mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-11-21 06:55:35 +00:00
ox-texinfo: More fixes to cross-referencing
* lisp/ox-texinfo.el (org-texinfo--sanitize-title): New function. (org-texinfo--get-node): Use new function. Tiny improvement over aesthetics of duplicate node names. (org-texinfo--sanitize-node): Fix docstring. (org-texinfo-headline): Use new function (org-texinfo--@ref): Remove colons and protect commas in description. (org-texinfo-link): Use new function. Better handling of targets within headings. (org-texinfo--format-entries): Use new function. Remove colons from menu entries.
This commit is contained in:
parent
93bc1b7c7e
commit
b13e672977
@ -459,26 +459,42 @@ anchor name is unique."
|
||||
(basename
|
||||
(org-texinfo--sanitize-node
|
||||
(if (eq (org-element-type datum) 'headline)
|
||||
(org-export-data (org-export-get-alt-title datum info)
|
||||
info)
|
||||
(org-texinfo--sanitize-title
|
||||
(org-export-get-alt-title datum info) info)
|
||||
(org-export-get-reference datum info))))
|
||||
(name basename))
|
||||
;; Ensure NAME is unique and not reserved node name "Top".
|
||||
(while (or (equal name "Top") (rassoc name cache))
|
||||
(setq name (concat basename (number-to-string (cl-incf salt)))))
|
||||
(setq name (concat basename (format " %d" (cl-incf salt)))))
|
||||
(plist-put info :texinfo-node-cache (cons (cons datum name) cache))
|
||||
name))))
|
||||
|
||||
(defun org-texinfo--sanitize-node (title)
|
||||
"Bend string TITLE to node line requirements.
|
||||
Trim string and collapse multiple whitespace characters as they
|
||||
are not significant. Also remove the following characters: @
|
||||
{ } ( ) : . ,"
|
||||
(replace-regexp-in-string
|
||||
"[:,.]" ""
|
||||
are not significant. Replace leading left parenthesis, when
|
||||
followed by a right parenthesis, with a square bracket. Remove
|
||||
periods, commas and colons."
|
||||
(org-trim
|
||||
(replace-regexp-in-string
|
||||
"\\`(\\(.*)\\)" "[\\1"
|
||||
(org-trim (replace-regexp-in-string "[ \t]\\{2,\\}" " " title)))))
|
||||
"[ \t]+" " "
|
||||
(replace-regexp-in-string
|
||||
"[:,.]" ""
|
||||
(replace-regexp-in-string "\\`(\\(.*?)\\)" "[\\1" title)))))
|
||||
|
||||
(defun org-texinfo--sanitize-title (title info)
|
||||
"Make TITLE suitable as a section name.
|
||||
TITLE is a string or a secondary string. INFO is the current
|
||||
export state, as a plist."
|
||||
(org-export-data-with-backend
|
||||
title
|
||||
(org-export-create-backend
|
||||
:parent 'texinfo
|
||||
:transcoders '((footnote-reference . ignore)
|
||||
(link . (lambda (object c i) c))
|
||||
(radio-target . (lambda (object c i) c))
|
||||
(target . ignore)))
|
||||
info))
|
||||
|
||||
(defun org-texinfo--sanitize-content (text)
|
||||
"Escape special characters in string TEXT.
|
||||
@ -804,7 +820,8 @@ holding contextual information."
|
||||
(org-export-get-tags headline info)))
|
||||
(priority (and (plist-get info :with-priority)
|
||||
(org-element-property :priority headline)))
|
||||
(text (org-export-data (org-element-property :title headline) info))
|
||||
(text (org-texinfo--sanitize-title
|
||||
(org-element-property :title headline) info))
|
||||
(full-text (funcall (plist-get info :texinfo-format-headline-function)
|
||||
todo todo-type priority text tags))
|
||||
(contents (if (org-string-nw-p contents) (concat "\n" contents) "")))
|
||||
@ -943,7 +960,12 @@ CONTENTS is nil. INFO is a plist holding contextual information."
|
||||
"Return @ref command for element or object DATUM.
|
||||
DESCRIPTION is the name of the section to print, as a string."
|
||||
(let ((node-name (org-texinfo--get-node datum info))
|
||||
(title (org-texinfo--sanitize-node description)))
|
||||
;; Sanitize DESCRIPTION for cross-reference use. In
|
||||
;; particular, remove colons as they seem to cause (even
|
||||
;; within @asis{...} to the Texinfo reader.
|
||||
(title (replace-regexp-in-string
|
||||
"[ \t]*:+" ""
|
||||
(replace-regexp-in-string "," "@comma{}" description))))
|
||||
(if (equal title node-name)
|
||||
(format "@ref{%s}" node-name)
|
||||
(format "@ref{%s, , %s}" node-name title))))
|
||||
@ -983,13 +1005,20 @@ INFO is a plist holding contextual information. See
|
||||
(`plain-text
|
||||
(if desc (format "@uref{file://%s,%s}" destination desc)
|
||||
(format "@uref{file://%s}" destination)))
|
||||
(`headline
|
||||
(org-texinfo--@ref
|
||||
destination
|
||||
(or desc
|
||||
(org-export-data
|
||||
(org-element-property :title destination) info))
|
||||
info))
|
||||
((or `headline
|
||||
;; Targets within headlines cannot be turned into
|
||||
;; @anchor{}, so we refer to the headline parent
|
||||
;; directly.
|
||||
(and `target
|
||||
(guard (eq 'headline
|
||||
(org-element-type
|
||||
(org-element-property :parent destination))))))
|
||||
(let ((headline (org-element-lineage destination '(headline) t)))
|
||||
(org-texinfo--@ref
|
||||
headline
|
||||
(or desc (org-texinfo--sanitize-title
|
||||
(org-element-property :title headline) info))
|
||||
info)))
|
||||
(_
|
||||
(org-texinfo--@ref
|
||||
destination
|
||||
@ -1106,8 +1135,13 @@ a plist containing contextual information."
|
||||
(org-element-normalize-string
|
||||
(mapconcat
|
||||
(lambda (h)
|
||||
(let* ((title (org-export-data
|
||||
(org-export-get-alt-title h info) info))
|
||||
(let* ((title
|
||||
;; Colons are used as a separator between title and node
|
||||
;; name. Remove them.
|
||||
(replace-regexp-in-string
|
||||
"[ \t]+:+" ""
|
||||
(org-texinfo--sanitize-title
|
||||
(org-export-get-alt-title h info) info)))
|
||||
(node (org-texinfo--get-node h info))
|
||||
(entry (concat "* " title ":"
|
||||
(if (string= title node) ":"
|
||||
|
Loading…
Reference in New Issue
Block a user