ox: Allow a less strict UNNUMBERED inheritance

* lisp/ox.el (org-export-collect-headlines):
(org-export-excluded-from-toc-p): Allow to number headlines in the
middle of an otherwise unnumbered tree.

* testing/lisp/test-ox.el (test-org-export/collect-headlines):
(test-org-export/excluded-from-toc-p):
(test-org-export/toc-entry-backend): Update tests.  Add more tests.

Reported-by: Akater <nuclearspace@gmail.com>
<http://lists.gnu.org/archive/html/emacs-orgmode/2017-11/msg00219.html>
This commit is contained in:
Nicolas Goaziou 2017-11-20 14:07:03 +01:00
parent d788d1b00e
commit 7455f4bf83
2 changed files with 30 additions and 17 deletions

View File

@ -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.

View File

@ -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))))))