Merge branch 'maint'
This commit is contained in:
commit
40cc8623f1
90
lisp/ox.el
90
lisp/ox.el
|
@ -3342,24 +3342,6 @@ Return a string of lines to be included in the format expected by
|
|||
(while (< (point) end) (cl-incf counter) (forward-line))
|
||||
counter))))))))
|
||||
|
||||
(defun org-export--update-footnote-label (ref-begin digit-label id)
|
||||
"Prefix footnote-label at point REF-BEGIN in buffer with ID.
|
||||
|
||||
REF-BEGIN corresponds to the property `:begin' of objects of type
|
||||
footnote-definition and footnote-reference.
|
||||
|
||||
If DIGIT-LABEL is non-nil the label is assumed to be of the form
|
||||
\[N] where N is one or more numbers.
|
||||
|
||||
Return the new label."
|
||||
(goto-char (1+ ref-begin))
|
||||
(buffer-substring (point)
|
||||
(progn
|
||||
(if digit-label (insert (format "fn:--%d-" id))
|
||||
(forward-char 3)
|
||||
(insert (format "-%d-" id)))
|
||||
(1- (search-forward "]")))))
|
||||
|
||||
(defun org-export--prepare-file-contents
|
||||
(file &optional lines ind minlevel id footnotes)
|
||||
"Prepare contents of FILE for inclusion and return it as a string.
|
||||
|
@ -3445,51 +3427,55 @@ the included document."
|
|||
(insert (make-string offset ?*)))))))))))
|
||||
;; Append ID to all footnote references and definitions, so they
|
||||
;; become file specific and cannot collide with footnotes in other
|
||||
;; included files. Further, collect relevant footnotes outside of
|
||||
;; LINES.
|
||||
;; included files. Further, collect relevant footnote definitions
|
||||
;; outside of LINES, in order to reintroduce them later.
|
||||
(when id
|
||||
(let ((marker-min (point-min-marker))
|
||||
(marker-max (point-max-marker))
|
||||
seen)
|
||||
(get-new-label
|
||||
(lambda (label)
|
||||
;; Generate new label from LABEL. If LABEL is akin to
|
||||
;; [1] convert it to [fn:--ID-1]. Otherwise add "-ID-"
|
||||
;; after "fn:".
|
||||
(if (org-string-match-p "\\`[0-9]+\\'" label)
|
||||
(format "fn:--%d-%s" id label)
|
||||
(format "fn:-%d-%s" id (substring label 3)))))
|
||||
(set-new-label
|
||||
(lambda (f old new)
|
||||
;; Replace OLD label with NEW in footnote F.
|
||||
(save-excursion
|
||||
(goto-char (1+ (org-element-property :begin f)))
|
||||
(looking-at (regexp-quote old))
|
||||
(replace-match new))))
|
||||
(seen-alist))
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward org-footnote-re nil t)
|
||||
(let ((reference (org-element-context)))
|
||||
(when (eq (org-element-type reference) 'footnote-reference)
|
||||
(let* ((label (org-element-property :label reference))
|
||||
(digit-label
|
||||
(and label (org-string-match-p "\\`[0-9]+\\'" label))))
|
||||
(let ((footnote (save-excursion
|
||||
(backward-char)
|
||||
(org-element-context))))
|
||||
(when (memq (org-element-type footnote)
|
||||
'(footnote-definition footnote-reference))
|
||||
(let* ((label (org-element-property :label footnote)))
|
||||
;; Update the footnote-reference at point and collect
|
||||
;; the new label, which is only used for footnotes
|
||||
;; outsides LINES.
|
||||
(when label
|
||||
;; If label is akin to [1] convert it to
|
||||
;; [fn:--ID-1]. Otherwise add "-ID-" after "fn:".
|
||||
(let ((new-label (org-export--update-footnote-label
|
||||
(org-element-property :begin reference)
|
||||
digit-label id)))
|
||||
(unless (or (eq (org-element-property :type reference)
|
||||
'inline)
|
||||
(member label seen))
|
||||
(push label seen)
|
||||
(org-with-wide-buffer
|
||||
(let* ((definition (org-footnote-get-definition label))
|
||||
(beginning (nth 1 definition)))
|
||||
(unless definition
|
||||
(error
|
||||
"Definition not found for footnote %s in file %s"
|
||||
label file))
|
||||
(if (or (< beginning marker-min)
|
||||
(>= beginning marker-max))
|
||||
(let ((seen (cdr (assoc label seen-alist))))
|
||||
(if seen (funcall set-new-label footnote label seen)
|
||||
(let ((new (funcall get-new-label label)))
|
||||
(push (cons label new) seen-alist)
|
||||
(org-with-wide-buffer
|
||||
(let* ((def (org-footnote-get-definition label))
|
||||
(beg (nth 1 def)))
|
||||
(when (and def
|
||||
(or (< beg marker-min)
|
||||
(>= beg marker-max)))
|
||||
;; Store since footnote-definition is
|
||||
;; outside of LINES.
|
||||
(puthash new-label
|
||||
(org-element-normalize-string
|
||||
(nth 3 definition))
|
||||
footnotes)
|
||||
;; Update label of definition since it is
|
||||
;; included directly.
|
||||
(org-export--update-footnote-label
|
||||
beginning digit-label id)))))))))))
|
||||
(puthash new
|
||||
(org-element-normalize-string (nth 3 def))
|
||||
footnotes))))
|
||||
(funcall set-new-label footnote label new)))))))))
|
||||
(set-marker marker-min nil)
|
||||
(set-marker marker-max nil)))
|
||||
(org-element-normalize-string (buffer-string))))
|
||||
|
|
Loading…
Reference in New Issue