浏览代码

Update s5 and deck,js slideshow exporters to work with refactored html
backend.

* lisp/ox-html.el (org-html--build-pre/postamble): Add css class to
wrapper div (defaults to `org-pre/postamble-class'). Move spec
building to separate function (`org-html-format-spec').
(org-html-format-spec): New function.
(org-pre/postamble-class): New variable.

* contrib/lisp/ox-deck.el: Replace :html-{pre,post}amble export
options with :deck versions.
(org-deck-postamble): Replaces `org-deck-postamble-template', uses
format-spec (and `org-html-format-spec') instead of custom template
option.
(org-deck-preamble): Replaces `org-deck-postamble-template', uses
format-spec (and `org-html-format-spec') instead of custom template
option.
(org-deck-title-slide-template): Use standard format specs.
(org-deck-template): Use org-html--build-pre/postamble instead of
`org-deck-fill-template'. Use fill-template for title slide (with
standard format specs) instead of custom `org-fill-template'
(org-deck-template-alist): Delete.
(org-deck-postamble-template): Delete.
(org-deck-preamble-template): Delete.

* contrib/lisp/ox-s5.el: Same overall set of changes as ox-deck.
(org-s5-divs): New option, similar usage to `org-html-divs'.
(org-s5-footer-template): Delete.
(org-s5-header-template): Delete.

Rick Frankel 12 年之前
父节点
当前提交
67a17cfe85
共有 3 个文件被更改,包括 195 次插入143 次删除
  1. 67 58
      contrib/lisp/ox-deck.el
  2. 106 72
      contrib/lisp/ox-s5.el
  3. 22 13
      lisp/ox-html.el

+ 67 - 58
contrib/lisp/ox-deck.el

@@ -53,8 +53,8 @@
   :options-alist
   :options-alist
   ((:html-link-home "HTML_LINK_HOME" nil nil)
   ((:html-link-home "HTML_LINK_HOME" nil nil)
    (:html-link-up "HTML_LINK_UP" nil nil)
    (:html-link-up "HTML_LINK_UP" nil nil)
-   (:html-postamble nil "html-postamble" nil t)
-   (:html-preamble nil "html-preamble" nil t)
+   (:deck-postamble "DECK_POSTAMBLE" nil org-deck-postamble newline)
+   (:deck-preamble "DECK_PREAMBLE" nil org-deck-preamble newline)
    (:html-head-include-default-style "HTML_INCLUDE_DEFAULT_STYLE" nil nil)
    (:html-head-include-default-style "HTML_INCLUDE_DEFAULT_STYLE" nil nil)
    (:html-head-include-scripts "HTML_INCLUDE_SCRIPTS" nil nil)
    (:html-head-include-scripts "HTML_INCLUDE_SCRIPTS" nil nil)
    (:deck-base-url "DECK_BASE_URL" nil org-deck-base-url)
    (:deck-base-url "DECK_BASE_URL" nil org-deck-base-url)
@@ -166,37 +166,61 @@ Can be overriden with the DECK_BASE_URL property."
   :group 'org-export-deck
   :group 'org-export-deck
   :type 'string)
   :type 'string)
 
 
-(defcustom org-deck-postamble-template
-  "<h1>%author - %title</h1>"
-  "Format template to specify the postamble section of document.
-Completed using `org-fill-template', optional keys include
-%author, %email, %file, %title and %date.
+(defvar org-deck-pre/postamble-styles
+  `((both "left: 5px; width: 100%;")
+    (preamble "position: absolute; top: 10px;")
+    (postamble ""))
+  "Alist of css styles for the preamble, postamble and both respectively.
+Can be overriden in `org-deck-styles'. See also `org-html-divs'.")
+
+(defcustom org-deck-postamble "<h1>%a - %t</h1>"
+  "Non-nil means insert a postamble in HTML export.
+
+When set to a string, use this string
+as the postamble.  When t, insert a string as defined by the
+formatting string in `org-html-postamble-format'.
+
+When set to a function, apply this function and insert the
+returned string.  The function takes the property list of export
+options as its only argument.
 
 
 This is included in the document at the bottom of the content
 This is included in the document at the bottom of the content
 section, and uses the postamble element and id from
 section, and uses the postamble element and id from
 `org-html-divs'. The default places the author and presentation
 `org-html-divs'. The default places the author and presentation
-title at the bottom of each slide. See also
-`org-deck-preamble-postamble-styles'."
-  :group 'org-export-deck
-  :type 'string)
+title at the bottom of each slide.
 
 
-(defcustom org-deck-preamble-template ""
-  "Format template to specify the preamble section of the document.
-Completed using `org-fill-template', optional keys include
-%author, %email, %file, %title and %date.
+The css styling is controlled by `org-deck-pre/postamble-styles'.
 
 
-This is included before the content section of the document and
-would normally be a header for the presentation. See also
-`org-deck-preamble-postamble-styles'."
+Setting :deck-postamble in publishing projects will take
+precedence over this variable."
   :group 'org-export-deck
   :group 'org-export-deck
-  :type 'string)
+  :type '(choice (const :tag "No postamble" nil)
+                 (const :tag "Default formatting string" t)
+                 (string :tag "Custom formatting string")
+                 (function :tag "Function (must return a string)")))
 
 
-(defvar org-deck-preamble-postamble-styles
-  `((both "left: 5px; width: 100%;")
-    (preamble "position: absolute; top: 10px;")
-    (postamble ""))
-  "Alist of css styles for the preamble, postamble and both respectively.
-Can be overriden in `org-deck-styles'. See also `org-html-divs'.")
+(defcustom org-deck-preamble nil
+  "Non-nil means insert a preamble in HTML export.
+
+When set to a string, use this string
+as the preamble.  When t, insert a string as defined by the
+formatting string in `org-html-preamble-format'.
+
+When set to a function, apply this function and insert the
+returned string.  The function takes the property list of export
+options as its only argument.
+
+This is included in the document at the top of  content section, and
+uses the preamble element and id from `org-html-divs'. The css
+styling is controlled by `org-deck-pre/postamble-styles'.
+
+Setting :deck-preamble in publishing projects will take
+precedence over this variable."
+  :group 'org-export-deck
+  :type '(choice (const :tag "No preamble" nil)
+                 (const :tag "Default formatting string" t)
+                 (string :tag "Custom formatting string")
+                 (function :tag "Function (must return a string)")))
 
 
 (defvar org-deck-toc-styles
 (defvar org-deck-toc-styles
   (mapconcat
   (mapconcat
@@ -207,7 +231,7 @@ Can be overriden in `org-deck-styles'. See also `org-html-divs'.")
     "#table-of-contents li {padding: 0;}") "\n")
     "#table-of-contents li {padding: 0;}") "\n")
   "Default css styles used for formatting a table of contents slide.
   "Default css styles used for formatting a table of contents slide.
 Can be overriden in `org-deck-styles'.
 Can be overriden in `org-deck-styles'.
-Note that when the headline numbering option is true, a \"list-style: none\" 
+Note that when the headline numbering option is true, a \"list-style: none\"
 is automatically added to avoid both numbers and bullets on the toc entries.")
 is automatically added to avoid both numbers and bullets on the toc entries.")
 
 
 (defcustom org-deck-styles
 (defcustom org-deck-styles
@@ -233,13 +257,13 @@ Defaults to styles for the title page."
   :type 'string)
   :type 'string)
 
 
 (defcustom org-deck-title-slide-template
 (defcustom org-deck-title-slide-template
-  "<h1>%title</h1>
-<h2>%author</h2>
-<h2>%email</h2>
-<h2>%date</h2>"
+  "<h1>%t</h1>
+<h2>%a</h2>
+<h2>%e</h2>
+<h2>%d</h2>"
   "Format template to specify title page section.
   "Format template to specify title page section.
-Completed using `org-fill-template', optional keys include
-%author, %email, %file, %title and %date.
+See `org-html-postamble-format' for the valid elements which
+can be included.
 
 
 It will be wrapped in the element defined in the :html-container
 It will be wrapped in the element defined in the :html-container
 property, and defaults to the value of `org-html-container-element',
 property, and defaults to the value of `org-html-container-element',
@@ -349,19 +373,15 @@ the \"slide\" class will be added to the to the list element,
         (replace-regexp-in-string "^<li>" "<li class='slide'>" text)
         (replace-regexp-in-string "^<li>" "<li class='slide'>" text)
       text)))
       text)))
 
 
