From 54ff91953d1a456852506ac162eee2a0cf99d3b0 Mon Sep 17 00:00:00 2001 From: Rudolf Adamkovic Date: Sat, 24 Aug 2024 15:26:18 +0200 Subject: [PATCH] ox-texinfo: Support numeric values of `toc' in `#+OPTIONS' * etc/ORG-NEWS (Texinfo exporter now supports numeric =toc= values in =#+OPTIONS:=): Announce the change. * lisp/ox.el (org-export-excluded-from-toc-p): Return nil for all headlines that are above the `toc' value in the export `#+OPTIONS'. (org-export-collect-headlines): Exclude all headlines that are above the `toc' value in the export `#+OPTIONS' , using the updated `org-export-excluded-from-toc-p' function. * testing/lisp/test-ox-texinfo.el (test-ox-texinfo/menus-nodes-headings): Add a test. --- etc/ORG-NEWS | 6 +++ lisp/ox.el | 16 ++++--- testing/lisp/test-ox-texinfo.el | 81 +++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 7 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 392788055..344591ebb 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -223,6 +223,12 @@ This way, attachments will remain accessible when opening symlinked Org file. When no attach dir exists, Org mode will still prefer creating it in the "default" directory - where the symlink is located. +*** Texinfo exporter now considers numeric =toc= values in =#+OPTIONS:= + +For example, given =H:3= and =toc:2= in =#+OPTIONS:=, all headings at +the 1st and 2nd level appear in the table of contents and those at the +3rd level do not. + * Version 9.7 ** Important announcements and breaking changes diff --git a/lisp/ox.el b/lisp/ox.el index 7a0ab4dc7..c16e3acf6 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -5555,12 +5555,10 @@ Footnote sections are ignored." (+ (org-export-get-relative-level scope info) n)) limit)))) (org-element-map (org-element-contents scope) 'headline - (lambda (h) - (and (not (org-element-property :footnote-section-p h)) - (not (equal "notoc" - (org-export-get-node-property :UNNUMBERED h t))) - (>= n (org-export-get-relative-level h info)) - h)) + (lambda (headline) + (and (not (org-export-excluded-from-toc-p headline info)) + (>= n (org-export-get-relative-level headline info)) + headline)) info))) (defun org-export-collect-elements (type info &optional predicate) @@ -5625,7 +5623,11 @@ contents. However, it is useful if some additional processing is required on headlines excluded from table of contents." (or (org-element-property :footnote-section-p headline) (org-export-low-level-p headline info) - (equal "notoc" (org-export-get-node-property :UNNUMBERED headline t)))) + (equal "notoc" (org-export-get-node-property :UNNUMBERED headline t)) + (let ((toc-depth (plist-get info :with-toc))) + (and (wholenump toc-depth) + (> (org-element-property :level headline) + toc-depth))))) (defun org-export-toc-entry-backend (parent &rest transcoders) "Return an export backend appropriate for table of contents entries. diff --git a/testing/lisp/test-ox-texinfo.el b/testing/lisp/test-ox-texinfo.el index b16a344e7..fc9b6dabd 100644 --- a/testing/lisp/test-ox-texinfo.el +++ b/testing/lisp/test-ox-texinfo.el @@ -345,5 +345,86 @@ body (should-not (org-element-contents section)) (should (eq first-heading (org-element-parent section))))))) + +;;; Structure + +(ert-deftest test-ox-texinfo/menus-nodes-headings () + "Test menus, nodes, and headings." + (should + (org-test-with-temp-text + (string-join + (list "#+OPTIONS: H:3 toc:2 num:nil" + "* Heading 1" + "** Heading 1-1" + "*** Heading 1-1-1" + "*** Heading 1-1-2" + "** Heading 1-2" + "*** Heading 1-2-1" + "*** Heading 1-2-2" + "* Heading 2" + "** Heading 2-1" + "*** Heading 2-1-1" + "*** Heading 2-1-2" + "** Heading 2-2" + "*** Heading 2-2-1" + "*** Heading 2-2-2") + "\n") + (let ((export-buffer "*Test Texinfo Export*") + (org-export-show-temporary-export-buffer nil)) + (org-export-to-buffer 'texinfo export-buffer + nil nil nil nil nil + #'texinfo-mode) + (with-current-buffer export-buffer + (goto-char (point-min)) + (and + (re-search-forward "^@menu$") + (re-search-forward "^* Heading 1::$") + (re-search-forward "^* Heading 2::$") + (re-search-forward "^@detailmenu$") + (re-search-forward "^Heading 1$") + (re-search-forward "^* Heading 1-1::$") + (re-search-forward "^* Heading 1-2::$") + (re-search-forward "^Heading 2$") + (re-search-forward "^* Heading 2-1::$") + (re-search-forward "^* Heading 2-2::$") + (re-search-forward "^@end detailmenu$") + (re-search-forward "^@end menu$") + (re-search-forward "^@node Heading 1$") + (re-search-forward "^@unnumbered Heading 1$") + (re-search-forward "^@menu$") + (re-search-forward "^* Heading 1-1::$") + (re-search-forward "^* Heading 1-2::$") + (re-search-forward "^@end menu$") + (re-search-forward "^@node Heading 1-1$") + (re-search-forward "^@unnumberedsec Heading 1-1$") + (re-search-forward "^@anchor{Heading 1-1-1}$") + (re-search-forward "^@subheading Heading 1-1-1$") + (re-search-forward "^@anchor{Heading 1-1-2}$") + (re-search-forward "^@subheading Heading 1-1-2$") + (re-search-forward "^@node Heading 1-2$") + (re-search-forward "^@unnumberedsec Heading 1-2$") + (re-search-forward "^@anchor{Heading 1-2-1}$") + (re-search-forward "^@subheading Heading 1-2-1$") + (re-search-forward "^@anchor{Heading 1-2-2}$") + (re-search-forward "^@subheading Heading 1-2-2$") + (re-search-forward "^@node Heading 2$") + (re-search-forward "^@unnumbered Heading 2$") + (re-search-forward "^@menu$") + (re-search-forward "^* Heading 2-1::$") + (re-search-forward "^* Heading 2-2::$") + (re-search-forward "^@end menu$") + (re-search-forward "^@node Heading 2-1$") + (re-search-forward "^@unnumberedsec Heading 2-1$") + (re-search-forward "^@anchor{Heading 2-1-1}$") + (re-search-forward "^@subheading Heading 2-1-1$") + (re-search-forward "^@anchor{Heading 2-1-2}$") + (re-search-forward "^@subheading Heading 2-1-2$") + (re-search-forward "^@node Heading 2-2$") + (re-search-forward "^@unnumberedsec Heading 2-2$") + (re-search-forward "^@anchor{Heading 2-2-1}$") + (re-search-forward "^@subheading Heading 2-2-1$") + (re-search-forward "^@anchor{Heading 2-2-2}$") + (re-search-forward "^@subheading Heading 2-2-2$"))))))) + (provide 'test-ox-texinfo) ;;; test-ox-texinfo.el end here -- 2.39.3 (Apple Git-146)