diff --git a/contrib/lisp/org-export.el b/contrib/lisp/org-export.el index 397ab3225..c58135dcd 100644 --- a/contrib/lisp/org-export.el +++ b/contrib/lisp/org-export.el @@ -2075,8 +2075,8 @@ Point is at buffer's beginning when BODY is applied." ;; should be added here. ;; As of now, functions operating on headlines, include keywords, -;; links, macros, src-blocks, tables and tables of contents are -;; implemented. +;; links, macros, references, src-blocks, tables and tables of +;; contents are implemented. ;;;; For Headlines @@ -2363,6 +2363,56 @@ INFO is a plist holding export options." (format "%s" value))) +;;;; For References + +;; `org-export-get-ordinal' associates a sequence number to any object +;; or element. + +(defun org-export-get-ordinal (element info &optional within-section predicate) + "Return ordinal number of an element or object. + +ELEMENT is the element or object considered. INFO is the plist +used as a communication channel. + +When optional argument WITHIN-SECTION is non-nil, narrow counting +to the section containing ELEMENT. + +Optional argument PREDICATE is a function returning a non-nil +value if the current element or object should be counted in. It +accepts one argument: the element or object being considered. +This argument allows to count only a certain type of objects, +like inline images, which are a subset of links \(in that case, +`org-export-inline-image-p' might be an useful predicate\)." + (let ((counter 0) + (type (car element)) + ;; Determine if search should apply to current section, in + ;; which case it should be retrieved first, or to full parse + ;; tree. As a special case, an element or object without + ;; a parent headline will also trigger a full search, + ;; notwithstanding WITHIN-SECTION value. + (data + (let ((parse-tree (plist-get info :parse-tree))) + (if within-section + (let ((parent (plist-get (plist-get info :inherited-properties) + :begin))) + (if (not parent) parse-tree + (org-element-map + parse-tree 'headline + (lambda (el local) + (when (= (org-element-get-property :begin el) parent) el)) + info 'first-match))) + parse-tree)))) + ;; Increment counter until ELEMENT is found again. + (org-element-map + data type + (lambda (el local) + (cond + ((and (functionp predicate) (funcall predicate el))) + ((equal element el) (1+ counter)) + (t (incf counter) nil))) + info 'first-match))) + + ;;;; For Src-Blocks ;; `org-export-handle-code' takes care of line numbering and reference