From 8441782b11321469c944267775cc631242c2e45d Mon Sep 17 00:00:00 2001 From: Jonathan Leech-Pepin Date: Thu, 23 Aug 2012 09:20:02 -0400 Subject: [PATCH] contrib/lisp/org-e-texinfo: Remove markup from headlines when exporting to ensure info can process them properly * contrib/lisp/org-e-texinfo.el (org-e-texinfo--generate-menu-items): Use org-e-texinfo--sanitize-headline to ensure markup is stripped before being used for sectioning and menu information. Nodes and menus can fail because of formatting and section titles do not show any formatting when viewed in an info-viewer. (org-e-texinfo--sanitize-headline): Wrapper function for org-e-texinfo--sanitize-healine-contents (org-e-texinfo--sanitize-headline-contents): Strips markup from headlines. It treats content recursively to ensure nested formatting is removed as well. --- contrib/lisp/org-e-texinfo.el | 45 ++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/contrib/lisp/org-e-texinfo.el b/contrib/lisp/org-e-texinfo.el index 8256d44eb..0bd6c6c6e 100644 --- a/contrib/lisp/org-e-texinfo.el +++ b/contrib/lisp/org-e-texinfo.el @@ -498,6 +498,34 @@ See `org-e-texinfo-text-markup-alist' for details." ;; Else use format string. (t (format fmt text))))) +;;; Headline sanitizing + +(defun org-e-texinfo--sanitize-headline (headline info) + "Remove all formatting from the text of a headline for use in + node and menu listing." + (mapconcat 'identity + (org-e-texinfo--sanitize-headline-contents headline info) " ")) + +(defun org-e-texinfo--sanitize-headline-contents (headline info) + "Retrieve the content of the headline. + +Any content that can contain further formatting is checked +recursively, to ensure that nested content is also properly +retrieved." + (loop for contents in headline append + (cond + ;; already a string + ((stringp contents) + (list (replace-regexp-in-string " $" "" contents))) + ;; Is exported as-is (value) + ((org-element-map contents '(verbatim code) + (lambda (value) + (org-element-property :value value)))) + ;; Has content and recurse into the content + ((org-element-contents contents) + (org-e-texinfo--sanitize-headline-contents + (org-element-contents contents) info))))) + ;;; Menu creation (defun org-e-texinfo--build-menu (tree level info &optional detailed) @@ -579,7 +607,7 @@ Returns a list containing the following information from each headline: length, title, description. This is used to format the menu using `org-e-texinfo--format-menu'." (loop for headline in items collect - (let* ((title (org-export-data + (let* ((title (org-e-texinfo--sanitize-headline (org-element-property :title headline) info)) (descr (org-export-data (org-element-property :description headline) info)) @@ -906,16 +934,17 @@ holding contextual information." (class-sectionning (assoc class org-e-texinfo-classes)) ;; Find the index type, if any (index (org-element-property :index headline)) + ;; Retrieve headline text + (text (org-e-texinfo--sanitize-headline + (org-element-property :title headline) info)) ;; Create node info, to insert it before section formatting. (node (format "@node %s\n" - (replace-regexp-in-string - "%" "%%" - (org-export-data (org-element-property :title headline) info)))) + (replace-regexp-in-string "%" "%%" text))) ;; Menus must be generated with first child, otherwise they ;; will not nest properly (menu (let* ((first (org-export-first-sibling-p headline info)) (parent (org-export-get-parent-headline headline)) - (title (org-export-data + (title (org-e-texinfo--sanitize-headline (org-element-property :title parent) info)) heading listing (tree (plist-get info :parse-tree))) @@ -929,7 +958,9 @@ holding contextual information." (setq listing (org-e-texinfo--build-menu (car heading) level info)) (if listing - (setq listing (format + (setq listing (replace-regexp-in-string + "%" "%%" listing) + listing (format "\n@menu\n%s\n@end menu\n\n" listing)) 'nil))) ;; Section formatting will set two placeholders: one for the @@ -953,8 +984,6 @@ holding contextual information." (concat menu node (funcall (if numberedp #'car #'cdr) sec) "\n%s")))))) - (text (org-export-data - (org-element-property :title headline) info)) (todo (and (plist-get info :with-todo-keywords) (let ((todo (org-element-property :todo-keyword headline)))