diff options
author | Eli Zaretskii <eliz@gnu.org> | 2014-08-21 18:07:13 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2014-08-21 18:07:13 +0300 |
commit | 8ab2588c9d68a54900b58f6e304ab32aeec5f10a (patch) | |
tree | 60e020fd7c74190b283e353343dc0e7b0293b564 /lisp/textmodes | |
parent | b360b106e9954a1f31bb4a22f023820958eafe5a (diff) | |
download | emacs-8ab2588c9d68a54900b58f6e304ab32aeec5f10a.tar.gz |
Fix a bug in texinfo-make-menu.
lisp/textmodes/texnfo-upd.el (texinfo-specific-section-type): Don't
recognize a Top node if there are other sectioning commands
earlier in the Texinfo file. This fixes a bug in
texinfo-make-menu and avoids inflooping in
texinfo-all-menus-update when they are invoked on texinfo.texi.
Diffstat (limited to 'lisp/textmodes')
-rw-r--r-- | lisp/textmodes/texnfo-upd.el | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/lisp/textmodes/texnfo-upd.el b/lisp/textmodes/texnfo-upd.el index e345f8a5028..839d7a96b5d 100644 --- a/lisp/textmodes/texnfo-upd.el +++ b/lisp/textmodes/texnfo-upd.el @@ -1145,24 +1145,40 @@ For example, \"unnumberedsubsec\". Return \"top\" for top node. Searches forward for a section. Hence, point must be before the section whose type will be found. Does not move point. Signal an error if the node is not the top node and a section is not found." - (let ((case-fold-search t)) - (save-excursion - (cond - ((re-search-forward "^@node [ \t]*top[ \t]*\\(,\\|$\\)" - ;; Following search limit by cph but causes a bug - ;;(line-end-position) - nil - t) - "top") - ((re-search-forward texinfo-section-types-regexp nil t) - (buffer-substring-no-properties - (progn (beginning-of-line) ; copy its name - (1+ (point))) - (progn (forward-word 1) - (point)))) - (t - (error - "texinfo-specific-section-type: Chapter or section not found")))))) + (let* ((case-fold-search t) + ;; The Texinfo manual has a second Top node inside @verbatim + ;; near the end, which dupes us into thinking we are at top + ;; level, no matter where we are when invoked. We don't + ;; really grok @verbatim, so we cheat: only consider us to be + ;; at top level if the position of the Top node we found is + ;; before any other sectioning command. + (top-pos (save-excursion + (re-search-forward "^@node [ \t]*top[ \t]*\\(,\\|$\\)" + ;; Following search limit causes a bug + ;;(line-end-position) + nil + t))) + (sec-pos (save-excursion + (re-search-forward texinfo-section-types-regexp nil t))) + sec-name) + (if sec-pos + (save-excursion + (goto-char sec-pos) + (setq sec-name (buffer-substring-no-properties + (progn (beginning-of-line) ; copy its name + (1+ (point))) + (progn (forward-word 1) + (point)))))) + (cond + ((or sec-pos top-pos) + (if (and top-pos sec-pos) + (if (< top-pos sec-pos) + "top" + sec-name) + (or sec-name "top"))) + (t + (error + "texinfo-specific-section-type: Chapter or section not found"))))) (defun texinfo-hierarchic-level () "Return the general hierarchical level of the next node in a texinfo file. |