diff --git a/lisp/ox.el b/lisp/ox.el index d6add0a0c..7ab41286a 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -5225,16 +5225,14 @@ Footnote sections are ignored." (n (if (not (wholenump n)) limit (min (if (eq (org-element-type scope) 'org-data) n (+ (org-export-get-relative-level scope info) n)) - limit))) - (skipped nil)) + limit)))) (org-element-map (org-element-contents scope) 'headline (lambda (h) - (if (or (org-element-property :footnote-section-p h) - (equal "notoc" (org-element-property :UNNUMBERED h)) - (memq (org-element-property :parent h) skipped) - (< n (org-export-get-relative-level h info))) - (progn (push h skipped) nil) - 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)) info))) (defun org-export-collect-elements (type info &optional predicate) @@ -5299,8 +5297,7 @@ 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) - (cl-some (lambda (h) (equal "notoc" (org-element-property :UNNUMBERED h))) - (org-element-lineage headline nil t)))) + (equal "notoc" (org-export-get-node-property :UNNUMBERED headline t)))) (defun org-export-toc-entry-backend (parent &rest transcoders) "Return an export back-end appropriate for table of contents entries. diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el index 74ac2de84..d88d7e30b 100644 --- a/testing/lisp/test-ox.el +++ b/testing/lisp/test-ox.el @@ -4318,13 +4318,18 @@ Another text. (ref:text) (org-export-collect-headlines info)))))) ;; Do not collect headlines with UNNUMBERED property set to "notoc". ;; Headlines with another value for the property are still - ;; collected. + ;; collected. UNNUMBERED property is inherited. (should (equal '("H1") (org-test-with-parsed-data "* H1\n* H2\n:PROPERTIES:\n:UNNUMBERED: notoc\n:END:" (mapcar (lambda (h) (org-element-property :raw-value h)) (org-export-collect-headlines info))))) + (should-not + (org-test-with-parsed-data + "* H1\n:PROPERTIES:\n:UNNUMBERED: notoc\n:END:\n** H2" + (mapcar (lambda (h) (org-element-property :raw-value h)) + (org-export-collect-headlines info)))) (should (equal '("H1" "H2") (org-test-with-parsed-data @@ -4348,17 +4353,28 @@ Another text. (ref:text) (ert-deftest test-org-export/excluded-from-toc-p () "Test `org-export-excluded-from-toc-p' specifications." + ;; By default, headlines are not excluded. (should-not (org-test-with-parsed-data "* H1" (org-element-map tree 'headline (lambda (h) (org-export-excluded-from-toc-p h info)) info t))) + ;; Exclude according to a maximum level. + (should + (equal '(in out) + (org-test-with-parsed-data "#+OPTIONS: H:1\n* H1\n** H2" + (org-element-map tree 'headline + (lambda (h) (if (org-export-excluded-from-toc-p h info) 'out 'in)) + info)))) + ;; Exclude according to UNNUMBERED property. (should (org-test-with-parsed-data "* H1\n:PROPERTIES:\n:UNNUMBERED: notoc\n:END:" (org-element-map tree 'headline (lambda (h) (org-export-excluded-from-toc-p h info)) info t))) + ;; UNNUMBERED property is inherited, so is "notoc" value. (should - (equal '(in out) - (org-test-with-parsed-data "#+OPTIONS: H:1\n* H1\n** H2" + (equal '(out out) + (org-test-with-parsed-data + "* H1\n:PROPERTIES:\n:UNNUMBERED: notoc\n:END:\n** H2" (org-element-map tree 'headline (lambda (h) (if (org-export-excluded-from-toc-p h info) 'out 'in)) info))))) @@ -4427,10 +4443,10 @@ Another text. (ref:text) (let (org-export-registered-backends) (org-export-define-backend 'test '((headline . (lambda (h _c i) (org-export-data-with-backend - (org-element-property :title h) - (org-export-toc-entry-backend 'test - '(bold . (lambda (_b c _i) c))) - i))))) + (org-element-property :title h) + (org-export-toc-entry-backend 'test + '(bold . (lambda (_b c _i) c))) + i))))) (org-export-as 'test))))))