From ef3fa244d1a32c2cce3616a6dffc9c3dcafd4e34 Mon Sep 17 00:00:00 2001 Message-ID: From: Ihor Radchenko Date: Sun, 14 Apr 2024 14:05:59 +0300 Subject: [PATCH] ox-man: Escape backslash characters in verbatim examples * lisp/ox-man.el (org-man--protect-example): New helper function protecting special escape characters inside literal examples. (org-man-example-block): (org-man-inline-src-block): (org-man-src-block): (org-man-table): Protect contents that is intended to be rendered verbatim. Reported-by: Greg Minshall Link: https://orgmode.org/list/2924644.1643637646@apollo2.minshall.org --- lisp/ox-man.el | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lisp/ox-man.el b/lisp/ox-man.el index 958740da8..cdd4fea7d 100644 --- a/lisp/ox-man.el +++ b/lisp/ox-man.el @@ -293,6 +293,13 @@ (defun org-man--protect-text (text) "Protect minus and backslash characters in string TEXT." (replace-regexp-in-string "-" "\\-" text nil t)) +(defun org-man--protect-example (text) + "Escape necessary characters for verbatim TEXT." + ;; See man groff_man_style; \e must be used to render backslash. + ;; Note that groff's .eo (disable backslash) and .ec (re-enable + ;; backslash) cannot be used as per the same man page. + (replace-regexp-in-string "\\\\" "\\e" text nil t)) + ;;; Template @@ -400,7 +407,7 @@ (defun org-man-example-block (example-block _contents info) (org-man--wrap-label example-block (format ".RS\n.nf\n%s\n.fi\n.RE" - (org-export-format-code-default example-block info)))) + (org-man--protect-example (org-export-format-code-default example-block info))))) ;;; Export Block @@ -529,11 +536,11 @@ (defun org-man-inline-src-block (inline-src-block _contents info) (delete-file out-file) code-block) (format ".RS\n.nf\n\\fC\\m[black]%s\\m[]\\fP\n.fi\n.RE\n" - code)))) + (org-man--protect-example code))))) ;; Do not use a special package: transcode it verbatim. (t - (concat ".RS\n.nf\n" "\\fC" "\n" code "\n" + (concat ".RS\n.nf\n" "\\fC" "\n" (org-man--protect-example code) "\n" "\\fP\n.fi\n.RE\n"))))) @@ -749,7 +756,7 @@ (defun org-man-src-block (src-block _contents info) contextual information." (if (not (plist-get info :man-source-highlight)) (format ".RS\n.nf\n\\fC%s\\fP\n.fi\n.RE\n\n" - (org-export-format-code-default src-block info)) + (org-man--protect-example (org-export-format-code-default src-block info))) (let* ((tmpdir temporary-file-directory) (in-file (make-temp-name (expand-file-name "srchilite" tmpdir))) (out-file (make-temp-name (expand-file-name "reshilite" tmpdir))) @@ -772,7 +779,7 @@ (defun org-man-src-block (src-block _contents info) (delete-file in-file) (delete-file out-file) code-block) - (format ".RS\n.nf\n\\fC\\m[black]%s\\m[]\\fP\n.fi\n.RE" code))))) + (format ".RS\n.nf\n\\fC\\m[black]%s\\m[]\\fP\n.fi\n.RE" (org-man--protect-example code)))))) ;;; Statistics Cookie @@ -836,9 +843,10 @@ (defun org-man-table (table contents info) (format ".nf\n\\fC%s\\fP\n.fi" ;; Re-create table, without affiliated keywords. - (org-trim - (org-element-interpret-data - `(table nil ,@(org-element-contents table)))))) + (org-man--protect-example + (org-trim + (org-element-interpret-data + `(table nil ,@(org-element-contents table))))))) ;; Case 2: Standard table. (t (org-man-table--org-table table contents info)))) -- 2.44.0