diff --git a/lisp/org-element.el b/lisp/org-element.el index 92780e018..e3f0c8299 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -5295,6 +5295,7 @@ indentation removed from its contents." ;; `org-element--cache-diagnostics-ring-size', `org-element--cache-map-statistics', ;; `org-element--cache-map-statistics-threshold'. +;;;###autoload (defvar org-element-use-cache t "Non-nil when Org parser should cache its results.") diff --git a/lisp/ox.el b/lisp/ox.el index 0a5ff6798..e9ec53747 100644 --- a/lisp/ox.el +++ b/lisp/ox.el @@ -4758,23 +4758,27 @@ objects of the same type." (let ((counter 0)) ;; Increment counter until ELEMENT is found again. (org-element-map (plist-get info :parse-tree) - (or types (org-element-type element)) + (or (and types (cons (org-element-type element) types)) + (org-element-type element)) (lambda (el) (let ((cached (org-element-property :org-export--counter el))) (cond ((eq element el) (1+ counter)) ;; Use cached result. - ((and cached (equal predicate (car cached))) - (cdr cached)) + ((and cached + (equal predicate (car cached)) + (equal types (cadr cached))) + (setq counter (nth 2 cached)) + nil) ((not predicate) (cl-incf counter) (org-element-put-property - el :org-export--counter (cons predicate counter)) + el :org-export--counter (list predicate types counter)) nil) ((funcall predicate el info) (cl-incf counter) (org-element-put-property - el :org-export--counter (cons predicate counter)) + el :org-export--counter (list predicate types counter)) nil)))) info 'first-match))))) diff --git a/testing/lisp/test-ox.el b/testing/lisp/test-ox.el index 47f3f6075..cdb549df4 100644 --- a/testing/lisp/test-ox.el +++ b/testing/lisp/test-ox.el @@ -405,6 +405,64 @@ Paragraph" (options (org-export-get-environment backend t))) (list (plist-get options :k1) (plist-get options :k2))))))) +(ert-deftest test-org-export/get-ordinal () + "Test specifications for `org-export-get-ordinal'." + ;; Table numbering with, without predicates, and with other types. + (org-test-with-temp-text + "#+title: Table numbering test +#+options: author:nil toc:nil + +#+caption: Should be Table 1 +| h1 | h2 | h3 | +|----------+----------+----------| +| abcdefgh | ijklmnop | qrstuvwx | + +#+caption: Should be Table 2 +| h1 | h2 | h3 | +|----------+----------+----------| +| abcdefgh | ijklmnop | qrstuvwx | + +#+caption: Should be Table 3 +| h1 | h2 | h3 | +|----------+----------+----------| +| abcdefgh | ijklmnop | qrstuvwx | + +#+caption: Should be Table 4 +| h1 | h2 | h3 | +|----------+----------+----------| +| abcdefgh | ijklmnop | qrstuvwx |" + (org-export-as + (org-export-create-backend + :parent 'org + :transcoders + '((table + . + (lambda (table contents info) + (let ((from-third (lambda (table info) + (<= 3 (org-export-get-ordinal table info))))) + (pcase (org-element-interpret-data (org-export-get-caption table)) + ("Should be Table 1" + (should (= 1 (org-export-get-ordinal table info))) + (should (= 2 (org-export-get-ordinal table info '(section)))) + (should (= 1 (org-export-get-ordinal table info nil #'org-ascii--has-caption-p))) + (should (= 1 (org-export-get-ordinal table info nil from-third)))) + ("Should be Table 2" + (should (= 2 (org-export-get-ordinal table info))) + (should (= 3 (org-export-get-ordinal table info '(section)))) + (should (= 2 (org-export-get-ordinal table info nil #'org-ascii--has-caption-p))) + (should (= 1 (org-export-get-ordinal table info nil from-third)))) + ("Should be Table 3" + (should (= 3 (org-export-get-ordinal table info))) + (should (= 4 (org-export-get-ordinal table info '(section)))) + (should (= 3 (org-export-get-ordinal table info nil #'org-ascii--has-caption-p))) + (should (= 1 (org-export-get-ordinal table info nil from-third)))) + ("Should be Table 4" + (should (= 4 (org-export-get-ordinal table info))) + (should (= 5 (org-export-get-ordinal table info '(section)))) + (should (= 4 (org-export-get-ordinal table info nil #'org-ascii--has-caption-p))) + (should (= 2 (org-export-get-ordinal table info nil from-third)))))) + ""))))))) + (ert-deftest test-org-export/set-title () "Test title setting." ;; Without TITLE keyword.