emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Enhance org-html--build-meta-info


From: TEC
Subject: Re: [PATCH] Enhance org-html--build-meta-info
Date: Sat, 26 Sep 2020 01:48:44 +0800
User-agent: mu4e 1.4.13; emacs 27.1

@Maintainers I think this is ready for a review.

Jens Lechtenboerger <lechten@wi.uni-muenster.de> writes:

> My suggestion would be to go with the handling of description in all
> cases, including the title.

Currently the only element handled differently to
`org-html-encode-plain-text' is "author". I don't know why so I don't
want to touch it.

> I added keywords to my OER presentations because some crawlers use
> them to extract topics for classification of documents.  I’d like to
> keep that.

Re-added.

Let me know if there's anything else,

Timothy.

-----
Updated patch below:


>From da3878493a8c7097bf44add925696ede86ede661 Mon Sep 17 00:00:00 2001
From: TEC <tec@tecosaur.com>
Subject: [PATCH] lisp/ox-html.el: make html meta func nicer

* lisp/ox-html.el (org-html--build-meta-info): Multi-line repeated
structure extracted to new function `org-html--build-meta-entry'.
The opportunity was taken to extract most metadata info to custom
variable `org-html-meta-tags', allowing for easy end-user modification.
---
 lisp/ox-html.el | 115 +++++++++++++++++++++++++++---------------------
 1 file changed, 65 insertions(+), 50 deletions(-)

diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..6efb76e12 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,28 @@ not be modified."
 
 ;;;; Template :: Styles
 
+(defcustom org-html-meta-tags
+  '((lambda (_title author _info)
+      (when (org-string-nw-p author)
+       (list "name" "author" author)))
+    (lambda (_title _author info)
+      (when (org-string-nw-p (plist-get info :description))
+       (list "name" "description"
+                                   (plist-get info :description))))
+    ("name" "generator" "Org Mode"))
+  "A list of arguments to be passed to `org-html--build-meta-entry'.
+Each argument can either be an list which is applied, or a function which
+generates such a list 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 '(repeat
+         (choice
+          (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,23 +1857,32 @@ INFO is a plist used as a communication channel."

 ;;; Template
 
+(defun org-html--build-meta-entry (label identity &optional content-format 
&rest content-formatters)
+  "Construct <meta> tag with LABEL=\"IDENTITY\" and content from 
CONTENT-FORMAT and CONTENT-FORMATTER."
+  (concat "<meta "
+         (format "%s=\"%s" label identity)
+         (when content-format
+           (concat "\" content=\""
+                   (replace-regexp-in-string
+                    "\"" "&quot;"
+                    (org-html-encode-plain-text
+                     (if content-formatters
+                         (apply #'format content-format content-formatters)
+                       content-format)))))
+         "\" />\n"))
+
 (defun org-html--build-meta-info (info)
   "Return meta tags for exported document.
 INFO is a plist used as a communication channel."
-  (let* ((protect-string
-          (lambda (str)
-            (replace-regexp-in-string
-             "\"" "&quot;" (org-html-encode-plain-text str))))
-         (title (org-export-data (plist-get info :title) info))
+  (let* ((title (org-html-encode-plain-text (plist-get info :title) info))
          ;; Set title to an invisible character instead of leaving it
          ;; empty, which is invalid.
          (title (if (org-string-nw-p title) title "&lrm;"))
          (author (and (plist-get info :with-author)
                       (let ((auth (plist-get info :author)))
-                       ;; Return raw Org syntax.
+         ;; Return raw Org syntax.
                         (and auth (org-element-interpret-data auth)))))
-         (description (plist-get info :description))
-         (keywords (plist-get info :keywords))
+        (keywords (plist-get info :keywords))
          (charset (or (and org-html-coding-system
                            (fboundp 'coding-system-get)
                            (coding-system-get org-html-coding-system
@@ -1863,50 +1894,34 @@ INFO is a plist used as a communication channel."
        (concat "<!-- "
                (plist-get info :html-metadata-timestamp-format)
                " -->\n")))
-     (format
-      (if (org-html-html5-p info)
-         (org-html-close-tag "meta" "charset=\"%s\"" info)
-       (org-html-close-tag
-        "meta" "http-equiv=\"Content-Type\" content=\"text/html;charset=%s\""
-        info))
-      charset) "\n"
+
+     (if (org-html-html5-p info)
+        (org-html--build-meta-entry "charset" charset)
+       (org-html--build-meta-entry "http-equiv" "Content-Type"
+                                  (concat "text/html;charset=" charset)))
+
      (let ((viewport-options
-           (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
-                             (plist-get info :html-viewport))))
-       (and viewport-options
-           (concat
-            (org-html-close-tag
-             "meta"
-             (format "name=\"viewport\" content=\"%s\""
-                     (mapconcat
-                      (lambda (elm) (format "%s=%s" (car elm) (cadr elm)))
-                      viewport-options ", "))
-             info)
-            "\n")))
+            (cl-remove-if-not (lambda (cell) (org-string-nw-p (cadr cell)))
+                              (plist-get info :html-viewport))))
+       (if viewport-options
+           (org-html--build-meta-entry "name" "viewport"
+                                       (mapconcat
+                                        (lambda (elm) (format "%s=%s" (car 
elm) (cadr elm)))
+                                        viewport-options ", "))))
+
      (format "<title>%s</title>\n" title)
-     (org-html-close-tag "meta" "name=\"generator\" content=\"Org mode\"" info)
-     "\n"
-     (and (org-string-nw-p author)
-         (concat
-          (org-html-close-tag "meta"
-                              (format "name=\"author\" content=\"%s\""
-                                      (funcall protect-string author))
-                              info)
-          "\n"))
-     (and (org-string-nw-p description)
-         (concat
-          (org-html-close-tag "meta"
-                              (format "name=\"description\" content=\"%s\"\n"
-                                      (funcall protect-string description))
-                              info)
-          "\n"))
-     (and (org-string-nw-p keywords)
-         (concat
-          (org-html-close-tag "meta"
-                              (format "name=\"keywords\" content=\"%s\""
-                                      (funcall protect-string keywords))
-                              info)
-          "\n")))))
+
+     (when keywords
+       (org-html--build-meta-entry "keywords" keywords))
+
+     (apply #'concat
+           (mapcar
+            (lambda (form)
+              (when (functionp form)
+                (setq form (funcall form title author info)))
+              (when form
+                (apply #'org-html--build-meta-entry form)))
+            org-html-meta-tags)))))
 
 (defun org-html--build-head (info)
   "Return information for the <head>..</head> of the HTML output.
-- 
2.28.0



reply via email to

[Prev in Thread] Current Thread [Next in Thread]