|
@@ -610,6 +610,12 @@ while every other back-end will ignore it."
|
|
|
;; - category :: persistent
|
|
|
;; - type :: integer
|
|
|
|
|
|
+;; + `headline-numbering' :: Alist between headlines' beginning
|
|
|
+;; position and their numbering, as a list of numbers
|
|
|
+;; (cf. `org-export-get-headline-number').
|
|
|
+;; - category :: persistent
|
|
|
+;; - type :: alist (INTEGER . LIST)
|
|
|
+
|
|
|
;; + `included-files' :: List of files, with full path, included in
|
|
|
;; the current buffer, through the "#+include:" keyword. It is
|
|
|
;; mainly used to verify that no infinite recursive inclusion
|
|
@@ -1096,14 +1102,14 @@ retrieved."
|
|
|
;; `org-export-use-select-tag-p' determines if an headline makes use
|
|
|
;; of an export tag enforcing inclusion. `org-export-get-min-level'
|
|
|
;; gets the minimal exportable level, used as a basis to compute
|
|
|
-;; relative level for headlines. Eventually,
|
|
|
-;; `org-export-get-point-max' returns the maximum exportable ending
|
|
|
-;; position in the parse tree.
|
|
|
+;; relative level for headlines. `org-export-get-point-max' returns
|
|
|
+;; the maximum exportable ending position in the parse tree.
|
|
|
+;; Eventually `org-export-collect-headline-numbering' builds an alist
|
|
|
+;; between headlines' beginning position and their numbering.
|
|
|
|
|
|
(defconst org-export-persistent-properties-list
|
|
|
- '(:babel-data-alist :babel-info-alist :babel-results-alist :code-refs
|
|
|
- :headline-offset :parse-tree :point-max
|
|
|
- :seen-footnote-labels :total-loc :use-select-tags)
|
|
|
+ '(:code-refs :headline-alist :headline-offset :headline-offset :parse-tree
|
|
|
+ :point-max :seen-footnote-labels :total-loc :use-select-tags)
|
|
|
"List of persistent properties.")
|
|
|
|
|
|
(defconst org-export-persistent-properties nil
|
|
@@ -1132,6 +1138,9 @@ Following initial persistent properties are set:
|
|
|
of level 2 should be considered as a level
|
|
|
1 headline in the context.
|
|
|
|
|
|
+`:headline-numbering' Alist of all headlines' beginning position
|
|
|
+ as key an the associated numbering as value.
|
|
|
+
|
|
|
`:parse-tree' Whole parse tree.
|
|
|
|
|
|
`:point-max' Last position in the parse tree
|
|
@@ -1178,7 +1187,11 @@ Following initial persistent properties are set:
|
|
|
(list (org-element-get-property :raw-value headline)
|
|
|
(org-element-get-property :begin headline)
|
|
|
(org-element-get-property :end headline))))))
|
|
|
- ;; 6. `:back-end'
|
|
|
+ ;; 6. `:headline-numbering'
|
|
|
+ (setq options (org-export-set-property
|
|
|
+ options :headline-numbering
|
|
|
+ (org-export-collect-headline-numbering data options)))
|
|
|
+ ;; 7. `:back-end'
|
|
|
(setq options (org-export-set-property options :back-end backend)))
|
|
|
|
|
|
(defun org-export-use-select-tags-p (data options)
|
|
@@ -1224,6 +1237,30 @@ OPTIONS is a plist holding export options."
|
|
|
(org-element-get-contents data))
|
|
|
pos-max))
|
|
|
|
|
|
+(defun org-export-collect-headline-numbering (data options)
|
|
|
+ "Return numbering of all exportable headlines in a parse tree.
|
|
|
+
|
|
|
+DATA is the parse tree. OPTIONS is the plist holding export
|
|
|
+options.
|
|
|
+
|
|
|
+Return an alist whose key is headline's beginning position and
|
|
|
+value is its associated numbering (in the shape of a list of
|
|
|
+numbers)."
|
|
|
+ (let ((numbering (make-vector org-export-max-depth 0)))
|
|
|
+ (org-element-map
|
|
|
+ data
|
|
|
+ 'headline
|
|
|
+ (lambda (headline info)
|
|
|
+ (let ((relative-level (1- (org-export-get-relative-level blob info))))
|
|
|
+ (cons
|
|
|
+ (org-element-get-property :begin headline)
|
|
|
+ (loop for n across numbering
|
|
|
+ for idx from 0 to org-export-max-depth
|
|
|
+ when (< idx relative-level) collect n
|
|
|
+ when (= idx relative-level) collect (aset numbering idx (1+ n))
|
|
|
+ when (> idx relative-level) do (aset numbering idx 0)))))
|
|
|
+ options)))
|
|
|
+
|
|
|
|
|
|
;;;; Properties Management
|
|
|
|
|
@@ -1255,18 +1292,11 @@ The following properties are updated:
|
|
|
(plist).
|
|
|
`previous-element' Previous element's type (symbol).
|
|
|
`previous-object' Previous object's type (symbol).
|
|
|
-`previous-section-number' Numbering of the previous headline
|
|
|
- (vector).
|
|
|
`seen-footnote-labels' List of already parsed footnote
|
|
|
labels (string list)
|
|
|
|
|
|
Return the property list."
|
|
|
- (let* ((type (and (not (stringp blob)) (car blob)))
|
|
|
- (relative-level (and (eq type 'headline)
|
|
|
- (org-export-get-relative-level blob info)))
|
|
|
- (current-num (and (eq type 'headline)
|
|
|
- (or (plist-get info :previous-section-number)
|
|
|
- (make-vector org-export-max-depth 0)))))
|
|
|
+ (let* ((type (and (not (stringp blob)) (car blob))))
|
|
|
(cond
|
|
|
;; Case 1: We're moving into a recursive blob.
|
|
|
(recursep
|
|
@@ -1275,20 +1305,15 @@ Return the property list."
|
|
|
`(:genealogy ,(cons type (plist-get info :genealogy))
|
|
|
:previous-element nil
|
|
|
:previous-object nil
|
|
|
- :parent-properties ,(if (memq type org-element-all-elements)
|
|
|
- (nth 1 blob)
|
|
|
- (plist-get info :parent-properties))
|
|
|
+ :parent-properties
|
|
|
+ ,(if (memq type org-element-all-elements)
|
|
|
+ (nth 1 blob)
|
|
|
+ (plist-get info :parent-properties))
|
|
|
:inherited-properties
|
|
|
,(if (eq type 'headline)
|
|
|
(org-combine-plists
|
|
|
(plist-get info :inherited-properties) (nth 1 blob))
|
|
|
- (plist-get info :inherited-properties))
|
|
|
- :previous-section-number
|
|
|
- ,(let ((current-num (copy-sequence current-num)))
|
|
|
- (if (not (eq type 'headline))
|
|
|
- current-num
|
|
|
- (progn (incf (aref current-num (1- relative-level)))
|
|
|
- current-num))))
|
|
|
+ (plist-get info :inherited-properties)))
|
|
|
;; Add persistent properties.
|
|
|
org-export-persistent-properties))
|
|
|
;; Case 2: No recursion.
|
|
@@ -1304,12 +1329,6 @@ Return the property list."
|
|
|
(unless (and label (member label seen-labels))
|
|
|
(setq info (org-export-set-property
|
|
|
info :seen-footnote-labels (push label seen-labels))))))
|
|
|
- ;; At an headline: update section number.
|
|
|
- (when (eq type 'headline)
|
|
|
- (setq info (org-export-set-property
|
|
|
- info :previous-section-number
|
|
|
- (progn (incf (aref current-num (1- relative-level)))
|
|
|
- current-num))))
|
|
|
;; Set `:previous-element' or `:previous-object' according to
|
|
|
;; BLOB.
|
|
|
(setq info (cond ((not type)
|
|
@@ -2055,12 +2074,8 @@ INFO is a plist holding contextual information."
|
|
|
(defun org-export-get-headline-number (headline info)
|
|
|
"Return HEADLINE numbering as a list of numbers.
|
|
|
INFO is a plist holding contextual information."
|
|
|
- (let ((relative-level (org-export-get-relative-level headline info))
|
|
|
- (previous-numbering (or (plist-get info :previous-section-number)
|
|
|
- (make-vector org-export-max-depth 0))))
|
|
|
- (loop for n across previous-numbering
|
|
|
- for i from 1 to relative-level
|
|
|
- collect (if (= i relative-level) (1+ n) n))))
|
|
|
+ (cdr (assq (org-element-get-property :begin headline)
|
|
|
+ (plist-get info :headline-numbering))))
|
|
|
|
|
|
(defun org-export-number-to-roman (n)
|
|
|
"Convert integer N into a roman numeral."
|