-(defun org-deck-template-alist (info)
-  (list
-   `("title"  . ,(car (plist-get info :title)))
-   `("author" . ,(car (plist-get info :author)))
-   `("email"  . ,(plist-get info :email))
-   `("date"   . ,(nth 0 (plist-get info :date)))
-   `("file"   . ,(plist-get info :input-file))))
-
 (defun org-deck-template (contents info)
 (defun org-deck-template (contents info)
   "Return complete document string after HTML conversion.
   "Return complete document string after HTML conversion.
 CONTENTS is the transcoded contents string.  INFO is a plist
 CONTENTS is the transcoded contents string.  INFO is a plist
 holding export options."
 holding export options."
-  (let ((pkg-info (org-deck--get-packages info)))
+  (let ((pkg-info (org-deck--get-packages info))
+         (org-html--pre/postamble-class "deck-status")
+         (info (plist-put
+                (plist-put info :html-preamble (plist-get info :deck-preamble))
+                :html-postamble (plist-get info :deck-postamble))))
     (mapconcat
     (mapconcat
      'identity
      'identity
      (list
      (list
@@ -401,31 +421,25 @@ holding export options."
       (format "#%s, #%s {%s}"
       (format "#%s, #%s {%s}"
               (nth 2 (assq 'preamble org-html-divs))
               (nth 2 (assq 'preamble org-html-divs))
               (nth 2 (assq 'postamble org-html-divs))
               (nth 2 (assq 'postamble org-html-divs))
-              (nth 1 (assq 'both org-deck-preamble-postamble-styles)))
+              (nth 1 (assq 'both org-deck-pre/postamble-styles)))
       (format "#%s {%s}"
       (format "#%s {%s}"
               (nth 2 (assq 'preamble org-html-divs))
               (nth 2 (assq 'preamble org-html-divs))
-              (nth 1 (assq 'preamble org-deck-preamble-postamble-styles)))
+              (nth 1 (assq 'preamble org-deck-pre/postamble-styles)))
       (format "#%s {%s}"
       (format "#%s {%s}"
               (nth 2 (assq 'postamble org-html-divs))
               (nth 2 (assq 'postamble org-html-divs))
-              (nth 1 (assq 'postamble org-deck-preamble-postamble-styles)))
+              (nth 1 (assq 'postamble org-deck-pre/postamble-styles)))
       org-deck-styles
       org-deck-styles
       "</style>"
       "</style>"
       "</head>"
       "</head>"
       "<body>"
       "<body>"
-      (format "<%s id='%s' class='deck-status'>"
-              (nth 1 (assq 'preamble org-html-divs))
-              (nth 2 (assq 'preamble org-html-divs)))
-      (org-fill-template
-       org-deck-preamble-template (org-deck-template-alist info))
-      (format "</%s>" (nth 1 (assq 'preamble org-html-divs)))
       (format "<%s id='%s' class='deck-container'>"
       (format "<%s id='%s' class='deck-container'>"
               (nth 1 (assq 'content org-html-divs))
               (nth 1 (assq 'content org-html-divs))
               (nth 2 (assq 'content org-html-divs)))
               (nth 2 (assq 'content org-html-divs)))
+      (org-html--build-pre/postamble 'preamble info)
       ;; title page
       ;; title page
       (format "<%s id='title-slide' class='slide'>"
       (format "<%s id='title-slide' class='slide'>"
               (plist-get info :html-container))
               (plist-get info :html-container))
-      (org-fill-template
-       org-deck-title-slide-template (org-deck-template-alist info))
+      (format-spec org-deck-title-slide-template (org-html-format-spec info))
       (format "</%s>" (plist-get info :html-container))
       (format "</%s>" (plist-get info :html-container))
       ;; toc page
       ;; toc page
       (let ((depth (plist-get info :with-toc)))
       (let ((depth (plist-get info :with-toc)))
@@ -436,12 +450,7 @@ holding export options."
          (with-temp-buffer (insert-file-contents snippet)
          (with-temp-buffer (insert-file-contents snippet)
                            (buffer-string)))
                            (buffer-string)))
        (plist-get pkg-info :snippets) "\n")
        (plist-get pkg-info :snippets) "\n")
-      (format "<%s id='%s' class='deck-status'>"
-              (nth 1 (assq 'postamble org-html-divs))
-              (nth 2 (assq 'postamble org-html-divs)))
-      (org-fill-template
-       org-deck-postamble-template (org-deck-template-alist info))
-      (format "</%s>" (nth 1 (assq 'postamble org-html-divs)))
+      (org-html--build-pre/postamble 'postamble info)
       (format "</%s>" (nth 1 (assq 'content org-html-divs)))
       (format "</%s>" (nth 1 (assq 'content org-html-divs)))
       "</body>"
       "</body>"
       "</html>\n") "\n")))
       "</html>\n") "\n")))

+ 106 - 72
contrib/lisp/ox-s5.el

@@ -62,15 +62,16 @@
   :options-alist
   :options-alist
   ((:html-link-home "HTML_LINK_HOME" nil nil)
   ((:html-link-home "HTML_LINK_HOME" nil nil)
    (:html-link-up "HTML_LINK_UP" nil nil)
    (:html-link-up "HTML_LINK_UP" nil nil)
-   (:html-postamble nil "html-postamble" nil t)
-   (:html-preamble nil "html-preamble" nil t)
+   (:s5-postamble "S5_POSTAMBLE" nil org-s5-postamble newline)
+   (:s5-preamble "S5_PREAMBLE" nil org-s5-preamble newline)
    (:html-head-include-default-style "HTML_INCLUDE_DEFAULT_STYLE" nil nil)
    (:html-head-include-default-style "HTML_INCLUDE_DEFAULT_STYLE" nil nil)
    (:html-head-include-scripts "HTML_INCLUDE_SCRIPTS" nil nil)
    (:html-head-include-scripts "HTML_INCLUDE_SCRIPTS" nil nil)
    (:s5-version "S5_VERSION" nil org-s5-version)
    (:s5-version "S5_VERSION" nil org-s5-version)
    (:s5-theme-file "S5_THEME_FILE" nil org-s5-theme-file)
    (:s5-theme-file "S5_THEME_FILE" nil org-s5-theme-file)
    (:s5-ui-url "S5_UI_URL" nil org-s5-ui-url)
    (:s5-ui-url "S5_UI_URL" nil org-s5-ui-url)
    (:s5-default-view "S5_DEFAULT_VIEW" nil org-s5-default-view)
    (:s5-default-view "S5_DEFAULT_VIEW" nil org-s5-default-view)
-   (:s5-control-visibility "S5_CONTROL_VISIBILITY" nil org-s5-control-visibility))
+   (:s5-control-visibility "S5_CONTROL_VISIBILITY" nil
+			   org-s5-control-visibility))
   :translate-alist
   :translate-alist
   ((headline . org-s5-headline)
   ((headline . org-s5-headline)
    (plain-list . org-s5-plain-list)
    (plain-list . org-s5-plain-list)
@@ -117,33 +118,77 @@ Can be overriden with the S5_UI_URL property."
   :group 'org-export-s5
   :group 'org-export-s5
   :type '(choice (const hidden) (const visibile)))
   :type '(choice (const hidden) (const visibile)))
 
 
-(defcustom org-s5-footer-template
-  "<h1>%author - %title</h1>"
-  "Format template to specify footer div.
-Completed using `org-fill-template', optional keys include
-%author, %email, %file, %title and %date.
-
-It will be wrapped in a <div> with the id \"footer\""
+(defcustom org-s5-divs
+  '((preamble  "div" "header")
+    (content   "div" "content")
+    (postamble "div" "footer"))
+  "Alist of the threed section elements for HTML export.
+The car of each entry is one of 'preamble, 'content or 'postamble.
+The cdrs of each entry are the ELEMENT_TYPE and ID for each
+section of the exported document.
+
+Note that changing the defaults for the preamble and postamble
+will break the standard S5 stylesheets. To generate XOXO compatible
+slideshows, change the content ELEMENT_TYPE to \"ul\" or \"ol\"
+and the `org-html-container-element' to \"li\"."
+  :group 'org-export-html
+  :version "24.4"
+  :package-version '(Org . "8.0")
+  :type '(list :greedy t
+	       (list :tag "Preamble"
+		     (const :format "" preamble)
+		     (string :tag "element") (string :tag "     id"))
+	       (list :tag "Content"
+		     (const :format "" content)
+		     (string :tag "element") (string :tag "     id"))
+	       (list :tag "Postamble" (const :format "" postamble)
+		     (string :tag "     id") (string :tag "element"))))
+
+(defcustom org-s5-postamble "<h1>%a - %t</h1>"
+  "Preamble inserted into the S5 layout section.
+When set to a string, use this string as the postamble.
+
+When set to a function, apply this function and insert the
+returned string.  The function takes the property list of export
+options as its only argument.
+
+Setting the S5_POSTAMBLE option -- or the :s5-postamble in publishing
+projects -- will take precedence over this variable.
+
+Note that the default css styling will break if this is set to nil
+or an empty string."
   :group 'org-export-s5
   :group 'org-export-s5
-  :type 'string)
+  :type '(choice (const :tag "No postamble" "&#x20;")
+		 (string :tag "Custom formatting string")
+		 (function :tag "Function (must return a string)")))
+
+(defcustom org-s5-preamble "&#x20;"
+  "Peamble inserted into the S5 layout section.
+
+When set to a string, use this string as the preamble.
+
+When set to a function, apply this function and insert the
+returned string.  The function takes the property list of export
+options as its only argument.
 
 
-(defcustom org-s5-header-template ""
-  "Format template to specify header div.
-Completed using `org-fill-template', optional keys include
-%author, %email, %file, %title and %date.
+Setting S5_PREAMBLE option -- or the :s5-preamble in publishing
+projects -- will take precedence over this variable.
 
 
-It will be wrapped in a <div> with the id \"header\""
+Note that the default css styling will break if this is set to nil
+or an empty string."
   :group 'org-export-s5
   :group 'org-export-s5
-  :type 'string)
+  :type '(choice (const :tag "No preamble" "&#x20;")
+		 (string :tag "Custom formatting string")
+		 (function :tag "Function (must return a string)")))
 
 
 (defcustom org-s5-title-slide-template
 (defcustom org-s5-title-slide-template
-  "<h1>%title</h1>
-<h2>%author</h2>
-<h2>%email</h2>
-<h2>%date</h2>"
+  "<h1>%t</h1>
+<h2>%a</h2>
+<h2>%e</h2>
+<h2>%d</h2>"
   "Format template to specify title page section.
   "Format template to specify title page section.
-Completed using `org-fill-template', optional keys include
-%author, %email, %file, %title and %date.
+See `org-html-postamble-format' for the valid elements which
+can be included.
 
 
 It will be wrapped in the element defined in the :html-container
 It will be wrapped in the element defined in the :html-container
 property, and defaults to the value of `org-html-container-element',
 property, and defaults to the value of `org-html-container-element',
@@ -251,14 +296,6 @@ which will make the list into a \"build\"."
                  " incremental" ""))
                  " incremental" ""))
             contents (org-html-end-plain-list type))))
             contents (org-html-end-plain-list type))))
 
 
