Browse Source

ox-texinfo: Gracefully handle node collision in the same hierarchy

* lisp/ox-texinfo.el (org-texinfo--get-node): Ensure the upper element
  get the shorter node.

Considering the following document:

* Headline
** Headline

the level 1 headlines get "Headline" node and the other one
"Headline (1)".
Nicolas Goaziou 2 years ago
1 changed files with 11 additions and 0 deletions
  1. 11 0

+ 11 - 0

@@ -486,6 +486,17 @@ node or anchor name is unique."
 		    (error "Cannot generate node name for type: %S" type)))))
 	       (name basename))
+	  ;; Org exports deeper elements before their parents.  If two
+	  ;; node names collide -- e.g., they have the same title --
+	  ;; within the same hierarchy, the second one would get the
+	  ;; shorter node name.  This is counter-intuitive.
+	  ;; Consequently, we ensure that every parent headline get
+	  ;; its node beforehand. As a recursive operation, this
+	  ;; achieves the desired effect.
+	  (let ((parent (org-element-lineage datum '(headline))))
+	    (when (and parent (not (assq parent cache)))
+	      (org-texinfo--get-node parent info)
+	      (setq cache (plist-get info :texinfo-node-cache))))
 	  ;; Ensure NAME is unique and not reserved node name "Top".
 	  (while (or (equal name "Top") (rassoc name cache))
 	    (setq name (concat basename (format " (%d)" (cl-incf salt)))))