macro: Small refactoring.

* lisp/org-macro.el (org-macro--collect-macros): Use
`org-collect-keywords'.
This commit is contained in:
Nicolas Goaziou 2020-04-26 22:57:47 +02:00
parent 0826461bc1
commit 3e44ddbe78
1 changed files with 12 additions and 35 deletions

View File

@ -50,6 +50,7 @@
(require 'org-macs) (require 'org-macs)
(require 'org-compat) (require 'org-compat)
(declare-function org-collect-keywords "org" (keywords &optional unique directory))
(declare-function org-element-at-point "org-element" ()) (declare-function org-element-at-point "org-element" ())
(declare-function org-element-context "org-element" (&optional element)) (declare-function org-element-context "org-element" (&optional element))
(declare-function org-element-copy "org-element" (datum)) (declare-function org-element-copy "org-element" (datum))
@ -94,42 +95,18 @@ templates. Return the updated list."
(t (push (cons name (or value "")) templates)))) (t (push (cons name (or value "")) templates))))
templates) templates)
(defun org-macro--collect-macros (&optional files templates) (defun org-macro--collect-macros ()
"Collect macro definitions in current buffer and setup files. "Collect macro definitions in current buffer and setup files.
Return an alist containing all macro templates found. Return an alist containing all macro templates found."
(let ((templates nil))
FILES is a list of setup files names read so far, used to avoid (pcase (org-collect-keywords '("MACRO"))
circular dependencies. TEMPLATES is the alist collected so far. (`(("MACRO" . ,values))
The two arguments are used in recursive calls." (dolist (value values)
(let ((case-fold-search t)) (when (string-match "^\\(\\S-+\\)[ \t]*" value)
(org-with-point-at 1 (let ((name (match-string 1 value))
(while (re-search-forward "^[ \t]*#\\+\\(MACRO\\|SETUPFILE\\):" nil t) (definition (substring value (match-end 0))))
(let ((element (org-element-at-point))) (setq templates
(when (eq (org-element-type element) 'keyword) (org-macro--set-template name definition templates)))))))
(let ((val (org-element-property :value element)))
(if (equal "MACRO" (org-element-property :key element))
;; Install macro in TEMPLATES.
(when (string-match "^\\(\\S-+\\)[ \t]*" val)
(let ((name (match-string 1 val))
(value (substring val (match-end 0))))
(setq templates
(org-macro--set-template name value templates))))
;; Enter setup file.
(let* ((uri (org-strip-quotes val))
(uri-is-url (org-file-url-p uri))
(uri (if uri-is-url
uri
(expand-file-name uri))))
;; Avoid circular dependencies.
(unless (member uri files)
(with-temp-buffer
(unless uri-is-url
(setq default-directory (file-name-directory uri)))
(org-mode)
(insert (org-file-contents uri 'noerror))
(setq templates
(org-macro--collect-macros
(cons uri files) templates)))))))))))
(let ((macros `(("author" . ,(org-macro--find-keyword-value "AUTHOR")) (let ((macros `(("author" . ,(org-macro--find-keyword-value "AUTHOR"))
("email" . ,(org-macro--find-keyword-value "EMAIL")) ("email" . ,(org-macro--find-keyword-value "EMAIL"))
("title" . ,(org-macro--find-keyword-value "TITLE" t)) ("title" . ,(org-macro--find-keyword-value "TITLE" t))