From ddb0f73a9e60cdd9fd83a01e8bd0f72716f2bb06 Mon Sep 17 00:00:00 2001 From: TEC Date: Mon, 14 Dec 2020 17:50:15 +0800 Subject: [PATCH 2/2] lisp/ox-html.el: make html meta tags customizable * lisp/ox-html.el (org-html-meta-tags): Introduce this as a new option which can be modified to set the meta tags added in HTML exports. (org-html--build-meta-info): Make use of `org-html-meta-tags' instead of hardcoded meta tags. This is leveraging the earlier restructuring of `org-html--build-meta-info' into a much DRYer form, such that this modification has a negligible impact on complexity and readability. --- lisp/ox-html.el | 57 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/lisp/ox-html.el b/lisp/ox-html.el index f74c6a4..9446f54 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -1425,6 +1425,22 @@ not be modified." ;;;; Template :: Styles +(defcustom org-html-meta-tags #'org-html-meta-tags-default + "A list where each item is a list of arguments to be passed +to `org-html--build-meta-entry'. Any nil items are ignored. + +Also accept a function which gives such a list when called with with +signature (TITLE AUTHOR INFO) where TITLE and AUTHOR are strings, +and INFO a communication plist." + :group 'org-export-html + :package-version '(Org . "9.5") + :type '(choice + (repeat + (list (string :tag "Meta label") + (string :tag "label value") + (string :tag "Content value"))) + function)) + (defcustom org-html-head-include-default-style t "Non-nil means include the default style in exported HTML files. The actual style is defined in `org-html-style-default' and @@ -1835,6 +1851,27 @@ INFO is a plist used as a communication channel." ;;; Template +(defun org-html-meta-tags-default (info) + "Generate a list items, each of which is a list of arguments that can +be passed to `org-html--build-meta-entry', to generate meta tags to be +included in the HTML head. + +The documents's TITLE, AUTHOR, and communication plist INFO may be used." + (let ((author (and (plist-get info :with-author) + (let ((auth (plist-get info :author))) + ;; Return raw Org syntax. + (and auth (org-html-plain-text + (org-element-interpret-data auth) info)))))) + (list + (when (org-string-nw-p author) + (list "name" "author" author)) + (when (org-string-nw-p (plist-get info :description)) + (list "name" "description" + (plist-get info :description))) + (when (org-string-nw-p (plist-get info :keywords)) + (list "name" "keywords" (plist-get info :keywords))) + '("name" "generator" "Org Mode")))) + (defun org-html--build-meta-entry (label identity &optional content-format &rest content-formatters) "Construct tag of form , or when CONTENT-FORMAT is present: @@ -1861,11 +1898,6 @@ INFO is a plist used as a communication channel." ;; Set title to an invisible character instead of leaving it ;; empty, which is invalid. (title (if (org-string-nw-p title) title "‎")) - (author (and (plist-get info :with-author) - (let ((auth (plist-get info :author))) - ;; Return raw Org syntax. - (and auth (org-html-plain-text - (org-element-interpret-data auth) info))))) (charset (or (and org-html-coding-system (fboundp 'coding-system-get) (symbol-name @@ -1895,16 +1927,11 @@ INFO is a plist used as a communication channel." (format "%s\n" title) - (when (org-string-nw-p author) - (org-html--build-meta-entry "name" "author" author)) - - (when (org-string-nw-p (plist-get info :description)) - (org-html--build-meta-entry "name" "description" (plist-get info :description))) - - (when (org-string-nw-p (plist-get info :keywords)) - (org-html--build-meta-entry "keywords" (plist-get info :keywords))) - - (org-html--build-meta-entry "name" "generator" "Org Mode")))) + (mapconcat + (lambda (args) (apply #'org-html--build-meta-entry args)) + (delq nil (if (functionp org-html-meta-tags) + (funcall org-html-meta-tags info) + org-html-meta-tags)) "")))) (defun org-html--build-head (info) "Return information for the .. of the HTML output. -- 2.29.2