diff --git a/doc/org.texi b/doc/org.texi index 63ab06a86..c1d066715 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -14260,6 +14260,7 @@ however, override everything. @item @code{:html-use-infojs} @tab @code{org-html-use-infojs} @item @code{:html-use-unicode-chars} @tab @code{org-html-use-unicode-chars} @item @code{:html-validation-link} @tab @code{org-html-validation-link} +@item @code{:html-viewport} @tab @code{org-html-viewport} @item @code{:html-xml-declaration} @tab @code{org-html-xml-declaration} @end multitable diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index e017d8003..ad2d922e3 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -353,6 +353,9 @@ However, parsed =KEYWORD= is automatically associated to an =:EXPORT_KEYWORD:= property, which can be used to override the keyword value during a subtree export. Moreover, macros are expanded in such keywords and properties. +*** Viewport support in html export +Viewport for mobile-optimized website is now automatically inserted +when exporting to html. See ~org-html-viewport~ for details. ** Miscellaneous *** Strip all meta data from ITEM special property ITEM special property does not contain TODO, priority or tags anymore. diff --git a/lisp/ox-html.el b/lisp/ox-html.el index 8c6406b50..5b9d1194d 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -162,6 +162,7 @@ (:html-use-infojs nil nil org-html-use-infojs) (:html-use-unicode-chars nil nil org-html-use-unicode-chars) (:html-validation-link nil nil org-html-validation-link) + (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) (:html-table-attributes nil nil org-html-table-default-attributes) (:html-table-row-tags nil nil org-html-table-row-tags) @@ -1403,6 +1404,53 @@ or for publication projects using the :html-head-extra property." ;;;###autoload (put 'org-html-head-extra 'safe-local-variable 'stringp) +;;;; Template :: Viewport + +(defcustom org-html-viewport '((width "device-width") + (initial-scale "1") + (minimum-scale "") + (maximum-scale "") + (user-scalable "")) + "Viewport options for mobile-optimized sites. + +The following values are recognized + +width Size of the viewport. +initial-scale Zoom level when the page is first loaded. +minimum-scale Minimum allowed zoom level. +maximum-scale Maximum allowed zoom level. +user-scalable Whether zoom can be changed. + +The viewport meta tag is inserted if this variable is non-nil. + +See the following site for a reference: +https://developer.mozilla.org/en-US/docs/Mozilla/Mobile/Viewport_meta_tag" + :group 'org-export-html + :version "25.1" + :package-version '(Org . "8.3") + :type '(list :greedy t + (list :tag "Width of viewport" + (const :format " " width) + (choice (const :tag "unset" "") + (string))) + (list :tag "Initial scale" + (const :format " " initial-scale) + (choice (const :tag "unset" "") + (string))) + (list :tag "Minimum scale/zoom" + (const :format " " minimum-scale) + (choice (const :tag "unset" "") + (string))) + (list :tag "Maximum scale/zoom" + (const :format " " maximum-scale) + (choice (const :tag "unset" "") + (string))) + (list :tag "User scalable/zoomable" + (const :format " " user-scalable) + (choice (const :tag "unset" "") + (const "true") + (const "false"))))) + ;;;; Todos (defcustom org-html-todo-kwd-class-prefix "" @@ -1681,7 +1729,20 @@ INFO is a plist used as a communication channel." (format " name=\"keywords\" content=\"%s\"" (funcall protect-string keywords)) info) - "\n"))))) + "\n")) + (let ((viewport-options + (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 ", ")) + info) + "\n")))))) (defun org-html--build-head (info) "Return information for the .. of the HTML output.