|
@@ -49,11 +49,7 @@
|
|
|
|
|
|
(declare-function org-element-at-point "org-element" ())
|
|
|
(declare-function org-element-context "org-element" (&optional element))
|
|
|
-(declare-function org-element-map "org-element"
|
|
|
- (data types fun &optional info first-match no-recursion
|
|
|
- with-affiliated))
|
|
|
-(declare-function org-element-parse-buffer "org-element"
|
|
|
- (&optional granularity visible-only))
|
|
|
+(declare-function org-element-macro-parser "org-element" ())
|
|
|
(declare-function org-element-property "org-element" (property element))
|
|
|
(declare-function org-element-type "org-element" (element))
|
|
|
(declare-function org-file-contents "org" (file &optional noerror))
|
|
@@ -189,55 +185,53 @@ found in the buffer with no definition in TEMPLATES.
|
|
|
|
|
|
Optional argument KEYWORDS, when non-nil is a list of keywords,
|
|
|
as strings, where macro expansion is allowed."
|
|
|
- (org-with-wide-buffer
|
|
|
- (goto-char (point-min))
|
|
|
- (let ((properties-regexp
|
|
|
- (format "\\`EXPORT_%s\\+?\\'" (regexp-opt keywords)))
|
|
|
- record)
|
|
|
- (while (re-search-forward "{{{[-A-Za-z0-9_]" nil t)
|
|
|
- (let* ((datum (save-match-data (org-element-context)))
|
|
|
- (type (org-element-type datum))
|
|
|
- (macro
|
|
|
- (cond
|
|
|
- ((eq type 'macro) datum)
|
|
|
- ;; In parsed keywords and associated node properties,
|
|
|
- ;; force macro recognition.
|
|
|
- ((or (and (eq type 'keyword)
|
|
|
- (member (org-element-property :key datum) keywords))
|
|
|
- (and (eq type 'node-property)
|
|
|
- (string-match-p
|
|
|
- properties-regexp
|
|
|
- (org-element-property :key datum))))
|
|
|
- (save-restriction
|
|
|
- (narrow-to-region (match-beginning 0) (line-end-position))
|
|
|
- (org-element-map (org-element-parse-buffer) 'macro
|
|
|
- #'identity nil t))))))
|
|
|
- (when macro
|
|
|
- (let* ((value (org-macro-expand macro templates))
|
|
|
- (begin (org-element-property :begin macro))
|
|
|
- (signature (list begin
|
|
|
- macro
|
|
|
- (org-element-property :args macro))))
|
|
|
- ;; Avoid circular dependencies by checking if the same
|
|
|
- ;; macro with the same arguments is expanded at the same
|
|
|
- ;; position twice.
|
|
|
- (cond ((member signature record)
|
|
|
- (error "Circular macro expansion: %s"
|
|
|
- (org-element-property :key macro)))
|
|
|
- (value
|
|
|
- (push signature record)
|
|
|
- (delete-region
|
|
|
- begin
|
|
|
- ;; Preserve white spaces after the macro.
|
|
|
- (progn (goto-char (org-element-property :end macro))
|
|
|
- (skip-chars-backward " \t")
|
|
|
- (point)))
|
|
|
- ;; Leave point before replacement in case of
|
|
|
- ;; recursive expansions.
|
|
|
- (save-excursion (insert value)))
|
|
|
- (finalize
|
|
|
- (error "Undefined Org macro: %s; aborting"
|
|
|
- (org-element-property :key macro)))))))))))
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (point-min))
|
|
|
+ (let ((properties-regexp
|
|
|
+ (format "\\`EXPORT_%s\\+?\\'" (regexp-opt keywords)))
|
|
|
+ record)
|
|
|
+ (while (re-search-forward "{{{[-A-Za-z0-9_]" nil t)
|
|
|
+ (let* ((datum (save-match-data (org-element-context)))
|
|
|
+ (type (org-element-type datum))
|
|
|
+ (macro
|
|
|
+ (cond
|
|
|
+ ((eq type 'macro) datum)
|
|
|
+ ;; In parsed keywords and associated node properties,
|
|
|
+ ;; force macro recognition.
|
|
|
+ ((or (and (eq type 'keyword)
|
|
|
+ (member (org-element-property :key datum) keywords))
|
|
|
+ (and (eq type 'node-property)
|
|
|
+ (string-match-p properties-regexp
|
|
|
+ (org-element-property :key datum))))
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (match-beginning 0))
|
|
|
+ (org-element-macro-parser))))))
|
|
|
+ (when macro
|
|
|
+ (let* ((value (org-macro-expand macro templates))
|
|
|
+ (begin (org-element-property :begin macro))
|
|
|
+ (signature (list begin
|
|
|
+ macro
|
|
|
+ (org-element-property :args macro))))
|
|
|
+ ;; Avoid circular dependencies by checking if the same
|
|
|
+ ;; macro with the same arguments is expanded at the same
|
|
|
+ ;; position twice.
|
|
|
+ (cond ((member signature record)
|
|
|
+ (error "Circular macro expansion: %s"
|
|
|
+ (org-element-property :key macro)))
|
|
|
+ (value
|
|
|
+ (push signature record)
|
|
|
+ (delete-region
|
|
|
+ begin
|
|
|
+ ;; Preserve white spaces after the macro.
|
|
|
+ (progn (goto-char (org-element-property :end macro))
|
|
|
+ (skip-chars-backward " \t")
|
|
|
+ (point)))
|
|
|
+ ;; Leave point before replacement in case of
|
|
|
+ ;; recursive expansions.
|
|
|
+ (save-excursion (insert value)))
|
|
|
+ (finalize
|
|
|
+ (error "Undefined Org macro: %s; aborting"
|
|
|
+ (org-element-property :key macro)))))))))))
|
|
|
|
|
|
(defun org-macro-escape-arguments (&rest args)
|
|
|
"Build macro's arguments string from ARGS.
|