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: Mon, 28 Sep 2020 01:39:51 +0800
User-agent: mu4e 1.4.13; emacs 27.1


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

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 believe that was also the previous conclusion. However, as this
is not documented, maybe now could be the chance to change this?

Hmm. Maybe, it sounds like some tests may be in order.

I must I admit that I do not fully understand your approach.

Why do you treat keywords and description differently (with
description in org-html-meta-tags and keywords in
org-html--build-meta-info)?

Ooops, that should have been in org-html-meta-tags as the rest are.
[Fixed]

Why do you pass _title into the lambda expressions in
org-html-meta-tags when it is never used? Currently, the variable
org-html-meta-tags does not seem user-friendly to me.

Title and author just seemed like the most likely useful information for customisation. It would be nice if it looked less boiler-plate-y, but I'm not sure what the best approach for that would be, and it's already
miles better than the current.
If you have any ideas, please let me know.

Also, in org-html--build-meta-info you call
org-html-encode-plain-text with two arguments, but it just accepts
one.

? No I don't.

Best wishes
Jens

Hope that clarifies things a bit,

Timothy.


------
Moved the keyword in with the rest.



From 889ae918aed267417825d565df9135221dae16b1 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 | 114 +++++++++++++++++++++++++++---------------------
1 file changed, 64 insertions(+), 50 deletions(-)

diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index d2f24f5c6..46195b0e0 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -1425,6 +1425,31 @@ 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))))
+    (lambda (_title _author info)
+      (when (org-string-nw-p (plist-get info :keywords))
+       (list "keywords" (plist-get info :keywords))))
+    ("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 +1860,31 @@ 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))
         (charset (or (and org-html-coding-system
                           (fboundp 'coding-system-get)
(coding-system-get org-html-coding-system @@ -1863,50 +1896,31 @@ 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")))))
+
+     (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]