-(defun org-s5-template-alist (info)
-  `(
-   ("title"  . ,(car (plist-get info :title)))
-   ("author" . ,(car (plist-get info :author)))
-   ("email"  . ,(plist-get info :email))
-   ("date"   . ,(nth 0 (plist-get info :date)))
-   ("file"   . ,(plist-get info :input-file))))
-
 (defun org-s5-inner-template (contents info)
 (defun org-s5-inner-template (contents info)
   "Return body of document string after HTML conversion.
   "Return body of document string after HTML conversion.
 CONTENTS is the transcoded contents string.  INFO is a plist
 CONTENTS is the transcoded contents string.  INFO is a plist
@@ -269,47 +306,44 @@ holding export options."
   "Return complete document string after HTML conversion.
   "Return complete document string after HTML conversion.
 CONTENTS is the transcoded contents string.  INFO is a plist
 CONTENTS is the transcoded contents string.  INFO is a plist
 holding export options."
 holding export options."
-  (mapconcat
-   'identity
-   (list
-    (plist-get info :html-doctype)
-    (format "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"%s\" xml:lang=\"%s\">"
-            (plist-get info :language) (plist-get info :language))
-    "<head>"
-    (org-s5--build-meta-info info)
-    (org-s5--build-head info)
-    (org-html--build-head info)
-    (org-html--build-mathjax-config info)
-    "</head>"
-    "<body>"
-    "<div class=\"layout\">"
-    "<div id=\"controls\"><!-- no edit --></div>"
-    "<div id=\"currentSlide\"><!-- no edit --></div>"
-     "<div id='header'>"
-    (org-fill-template
-     org-s5-header-template (org-s5-template-alist info))
-    "</div>"
-    "<div id='footer'>"
-    (org-fill-template
-     org-s5-footer-template (org-s5-template-alist info))
-    "</div>"
-    "</div>"
-    (format "<%s id=\"%s\" class=\"presentation\">"
-            (nth 1 (assq 'content org-html-divs))
-            (nth 2 (assq 'content org-html-divs)))
-    ;; title page
-    (format "<%s id='title-slide' class='slide'>"
-            (plist-get info :html-container))
-    (org-fill-template
-     org-s5-title-slide-template (org-s5-template-alist info))
-    (format "</%s>" (plist-get info :html-container))
-    ;; table of contents.
-    (let ((depth (plist-get info :with-toc)))
-      (when depth (org-s5-toc depth info)))
-    contents
-    (format "</%s>" (nth 1 (assq 'content org-html-divs)))
-    "</body>"
-    "</html>\n") "\n"))
+  (let ((org-html-divs org-s5-divs)
+	 (info (plist-put
+		(plist-put info :html-preamble (plist-get info :s5-preamble))
+		:html-postamble (plist-get info :s5-postamble))))
+    (mapconcat
+     'identity
+     (list
+      (plist-get info :html-doctype)
+      (format "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"%s\" xml:lang=\"%s\">"
+	      (plist-get info :language) (plist-get info :language))
+      "<head>"
+      (org-s5--build-meta-info info)
+      (org-s5--build-head info)
+      (org-html--build-head info)
+      (org-html--build-mathjax-config info)
+      "</head>"
+      "<body>"
+      "<div class=\"layout\">"
+      "<div id=\"controls\"><!-- no edit --></div>"
+      "<div id=\"currentSlide\"><!-- no edit --></div>"
+      (org-html--build-pre/postamble 'preamble info)
+      (org-html--build-pre/postamble 'postamble info)
+      "</div>"
+      (format "<%s id=\"%s\" class=\"presentation\">"
+	      (nth 1 (assq 'content org-s5-divs))
+	      (nth 2 (assq 'content org-s5-divs)))
+      ;; title page
+      (format "<%s id='title-slide' class='slide'>"
+	      (plist-get info :html-container))
+      (format-spec org-s5-title-slide-template (org-html-format-spec info))
+      (format "</%s>" (plist-get info :html-container))
+      ;; table of contents.
+      (let ((depth (plist-get info :with-toc)))
+	(when depth (org-s5-toc depth info)))
+      contents
+      (format "</%s>" (nth 1 (assq 'content org-s5-divs)))
+      "</body>"
+      "</html>\n") "\n")))
 
 
 (defun org-s5-export-as-html
 (defun org-s5-export-as-html
   (&optional async subtreep visible-only body-only ext-plist)
   (&optional async subtreep visible-only body-only ext-plist)

+ 22 - 13
lisp/ox-html.el

@@ -140,6 +140,9 @@
   "FORMAT used by `format-time-string' for timestamps in
   "FORMAT used by `format-time-string' for timestamps in
 preamble, postamble and metadata.")
 preamble, postamble and metadata.")
 
 
+(defvar org-html--pre/postamble-class "status"
+  "CSS class used for pre/postamble")
+
 (defconst org-html-special-string-regexps
 (defconst org-html-special-string-regexps
   '(("\\\\-" . "&#x00ad;")		; shy
   '(("\\\\-" . "&#x00ad;")		; shy
     ("---\\([^-]\\)" . "&#x2014;\\1")	; mdash
     ("---\\([^-]\\)" . "&#x2014;\\1")	; mdash
@@ -1487,22 +1490,27 @@ INFO is a plist used as a communication channel."
       ;; Return the modified template.
       ;; Return the modified template.
       (org-element-normalize-string template))))
       (org-element-normalize-string template))))
 
 
