branch: externals/denote commit a648205dc9db1a4c0f3d22c196b20a8528627e2c Author: Protesilaos Stavrou <i...@protesilaos.com> Commit: Protesilaos Stavrou <i...@protesilaos.com>
Define macro to consolidate front matter retrieval functions --- denote.el | 52 ++++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/denote.el b/denote.el index 8f5b9bff32..a64e8284bf 100644 --- a/denote.el +++ b/denote.el @@ -1739,36 +1739,28 @@ Subroutine of `denote--file-with-temp-buffer'." (goto-char (point-min)) ,@body))) -(defun denote-retrieve-front-matter-title-value (file file-type) - "Return title value from FILE front matter per FILE-TYPE." - (when file-type - (denote--file-with-temp-buffer file - (when (re-search-forward (denote--title-key-regexp file-type) nil t 1) - (funcall (denote--title-value-reverse-function file-type) - (buffer-substring-no-properties (point) (line-end-position))))))) - -(defun denote-retrieve-front-matter-title-line (file file-type) - "Return title line from FILE front matter per FILE-TYPE." - (when file-type - (denote--file-with-temp-buffer file - (when (re-search-forward (denote--title-key-regexp file-type) nil t 1) - (buffer-substring-no-properties (line-beginning-position) (line-end-position)))))) - -(defun denote-retrieve-front-matter-keywords-value (file file-type) - "Return keywords value from FILE front matter per FILE-TYPE. -The return value is a list of strings." - (when file-type - (denote--file-with-temp-buffer file - (when (re-search-forward (denote--keywords-key-regexp file-type) nil t 1) - (funcall (denote--keywords-value-reverse-function file-type) - (buffer-substring-no-properties (point) (line-end-position))))))) - -(defun denote-retrieve-front-matter-keywords-line (file file-type) - "Return keywords line from FILE front matter per FILE-TYPE." - (when file-type - (denote--file-with-temp-buffer file - (when (re-search-forward (denote--keywords-key-regexp file-type) nil t 1) - (buffer-substring-no-properties (line-beginning-position) (line-end-position)))))) +(defmacro denote--define-retrieve-front-matter (component scope) + "Define a function to retrieve front matter for COMPONENT given SCOPE. +The COMPONENT is one of the file name components that has a +corresponding front matter entry. SCOPE is a symbol of either `value' +or `line', referring to what to match and retrieve." + (declare (indent 1)) + `(defun ,(intern (format "denote-retrieve-front-matter-%s-%s" component scope)) (file file-type) + (when file-type + (denote--file-with-temp-buffer file + (when (re-search-forward (,(intern (format "denote--%s-key-regexp" component)) file-type) nil t 1) + ,(cond + ((eq scope 'value) + `(funcall (,(intern (format "denote--%s-value-reverse-function" component)) file-type) + (buffer-substring-no-properties (point) (line-end-position)))) + ((eq scope 'line) + '(buffer-substring-no-properties (line-beginning-position) (line-end-position))) + (t (error "`%s' is not a known scope" scope)))))))) + +(denote--define-retrieve-front-matter title value) +(denote--define-retrieve-front-matter title line) +(denote--define-retrieve-front-matter keywords value) +(denote--define-retrieve-front-matter keywords line) (defalias 'denote-retrieve-title-value 'denote-retrieve-front-matter-title-value "Alias for `denote-retrieve-front-matter-title-value'.")