+(defun org-html-format-spec (info)
+  "Return format specification for elements that can be
+used in the preamble or postamble."
+  `((?t . ,(org-export-data (plist-get info :title) info))
+    (?d . ,(org-export-data (plist-get info :date) info))
+    (?T . ,(format-time-string org-html--timestamp-format))
+    (?a . ,(org-export-data (plist-get info :author) info))
+    (?e . ,(mapconcat
+	    (lambda (e)
+	      (format "<a href=\"mailto:%s\">%s</a>" e e))
+	    (split-string (plist-get info :email)  ",+ *")
+	    ", "))
+    (?c . ,(plist-get info :creator))
+    (?v . ,(or org-html-validation-link ""))))
+
 (defun org-html--build-pre/postamble (type info)
 (defun org-html--build-pre/postamble (type info)
   "Return document preamble or postamble as a string, or nil.
   "Return document preamble or postamble as a string, or nil.
 TYPE is either 'preamble or 'postamble, INFO is a plist used as a
 TYPE is either 'preamble or 'postamble, INFO is a plist used as a
 communication channel."
 communication channel."
   (let ((section (plist-get info (intern (format ":html-%s" type))))
   (let ((section (plist-get info (intern (format ":html-%s" type))))
-	(spec `((?t . ,(org-export-data (plist-get info :title) info))
-		(?d . ,(org-export-data (plist-get info :date) info))
-		(?T . ,(format-time-string org-html--timestamp-format))
-		(?a . ,(org-export-data (plist-get info :author) info))
-		(?e . ,(mapconcat
-			(lambda (e)
-			  (format "<a href=\"mailto:%s\">%s</a>" e e))
-			(split-string (plist-get info :email)  ",+ *")
-			", "))
-		(?c . ,(plist-get info :creator))
-		(?v . ,(or org-html-validation-link "")))))
+	(spec (org-html-format-spec info)))
     (when section
     (when section
       (let ((section-contents
       (let ((section-contents
 	     (if (functionp section) (funcall section info)
 	     (if (functionp section) (funcall section info)
@@ -1554,9 +1562,10 @@ communication channel."
 		    spec))))))
 		    spec))))))
 	(when (org-string-nw-p section-contents)
 	(when (org-string-nw-p section-contents)
 	  (concat
 	  (concat
-	   (format "<%s id=\"%s\">\n"
+	   (format "<%s id=\"%s\" class=\"%s\">\n"
 		   (nth 1 (assq type org-html-divs))
 		   (nth 1 (assq type org-html-divs))
-		   (nth 2 (assq type org-html-divs)))
+		   (nth 2 (assq type org-html-divs))
+		   org-html--pre/postamble-class)
 	   (org-element-normalize-string section-contents)
 	   (org-element-normalize-string section-contents)
 	   (format "</%s>\n" (nth 1 (assq type org-html-divs)))))))))
 	   (format "</%s>\n" (nth 1 (assq type org-html-divs)))))))))