diff options
Diffstat (limited to 'elpa/org-9.5.2/ox-html.el')
-rw-r--r-- | elpa/org-9.5.2/ox-html.el | 3895 |
1 files changed, 0 insertions, 3895 deletions
diff --git a/elpa/org-9.5.2/ox-html.el b/elpa/org-9.5.2/ox-html.el deleted file mode 100644 index a150b1f..0000000 --- a/elpa/org-9.5.2/ox-html.el +++ /dev/null @@ -1,3895 +0,0 @@ -;;; ox-html.el --- HTML Back-End for Org Export Engine -*- lexical-binding: t; -*- - -;; Copyright (C) 2011-2021 Free Software Foundation, Inc. - -;; Author: Carsten Dominik <carsten.dominik@gmail.com> -;; Jambunathan K <kjambunathan at gmail dot com> -;; Maintainer: TEC <tecosaur@gmail.com> -;; Keywords: outlines, hypermedia, calendar, wp - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. - -;;; Commentary: - -;; This library implements a HTML back-end for Org generic exporter. -;; See Org manual for more information. - -;;; Code: - -;;; Dependencies - -(require 'cl-lib) -(require 'format-spec) -(require 'ox) -(require 'ox-publish) -(require 'table) - - -;;; Function Declarations - -(declare-function org-id-find-id-file "org-id" (id)) -(declare-function htmlize-region "ext:htmlize" (beg end)) -(declare-function mm-url-decode-entities "mm-url" ()) - -(defvar htmlize-css-name-prefix) -(defvar htmlize-output-type) -(defvar htmlize-output-type) -(defvar htmlize-css-name-prefix) - -;;; Define Back-End - -(org-export-define-backend 'html - '((bold . org-html-bold) - (center-block . org-html-center-block) - (clock . org-html-clock) - (code . org-html-code) - (drawer . org-html-drawer) - (dynamic-block . org-html-dynamic-block) - (entity . org-html-entity) - (example-block . org-html-example-block) - (export-block . org-html-export-block) - (export-snippet . org-html-export-snippet) - (fixed-width . org-html-fixed-width) - (footnote-reference . org-html-footnote-reference) - (headline . org-html-headline) - (horizontal-rule . org-html-horizontal-rule) - (inline-src-block . org-html-inline-src-block) - (inlinetask . org-html-inlinetask) - (inner-template . org-html-inner-template) - (italic . org-html-italic) - (item . org-html-item) - (keyword . org-html-keyword) - (latex-environment . org-html-latex-environment) - (latex-fragment . org-html-latex-fragment) - (line-break . org-html-line-break) - (link . org-html-link) - (node-property . org-html-node-property) - (paragraph . org-html-paragraph) - (plain-list . org-html-plain-list) - (plain-text . org-html-plain-text) - (planning . org-html-planning) - (property-drawer . org-html-property-drawer) - (quote-block . org-html-quote-block) - (radio-target . org-html-radio-target) - (section . org-html-section) - (special-block . org-html-special-block) - (src-block . org-html-src-block) - (statistics-cookie . org-html-statistics-cookie) - (strike-through . org-html-strike-through) - (subscript . org-html-subscript) - (superscript . org-html-superscript) - (table . org-html-table) - (table-cell . org-html-table-cell) - (table-row . org-html-table-row) - (target . org-html-target) - (template . org-html-template) - (timestamp . org-html-timestamp) - (underline . org-html-underline) - (verbatim . org-html-verbatim) - (verse-block . org-html-verse-block)) - :filters-alist '((:filter-options . org-html-infojs-install-script) - (:filter-parse-tree . org-html-image-link-filter) - (:filter-final-output . org-html-final-function)) - :menu-entry - '(?h "Export to HTML" - ((?H "As HTML buffer" org-html-export-as-html) - (?h "As HTML file" org-html-export-to-html) - (?o "As HTML file and open" - (lambda (a s v b) - (if a (org-html-export-to-html t s v b) - (org-open-file (org-html-export-to-html nil s v b))))))) - :options-alist - '((:html-doctype "HTML_DOCTYPE" nil org-html-doctype) - (:html-container "HTML_CONTAINER" nil org-html-container-element) - (:html-content-class "HTML_CONTENT_CLASS" nil org-html-content-class) - (:description "DESCRIPTION" nil nil newline) - (:keywords "KEYWORDS" nil nil space) - (:html-html5-fancy nil "html5-fancy" org-html-html5-fancy) - (:html-link-use-abs-url nil "html-link-use-abs-url" org-html-link-use-abs-url) - (:html-link-home "HTML_LINK_HOME" nil org-html-link-home) - (:html-link-up "HTML_LINK_UP" nil org-html-link-up) - (:html-mathjax "HTML_MATHJAX" nil "" space) - (:html-equation-reference-format "HTML_EQUATION_REFERENCE_FORMAT" nil org-html-equation-reference-format t) - (:html-postamble nil "html-postamble" org-html-postamble) - (:html-preamble nil "html-preamble" org-html-preamble) - (:html-head "HTML_HEAD" nil org-html-head newline) - (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) - (:subtitle "SUBTITLE" nil nil parse) - (:html-head-include-default-style - nil "html-style" org-html-head-include-default-style) - (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) - (:html-allow-name-attribute-in-anchors - nil nil org-html-allow-name-attribute-in-anchors) - (:html-divs nil nil org-html-divs) - (:html-checkbox-type nil nil org-html-checkbox-type) - (:html-extension nil nil org-html-extension) - (:html-footnote-format nil nil org-html-footnote-format) - (:html-footnote-separator nil nil org-html-footnote-separator) - (:html-footnotes-section nil nil org-html-footnotes-section) - (:html-format-drawer-function nil nil org-html-format-drawer-function) - (:html-format-headline-function nil nil org-html-format-headline-function) - (:html-format-inlinetask-function - nil nil org-html-format-inlinetask-function) - (:html-home/up-format nil nil org-html-home/up-format) - (:html-indent nil nil org-html-indent) - (:html-infojs-options nil nil org-html-infojs-options) - (:html-infojs-template nil nil org-html-infojs-template) - (:html-inline-image-rules nil nil org-html-inline-image-rules) - (:html-link-org-files-as-html nil nil org-html-link-org-files-as-html) - (:html-mathjax-options nil nil org-html-mathjax-options) - (:html-mathjax-template nil nil org-html-mathjax-template) - (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) - (:html-postamble-format nil nil org-html-postamble-format) - (:html-preamble-format nil nil org-html-preamble-format) - (:html-prefer-user-labels nil nil org-html-prefer-user-labels) - (:html-self-link-headlines nil nil org-html-self-link-headlines) - (:html-table-align-individual-fields - nil nil org-html-table-align-individual-fields) - (:html-table-caption-above nil nil org-html-table-caption-above) - (:html-table-data-tags nil nil org-html-table-data-tags) - (:html-table-header-tags nil nil org-html-table-header-tags) - (:html-table-use-header-tags-for-first-column - nil nil org-html-table-use-header-tags-for-first-column) - (:html-tag-class-prefix nil nil org-html-tag-class-prefix) - (:html-text-markup-alist nil nil org-html-text-markup-alist) - (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) - (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) - (:html-use-infojs nil nil org-html-use-infojs) - (: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-open-tag nil nil org-html-table-row-open-tag) - (:html-table-row-close-tag nil nil org-html-table-row-close-tag) - (:html-xml-declaration nil nil org-html-xml-declaration) - (:html-wrap-src-lines nil nil org-html-wrap-src-lines) - (:html-klipsify-src nil nil org-html-klipsify-src) - (:html-klipse-css nil nil org-html-klipse-css) - (:html-klipse-js nil nil org-html-klipse-js) - (:html-klipse-selection-script nil nil org-html-klipse-selection-script) - (:infojs-opt "INFOJS_OPT" nil nil) - ;; Redefine regular options. - (:creator "CREATOR" nil org-html-creator-string) - (:with-latex nil "tex" org-html-with-latex) - ;; Retrieve LaTeX header for fragments. - (:latex-header "LATEX_HEADER" nil nil newline))) - - -;;; Internal Variables - -(defvar org-html-format-table-no-css) -(defvar htmlize-buffer-places) ; from htmlize.el - -(defvar org-html--pre/postamble-class "status" - "CSS class used for pre/postamble.") - -(defconst org-html-doctype-alist - '(("html4-strict" . "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" -\"http://www.w3.org/TR/html4/strict.dtd\">") - ("html4-transitional" . "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" -\"http://www.w3.org/TR/html4/loose.dtd\">") - ("html4-frameset" . "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" -\"http://www.w3.org/TR/html4/frameset.dtd\">") - - ("xhtml-strict" . "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" -\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">") - ("xhtml-transitional" . "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" -\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">") - ("xhtml-frameset" . "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" -\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">") - ("xhtml-11" . "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" -\"http://www.w3.org/TR/xhtml1/DTD/xhtml11.dtd\">") - - ("html5" . "<!DOCTYPE html>") - ("xhtml5" . "<!DOCTYPE html>")) - "An alist mapping (x)html flavors to specific doctypes.") - -(defconst org-html-html5-elements - '("article" "aside" "audio" "canvas" "details" "figcaption" - "figure" "footer" "header" "menu" "meter" "nav" "output" - "progress" "section" "summary" "video") - "New elements in html5. - -For blocks that should contain headlines, use the HTML_CONTAINER -property on the headline itself.") - -(defconst org-html-special-string-regexps - '(("\\\\-" . "­") ; shy - ("---\\([^-]\\)" . "—\\1") ; mdash - ("--\\([^-]\\)" . "–\\1") ; ndash - ("\\.\\.\\." . "…")) ; hellip - "Regular expressions for special string conversion.") - -(defcustom org-html-scripts - "<script> -// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later - function CodeHighlightOn(elem, id) - { - var target = document.getElementById(id); - if(null != target) { - elem.classList.add(\"code-highlighted\"); - target.classList.add(\"code-highlighted\"); - } - } - function CodeHighlightOff(elem, id) - { - var target = document.getElementById(id); - if(null != target) { - elem.classList.remove(\"code-highlighted\"); - target.classList.remove(\"code-highlighted\"); - } - } -// @license-end -</script>" - "Basic JavaScript to allow highlighting references in code blocks." - :group 'org-export-html - :package-version '(Org . "9.5") - :type 'string) - -(defcustom org-html-style-default - "<style> - #content { max-width: 60em; margin: auto; } - .title { text-align: center; - margin-bottom: .2em; } - .subtitle { text-align: center; - font-size: medium; - font-weight: bold; - margin-top:0; } - .todo { font-family: monospace; color: red; } - .done { font-family: monospace; color: green; } - .priority { font-family: monospace; color: orange; } - .tag { background-color: #eee; font-family: monospace; - padding: 2px; font-size: 80%; font-weight: normal; } - .timestamp { color: #bebebe; } - .timestamp-kwd { color: #5f9ea0; } - .org-right { margin-left: auto; margin-right: 0px; text-align: right; } - .org-left { margin-left: 0px; margin-right: auto; text-align: left; } - .org-center { margin-left: auto; margin-right: auto; text-align: center; } - .underline { text-decoration: underline; } - #postamble p, #preamble p { font-size: 90%; margin: .2em; } - p.verse { margin-left: 3%; } - pre { - border: 1px solid #e6e6e6; - border-radius: 3px; - background-color: #f2f2f2; - padding: 8pt; - font-family: monospace; - overflow: auto; - margin: 1.2em; - } - pre.src { - position: relative; - overflow: auto; - } - pre.src:before { - display: none; - position: absolute; - top: -8px; - right: 12px; - padding: 3px; - color: #555; - background-color: #f2f2f299; - } - pre.src:hover:before { display: inline; margin-top: 14px;} - /* Languages per Org manual */ - pre.src-asymptote:before { content: 'Asymptote'; } - pre.src-awk:before { content: 'Awk'; } - pre.src-authinfo::before { content: 'Authinfo'; } - pre.src-C:before { content: 'C'; } - /* pre.src-C++ doesn't work in CSS */ - pre.src-clojure:before { content: 'Clojure'; } - pre.src-css:before { content: 'CSS'; } - pre.src-D:before { content: 'D'; } - pre.src-ditaa:before { content: 'ditaa'; } - pre.src-dot:before { content: 'Graphviz'; } - pre.src-calc:before { content: 'Emacs Calc'; } - pre.src-emacs-lisp:before { content: 'Emacs Lisp'; } - pre.src-fortran:before { content: 'Fortran'; } - pre.src-gnuplot:before { content: 'gnuplot'; } - pre.src-haskell:before { content: 'Haskell'; } - pre.src-hledger:before { content: 'hledger'; } - pre.src-java:before { content: 'Java'; } - pre.src-js:before { content: 'Javascript'; } - pre.src-latex:before { content: 'LaTeX'; } - pre.src-ledger:before { content: 'Ledger'; } - pre.src-lisp:before { content: 'Lisp'; } - pre.src-lilypond:before { content: 'Lilypond'; } - pre.src-lua:before { content: 'Lua'; } - pre.src-matlab:before { content: 'MATLAB'; } - pre.src-mscgen:before { content: 'Mscgen'; } - pre.src-ocaml:before { content: 'Objective Caml'; } - pre.src-octave:before { content: 'Octave'; } - pre.src-org:before { content: 'Org mode'; } - pre.src-oz:before { content: 'OZ'; } - pre.src-plantuml:before { content: 'Plantuml'; } - pre.src-processing:before { content: 'Processing.js'; } - pre.src-python:before { content: 'Python'; } - pre.src-R:before { content: 'R'; } - pre.src-ruby:before { content: 'Ruby'; } - pre.src-sass:before { content: 'Sass'; } - pre.src-scheme:before { content: 'Scheme'; } - pre.src-screen:before { content: 'Gnu Screen'; } - pre.src-sed:before { content: 'Sed'; } - pre.src-sh:before { content: 'shell'; } - pre.src-sql:before { content: 'SQL'; } - pre.src-sqlite:before { content: 'SQLite'; } - /* additional languages in org.el's org-babel-load-languages alist */ - pre.src-forth:before { content: 'Forth'; } - pre.src-io:before { content: 'IO'; } - pre.src-J:before { content: 'J'; } - pre.src-makefile:before { content: 'Makefile'; } - pre.src-maxima:before { content: 'Maxima'; } - pre.src-perl:before { content: 'Perl'; } - pre.src-picolisp:before { content: 'Pico Lisp'; } - pre.src-scala:before { content: 'Scala'; } - pre.src-shell:before { content: 'Shell Script'; } - pre.src-ebnf2ps:before { content: 'ebfn2ps'; } - /* additional language identifiers per \"defun org-babel-execute\" - in ob-*.el */ - pre.src-cpp:before { content: 'C++'; } - pre.src-abc:before { content: 'ABC'; } - pre.src-coq:before { content: 'Coq'; } - pre.src-groovy:before { content: 'Groovy'; } - /* additional language identifiers from org-babel-shell-names in - ob-shell.el: ob-shell is the only babel language using a lambda to put - the execution function name together. */ - pre.src-bash:before { content: 'bash'; } - pre.src-csh:before { content: 'csh'; } - pre.src-ash:before { content: 'ash'; } - pre.src-dash:before { content: 'dash'; } - pre.src-ksh:before { content: 'ksh'; } - pre.src-mksh:before { content: 'mksh'; } - pre.src-posh:before { content: 'posh'; } - /* Additional Emacs modes also supported by the LaTeX listings package */ - pre.src-ada:before { content: 'Ada'; } - pre.src-asm:before { content: 'Assembler'; } - pre.src-caml:before { content: 'Caml'; } - pre.src-delphi:before { content: 'Delphi'; } - pre.src-html:before { content: 'HTML'; } - pre.src-idl:before { content: 'IDL'; } - pre.src-mercury:before { content: 'Mercury'; } - pre.src-metapost:before { content: 'MetaPost'; } - pre.src-modula-2:before { content: 'Modula-2'; } - pre.src-pascal:before { content: 'Pascal'; } - pre.src-ps:before { content: 'PostScript'; } - pre.src-prolog:before { content: 'Prolog'; } - pre.src-simula:before { content: 'Simula'; } - pre.src-tcl:before { content: 'tcl'; } - pre.src-tex:before { content: 'TeX'; } - pre.src-plain-tex:before { content: 'Plain TeX'; } - pre.src-verilog:before { content: 'Verilog'; } - pre.src-vhdl:before { content: 'VHDL'; } - pre.src-xml:before { content: 'XML'; } - pre.src-nxml:before { content: 'XML'; } - /* add a generic configuration mode; LaTeX export needs an additional - (add-to-list 'org-latex-listings-langs '(conf \" \")) in .emacs */ - pre.src-conf:before { content: 'Configuration File'; } - - table { border-collapse:collapse; } - caption.t-above { caption-side: top; } - caption.t-bottom { caption-side: bottom; } - td, th { vertical-align:top; } - th.org-right { text-align: center; } - th.org-left { text-align: center; } - th.org-center { text-align: center; } - td.org-right { text-align: right; } - td.org-left { text-align: left; } - td.org-center { text-align: center; } - dt { font-weight: bold; } - .footpara { display: inline; } - .footdef { margin-bottom: 1em; } - .figure { padding: 1em; } - .figure p { text-align: center; } - .equation-container { - display: table; - text-align: center; - width: 100%; - } - .equation { - vertical-align: middle; - } - .equation-label { - display: table-cell; - text-align: right; - vertical-align: middle; - } - .inlinetask { - padding: 10px; - border: 2px solid gray; - margin: 10px; - background: #ffffcc; - } - #org-div-home-and-up - { text-align: right; font-size: 70%; white-space: nowrap; } - textarea { overflow-x: auto; } - .linenr { font-size: smaller } - .code-highlighted { background-color: #ffff00; } - .org-info-js_info-navigation { border-style: none; } - #org-info-js_console-label - { font-size: 10px; font-weight: bold; white-space: nowrap; } - .org-info-js_search-highlight - { background-color: #ffff00; color: #000000; font-weight: bold; } - .org-svg { width: 90%; } -</style>" - "The default style specification for exported HTML files. -You can use `org-html-head' and `org-html-head-extra' to add to -this style. If you don't want to include this default style, -customize `org-html-head-include-default-style'." - :group 'org-export-html - :package-version '(Org . "9.5") - :type 'string) - - -;;; User Configuration Variables - -(defgroup org-export-html nil - "Options for exporting Org mode files to HTML." - :tag "Org Export HTML" - :group 'org-export) - -;;;; Handle infojs - -(defvar org-html-infojs-opts-table - '((path PATH "https://orgmode.org/org-info.js") - (view VIEW "info") - (toc TOC :with-toc) - (ftoc FIXED_TOC "0") - (tdepth TOC_DEPTH "max") - (sdepth SECTION_DEPTH "max") - (mouse MOUSE_HINT "underline") - (buttons VIEW_BUTTONS "0") - (ltoc LOCAL_TOC "1") - (up LINK_UP :html-link-up) - (home LINK_HOME :html-link-home)) - "JavaScript options, long form for script, default values.") - -(defcustom org-html-use-infojs 'when-configured - "Non-nil when Sebastian Rose's Java Script org-info.js should be active. -This option can be nil or t to never or always use the script. -It can also be the symbol `when-configured', meaning that the -script will be linked into the export file if and only if there -is a \"#+INFOJS_OPT:\" line in the buffer. See also the variable -`org-html-infojs-options'." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "Never" nil) - (const :tag "When configured in buffer" when-configured) - (const :tag "Always" t))) - -(defcustom org-html-infojs-options - (mapcar (lambda (x) (cons (car x) (nth 2 x))) org-html-infojs-opts-table) - "Options settings for the INFOJS JavaScript. -Each of the options must have an entry in `org-html-infojs-opts-table'. -The value can either be a string that will be passed to the script, or -a property. This property is then assumed to be a property that is defined -by the Export/Publishing setup of Org. -The `sdepth' and `tdepth' parameters can also be set to \"max\", which -means to use the maximum value consistent with other options." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type - `(set :greedy t :inline t - ,@(mapcar - (lambda (x) - (list 'cons (list 'const (car x)) - '(choice - (symbol :tag "Publishing/Export property") - (string :tag "Value")))) - org-html-infojs-opts-table))) - -(defcustom org-html-infojs-template - "<script src=\"%SCRIPT_PATH\"> -// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later -// @license-end -</script> - -<script> -// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later -%MANAGER_OPTIONS -org_html_manager.setup(); // activate after the parameters are set -// @license-end -</script>" - "The template for the export style additions when org-info.js is used. -Option settings will replace the %MANAGER-OPTIONS cookie." - :group 'org-export-html - :package-version '(Org . "9.4") - :type 'string) - -(defun org-html-infojs-install-script (exp-plist _backend) - "Install script in export options when appropriate. -EXP-PLIST is a plist containing export options. BACKEND is the -export back-end currently used." - (unless (or (memq 'body-only (plist-get exp-plist :export-options)) - (not (plist-get exp-plist :html-use-infojs)) - (and (eq (plist-get exp-plist :html-use-infojs) 'when-configured) - (let ((opt (plist-get exp-plist :infojs-opt))) - (or (not opt) - (string= "" opt) - (string-match "\\<view:nil\\>" opt))))) - (let* ((template (plist-get exp-plist :html-infojs-template)) - (ptoc (plist-get exp-plist :with-toc)) - (hlevels (plist-get exp-plist :headline-levels)) - (sdepth hlevels) - (tdepth (if (integerp ptoc) (min ptoc hlevels) hlevels)) - (options (plist-get exp-plist :infojs-opt)) - (infojs-opt (plist-get exp-plist :html-infojs-options)) - (table org-html-infojs-opts-table) - style) - (dolist (entry table) - (let* ((opt (car entry)) - (var (nth 1 entry)) - ;; Compute default values for script option OPT from - ;; `org-html-infojs-options' variable. - (default - (let ((default (cdr (assq opt infojs-opt)))) - (if (and (symbolp default) (not (memq default '(t nil)))) - (plist-get exp-plist default) - default))) - ;; Value set through INFOJS_OPT keyword has precedence - ;; over the default one. - (val (if (and options - (string-match (format "\\<%s:\\(\\S-+\\)" opt) - options)) - (match-string 1 options) - default))) - (pcase opt - (`path (setq template - (replace-regexp-in-string - "%SCRIPT_PATH" val template t t))) - (`sdepth (when (integerp (read val)) - (setq sdepth (min (read val) sdepth)))) - (`tdepth (when (integerp (read val)) - (setq tdepth (min (read val) tdepth)))) - (_ (setq val - (cond - ((or (eq val t) (equal val "t")) "1") - ((or (eq val nil) (equal val "nil")) "0") - ((stringp val) val) - (t (format "%s" val)))) - (push (cons var val) style))))) - ;; Now we set the depth of the *generated* TOC to SDEPTH, - ;; because the toc will actually determine the splitting. How - ;; much of the toc will actually be displayed is governed by the - ;; TDEPTH option. - (setq exp-plist (plist-put exp-plist :with-toc sdepth)) - ;; The table of contents should not show more sections than we - ;; generate. - (setq tdepth (min tdepth sdepth)) - (push (cons "TOC_DEPTH" tdepth) style) - ;; Build style string. - (setq style (mapconcat - (lambda (x) - (format "org_html_manager.set(\"%s\", \"%s\");" - (car x) (cdr x))) - style "\n")) - (when (and style (> (length style) 0)) - (and (string-match "%MANAGER_OPTIONS" template) - (setq style (replace-match style t t template)) - (setq exp-plist - (plist-put - exp-plist :html-head-extra - (concat (or (plist-get exp-plist :html-head-extra) "") - "\n" - style))))) - ;; This script absolutely needs the table of contents, so we - ;; change that setting. - (unless (plist-get exp-plist :with-toc) - (setq exp-plist (plist-put exp-plist :with-toc t))) - ;; Return the modified property list. - exp-plist))) - -;;;; Bold, etc. - -(defcustom org-html-text-markup-alist - '((bold . "<b>%s</b>") - (code . "<code>%s</code>") - (italic . "<i>%s</i>") - (strike-through . "<del>%s</del>") - (underline . "<span class=\"underline\">%s</span>") - (verbatim . "<code>%s</code>")) - "Alist of HTML expressions to convert text markup. - -The key must be a symbol among `bold', `code', `italic', -`strike-through', `underline' and `verbatim'. The value is -a formatting string to wrap fontified text with. - -If no association can be found for a given markup, text will be -returned as-is." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type '(alist :key-type (symbol :tag "Markup type") - :value-type (string :tag "Format string")) - :options '(bold code italic strike-through underline verbatim)) - -(defcustom org-html-indent nil - "Non-nil means to indent the generated HTML. -Warning: non-nil may break indentation of source code blocks." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - -;;;; Drawers - -(defcustom org-html-format-drawer-function (lambda (_name contents) contents) - "Function called to format a drawer in HTML code. - -The function must accept two parameters: - NAME the drawer name, like \"LOGBOOK\" - CONTENTS the contents of the drawer. - -The function should return the string to be exported. - -The default value simply returns the value of CONTENTS." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'function) - -;;;; Footnotes - -(defcustom org-html-footnotes-section "<div id=\"footnotes\"> -<h2 class=\"footnotes\">%s: </h2> -<div id=\"text-footnotes\"> -%s -</div> -</div>" - "Format for the footnotes section. -Should contain a two instances of %s. The first will be replaced with the -language-specific word for \"Footnotes\", the second one will be replaced -by the footnotes themselves." - :group 'org-export-html - :type 'string) - -(defcustom org-html-footnote-format "<sup>%s</sup>" - "The format for the footnote reference. -%s will be replaced by the footnote reference itself." - :group 'org-export-html - :type 'string) - -(defcustom org-html-footnote-separator "<sup>, </sup>" - "Text used to separate footnotes." - :group 'org-export-html - :type 'string) - -;;;; Headline - -(defcustom org-html-toplevel-hlevel 2 - "The <H> level for level 1 headings in HTML export. -This is also important for the classes that will be wrapped around headlines -and outline structure. If this variable is 1, the top-level headlines will -be <h1>, and the corresponding classes will be outline-1, section-number-1, -and outline-text-1. If this is 2, all of these will get a 2 instead. -The default for this variable is 2, because we use <h1> for formatting the -document title." - :group 'org-export-html - :type 'integer) - -(defcustom org-html-format-headline-function - 'org-html-format-headline-default-function - "Function to format headline text. - -This function will be called with six arguments: -TODO the todo keyword (string or nil). -TODO-TYPE the type of todo (symbol: `todo', `done', nil) -PRIORITY the priority of the headline (integer or nil) -TEXT the main headline text (string). -TAGS the tags (string or nil). -INFO the export options (plist). - -The function result will be used in the section format string." - :group 'org-export-html - :version "26.1" - :package-version '(Org . "8.3") - :type 'function) - -;;;; HTML-specific - -(defcustom org-html-allow-name-attribute-in-anchors nil - "When nil, do not set \"name\" attribute in anchors. -By default, when appropriate, anchors are formatted with \"id\" -but without \"name\" attribute." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - -(defcustom org-html-self-link-headlines nil - "When non-nil, the headlines contain a hyperlink to themselves." - :group 'org-export-html - :package-version '(Org . "9.3") - :type 'boolean - :safe #'booleanp) - -(defcustom org-html-prefer-user-labels nil - "When non-nil use user-defined names and ID over internal ones. - -By default, Org generates its own internal ID values during HTML -export. This process ensures that these values are unique and -valid, but the keys are not available in advance of the export -process, and not so readable. - -When this variable is non-nil, Org will use NAME keyword, or the -real name of the target to create the ID attribute. - -Independently of this variable, however, CUSTOM_ID are always -used as a reference." - :group 'org-export-html - :package-version '(Org . "9.4") - :type 'boolean - :safe #'booleanp) - -;;;; Inlinetasks - -(defcustom org-html-format-inlinetask-function - 'org-html-format-inlinetask-default-function - "Function called to format an inlinetask in HTML code. - -The function must accept seven parameters: - TODO the todo keyword, as a string - TODO-TYPE the todo type, a symbol among `todo', `done' and nil. - PRIORITY the inlinetask priority, as a string - NAME the inlinetask name, as a string. - TAGS the inlinetask tags, as a list of strings. - CONTENTS the contents of the inlinetask, as a string. - INFO the export options, as a plist - -The function should return the string to be exported." - :group 'org-export-html - :version "26.1" - :package-version '(Org . "8.3") - :type 'function) - -;;;; LaTeX - -(defcustom org-html-equation-reference-format "\\eqref{%s}" - "The MathJax command to use when referencing equations. - -This is a format control string that expects a single string argument -specifying the label that is being referenced. The argument is -generated automatically on export. - -The default is to wrap equations in parentheses (using \"\\eqref{%s}\)\". - -Most common values are: - - \\eqref{%s} Wrap the equation in parentheses - \\ref{%s} Do not wrap the equation in parentheses" - :group 'org-export-html - :package-version '(Org . "9.4") - :type 'string - :safe #'stringp) - -(defcustom org-html-with-latex org-export-with-latex - "Non-nil means process LaTeX math snippets. - -When set, the exporter will process LaTeX environments and -fragments. - -This option can also be set with the +OPTIONS line, -e.g. \"tex:mathjax\". Allowed values are: - - nil Ignore math snippets. - `verbatim' Keep everything in verbatim - `mathjax', t Do MathJax preprocessing and arrange for MathJax.js to - be loaded. - `html' Use `org-latex-to-html-convert-command' to convert - LaTeX fragments to HTML. - SYMBOL Any symbol defined in `org-preview-latex-process-alist', - e.g., `dvipng'." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "Do not process math in any way" nil) - (const :tag "Leave math verbatim" verbatim) - (const :tag "Use MathJax to display math" mathjax) - (symbol :tag "Convert to image to display math" :value dvipng))) - -;;;; Links :: Generic - -(defcustom org-html-link-org-files-as-html t - "Non-nil means make file links to \"file.org\" point to \"file.html\". - -When Org mode is exporting an Org file to HTML, links to non-HTML files -are directly put into a \"href\" tag in HTML. However, links to other Org files -(recognized by the extension \".org\") should become links to the corresponding -HTML file, assuming that the linked Org file will also be converted to HTML. - -When nil, the links still point to the plain \".org\" file." - :group 'org-export-html - :type 'boolean) - -;;;; Links :: Inline images - -(defcustom org-html-inline-images t - "Non-nil means inline images into exported HTML pages. -This is done using an <img> tag. When nil, an anchor with href is used to -link to the image." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.1") - :type 'boolean) - -(defcustom org-html-inline-image-rules - `(("file" . ,(regexp-opt '(".jpeg" ".jpg" ".png" ".gif" ".svg" ".webp"))) - ("http" . ,(regexp-opt '(".jpeg" ".jpg" ".png" ".gif" ".svg" ".webp"))) - ("https" . ,(regexp-opt '(".jpeg" ".jpg" ".png" ".gif" ".svg" ".webp")))) - "Rules characterizing image files that can be inlined into HTML. -A rule consists in an association whose key is the type of link -to consider, and value is a regexp that will be matched against -link's path." - :group 'org-export-html - :package-version '(Org . "9.5") - :type '(alist :key-type (string :tag "Type") - :value-type (regexp :tag "Path"))) - -;;;; Plain Text - -(defvar org-html-protect-char-alist - '(("&" . "&") - ("<" . "<") - (">" . ">")) - "Alist of characters to be converted by `org-html-encode-plain-text'.") - -;;;; Src Block - -(defcustom org-html-htmlize-output-type 'inline-css - "Output type to be used by htmlize when formatting code snippets. -Choices are `css' to export the CSS selectors only,`inline-css' -to export the CSS attribute values inline in the HTML or nil to -export plain text. We use as default `inline-css', in order to -make the resulting HTML self-containing. - -However, this will fail when using Emacs in batch mode for export, because -then no rich font definitions are in place. It will also not be good if -people with different Emacs setup contribute HTML files to a website, -because the fonts will represent the individual setups. In these cases, -it is much better to let Org/Htmlize assign classes only, and to use -a style file to define the look of these classes. -To get a start for your css file, start Emacs session and make sure that -all the faces you are interested in are defined, for example by loading files -in all modes you want. Then, use the command -`\\[org-html-htmlize-generate-css]' to extract class definitions." - :group 'org-export-html - :type '(choice (const css) (const inline-css) (const nil))) - -(defcustom org-html-htmlize-font-prefix "org-" - "The prefix for CSS class names for htmlize font specifications." - :group 'org-export-html - :type 'string) - -(defcustom org-html-wrap-src-lines nil - "If non-nil, wrap individual lines of source blocks in \"code\" elements. -In this case, add line number in attribute \"data-ox-html-linenr\" when line -numbers are enabled." - :group 'org-export-html - :package-version '(Org . "9.3") - :type 'boolean - :safe #'booleanp) - -;;;; Table - -(defcustom org-html-table-default-attributes - '(:border "2" :cellspacing "0" :cellpadding "6" :rules "groups" :frame "hsides") - "Default attributes and values which will be used in table tags. -This is a plist where attributes are symbols, starting with -colons, and values are strings. - -When exporting to HTML5, these values will be disregarded." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type '(plist :key-type (symbol :tag "Property") - :value-type (string :tag "Value"))) - -(defcustom org-html-table-header-tags '("<th scope=\"%s\"%s>" . "</th>") - "The opening and ending tags for table header fields. -This is customizable so that alignment options can be specified. -The first %s will be filled with the scope of the field, either row or col. -The second %s will be replaced by a style entry to align the field. -See also the variable `org-html-table-use-header-tags-for-first-column'. -See also the variable `org-html-table-align-individual-fields'." - :group 'org-export-html - :type '(cons (string :tag "Opening tag") (string :tag "Closing tag"))) - -(defcustom org-html-table-data-tags '("<td%s>" . "</td>") - "The opening and ending tags for table data fields. -This is customizable so that alignment options can be specified. -The first %s will be filled with the scope of the field, either row or col. -The second %s will be replaced by a style entry to align the field. -See also the variable `org-html-table-align-individual-fields'." - :group 'org-export-html - :type '(cons (string :tag "Opening tag") (string :tag "Closing tag"))) - -(defcustom org-html-table-row-open-tag "<tr>" - "The opening tag for table rows. -This is customizable so that alignment options can be specified. -Instead of strings, these can be a Lisp function that will be -evaluated for each row in order to construct the table row tags. - -The function will be called with these arguments: - - `number': row number (0 is the first row) - `group-number': group number of current row - `start-group?': non-nil means the row starts a group - `end-group?': non-nil means the row ends a group - `top?': non-nil means this is the top row - `bottom?': non-nil means this is the bottom row - -For example: - - (setq org-html-table-row-open-tag - (lambda (number group-number start-group? end-group-p top? bottom?) - (cond (top? \"<tr class=\\\"tr-top\\\">\") - (bottom? \"<tr class=\\\"tr-bottom\\\">\") - (t (if (= (mod number 2) 1) - \"<tr class=\\\"tr-odd\\\">\" - \"<tr class=\\\"tr-even\\\">\"))))) - -will use the \"tr-top\" and \"tr-bottom\" classes for the top row -and the bottom row, and otherwise alternate between \"tr-odd\" and -\"tr-even\" for odd and even rows." - :group 'org-export-html - :type '(choice :tag "Opening tag" - (string :tag "Specify") - (function))) - -(defcustom org-html-table-row-close-tag "</tr>" - "The closing tag for table rows. -This is customizable so that alignment options can be specified. -Instead of strings, this can be a Lisp function that will be -evaluated for each row in order to construct the table row tags. - -See documentation of `org-html-table-row-open-tag'." - :group 'org-export-html - :type '(choice :tag "Closing tag" - (string :tag "Specify") - (function))) - -(defcustom org-html-table-align-individual-fields t - "Non-nil means attach style attributes for alignment to each table field. -When nil, alignment will only be specified in the column tags, but this -is ignored by some browsers (like Firefox, Safari). Opera does it right -though." - :group 'org-export-html - :type 'boolean) - -(defcustom org-html-table-use-header-tags-for-first-column nil - "Non-nil means format column one in tables with header tags. -When nil, also column one will use data tags." - :group 'org-export-html - :type 'boolean) - -(defcustom org-html-table-caption-above t - "When non-nil, place caption string at the beginning of the table. -Otherwise, place it near the end." - :group 'org-export-html - :type 'boolean) - -;;;; Tags - -(defcustom org-html-tag-class-prefix "" - "Prefix to class names for TODO keywords. -Each tag gets a class given by the tag itself, with this prefix. -The default prefix is empty because it is nice to just use the keyword -as a class name. But if you get into conflicts with other, existing -CSS classes, then this prefix can be very useful." - :group 'org-export-html - :type 'string) - -;;;; Template :: Generic - -(defcustom org-html-extension "html" - "The extension for exported HTML files." - :group 'org-export-html - :type 'string) - -(defcustom org-html-xml-declaration - '(("html" . "<?xml version=\"1.0\" encoding=\"%s\"?>") - ("php" . "<?php echo \"<?xml version=\\\"1.0\\\" encoding=\\\"%s\\\" ?>\"; ?>")) - "The extension for exported HTML files. -%s will be replaced with the charset of the exported file. -This may be a string, or an alist with export extensions -and corresponding declarations. - -This declaration only applies when exporting to XHTML." - :group 'org-export-html - :type '(choice - (string :tag "Single declaration") - (repeat :tag "Dependent on extension" - (cons (string :tag "Extension") - (string :tag "Declaration"))))) - -(defcustom org-html-coding-system 'utf-8 - "Coding system for HTML export. -Use utf-8 as the default value." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'coding-system) - -(defcustom org-html-doctype "xhtml-strict" - "Document type definition to use for exported HTML files. -Can be set with the in-buffer HTML_DOCTYPE property or for -publishing, with :html-doctype." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type (append - '(choice) - (mapcar (lambda (x) `(const ,(car x))) org-html-doctype-alist) - '((string :tag "Custom doctype" )))) - -(defcustom org-html-html5-fancy nil - "Non-nil means using new HTML5 elements. -This variable is ignored for anything other than HTML5 export." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - -(defcustom org-html-container-element "div" - "HTML element to use for wrapping top level sections. -Can be set with the in-buffer HTML_CONTAINER property or for -publishing, with :html-container. - -Note that changing the default will prevent you from using -org-info.js for your website." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) - -(defcustom org-html-content-class "content" - "CSS class name to use for the top level content wrapper. -Can be set with the in-buffer HTML_CONTENT_CLASS property or for -publishing, with :html-content-class." - :group 'org-export-html - :version "27.2" - :package-version '(Org . "9.5") - :type 'string) - - -(defcustom org-html-divs - '((preamble "div" "preamble") - (content "div" "content") - (postamble "div" "postamble")) - "Alist of the three 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 default will prevent you from using -org-info.js for your website." - :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")))) - -(defconst org-html-checkbox-types - '((unicode . - ((on . "☑") (off . "☐") (trans . "☐"))) - (ascii . - ((on . "<code>[X]</code>") - (off . "<code>[ ]</code>") - (trans . "<code>[-]</code>"))) - (html . - ((on . "<input type='checkbox' checked='checked' />") - (off . "<input type='checkbox' />") - (trans . "<input type='checkbox' />")))) - "Alist of checkbox types. -The cdr of each entry is an alist list three checkbox types for -HTML export: `on', `off' and `trans'. - -The choices are: - `unicode' Unicode characters (HTML entities) - `ascii' ASCII characters - `html' HTML checkboxes - -Note that only the ascii characters implement tri-state -checkboxes. The other two use the `off' checkbox for `trans'.") - -(defcustom org-html-checkbox-type 'ascii - "The type of checkboxes to use for HTML export. -See `org-html-checkbox-types' for the values used for each -option." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type '(choice - (const :tag "ASCII characters" ascii) - (const :tag "Unicode characters" unicode) - (const :tag "HTML checkboxes" html))) - -(defcustom org-html-metadata-timestamp-format "%Y-%m-%d %a %H:%M" - "Format used for timestamps in preamble, postamble and metadata. -See `format-time-string' for more information on its components." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) - -;;;; Template :: Mathjax - -(defcustom org-html-mathjax-options - '((path "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML" ) - (scale "100") - (align "center") - (font "TeX") - (linebreaks "false") - (autonumber "AMS") - (indent "0em") - (multlinewidth "85%") - (tagindent ".8em") - (tagside "right")) - "Options for MathJax setup. - -Alist of the following elements. All values are strings. - -path The path to MathJax. -scale Scaling with HTML-CSS, MathML and SVG output engines. -align How to align display math: left, center, or right. -font The font to use with HTML-CSS and SVG output. As of MathJax 2.5 - the following values are understood: \"TeX\", \"STIX-Web\", - \"Asana-Math\", \"Neo-Euler\", \"Gyre-Pagella\", - \"Gyre-Termes\", and \"Latin-Modern\". -linebreaks Let MathJax perform automatic linebreaks. Valid values - are \"true\" and \"false\". -indent If align is not center, how far from the left/right side? - Valid values are \"left\" and \"right\" -multlinewidth The width of the multline environment. -autonumber How to number equations. Valid values are \"None\", - \"all\" and \"AMS Math\". -tagindent The amount tags are indented. -tagside Which side to show tags/labels on. Valid values are - \"left\" and \"right\" - -You can also customize this for each buffer, using something like - -#+HTML_MATHJAX: align: left indent: 5em tagside: left font: Neo-Euler - -For further information about MathJax options, see the MathJax documentation: - - https://docs.mathjax.org/" - :group 'org-export-html - :package-version '(Org . "8.3") - :type '(list :greedy t - (list :tag "path (the path from where to load MathJax.js)" - (const :format " " path) (string)) - (list :tag "scale (scaling for the displayed math)" - (const :format " " scale) (string)) - (list :tag "align (alignment of displayed equations)" - (const :format " " align) (string)) - (list :tag "font (used to display math)" - (const :format " " font) - (choice (const "TeX") - (const "STIX-Web") - (const "Asana-Math") - (const "Neo-Euler") - (const "Gyre-Pagella") - (const "Gyre-Termes") - (const "Latin-Modern"))) - (list :tag "linebreaks (automatic line-breaking)" - (const :format " " linebreaks) - (choice (const "true") - (const "false"))) - (list :tag "autonumber (when should equations be numbered)" - (const :format " " autonumber) - (choice (const "AMS") - (const "None") - (const "All"))) - (list :tag "indent (indentation with left or right alignment)" - (const :format " " indent) (string)) - (list :tag "multlinewidth (width to use for the multline environment)" - (const :format " " multlinewidth) (string)) - (list :tag "tagindent (the indentation of tags from left or right)" - (const :format " " tagindent) (string)) - (list :tag "tagside (location of tags)" - (const :format " " tagside) - (choice (const "left") - (const "right"))))) - -(defcustom org-html-mathjax-template - "<script type=\"text/x-mathjax-config\"> - MathJax.Hub.Config({ - displayAlign: \"%ALIGN\", - displayIndent: \"%INDENT\", - - \"HTML-CSS\": { scale: %SCALE, - linebreaks: { automatic: \"%LINEBREAKS\" }, - webFont: \"%FONT\" - }, - SVG: {scale: %SCALE, - linebreaks: { automatic: \"%LINEBREAKS\" }, - font: \"%FONT\"}, - NativeMML: {scale: %SCALE}, - TeX: { equationNumbers: {autoNumber: \"%AUTONUMBER\"}, - MultLineWidth: \"%MULTLINEWIDTH\", - TagSide: \"%TAGSIDE\", - TagIndent: \"%TAGINDENT\" - } -}); -</script> -<script src=\"%PATH\"></script>" - "The MathJax template. See also `org-html-mathjax-options'." - :group 'org-export-html - :type 'string) - -;;;; Template :: Postamble - -(defcustom org-html-postamble 'auto - "Non-nil means insert a postamble in HTML export. - -When set to `auto', check against the -`org-export-with-author/email/creator/date' variables to set the -content of the postamble. 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. - -Setting :html-postamble in publishing projects will take -precedence over this variable." - :group 'org-export-html - :type '(choice (const :tag "No postamble" nil) - (const :tag "Auto postamble" auto) - (const :tag "Default formatting string" t) - (string :tag "Custom formatting string") - (function :tag "Function (must return a string)"))) - -(defcustom org-html-postamble-format - '(("en" "<p class=\"author\">Author: %a (%e)</p> -<p class=\"date\">Date: %d</p> -<p class=\"creator\">%c</p> -<p class=\"validation\">%v</p>")) - "Alist of languages and format strings for the HTML postamble. - -The first element of each list is the language code, as used for -the LANGUAGE keyword. See `org-export-default-language'. - -The second element of each list is a format string to format the -postamble itself. This format string can contain these elements: - - %t stands for the title. - %s stands for the subtitle. - %a stands for the author's name. - %e stands for the author's email. - %d stands for the date. - %c will be replaced by `org-html-creator-string'. - %v will be replaced by `org-html-validation-link'. - %T will be replaced by the export time. - %C will be replaced by the last modification time. - -If you need to use a \"%\" character, you need to escape it -like that: \"%%\"." - :group 'org-export-html - :type '(repeat - (list (string :tag "Language") - (string :tag "Format string")))) - -(defcustom org-html-validation-link - "<a href=\"https://validator.w3.org/check?uri=referer\">Validate</a>" - "Link to HTML validation service." - :group 'org-export-html - :package-version '(Org . "9.4") - :type 'string) - -(defcustom org-html-creator-string - (format "<a href=\"https://www.gnu.org/software/emacs/\">Emacs</a> %s (<a href=\"https://orgmode.org\">Org</a> mode %s)" - emacs-version - (if (fboundp 'org-version) (org-version) "unknown version")) - "Information about the creator of the HTML document. -This option can also be set on with the CREATOR keyword." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type '(string :tag "Creator string")) - -;;;; Template :: Preamble - -(defcustom org-html-preamble t - "Non-nil means insert a preamble in HTML export. - -When t, insert a string as defined by the formatting string in -`org-html-preamble-format'. When set to a string, use this -formatting string instead (see `org-html-postamble-format' for an -example of such a formatting string). - -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 :html-preamble in publishing projects will take -precedence over this variable." - :group 'org-export-html - :type '(choice (const :tag "No preamble" nil) - (const :tag "Default preamble" t) - (string :tag "Custom formatting string") - (function :tag "Function (must return a string)"))) - -(defcustom org-html-preamble-format '(("en" "")) - "Alist of languages and format strings for the HTML preamble. - -The first element of each list is the language code, as used for -the LANGUAGE keyword. See `org-export-default-language'. - -The second element of each list is a format string to format the -preamble itself. This format string can contain these elements: - - %t stands for the title. - %s stands for the subtitle. - %a stands for the author's name. - %e stands for the author's email. - %d stands for the date. - %c will be replaced by `org-html-creator-string'. - %v will be replaced by `org-html-validation-link'. - %T will be replaced by the export time. - %C will be replaced by the last modification time. - -If you need to use a \"%\" character, you need to escape it -like that: \"%%\". - -See the default value of `org-html-postamble-format' for an -example." - :group 'org-export-html - :type '(repeat - (list (string :tag "Language") - (string :tag "Format string")))) - -(defcustom org-html-link-up "" - "Where should the \"UP\" link of exported HTML pages lead?" - :group 'org-export-html - :type '(string :tag "File or URL")) - -(defcustom org-html-link-home "" - "Where should the \"HOME\" link of exported HTML pages lead?" - :group 'org-export-html - :type '(string :tag "File or URL")) - -(defcustom org-html-link-use-abs-url nil - "Should we prepend relative links with HTML_LINK_HOME?" - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.1") - :type 'boolean) - -(defcustom org-html-home/up-format - "<div id=\"org-div-home-and-up\"> - <a accesskey=\"h\" href=\"%s\"> UP </a> - | - <a accesskey=\"H\" href=\"%s\"> HOME </a> -</div>" - "Snippet used to insert the HOME and UP links. -This is a format string, the first %s will receive the UP link, -the second the HOME link. If both `org-html-link-up' and -`org-html-link-home' are empty, the entire snippet will be -ignored." - :group 'org-export-html - :type 'string) - -;;;; Template :: Scripts - -(defcustom org-html-head-include-scripts nil - "Non-nil means include the JavaScript snippets in exported HTML files. -The actual script is defined in `org-html-scripts'." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) - -;;;; Template :: Styles - -(defcustom org-html-meta-tags #'org-html-meta-tags-default - "Form that is used to produce meta tags in the HTML head. - -Can be 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 a -single argument (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 -should not be modified. Use `org-html-head' to use your own -style information." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'boolean) -;;;###autoload -(put 'org-html-head-include-default-style 'safe-local-variable 'booleanp) - -(defcustom org-html-head "" - "Org-wide head definitions for exported HTML files. - -This variable can contain the full HTML structure to provide a -style, including the surrounding HTML tags. You can consider -including definitions for the following classes: title, todo, -done, timestamp, timestamp-kwd, tag, target. - -For example, a valid value would be: - - <style> - p { font-weight: normal; color: gray; } - h1 { color: black; } - .title { text-align: center; } - .todo, .timestamp-kwd { color: red; } - .done { color: green; } - </style> - -If you want to refer to an external style, use something like - - <link rel=\"stylesheet\" type=\"text/css\" href=\"mystyles.css\" /> - -As the value of this option simply gets inserted into the HTML -<head> header, you can use it to add any arbitrary text to the -header. - -You can set this on a per-file basis using #+HTML_HEAD:, -or for publication projects using the :html-head property." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) -;;;###autoload -(put 'org-html-head 'safe-local-variable 'stringp) - -(defcustom org-html-head-extra "" - "More head information to add in the HTML output. - -You can set this on a per-file basis using #+HTML_HEAD_EXTRA:, -or for publication projects using the :html-head-extra property." - :group 'org-export-html - :version "24.4" - :package-version '(Org . "8.0") - :type 'string) -;;;###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 "26.1" - :package-version '(Org . "8.3") - :type '(choice (const :tag "Disable" nil) - (list :tag "Enable" - (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")))))) - -;; Handle source code blocks with Klipse - -(defcustom org-html-klipsify-src nil - "When non-nil, source code blocks are editable in exported presentation." - :group 'org-export-html - :package-version '(Org . "9.1") - :type 'boolean) - -(defcustom org-html-klipse-css - "https://storage.googleapis.com/app.klipse.tech/css/codemirror.css" - "Location of the codemirror CSS file for use with klipse." - :group 'org-export-html - :package-version '(Org . "9.1") - :type 'string) - -(defcustom org-html-klipse-js - "https://storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js" - "Location of the klipse javascript file." - :group 'org-export-html - :type 'string) - -(defcustom org-html-klipse-selection-script - "window.klipse_settings = {selector_eval_html: '.src-html', - selector_eval_js: '.src-js', - selector_eval_python_client: '.src-python', - selector_eval_scheme: '.src-scheme', - selector: '.src-clojure', - selector_eval_ruby: '.src-ruby'};" - "Javascript snippet to activate klipse." - :group 'org-export-html - :package-version '(Org . "9.1") - :type 'string) - - -;;;; Todos - -(defcustom org-html-todo-kwd-class-prefix "" - "Prefix to class names for TODO keywords. -Each TODO keyword gets a class given by the keyword itself, with this prefix. -The default prefix is empty because it is nice to just use the keyword -as a class name. But if you get into conflicts with other, existing -CSS classes, then this prefix can be very useful." - :group 'org-export-html - :type 'string) - - -;;; Internal Functions - -(defun org-html-xhtml-p (info) - (let ((dt (downcase (plist-get info :html-doctype)))) - (string-match-p "xhtml" dt))) - -(defun org-html-html5-p (info) - (let ((dt (downcase (plist-get info :html-doctype)))) - (member dt '("html5" "xhtml5" "<!doctype html>")))) - -(defun org-html--html5-fancy-p (info) - "Non-nil when exporting to HTML5 with fancy elements. -INFO is the current state of the export process, as a plist." - (and (plist-get info :html-html5-fancy) - (org-html-html5-p info))) - -(defun org-html-close-tag (tag attr info) - "Return close-tag for string TAG. -ATTR specifies additional attributes. INFO is a property list -containing current export state." - (concat "<" tag - (org-string-nw-p (concat " " attr)) - (if (org-html-xhtml-p info) " />" ">"))) - -(defun org-html-doctype (info) - "Return correct HTML doctype tag. -INFO is a plist used as a communication channel. Doctype tag is -extracted from `org-html-doctype-alist', or the literal value -of :html-doctype from INFO if :html-doctype is not found in the -alist." - (let ((dt (plist-get info :html-doctype))) - (or (cdr (assoc dt org-html-doctype-alist)) dt))) - -(defun org-html--make-attribute-string (attributes) - "Return a list of attributes, as a string. -ATTRIBUTES is a plist where values are either strings or nil. An -attribute with a nil value will be omitted from the result." - (let (output) - (dolist (item attributes (mapconcat 'identity (nreverse output) " ")) - (cond ((null item) (pop output)) - ((symbolp item) (push (substring (symbol-name item) 1) output)) - (t (let ((key (car output)) - (value (replace-regexp-in-string - "\"" """ (org-html-encode-plain-text item)))) - (setcar output (format "%s=\"%s\"" key value)))))))) - -(defun org-html--reference (datum info &optional named-only) - "Return an appropriate reference for DATUM. - -DATUM is an element or a `target' type object. INFO is the -current export state, as a plist. - -When NAMED-ONLY is non-nil and DATUM has no NAME keyword, return -nil. This doesn't apply to headlines, inline tasks, radio -targets and targets." - (let* ((type (org-element-type datum)) - (user-label - (org-element-property - (pcase type - ((or `headline `inlinetask) :CUSTOM_ID) - ((or `radio-target `target) :value) - (_ :name)) - datum))) - (cond - ((and user-label - (or (plist-get info :html-prefer-user-labels) - ;; Used CUSTOM_ID property unconditionally. - (memq type '(headline inlinetask)))) - user-label) - ((and named-only - (not (memq type '(headline inlinetask radio-target target))) - (not user-label)) - nil) - (t - (org-export-get-reference datum info))))) - -(defun org-html--wrap-image (contents info &optional caption label) - "Wrap CONTENTS string within an appropriate environment for images. -INFO is a plist used as a communication channel. When optional -arguments CAPTION and LABEL are given, use them for caption and -\"id\" attribute." - (let ((html5-fancy (org-html--html5-fancy-p info))) - (format (if html5-fancy "\n<figure%s>\n%s%s\n</figure>" - "\n<div%s class=\"figure\">\n%s%s\n</div>") - ;; ID. - (if (org-string-nw-p label) (format " id=\"%s\"" label) "") - ;; Contents. - (if html5-fancy contents (format "<p>%s</p>" contents)) - ;; Caption. - (if (not (org-string-nw-p caption)) "" - (format (if html5-fancy "\n<figcaption>%s</figcaption>" - "\n<p>%s</p>") - caption))))) - -(defun org-html--format-image (source attributes info) - "Return \"img\" tag with given SOURCE and ATTRIBUTES. -SOURCE is a string specifying the location of the image. -ATTRIBUTES is a plist, as returned by -`org-export-read-attribute'. INFO is a plist used as -a communication channel." - (org-html-close-tag - "img" - (org-html--make-attribute-string - (org-combine-plists - (list :src source - :alt (if (string-match-p - (concat "^" org-preview-latex-image-directory) source) - (org-html-encode-plain-text - (org-find-text-property-in-string 'org-latex-src source)) - (file-name-nondirectory source))) - (if (string= "svg" (file-name-extension source)) - (org-combine-plists '(:class "org-svg") attributes '(:fallback nil)) - attributes))) - info)) - -(defun org-html--textarea-block (element) - "Transcode ELEMENT into a textarea block. -ELEMENT is either a source or an example block." - (let* ((code (car (org-export-unravel-code element))) - (attr (org-export-read-attribute :attr_html element))) - (format "<p>\n<textarea cols=\"%s\" rows=\"%s\">\n%s</textarea>\n</p>" - (or (plist-get attr :width) 80) - (or (plist-get attr :height) (org-count-lines code)) - code))) - -(defun org-html--has-caption-p (element &optional _info) - "Non-nil when ELEMENT has a caption affiliated keyword. -INFO is a plist used as a communication channel. This function -is meant to be used as a predicate for `org-export-get-ordinal' or -a value to `org-html-standalone-image-predicate'." - (org-element-property :caption element)) - -;;;; Table - -(defun org-html-htmlize-region-for-paste (beg end) - "Convert the region between BEG and END to HTML, using htmlize.el. -This is much like `htmlize-region-for-paste', only that it uses -the settings define in the org-... variables." - (let* ((htmlize-output-type org-html-htmlize-output-type) - (htmlize-css-name-prefix org-html-htmlize-font-prefix) - (htmlbuf (htmlize-region beg end))) - (unwind-protect - (with-current-buffer htmlbuf - (buffer-substring (plist-get htmlize-buffer-places 'content-start) - (plist-get htmlize-buffer-places 'content-end))) - (kill-buffer htmlbuf)))) - -;;;###autoload -(defun org-html-htmlize-generate-css () - "Create the CSS for all font definitions in the current Emacs session. -Use this to create face definitions in your CSS style file that can then -be used by code snippets transformed by htmlize. -This command just produces a buffer that contains class definitions for all -faces used in the current Emacs session. You can copy and paste the ones you -need into your CSS file. - -If you then set `org-html-htmlize-output-type' to `css', calls -to the function `org-html-htmlize-region-for-paste' will -produce code that uses these same face definitions." - (interactive) - (unless (require 'htmlize nil t) - (error "htmlize library missing. Aborting")) - (and (get-buffer "*html*") (kill-buffer "*html*")) - (with-temp-buffer - (let ((fl (face-list)) - (htmlize-css-name-prefix "org-") - (htmlize-output-type 'css) - f i) - (while (setq f (pop fl) - i (and f (face-attribute f :inherit))) - (when (and (symbolp f) (or (not i) (not (listp i)))) - (insert (org-add-props (copy-sequence "1") nil 'face f)))) - (htmlize-region (point-min) (point-max)))) - (pop-to-buffer-same-window "*html*") - (goto-char (point-min)) - (when (re-search-forward "<style" nil t) - (delete-region (point-min) (match-beginning 0))) - (when (re-search-forward "</style>" nil t) - (delete-region (1+ (match-end 0)) (point-max))) - (beginning-of-line 1) - (when (looking-at " +") (replace-match "")) - (goto-char (point-min))) - -(defun org-html--make-string (n string) - "Build a string by concatenating N times STRING." - (let (out) (dotimes (_ n out) (setq out (concat string out))))) - -(defun org-html-fix-class-name (kwd) ; audit callers of this function - "Turn todo keyword KWD into a valid class name. -Replaces invalid characters with \"_\"." - (replace-regexp-in-string "[^a-zA-Z0-9_]" "_" kwd nil t)) - -(defun org-html-footnote-section (info) - "Format the footnote section. -INFO is a plist used as a communication channel." - (pcase (org-export-collect-footnote-definitions info) - (`nil nil) - (definitions - (format - (plist-get info :html-footnotes-section) - (org-html--translate "Footnotes" info) - (format - "\n%s\n" - (mapconcat - (lambda (definition) - (pcase definition - (`(,n ,_ ,def) - ;; `org-export-collect-footnote-definitions' can return - ;; two kinds of footnote definitions: inline and blocks. - ;; Since this should not make any difference in the HTML - ;; output, we wrap the inline definitions within - ;; a "footpara" class paragraph. - (let ((inline? (not (org-element-map def org-element-all-elements - #'identity nil t))) - (anchor (org-html--anchor - (format "fn.%d" n) - n - (format " class=\"footnum\" href=\"#fnr.%d\" role=\"doc-backlink\"" n) - info)) - (contents (org-trim (org-export-data def info)))) - (format "<div class=\"footdef\">%s %s</div>\n" - (format (plist-get info :html-footnote-format) anchor) - (format "<div class=\"footpara\" role=\"doc-footnote\">%s</div>" - (if (not inline?) contents - (format "<p class=\"footpara\">%s</p>" - contents)))))))) - definitions - "\n")))))) - - -;;; Template - -(defun org-html-meta-tags-default (info) - "A default value for `org-html-meta-tags'. - -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. - -Use document's plist INFO to derive relevant information for the tags." - (let ((author (and (plist-get info :with-author) - (let ((auth (plist-get info :author))) - ;; Return raw Org syntax. - (and auth (org-element-interpret-data auth)))))) - (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) - "Build a meta tag using the provided information. - -Construct <meta> tag of form <meta LABEL=\"IDENTITY\" />, or when CONTENT-FORMAT -is present: <meta LABEL=\"IDENTITY\" content=\"{content}\" /> - -Here {content} is determined by applying any CONTENT-FORMATTERS to the -CONTENT-FORMAT and encoding the result as plain text." - (concat "<meta " - (format "%s=\"%s" label identity) - (when content-format - (concat "\" content=\"" - (replace-regexp-in-string - "\"" """ - (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* ((title (org-html-plain-text - (org-element-interpret-data (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 "‎")) - (charset (or (and org-html-coding-system - (fboundp 'coding-system-get) - (symbol-name - (coding-system-get org-html-coding-system - 'mime-charset))) - "iso-8859-1"))) - (concat - (when (plist-get info :time-stamp-file) - (format-time-string - (concat "<!-- " - (plist-get info :html-metadata-timestamp-format) - " -->\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)))) - (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) - - (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 <head>..</head> of the HTML output. -INFO is a plist used as a communication channel." - (org-element-normalize-string - (concat - (when (plist-get info :html-head-include-default-style) - (org-element-normalize-string org-html-style-default)) - (org-element-normalize-string (plist-get info :html-head)) - (org-element-normalize-string (plist-get info :html-head-extra)) - (when (and (plist-get info :html-htmlized-css-url) - (eq org-html-htmlize-output-type 'css)) - (org-html-close-tag "link" - (format "rel=\"stylesheet\" href=\"%s\" type=\"text/css\"" - (plist-get info :html-htmlized-css-url)) - info)) - (when (plist-get info :html-head-include-scripts) org-html-scripts)))) - -(defun org-html--build-mathjax-config (info) - "Insert the user setup into the mathjax template. -INFO is a plist used as a communication channel." - (when (and (memq (plist-get info :with-latex) '(mathjax t)) - (org-element-map (plist-get info :parse-tree) - '(latex-fragment latex-environment) #'identity info t nil t)) - (let ((template (plist-get info :html-mathjax-template)) - (options (plist-get info :html-mathjax-options)) - (in-buffer (or (plist-get info :html-mathjax) ""))) - (dolist (e options (org-element-normalize-string template)) - (let ((name (car e)) - (val (nth 1 e))) - (when (string-match (concat "\\<" (symbol-name name) ":") in-buffer) - (setq val - (car (read-from-string (substring in-buffer (match-end 0)))))) - (unless (stringp val) (setq val (format "%s" val))) - (while (string-match (concat "%" (upcase (symbol-name name))) - template) - (setq template (replace-match val t t template)))))))) - -(defun org-html-format-spec (info) - "Return format specification for preamble and postamble. -INFO is a plist used as a communication channel." - (let ((timestamp-format (plist-get info :html-metadata-timestamp-format))) - `((?t . ,(org-export-data (plist-get info :title) info)) - (?s . ,(org-export-data (plist-get info :subtitle) info)) - (?d . ,(org-export-data (org-export-get-date info timestamp-format) - info)) - (?T . ,(format-time-string 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)) - (?C . ,(let ((file (plist-get info :input-file))) - (format-time-string timestamp-format - (and file (file-attribute-modification-time - (file-attributes file)))))) - (?v . ,(or (plist-get info :html-validation-link) ""))))) - -(defun org-html--build-pre/postamble (type info) - "Return document preamble or postamble as a string, or nil. -TYPE is either `preamble' or `postamble', INFO is a plist used as a -communication channel." - (let ((section (plist-get info (intern (format ":html-%s" type)))) - (spec (org-html-format-spec info))) - (when section - (let ((section-contents - (if (functionp section) (funcall section info) - (cond - ((stringp section) (format-spec section spec)) - ((eq section 'auto) - (let ((date (cdr (assq ?d spec))) - (author (cdr (assq ?a spec))) - (email (cdr (assq ?e spec))) - (creator (cdr (assq ?c spec))) - (validation-link (cdr (assq ?v spec)))) - (concat - (and (plist-get info :with-date) - (org-string-nw-p date) - (format "<p class=\"date\">%s: %s</p>\n" - (org-html--translate "Date" info) - date)) - (and (plist-get info :with-author) - (org-string-nw-p author) - (format "<p class=\"author\">%s: %s</p>\n" - (org-html--translate "Author" info) - author)) - (and (plist-get info :with-email) - (org-string-nw-p email) - (format "<p class=\"email\">%s: %s</p>\n" - (org-html--translate "Email" info) - email)) - (and (plist-get info :time-stamp-file) - (format - "<p class=\"date\">%s: %s</p>\n" - (org-html--translate "Created" info) - (format-time-string - (plist-get info :html-metadata-timestamp-format)))) - (and (plist-get info :with-creator) - (org-string-nw-p creator) - (format "<p class=\"creator\">%s</p>\n" creator)) - (and (org-string-nw-p validation-link) - (format "<p class=\"validation\">%s</p>\n" - validation-link))))) - (t - (let ((formats (plist-get info (if (eq type 'preamble) - :html-preamble-format - :html-postamble-format))) - (language (plist-get info :language))) - (format-spec - (cadr (or (assoc-string language formats t) - (assoc-string "en" formats t))) - spec))))))) - (let ((div (assq type (plist-get info :html-divs)))) - (when (org-string-nw-p section-contents) - (concat - (format "<%s id=\"%s\" class=\"%s\">\n" - (nth 1 div) - (nth 2 div) - org-html--pre/postamble-class) - (org-element-normalize-string section-contents) - (format "</%s>\n" (nth 1 div))))))))) - -(defun org-html-inner-template (contents info) - "Return body of document string after HTML conversion. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - (concat - ;; Table of contents. - (let ((depth (plist-get info :with-toc))) - (when depth (org-html-toc depth info))) - ;; Document contents. - contents - ;; Footnotes section. - (org-html-footnote-section info))) - -(defun org-html-template (contents info) - "Return complete document string after HTML conversion. -CONTENTS is the transcoded contents string. INFO is a plist -holding export options." - (concat - (when (and (not (org-html-html5-p info)) (org-html-xhtml-p info)) - (let* ((xml-declaration (plist-get info :html-xml-declaration)) - (decl (or (and (stringp xml-declaration) xml-declaration) - (cdr (assoc (plist-get info :html-extension) - xml-declaration)) - (cdr (assoc "html" xml-declaration)) - ""))) - (when (not (or (not decl) (string= "" decl))) - (format "%s\n" - (format decl - (or (and org-html-coding-system - (fboundp 'coding-system-get) - (coding-system-get org-html-coding-system 'mime-charset)) - "iso-8859-1")))))) - (org-html-doctype info) - "\n" - (concat "<html" - (cond ((org-html-xhtml-p info) - (format - " xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"%s\" xml:lang=\"%s\"" - (plist-get info :language) (plist-get info :language))) - ((org-html-html5-p info) - (format " lang=\"%s\"" (plist-get info :language)))) - ">\n") - "<head>\n" - (org-html--build-meta-info info) - (org-html--build-head info) - (org-html--build-mathjax-config info) - "</head>\n" - "<body>\n" - (let ((link-up (org-trim (plist-get info :html-link-up))) - (link-home (org-trim (plist-get info :html-link-home)))) - (unless (and (string= link-up "") (string= link-home "")) - (format (plist-get info :html-home/up-format) - (or link-up link-home) - (or link-home link-up)))) - ;; Preamble. - (org-html--build-pre/postamble 'preamble info) - ;; Document contents. - (let ((div (assq 'content (plist-get info :html-divs)))) - (format "<%s id=\"%s\" class=\"%s\">\n" - (nth 1 div) - (nth 2 div) - (plist-get info :html-content-class))) - ;; Document title. - (when (plist-get info :with-title) - (let ((title (and (plist-get info :with-title) - (plist-get info :title))) - (subtitle (plist-get info :subtitle)) - (html5-fancy (org-html--html5-fancy-p info))) - (when title - (format - (if html5-fancy - "<header>\n<h1 class=\"title\">%s</h1>\n%s</header>" - "<h1 class=\"title\">%s%s</h1>\n") - (org-export-data title info) - (if subtitle - (format - (if html5-fancy - "<p class=\"subtitle\" role=\"doc-subtitle\">%s</p>\n" - (concat "\n" (org-html-close-tag "br" nil info) "\n" - "<span class=\"subtitle\">%s</span>\n")) - (org-export-data subtitle info)) - ""))))) - contents - (format "</%s>\n" (nth 1 (assq 'content (plist-get info :html-divs)))) - ;; Postamble. - (org-html--build-pre/postamble 'postamble info) - ;; Possibly use the Klipse library live code blocks. - (when (plist-get info :html-klipsify-src) - (concat "<script>" (plist-get info :html-klipse-selection-script) - "</script><script src=\"" - org-html-klipse-js - "\"></script><link rel=\"stylesheet\" type=\"text/css\" href=\"" - org-html-klipse-css "\"/>")) - ;; Closing document. - "</body>\n</html>")) - -(defun org-html--translate (s info) - "Translate string S according to specified language. -INFO is a plist used as a communication channel." - (org-export-translate s :html info)) - -;;;; Anchor - -(defun org-html--anchor (id desc attributes info) - "Format a HTML anchor." - (let* ((name (and (plist-get info :html-allow-name-attribute-in-anchors) id)) - (attributes (concat (and id (format " id=\"%s\"" id)) - (and name (format " name=\"%s\"" name)) - attributes))) - (format "<a%s>%s</a>" attributes (or desc "")))) - -;;;; Todo - -(defun org-html--todo (todo info) - "Format TODO keywords into HTML." - (when todo - (format "<span class=\"%s %s%s\">%s</span>" - (if (member todo org-done-keywords) "done" "todo") - (or (plist-get info :html-todo-kwd-class-prefix) "") - (org-html-fix-class-name todo) - todo))) - -;;;; Priority - -(defun org-html--priority (priority _info) - "Format a priority into HTML. -PRIORITY is the character code of the priority or nil. INFO is -a plist containing export options." - (and priority (format "<span class=\"priority\">[%c]</span>" priority))) - -;;;; Tags - -(defun org-html--tags (tags info) - "Format TAGS into HTML. -INFO is a plist containing export options." - (when tags - (format "<span class=\"tag\">%s</span>" - (mapconcat - (lambda (tag) - (format "<span class=\"%s\">%s</span>" - (concat (plist-get info :html-tag-class-prefix) - (org-html-fix-class-name tag)) - tag)) - tags " ")))) - -;;;; Src Code - -(defun org-html-fontify-code (code lang) - "Color CODE with htmlize library. -CODE is a string representing the source code to colorize. LANG -is the language used for CODE, as a string, or nil." - (when code - (cond - ;; No language. Possibly an example block. - ((not lang) (org-html-encode-plain-text code)) - ;; Plain text explicitly set. - ((not org-html-htmlize-output-type) (org-html-encode-plain-text code)) - ;; No htmlize library or an inferior version of htmlize. - ((not (progn (require 'htmlize nil t) - (fboundp 'htmlize-region-for-paste))) - ;; Emit a warning. - (message "Cannot fontify source block (htmlize.el >= 1.34 required)") - (org-html-encode-plain-text code)) - (t - ;; Map language - (setq lang (or (assoc-default lang org-src-lang-modes) lang)) - (let* ((lang-mode (and lang (intern (format "%s-mode" lang))))) - (cond - ;; Case 1: Language is not associated with any Emacs mode - ((not (functionp lang-mode)) - (org-html-encode-plain-text code)) - ;; Case 2: Default. Fontify code. - (t - ;; htmlize - (setq code - (let ((output-type org-html-htmlize-output-type) - (font-prefix org-html-htmlize-font-prefix) - (inhibit-read-only t)) - (with-temp-buffer - ;; Switch to language-specific mode. - (funcall lang-mode) - (insert code) - ;; Fontify buffer. - (org-font-lock-ensure) - ;; Remove formatting on newline characters. - (save-excursion - (let ((beg (point-min)) - (end (point-max))) - (goto-char beg) - (while (progn (end-of-line) (< (point) end)) - (put-text-property (point) (1+ (point)) 'face nil) - (forward-char 1)))) - (org-src-mode) - (set-buffer-modified-p nil) - ;; Htmlize region. - (let ((org-html-htmlize-output-type output-type) - (org-html-htmlize-font-prefix font-prefix)) - (org-html-htmlize-region-for-paste - (point-min) (point-max)))))) - ;; Strip any enclosing <pre></pre> tags. - (let* ((beg (and (string-match "\\`<pre[^>]*>\n?" code) (match-end 0))) - (end (and beg (string-match "</pre>\\'" code)))) - (if (and beg end) (substring code beg end) code))))))))) - -(defun org-html-do-format-code - (code &optional lang refs retain-labels num-start wrap-lines) - "Format CODE string as source code. -Optional arguments LANG, REFS, RETAIN-LABELS, NUM-START, WRAP-LINES -are, respectively, the language of the source code, as a string, an -alist between line numbers and references (as returned by -`org-export-unravel-code'), a boolean specifying if labels should -appear in the source code, the number associated to the first -line of code, and a boolean specifying if lines of code should be -wrapped in code elements." - (let* ((code-lines (split-string code "\n")) - (code-length (length code-lines)) - (num-fmt - (and num-start - (format "%%%ds: " - (length (number-to-string (+ code-length num-start)))))) - (code (org-html-fontify-code code lang))) - (org-export-format-code - code - (lambda (loc line-num ref) - (setq loc - (concat - ;; Add line number, if needed. - (when num-start - (format "<span class=\"linenr\">%s</span>" - (format num-fmt line-num))) - ;; Transcoded src line. - (if wrap-lines - (format "<code%s>%s</code>" - (if num-start - (format " data-ox-html-linenr=\"%s\"" line-num) - "") - loc) - loc) - ;; Add label, if needed. - (when (and ref retain-labels) (format " (%s)" ref)))) - ;; Mark transcoded line as an anchor, if needed. - (if (not ref) loc - (format "<span id=\"coderef-%s\" class=\"coderef-off\">%s</span>" - ref loc))) - num-start refs))) - -(defun org-html-format-code (element info) - "Format contents of ELEMENT as source code. -ELEMENT is either an example or a source block. INFO is a plist -used as a communication channel." - (let* ((lang (org-element-property :language element)) - ;; Extract code and references. - (code-info (org-export-unravel-code element)) - (code (car code-info)) - (refs (cdr code-info)) - ;; Does the source block contain labels? - (retain-labels (org-element-property :retain-labels element)) - ;; Does it have line numbers? - (num-start (org-export-get-loc element info)) - ;; Should lines be wrapped in code elements? - (wrap-lines (plist-get info :html-wrap-src-lines))) - (org-html-do-format-code code lang refs retain-labels num-start wrap-lines))) - - -;;; Tables of Contents - -(defun org-html-toc (depth info &optional scope) - "Build a table of contents. -DEPTH is an integer specifying the depth of the table. INFO is -a plist used as a communication channel. Optional argument SCOPE -is an element defining the scope of the table. Return the table -of contents as a string, or nil if it is empty." - (let ((toc-entries - (mapcar (lambda (headline) - (cons (org-html--format-toc-headline headline info) - (org-export-get-relative-level headline info))) - (org-export-collect-headlines info depth scope)))) - (when toc-entries - (let ((toc (concat "<div id=\"text-table-of-contents\" role=\"doc-toc\">" - (org-html--toc-text toc-entries) - "</div>\n"))) - (if scope toc - (let ((outer-tag (if (org-html--html5-fancy-p info) - "nav" - "div"))) - (concat (format "<%s id=\"table-of-contents\" role=\"doc-toc\">\n" outer-tag) - (let ((top-level (plist-get info :html-toplevel-hlevel))) - (format "<h%d>%s</h%d>\n" - top-level - (org-html--translate "Table of Contents" info) - top-level)) - toc - (format "</%s>\n" outer-tag)))))))) - -(defun org-html--toc-text (toc-entries) - "Return innards of a table of contents, as a string. -TOC-ENTRIES is an alist where key is an entry title, as a string, -and value is its relative level, as an integer." - (let* ((prev-level (1- (cdar toc-entries))) - (start-level prev-level)) - (concat - (mapconcat - (lambda (entry) - (let ((headline (car entry)) - (level (cdr entry))) - (concat - (let* ((cnt (- level prev-level)) - (times (if (> cnt 0) (1- cnt) (- cnt)))) - (setq prev-level level) - (concat - (org-html--make-string - times (cond ((> cnt 0) "\n<ul>\n<li>") - ((< cnt 0) "</li>\n</ul>\n"))) - (if (> cnt 0) "\n<ul>\n<li>" "</li>\n<li>"))) - headline))) - toc-entries "") - (org-html--make-string (- prev-level start-level) "</li>\n</ul>\n")))) - -(defun org-html--format-toc-headline (headline info) - "Return an appropriate table of contents entry for HEADLINE. -INFO is a plist used as a communication channel." - (let* ((headline-number (org-export-get-headline-number headline info)) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword headline))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type headline))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority headline))) - (text (org-export-data-with-backend - (org-export-get-alt-title headline info) - (org-export-toc-entry-backend 'html) - info)) - (tags (and (eq (plist-get info :with-tags) t) - (org-export-get-tags headline info)))) - (format "<a href=\"#%s\">%s</a>" - ;; Label. - (org-html--reference headline info) - ;; Body. - (concat - (and (not (org-export-low-level-p headline info)) - (org-export-numbered-headline-p headline info) - (concat (mapconcat #'number-to-string headline-number ".") - ". ")) - (apply (plist-get info :html-format-headline-function) - todo todo-type priority text tags :section-number nil))))) - -(defun org-html-list-of-listings (info) - "Build a list of listings. -INFO is a plist used as a communication channel. Return the list -of listings as a string, or nil if it is empty." - (let ((lol-entries (org-export-collect-listings info))) - (when lol-entries - (concat "<div id=\"list-of-listings\">\n" - (let ((top-level (plist-get info :html-toplevel-hlevel))) - (format "<h%d>%s</h%d>\n" - top-level - (org-html--translate "List of Listings" info) - top-level)) - "<div id=\"text-list-of-listings\">\n<ul>\n" - (let ((count 0) - (initial-fmt (format "<span class=\"listing-number\">%s</span>" - (org-html--translate "Listing %d:" info)))) - (mapconcat - (lambda (entry) - (let ((label (org-html--reference entry info t)) - (title (org-trim - (org-export-data - (or (org-export-get-caption entry t) - (org-export-get-caption entry)) - info)))) - (concat - "<li>" - (if (not label) - (concat (format initial-fmt (cl-incf count)) - " " - title) - (format "<a href=\"#%s\">%s %s</a>" - label - (format initial-fmt (cl-incf count)) - title)) - "</li>"))) - lol-entries "\n")) - "\n</ul>\n</div>\n</div>")))) - -(defun org-html-list-of-tables (info) - "Build a list of tables. -INFO is a plist used as a communication channel. Return the list -of tables as a string, or nil if it is empty." - (let ((lol-entries (org-export-collect-tables info))) - (when lol-entries - (concat "<div id=\"list-of-tables\">\n" - (let ((top-level (plist-get info :html-toplevel-hlevel))) - (format "<h%d>%s</h%d>\n" - top-level - (org-html--translate "List of Tables" info) - top-level)) - "<div id=\"text-list-of-tables\">\n<ul>\n" - (let ((count 0) - (initial-fmt (format "<span class=\"table-number\">%s</span>" - (org-html--translate "Table %d:" info)))) - (mapconcat - (lambda (entry) - (let ((label (org-html--reference entry info t)) - (title (org-trim - (org-export-data - (or (org-export-get-caption entry t) - (org-export-get-caption entry)) - info)))) - (concat - "<li>" - (if (not label) - (concat (format initial-fmt (cl-incf count)) - " " - title) - (format "<a href=\"#%s\">%s %s</a>" - label - (format initial-fmt (cl-incf count)) - title)) - "</li>"))) - lol-entries "\n")) - "\n</ul>\n</div>\n</div>")))) - - -;;; Transcode Functions - -;;;; Bold - -(defun org-html-bold (_bold contents info) - "Transcode BOLD from Org to HTML. -CONTENTS is the text with bold markup. INFO is a plist holding -contextual information." - (format (or (cdr (assq 'bold (plist-get info :html-text-markup-alist))) "%s") - contents)) - -;;;; Center Block - -(defun org-html-center-block (_center-block contents _info) - "Transcode a CENTER-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (format "<div class=\"org-center\">\n%s</div>" contents)) - -;;;; Clock - -(defun org-html-clock (clock _contents _info) - "Transcode a CLOCK element from Org to HTML. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (format "<p> -<span class=\"timestamp-wrapper\"> -<span class=\"timestamp-kwd\">%s</span> <span class=\"timestamp\">%s</span>%s -</span> -</p>" - org-clock-string - (org-timestamp-translate (org-element-property :value clock)) - (let ((time (org-element-property :duration clock))) - (and time (format " <span class=\"timestamp\">(%s)</span>" time))))) - -;;;; Code - -(defun org-html-code (code _contents info) - "Transcode CODE from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format (or (cdr (assq 'code (plist-get info :html-text-markup-alist))) "%s") - (org-html-encode-plain-text (org-element-property :value code)))) - -;;;; Drawer - -(defun org-html-drawer (drawer contents info) - "Transcode a DRAWER element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (funcall (plist-get info :html-format-drawer-function) - (org-element-property :drawer-name drawer) - contents)) - -;;;; Dynamic Block - -(defun org-html-dynamic-block (_dynamic-block contents _info) - "Transcode a DYNAMIC-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information. See `org-export-data'." - contents) - -;;;; Entity - -(defun org-html-entity (entity _contents _info) - "Transcode an ENTITY object from Org to HTML. -CONTENTS are the definition itself. INFO is a plist holding -contextual information." - (org-element-property :html entity)) - -;;;; Example Block - -(defun org-html-example-block (example-block _contents info) - "Transcode a EXAMPLE-BLOCK element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((attributes (org-export-read-attribute :attr_html example-block))) - (if (plist-get attributes :textarea) - (org-html--textarea-block example-block) - (format "<pre class=\"example\"%s>\n%s</pre>" - (let* ((reference (org-html--reference example-block info)) - (a (org-html--make-attribute-string - (if (or (not reference) (plist-member attributes :id)) - attributes - (plist-put attributes :id reference))))) - (if (org-string-nw-p a) (concat " " a) "")) - (org-html-format-code example-block info))))) - -;;;; Export Snippet - -(defun org-html-export-snippet (export-snippet _contents _info) - "Transcode a EXPORT-SNIPPET object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (when (eq (org-export-snippet-backend export-snippet) 'html) - (org-element-property :value export-snippet))) - -;;;; Export Block - -(defun org-html-export-block (export-block _contents _info) - "Transcode a EXPORT-BLOCK element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (when (string= (org-element-property :type export-block) "HTML") - (org-remove-indentation (org-element-property :value export-block)))) - -;;;; Fixed Width - -(defun org-html-fixed-width (fixed-width _contents _info) - "Transcode a FIXED-WIDTH element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (format "<pre class=\"example\">\n%s</pre>" - (org-html-do-format-code - (org-remove-indentation - (org-element-property :value fixed-width))))) - -;;;; Footnote Reference - -(defun org-html-footnote-reference (footnote-reference _contents info) - "Transcode a FOOTNOTE-REFERENCE element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (concat - ;; Insert separator between two footnotes in a row. - (let ((prev (org-export-get-previous-element footnote-reference info))) - (when (eq (org-element-type prev) 'footnote-reference) - (plist-get info :html-footnote-separator))) - (let* ((n (org-export-get-footnote-number footnote-reference info)) - (id (format "fnr.%d%s" - n - (if (org-export-footnote-first-reference-p - footnote-reference info) - "" - ".100")))) - (format - (plist-get info :html-footnote-format) - (org-html--anchor - id n (format " class=\"footref\" href=\"#fn.%d\" role=\"doc-backlink\"" n) info))))) - -;;;; Headline - -(defun org-html-headline (headline contents info) - "Transcode a HEADLINE element from Org to HTML. -CONTENTS holds the contents of the headline. INFO is a plist -holding contextual information." - (unless (org-element-property :footnote-section-p headline) - (let* ((numberedp (org-export-numbered-headline-p headline info)) - (numbers (org-export-get-headline-number headline info)) - (level (+ (org-export-get-relative-level headline info) - (1- (plist-get info :html-toplevel-hlevel)))) - (todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword headline))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type headline))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority headline))) - (text (org-export-data (org-element-property :title headline) info)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags headline info))) - (full-text (funcall (plist-get info :html-format-headline-function) - todo todo-type priority text tags info)) - (contents (or contents "")) - (id (org-html--reference headline info)) - (formatted-text - (if (plist-get info :html-self-link-headlines) - (format "<a href=\"#%s\">%s</a>" id full-text) - full-text))) - (if (org-export-low-level-p headline info) - ;; This is a deep sub-tree: export it as a list item. - (let* ((html-type (if numberedp "ol" "ul"))) - (concat - (and (org-export-first-sibling-p headline info) - (apply #'format "<%s class=\"org-%s\">\n" - (make-list 2 html-type))) - (org-html-format-list-item - contents (if numberedp 'ordered 'unordered) - nil info nil - (concat (org-html--anchor id nil nil info) formatted-text)) "\n" - (and (org-export-last-sibling-p headline info) - (format "</%s>\n" html-type)))) - ;; Standard headline. Export it as a section. - (let ((extra-class - (org-element-property :HTML_CONTAINER_CLASS headline)) - (headline-class - (org-element-property :HTML_HEADLINE_CLASS headline)) - (first-content (car (org-element-contents headline)))) - (format "<%s id=\"%s\" class=\"%s\">%s%s</%s>\n" - (org-html--container headline info) - (format "outline-container-%s" id) - (concat (format "outline-%d" level) - (and extra-class " ") - extra-class) - (format "\n<h%d id=\"%s\"%s>%s</h%d>\n" - level - id - (if (not headline-class) "" - (format " class=\"%s\"" headline-class)) - (concat - (and numberedp - (format - "<span class=\"section-number-%d\">%s</span> " - level - (concat (mapconcat #'number-to-string numbers ".") "."))) - formatted-text) - level) - ;; When there is no section, pretend there is an - ;; empty one to get the correct <div - ;; class="outline-...> which is needed by - ;; `org-info.js'. - (if (eq (org-element-type first-content) 'section) contents - (concat (org-html-section first-content "" info) contents)) - (org-html--container headline info))))))) - -(defun org-html-format-headline-default-function - (todo _todo-type priority text tags info) - "Default format function for a headline. -See `org-html-format-headline-function' for details." - (let ((todo (org-html--todo todo info)) - (priority (org-html--priority priority info)) - (tags (org-html--tags tags info))) - (concat todo (and todo " ") - priority (and priority " ") - text - (and tags "   ") tags))) - -(defun org-html--container (headline info) - (or (org-element-property :HTML_CONTAINER headline) - (if (= 1 (org-export-get-relative-level headline info)) - (plist-get info :html-container) - "div"))) - -;;;; Horizontal Rule - -(defun org-html-horizontal-rule (_horizontal-rule _contents info) - "Transcode an HORIZONTAL-RULE object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (org-html-close-tag "hr" nil info)) - -;;;; Inline Src Block - -(defun org-html-inline-src-block (inline-src-block _contents info) - "Transcode an INLINE-SRC-BLOCK element from Org to HTML. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((lang (org-element-property :language inline-src-block)) - (code (org-html-fontify-code - (org-element-property :value inline-src-block) - lang)) - (label - (let ((lbl (org-html--reference inline-src-block info t))) - (if (not lbl) "" (format " id=\"%s\"" lbl))))) - (format "<code class=\"src src-%s\"%s>%s</code>" lang label code))) - -;;;; Inlinetask - -(defun org-html-inlinetask (inlinetask contents info) - "Transcode an INLINETASK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((todo (and (plist-get info :with-todo-keywords) - (let ((todo (org-element-property :todo-keyword inlinetask))) - (and todo (org-export-data todo info))))) - (todo-type (and todo (org-element-property :todo-type inlinetask))) - (priority (and (plist-get info :with-priority) - (org-element-property :priority inlinetask))) - (text (org-export-data (org-element-property :title inlinetask) info)) - (tags (and (plist-get info :with-tags) - (org-export-get-tags inlinetask info)))) - (funcall (plist-get info :html-format-inlinetask-function) - todo todo-type priority text tags contents info))) - -(defun org-html-format-inlinetask-default-function - (todo todo-type priority text tags contents info) - "Default format function for inlinetasks. -See `org-html-format-inlinetask-function' for details." - (format "<div class=\"inlinetask\">\n<b>%s</b>%s\n%s</div>" - (org-html-format-headline-default-function - todo todo-type priority text tags info) - (org-html-close-tag "br" nil info) - contents)) - -;;;; Italic - -(defun org-html-italic (_italic contents info) - "Transcode ITALIC from Org to HTML. -CONTENTS is the text with italic markup. INFO is a plist holding -contextual information." - (format - (or (cdr (assq 'italic (plist-get info :html-text-markup-alist))) "%s") - contents)) - -;;;; Item - -(defun org-html-checkbox (checkbox info) - "Format CHECKBOX into HTML. -INFO is a plist holding contextual information. See -`org-html-checkbox-type' for customization options." - (cdr (assq checkbox - (cdr (assq (plist-get info :html-checkbox-type) - org-html-checkbox-types))))) - -(defun org-html-format-list-item (contents type checkbox info - &optional term-counter-id - headline) - "Format a list item into HTML." - (let ((class (if checkbox - (format " class=\"%s\"" - (symbol-name checkbox)) "")) - (checkbox (concat (org-html-checkbox checkbox info) - (and checkbox " "))) - (br (org-html-close-tag "br" nil info)) - (extra-newline (if (and (org-string-nw-p contents) headline) "\n" ""))) - (concat - (pcase type - (`ordered - (let* ((counter term-counter-id) - (extra (if counter (format " value=\"%s\"" counter) ""))) - (concat - (format "<li%s%s>" class extra) - (when headline (concat headline br))))) - (`unordered - (let* ((id term-counter-id) - (extra (if id (format " id=\"%s\"" id) ""))) - (concat - (format "<li%s%s>" class extra) - (when headline (concat headline br))))) - (`descriptive - (let* ((term term-counter-id)) - (setq term (or term "(no term)")) - ;; Check-boxes in descriptive lists are associated to tag. - (concat (format "<dt%s>%s</dt>" - class (concat checkbox term)) - "<dd>")))) - (unless (eq type 'descriptive) checkbox) - extra-newline - (and (org-string-nw-p contents) (org-trim contents)) - extra-newline - (pcase type - (`ordered "</li>") - (`unordered "</li>") - (`descriptive "</dd>"))))) - -(defun org-html-item (item contents info) - "Transcode an ITEM element from Org to HTML. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (let* ((plain-list (org-export-get-parent item)) - (type (org-element-property :type plain-list)) - (counter (org-element-property :counter item)) - (checkbox (org-element-property :checkbox item)) - (tag (let ((tag (org-element-property :tag item))) - (and tag (org-export-data tag info))))) - (org-html-format-list-item - contents type checkbox info (or tag counter)))) - -;;;; Keyword - -(defun org-html-keyword (keyword _contents info) - "Transcode a KEYWORD element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((key (org-element-property :key keyword)) - (value (org-element-property :value keyword))) - (cond - ((string= key "HTML") value) - ((string= key "TOC") - (let ((case-fold-search t)) - (cond - ((string-match "\\<headlines\\>" value) - (let ((depth (and (string-match "\\<[0-9]+\\>" value) - (string-to-number (match-string 0 value)))) - (scope - (cond - ((string-match ":target +\\(\".+?\"\\|\\S-+\\)" value) ;link - (org-export-resolve-link - (org-strip-quotes (match-string 1 value)) info)) - ((string-match-p "\\<local\\>" value) keyword)))) ;local - (org-html-toc depth info scope))) - ((string= "listings" value) (org-html-list-of-listings info)) - ((string= "tables" value) (org-html-list-of-tables info)))))))) - -;;;; Latex Environment - -(defun org-html-format-latex (latex-frag processing-type info) - "Format a LaTeX fragment LATEX-FRAG into HTML. -PROCESSING-TYPE designates the tool used for conversion. It can -be `mathjax', `verbatim', `html', nil, t or symbols in -`org-preview-latex-process-alist', e.g., `dvipng', `dvisvgm' or -`imagemagick'. See `org-html-with-latex' for more information. -INFO is a plist containing export properties." - (let ((cache-relpath "") (cache-dir "")) - (unless (or (eq processing-type 'mathjax) - (eq processing-type 'html)) - (let ((bfn (or (buffer-file-name) - (make-temp-name - (expand-file-name "latex" temporary-file-directory)))) - (latex-header - (let ((header (plist-get info :latex-header))) - (and header - (concat (mapconcat - (lambda (line) (concat "#+LATEX_HEADER: " line)) - (org-split-string header "\n") - "\n") - "\n"))))) - (setq cache-relpath - (concat (file-name-as-directory org-preview-latex-image-directory) - (file-name-sans-extension - (file-name-nondirectory bfn))) - cache-dir (file-name-directory bfn)) - ;; Re-create LaTeX environment from original buffer in - ;; temporary buffer so that dvipng/imagemagick can properly - ;; turn the fragment into an image. - (setq latex-frag (concat latex-header latex-frag)))) - (with-temp-buffer - (insert latex-frag) - (org-format-latex cache-relpath nil nil cache-dir nil - "Creating LaTeX Image..." nil processing-type) - (buffer-string)))) - -(defun org-html--wrap-latex-environment (contents _ &optional caption label) - "Wrap CONTENTS string within appropriate environment for equations. -When optional arguments CAPTION and LABEL are given, use them for -caption and \"id\" attribute." - (format "\n<div%s class=\"equation-container\">\n%s%s\n</div>" - ;; ID. - (if (org-string-nw-p label) (format " id=\"%s\"" label) "") - ;; Contents. - (format "<span class=\"equation\">\n%s\n</span>" contents) - ;; Caption. - (if (not (org-string-nw-p caption)) "" - (format "\n<span class=\"equation-label\">\n%s\n</span>" - caption)))) - -(defun org-html--math-environment-p (element &optional _) - "Non-nil when ELEMENT is a LaTeX math environment. -Math environments match the regular expression defined in -`org-latex-math-environments-re'. This function is meant to be -used as a predicate for `org-export-get-ordinal' or a value to -`org-html-standalone-image-predicate'." - (string-match-p org-latex-math-environments-re - (org-element-property :value element))) - -(defun org-html--latex-environment-numbered-p (element) - "Non-nil when ELEMENT contains a numbered LaTeX math environment. -Starred and \"displaymath\" environments are not numbered." - (not (string-match-p "\\`[ \t]*\\\\begin{\\(.*\\*\\|displaymath\\)}" - (org-element-property :value element)))) - -(defun org-html--unlabel-latex-environment (latex-frag) - "Change environment in LATEX-FRAG string to an unnumbered one. -For instance, change an 'equation' environment to 'equation*'." - (replace-regexp-in-string - "\\`[ \t]*\\\\begin{\\([^*]+?\\)}" - "\\1*" - (replace-regexp-in-string "^[ \t]*\\\\end{\\([^*]+?\\)}[ \r\t\n]*\\'" - "\\1*" - latex-frag nil nil 1) - nil nil 1)) - -(defun org-html-latex-environment (latex-environment _contents info) - "Transcode a LATEX-ENVIRONMENT element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((processing-type (plist-get info :with-latex)) - (latex-frag (org-remove-indentation - (org-element-property :value latex-environment))) - (attributes (org-export-read-attribute :attr_html latex-environment)) - (label (org-html--reference latex-environment info t)) - (caption (and (org-html--latex-environment-numbered-p latex-environment) - (number-to-string - (org-export-get-ordinal - latex-environment info nil - (lambda (l _) - (and (org-html--math-environment-p l) - (org-html--latex-environment-numbered-p l)))))))) - (cond - ((memq processing-type '(t mathjax)) - (org-html-format-latex - (if (org-string-nw-p label) - (replace-regexp-in-string "\\`.*" - (format "\\&\n\\\\label{%s}" label) - latex-frag) - latex-frag) - 'mathjax info)) - ((assq processing-type org-preview-latex-process-alist) - (let ((formula-link - (org-html-format-latex - (org-html--unlabel-latex-environment latex-frag) - processing-type info))) - (when (and formula-link (string-match "file:\\([^]]*\\)" formula-link)) - (let ((source (org-export-file-uri (match-string 1 formula-link)))) - (org-html--wrap-latex-environment - (org-html--format-image source attributes info) - info caption label))))) - (t (org-html--wrap-latex-environment latex-frag info caption label))))) - -;;;; Latex Fragment - -(defun org-html-latex-fragment (latex-fragment _contents info) - "Transcode a LATEX-FRAGMENT object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((latex-frag (org-element-property :value latex-fragment)) - (processing-type (plist-get info :with-latex))) - (cond - ((memq processing-type '(t mathjax)) - (org-html-format-latex latex-frag 'mathjax info)) - ((memq processing-type '(t html)) - (org-html-format-latex latex-frag 'html info)) - ((assq processing-type org-preview-latex-process-alist) - (let ((formula-link - (org-html-format-latex latex-frag processing-type info))) - (when (and formula-link (string-match "file:\\([^]]*\\)" formula-link)) - (let ((source (org-export-file-uri (match-string 1 formula-link)))) - (org-html--format-image source nil info))))) - (t latex-frag)))) - -;;;; Line Break - -(defun org-html-line-break (_line-break _contents info) - "Transcode a LINE-BREAK object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (concat (org-html-close-tag "br" nil info) "\n")) - -;;;; Link - -(defun org-html-image-link-filter (data _backend info) - (org-export-insert-image-links data info org-html-inline-image-rules)) - -(defun org-html-inline-image-p (link info) - "Non-nil when LINK is meant to appear as an image. -INFO is a plist used as a communication channel. LINK is an -inline image when it has no description and targets an image -file (see `org-html-inline-image-rules' for more information), or -if its description is a single link targeting an image file." - (if (not (org-element-contents link)) - (org-export-inline-image-p - link (plist-get info :html-inline-image-rules)) - (not - (let ((link-count 0)) - (org-element-map (org-element-contents link) - (cons 'plain-text org-element-all-objects) - (lambda (obj) - (pcase (org-element-type obj) - (`plain-text (org-string-nw-p obj)) - (`link (if (= link-count 1) t - (cl-incf link-count) - (not (org-export-inline-image-p - obj (plist-get info :html-inline-image-rules))))) - (_ t))) - info t))))) - -(defvar org-html-standalone-image-predicate) -(defun org-html-standalone-image-p (element info) - "Non-nil if ELEMENT is a standalone image. - -INFO is a plist holding contextual information. - -An element or object is a standalone image when - - - its type is `paragraph' and its sole content, save for white - spaces, is a link that qualifies as an inline image; - - - its type is `link' and its containing paragraph has no other - content save white spaces. - -Bind `org-html-standalone-image-predicate' to constrain paragraph -further. For example, to check for only captioned standalone -images, set it to: - - (lambda (paragraph) (org-element-property :caption paragraph))" - (let ((paragraph (pcase (org-element-type element) - (`paragraph element) - (`link (org-export-get-parent element))))) - (and (eq (org-element-type paragraph) 'paragraph) - (or (not (and (boundp 'org-html-standalone-image-predicate) - (fboundp org-html-standalone-image-predicate))) - (funcall org-html-standalone-image-predicate paragraph)) - (catch 'exit - (let ((link-count 0)) - (org-element-map (org-element-contents paragraph) - (cons 'plain-text org-element-all-objects) - (lambda (obj) - (when (pcase (org-element-type obj) - (`plain-text (org-string-nw-p obj)) - (`link (or (> (cl-incf link-count) 1) - (not (org-html-inline-image-p obj info)))) - (_ t)) - (throw 'exit nil))) - info nil 'link) - (= link-count 1)))))) - -(defun org-html-link (link desc info) - "Transcode a LINK object from Org to HTML. -DESC is the description part of the link, or the empty string. -INFO is a plist holding contextual information. See -`org-export-data'." - (let* ((html-ext (plist-get info :html-extension)) - (dot (when (> (length html-ext) 0) ".")) - (link-org-files-as-html-maybe - (lambda (raw-path info) - ;; Treat links to `file.org' as links to `file.html', if - ;; needed. See `org-html-link-org-files-as-html'. - (cond - ((and (plist-get info :html-link-org-files-as-html) - (string= ".org" - (downcase (file-name-extension raw-path ".")))) - (concat (file-name-sans-extension raw-path) dot html-ext)) - (t raw-path)))) - (type (org-element-property :type link)) - (raw-path (org-element-property :path link)) - ;; Ensure DESC really exists, or set it to nil. - (desc (org-string-nw-p desc)) - (path - (cond - ((member type '("http" "https" "ftp" "mailto" "news")) - (url-encode-url (concat type ":" raw-path))) - ((string= "file" type) - ;; During publishing, turn absolute file names belonging - ;; to base directory into relative file names. Otherwise, - ;; append "file" protocol to absolute file name. - (setq raw-path - (org-export-file-uri - (org-publish-file-relative-name raw-path info))) - ;; Possibly append `:html-link-home' to relative file - ;; name. - (let ((home (and (plist-get info :html-link-home) - (org-trim (plist-get info :html-link-home))))) - (when (and home - (plist-get info :html-link-use-abs-url) - (file-name-absolute-p raw-path)) - (setq raw-path (concat (file-name-as-directory home) raw-path)))) - ;; Maybe turn ".org" into ".html". - (setq raw-path (funcall link-org-files-as-html-maybe raw-path info)) - ;; Add search option, if any. A search option can be - ;; relative to a custom-id, a headline title, a name or - ;; a target. - (let ((option (org-element-property :search-option link))) - (if (not option) raw-path - (let ((path (org-element-property :path link))) - (concat raw-path - "#" - (org-publish-resolve-external-link option path t)))))) - (t raw-path))) - (attributes-plist - (org-combine-plists - ;; Extract attributes from parent's paragraph. HACK: Only - ;; do this for the first link in parent (inner image link - ;; for inline images). This is needed as long as - ;; attributes cannot be set on a per link basis. - (let* ((parent (org-export-get-parent-element link)) - (link (let ((container (org-export-get-parent link))) - (if (and (eq 'link (org-element-type container)) - (org-html-inline-image-p link info)) - container - link)))) - (and (eq link (org-element-map parent 'link #'identity info t)) - (org-export-read-attribute :attr_html parent))) - ;; Also add attributes from link itself. Currently, those - ;; need to be added programmatically before `org-html-link' - ;; is invoked, for example, by backends building upon HTML - ;; export. - (org-export-read-attribute :attr_html link))) - (attributes - (let ((attr (org-html--make-attribute-string attributes-plist))) - (if (org-string-nw-p attr) (concat " " attr) "")))) - (cond - ;; Link type is handled by a special function. - ((org-export-custom-protocol-maybe link desc 'html info)) - ;; Image file. - ((and (plist-get info :html-inline-images) - (org-export-inline-image-p - link (plist-get info :html-inline-image-rules))) - (org-html--format-image path attributes-plist info)) - ;; Radio target: Transcode target's contents and use them as - ;; link's description. - ((string= type "radio") - (let ((destination (org-export-resolve-radio-link link info))) - (if (not destination) desc - (format "<a href=\"#%s\"%s>%s</a>" - (org-export-get-reference destination info) - attributes - desc)))) - ;; Links pointing to a headline: Find destination and build - ;; appropriate referencing command. - ((member type '("custom-id" "fuzzy" "id")) - (let ((destination (if (string= type "fuzzy") - (org-export-resolve-fuzzy-link link info) - (org-export-resolve-id-link link info)))) - (pcase (org-element-type destination) - ;; ID link points to an external file. - (`plain-text - (let ((fragment (concat "ID-" path)) - ;; Treat links to ".org" files as ".html", if needed. - (path (funcall link-org-files-as-html-maybe - destination info))) - (format "<a href=\"%s#%s\"%s>%s</a>" - path fragment attributes (or desc destination)))) - ;; Fuzzy link points nowhere. - (`nil - (format "<i>%s</i>" - (or desc - (org-export-data - (org-element-property :raw-link link) info)))) - ;; Link points to a headline. - (`headline - (let ((href (org-html--reference destination info)) - ;; What description to use? - (desc - ;; Case 1: Headline is numbered and LINK has no - ;; description. Display section number. - (if (and (org-export-numbered-headline-p destination info) - (not desc)) - (mapconcat #'number-to-string - (org-export-get-headline-number - destination info) ".") - ;; Case 2: Either the headline is un-numbered or - ;; LINK has a custom description. Display LINK's - ;; description or headline's title. - (or desc - (org-export-data - (org-element-property :title destination) info))))) - (format "<a href=\"#%s\"%s>%s</a>" href attributes desc))) - ;; Fuzzy link points to a target or an element. - (_ - (if (and destination - (memq (plist-get info :with-latex) '(mathjax t)) - (eq 'latex-environment (org-element-type destination)) - (eq 'math (org-latex--environment-type destination))) - ;; Caption and labels are introduced within LaTeX - ;; environment. Use "ref" or "eqref" macro, depending on user - ;; preference to refer to those in the document. - (format (plist-get info :html-equation-reference-format) - (org-html--reference destination info)) - (let* ((ref (org-html--reference destination info)) - (org-html-standalone-image-predicate - #'org-html--has-caption-p) - (counter-predicate - (if (eq 'latex-environment (org-element-type destination)) - #'org-html--math-environment-p - #'org-html--has-caption-p)) - (number - (cond - (desc nil) - ((org-html-standalone-image-p destination info) - (org-export-get-ordinal - (org-element-map destination 'link #'identity info t) - info 'link 'org-html-standalone-image-p)) - (t (org-export-get-ordinal - destination info nil counter-predicate)))) - (desc - (cond (desc) - ((not number) "No description for this link") - ((numberp number) (number-to-string number)) - (t (mapconcat #'number-to-string number "."))))) - (format "<a href=\"#%s\"%s>%s</a>" ref attributes desc))))))) - ;; Coderef: replace link with the reference name or the - ;; equivalent line number. - ((string= type "coderef") - (let ((fragment (concat "coderef-" (org-html-encode-plain-text path)))) - (format "<a href=\"#%s\" %s%s>%s</a>" - fragment - (format "class=\"coderef\" onmouseover=\"CodeHighlightOn(this, \ -'%s');\" onmouseout=\"CodeHighlightOff(this, '%s');\"" - fragment fragment) - attributes - (format (org-export-get-coderef-format path desc) - (org-export-resolve-coderef path info))))) - ;; External link with a description part. - ((and path desc) - (format "<a href=\"%s\"%s>%s</a>" - (org-html-encode-plain-text path) - attributes - desc)) - ;; External link without a description part. - (path - (let ((path (org-html-encode-plain-text path))) - (format "<a href=\"%s\"%s>%s</a>" path attributes path))) - ;; No path, only description. Try to do something useful. - (t - (format "<i>%s</i>" desc))))) - -;;;; Node Property - -(defun org-html-node-property (node-property _contents _info) - "Transcode a NODE-PROPERTY element from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format "%s:%s" - (org-element-property :key node-property) - (let ((value (org-element-property :value node-property))) - (if value (concat " " value) "")))) - -;;;; Paragraph - -(defun org-html-paragraph (paragraph contents info) - "Transcode a PARAGRAPH element from Org to HTML. -CONTENTS is the contents of the paragraph, as a string. INFO is -the plist used as a communication channel." - (let* ((parent (org-export-get-parent paragraph)) - (parent-type (org-element-type parent)) - (style '((footnote-definition " class=\"footpara\"") - (org-data " class=\"footpara\""))) - (attributes (org-html--make-attribute-string - (org-export-read-attribute :attr_html paragraph))) - (extra (or (cadr (assq parent-type style)) ""))) - (cond - ((and (eq parent-type 'item) - (not (org-export-get-previous-element paragraph info)) - (let ((followers (org-export-get-next-element paragraph info 2))) - (and (not (cdr followers)) - (memq (org-element-type (car followers)) '(nil plain-list))))) - ;; First paragraph in an item has no tag if it is alone or - ;; followed, at most, by a sub-list. - contents) - ((org-html-standalone-image-p paragraph info) - ;; Standalone image. - (let ((caption - (let ((raw (org-export-data - (org-export-get-caption paragraph) info)) - (org-html-standalone-image-predicate - #'org-html--has-caption-p)) - (if (not (org-string-nw-p raw)) raw - (concat "<span class=\"figure-number\">" - (format (org-html--translate "Figure %d:" info) - (org-export-get-ordinal - (org-element-map paragraph 'link - #'identity info t) - info nil #'org-html-standalone-image-p)) - " </span>" - raw)))) - (label (org-html--reference paragraph info))) - (org-html--wrap-image contents info caption label))) - ;; Regular paragraph. - (t (format "<p%s%s>\n%s</p>" - (if (org-string-nw-p attributes) - (concat " " attributes) "") - extra contents))))) - -;;;; Plain List - -(defun org-html-plain-list (plain-list contents _info) - "Transcode a PLAIN-LIST element from Org to HTML. -CONTENTS is the contents of the list. INFO is a plist holding -contextual information." - (let* ((type (pcase (org-element-property :type plain-list) - (`ordered "ol") - (`unordered "ul") - (`descriptive "dl") - (other (error "Unknown HTML list type: %s" other)))) - (class (format "org-%s" type)) - (attributes (org-export-read-attribute :attr_html plain-list))) - (format "<%s %s>\n%s</%s>" - type - (org-html--make-attribute-string - (plist-put attributes :class - (org-trim - (mapconcat #'identity - (list class (plist-get attributes :class)) - " ")))) - contents - type))) - -;;;; Plain Text - -(defun org-html-convert-special-strings (string) - "Convert special characters in STRING to HTML." - (dolist (a org-html-special-string-regexps string) - (let ((re (car a)) - (rpl (cdr a))) - (setq string (replace-regexp-in-string re rpl string t))))) - -(defun org-html-encode-plain-text (text) - "Convert plain text characters from TEXT to HTML equivalent. -Possible conversions are set in `org-html-protect-char-alist'." - (dolist (pair org-html-protect-char-alist text) - (setq text (replace-regexp-in-string (car pair) (cdr pair) text t t)))) - -(defun org-html-plain-text (text info) - "Transcode a TEXT string from Org to HTML. -TEXT is the string to transcode. INFO is a plist holding -contextual information." - (let ((output text)) - ;; Protect following characters: <, >, &. - (setq output (org-html-encode-plain-text output)) - ;; Handle smart quotes. Be sure to provide original string since - ;; OUTPUT may have been modified. - (when (plist-get info :with-smart-quotes) - (setq output (org-export-activate-smart-quotes output :html info text))) - ;; Handle special strings. - (when (plist-get info :with-special-strings) - (setq output (org-html-convert-special-strings output))) - ;; Handle break preservation if required. - (when (plist-get info :preserve-breaks) - (setq output - (replace-regexp-in-string - "\\(\\\\\\\\\\)?[ \t]*\n" - (concat (org-html-close-tag "br" nil info) "\n") output))) - ;; Return value. - output)) - - -;; Planning - -(defun org-html-planning (planning _contents info) - "Transcode a PLANNING element from Org to HTML. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (format - "<p><span class=\"timestamp-wrapper\">%s</span></p>" - (org-trim - (mapconcat - (lambda (pair) - (let ((timestamp (cdr pair))) - (when timestamp - (let ((string (car pair))) - (format "<span class=\"timestamp-kwd\">%s</span> \ -<span class=\"timestamp\">%s</span> " - string - (org-html-plain-text (org-timestamp-translate timestamp) - info)))))) - `((,org-closed-string . ,(org-element-property :closed planning)) - (,org-deadline-string . ,(org-element-property :deadline planning)) - (,org-scheduled-string . ,(org-element-property :scheduled planning))) - "")))) - -;;;; Property Drawer - -(defun org-html-property-drawer (_property-drawer contents _info) - "Transcode a PROPERTY-DRAWER element from Org to HTML. -CONTENTS holds the contents of the drawer. INFO is a plist -holding contextual information." - (and (org-string-nw-p contents) - (format "<pre class=\"example\">\n%s</pre>" contents))) - -;;;; Quote Block - -(defun org-html-quote-block (quote-block contents info) - "Transcode a QUOTE-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (format "<blockquote%s>\n%s</blockquote>" - (let* ((reference (org-html--reference quote-block info t)) - (attributes (org-export-read-attribute :attr_html quote-block)) - (a (org-html--make-attribute-string - (if (or (not reference) (plist-member attributes :id)) - attributes - (plist-put attributes :id reference))))) - (if (org-string-nw-p a) (concat " " a) "")) - contents)) - -;;;; Section - -(defun org-html-section (section contents info) - "Transcode a SECTION element from Org to HTML. -CONTENTS holds the contents of the section. INFO is a plist -holding contextual information." - (let ((parent (org-export-get-parent-headline section))) - ;; Before first headline: no container, just return CONTENTS. - (if (not parent) contents - ;; Get div's class and id references. - (let* ((class-num (+ (org-export-get-relative-level parent info) - (1- (plist-get info :html-toplevel-hlevel)))) - (section-number - (and (org-export-numbered-headline-p parent info) - (mapconcat - #'number-to-string - (org-export-get-headline-number parent info) "-")))) - ;; Build return value. - (format "<div class=\"outline-text-%d\" id=\"text-%s\">\n%s</div>\n" - class-num - (or (org-element-property :CUSTOM_ID parent) - section-number - (org-export-get-reference parent info)) - (or contents "")))))) - -;;;; Radio Target - -(defun org-html-radio-target (radio-target text info) - "Transcode a RADIO-TARGET object from Org to HTML. -TEXT is the text of the target. INFO is a plist holding -contextual information." - (let ((ref (org-html--reference radio-target info))) - (org-html--anchor ref text nil info))) - -;;;; Special Block - -(defun org-html-special-block (special-block contents info) - "Transcode a SPECIAL-BLOCK element from Org to HTML. -CONTENTS holds the contents of the block. INFO is a plist -holding contextual information." - (let* ((block-type (org-element-property :type special-block)) - (html5-fancy (and (org-html--html5-fancy-p info) - (member block-type org-html-html5-elements))) - (attributes (org-export-read-attribute :attr_html special-block))) - (unless html5-fancy - (let ((class (plist-get attributes :class))) - (setq attributes (plist-put attributes :class - (if class (concat class " " block-type) - block-type))))) - (let* ((contents (or contents "")) - (reference (org-html--reference special-block info)) - (a (org-html--make-attribute-string - (if (or (not reference) (plist-member attributes :id)) - attributes - (plist-put attributes :id reference)))) - (str (if (org-string-nw-p a) (concat " " a) ""))) - (if html5-fancy - (format "<%s%s>\n%s</%s>" block-type str contents block-type) - (format "<div%s>\n%s\n</div>" str contents))))) - -;;;; Src Block - -(defun org-html-src-block (src-block _contents info) - "Transcode a SRC-BLOCK element from Org to HTML. -CONTENTS holds the contents of the item. INFO is a plist holding -contextual information." - (if (org-export-read-attribute :attr_html src-block :textarea) - (org-html--textarea-block src-block) - (let* ((lang (org-element-property :language src-block)) - (code (org-html-format-code src-block info)) - (label (let ((lbl (org-html--reference src-block info t))) - (if lbl (format " id=\"%s\"" lbl) ""))) - (klipsify (and (plist-get info :html-klipsify-src) - (member lang '("javascript" "js" - "ruby" "scheme" "clojure" "php" "html"))))) - (if (not lang) (format "<pre class=\"example\"%s>\n%s</pre>" label code) - (format "<div class=\"org-src-container\">\n%s%s\n</div>" - ;; Build caption. - (let ((caption (org-export-get-caption src-block))) - (if (not caption) "" - (let ((listing-number - (format - "<span class=\"listing-number\">%s </span>" - (format - (org-html--translate "Listing %d:" info) - (org-export-get-ordinal - src-block info nil #'org-html--has-caption-p))))) - (format "<label class=\"org-src-name\">%s%s</label>" - listing-number - (org-trim (org-export-data caption info)))))) - ;; Contents. - (if klipsify - (format "<pre><code class=\"src src-%s\"%s%s>%s</code></pre>" - lang - label - (if (string= lang "html") - " data-editor-type=\"html\"" - "") - code) - (format "<pre class=\"src src-%s\"%s>%s</pre>" - lang label code))))))) - -;;;; Statistics Cookie - -(defun org-html-statistics-cookie (statistics-cookie _contents _info) - "Transcode a STATISTICS-COOKIE object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual information." - (let ((cookie-value (org-element-property :value statistics-cookie))) - (format "<code>%s</code>" cookie-value))) - -;;;; Strike-Through - -(defun org-html-strike-through (_strike-through contents info) - "Transcode STRIKE-THROUGH from Org to HTML. -CONTENTS is the text with strike-through markup. INFO is a plist -holding contextual information." - (format - (or (cdr (assq 'strike-through (plist-get info :html-text-markup-alist))) - "%s") - contents)) - -;;;; Subscript - -(defun org-html-subscript (_subscript contents _info) - "Transcode a SUBSCRIPT object from Org to HTML. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "<sub>%s</sub>" contents)) - -;;;; Superscript - -(defun org-html-superscript (_superscript contents _info) - "Transcode a SUPERSCRIPT object from Org to HTML. -CONTENTS is the contents of the object. INFO is a plist holding -contextual information." - (format "<sup>%s</sup>" contents)) - -;;;; Table Cell - -(defun org-html-table-cell (table-cell contents info) - "Transcode a TABLE-CELL element from Org to HTML. -CONTENTS is nil. INFO is a plist used as a communication -channel." - (let* ((table-row (org-export-get-parent table-cell)) - (table (org-export-get-parent-table table-cell)) - (cell-attrs - (if (not (plist-get info :html-table-align-individual-fields)) "" - (format (if (and (boundp 'org-html-format-table-no-css) - org-html-format-table-no-css) - " align=\"%s\"" " class=\"org-%s\"") - (org-export-table-cell-alignment table-cell info))))) - (when (or (not contents) (string= "" (org-trim contents))) - (setq contents " ")) - (cond - ((and (org-export-table-has-header-p table info) - (= 1 (org-export-table-row-group table-row info))) - (let ((header-tags (plist-get info :html-table-header-tags))) - (concat "\n" (format (car header-tags) "col" cell-attrs) - contents - (cdr header-tags)))) - ((and (plist-get info :html-table-use-header-tags-for-first-column) - (zerop (cdr (org-export-table-cell-address table-cell info)))) - (let ((header-tags (plist-get info :html-table-header-tags))) - (concat "\n" (format (car header-tags) "row" cell-attrs) - contents - (cdr header-tags)))) - (t (let ((data-tags (plist-get info :html-table-data-tags))) - (concat "\n" (format (car data-tags) cell-attrs) - contents - (cdr data-tags))))))) - -;;;; Table Row - -(defun org-html-table-row (table-row contents info) - "Transcode a TABLE-ROW element from Org to HTML. -CONTENTS is the contents of the row. INFO is a plist used as a -communication channel." - ;; Rules are ignored since table separators are deduced from - ;; borders of the current row. - (when (eq (org-element-property :type table-row) 'standard) - (let* ((group (org-export-table-row-group table-row info)) - (number (org-export-table-row-number table-row info)) - (start-group-p - (org-export-table-row-starts-rowgroup-p table-row info)) - (end-group-p - (org-export-table-row-ends-rowgroup-p table-row info)) - (topp (and (equal start-group-p '(top)) - (equal end-group-p '(below top)))) - (bottomp (and (equal start-group-p '(above)) - (equal end-group-p '(bottom above)))) - (row-open-tag - (pcase (plist-get info :html-table-row-open-tag) - ((and accessor (pred functionp)) - (funcall accessor - number group start-group-p end-group-p topp bottomp)) - (accessor accessor))) - (row-close-tag - (pcase (plist-get info :html-table-row-close-tag) - ((and accessor (pred functionp)) - (funcall accessor - number group start-group-p end-group-p topp bottomp)) - (accessor accessor))) - (group-tags - (cond - ;; Row belongs to second or subsequent groups. - ((not (= 1 group)) '("<tbody>" . "\n</tbody>")) - ;; Row is from first group. Table has >=1 groups. - ((org-export-table-has-header-p - (org-export-get-parent-table table-row) info) - '("<thead>" . "\n</thead>")) - ;; Row is from first and only group. - (t '("<tbody>" . "\n</tbody>"))))) - (concat (and start-group-p (car group-tags)) - (concat "\n" - row-open-tag - contents - "\n" - row-close-tag) - (and end-group-p (cdr group-tags)))))) - -;;;; Table - -(defun org-html-table-first-row-data-cells (table info) - "Transcode the first row of TABLE. -INFO is a plist used as a communication channel." - (let ((table-row - (org-element-map table 'table-row - (lambda (row) - (unless (eq (org-element-property :type row) 'rule) row)) - info 'first-match)) - (special-column-p (org-export-table-has-special-column-p table))) - (if (not special-column-p) (org-element-contents table-row) - (cdr (org-element-contents table-row))))) - -(defun org-html-table--table.el-table (table _info) - "Format table.el tables into HTML. -INFO is a plist used as a communication channel." - (when (eq (org-element-property :type table) 'table.el) - (require 'table) - (let ((outbuf (with-current-buffer - (get-buffer-create "*org-export-table*") - (erase-buffer) (current-buffer)))) - (with-temp-buffer - (insert (org-element-property :value table)) - (goto-char 1) - (re-search-forward "^[ \t]*|[^|]" nil t) - (table-generate-source 'html outbuf)) - (with-current-buffer outbuf - (prog1 (org-trim (buffer-string)) - (kill-buffer) ))))) - -(defun org-html-table (table contents info) - "Transcode a TABLE element from Org to HTML. -CONTENTS is the contents of the table. INFO is a plist holding -contextual information." - (if (eq (org-element-property :type table) 'table.el) - ;; "table.el" table. Convert it using appropriate tools. - (org-html-table--table.el-table table info) - ;; Standard table. - (let* ((caption (org-export-get-caption table)) - (number (org-export-get-ordinal - table info nil #'org-html--has-caption-p)) - (attributes - (org-html--make-attribute-string - (org-combine-plists - (list :id (org-html--reference table info t)) - (and (not (org-html-html5-p info)) - (plist-get info :html-table-attributes)) - (org-export-read-attribute :attr_html table)))) - (alignspec - (if (bound-and-true-p org-html-format-table-no-css) - "align=\"%s\"" - "class=\"org-%s\"")) - (table-column-specs - (lambda (table info) - (mapconcat - (lambda (table-cell) - (let ((alignment (org-export-table-cell-alignment - table-cell info))) - (concat - ;; Begin a colgroup? - (when (org-export-table-cell-starts-colgroup-p - table-cell info) - "\n<colgroup>") - ;; Add a column. Also specify its alignment. - (format "\n%s" - (org-html-close-tag - "col" (concat " " (format alignspec alignment)) info)) - ;; End a colgroup? - (when (org-export-table-cell-ends-colgroup-p - table-cell info) - "\n</colgroup>")))) - (org-html-table-first-row-data-cells table info) "\n")))) - (format "<table%s>\n%s\n%s\n%s</table>" - (if (equal attributes "") "" (concat " " attributes)) - (if (not caption) "" - (format (if (plist-get info :html-table-caption-above) - "<caption class=\"t-above\">%s</caption>" - "<caption class=\"t-bottom\">%s</caption>") - (concat - "<span class=\"table-number\">" - (format (org-html--translate "Table %d:" info) number) - "</span> " (org-export-data caption info)))) - (funcall table-column-specs table info) - contents)))) - -;;;; Target - -(defun org-html-target (target _contents info) - "Transcode a TARGET object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((ref (org-html--reference target info))) - (org-html--anchor ref nil nil info))) - -;;;; Timestamp - -(defun org-html-timestamp (timestamp _contents info) - "Transcode a TIMESTAMP object from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (let ((value (org-html-plain-text (org-timestamp-translate timestamp) info))) - (format "<span class=\"timestamp-wrapper\"><span class=\"timestamp\">%s</span></span>" - (replace-regexp-in-string "--" "–" value)))) - -;;;; Underline - -(defun org-html-underline (_underline contents info) - "Transcode UNDERLINE from Org to HTML. -CONTENTS is the text with underline markup. INFO is a plist -holding contextual information." - (format (or (cdr (assq 'underline (plist-get info :html-text-markup-alist))) - "%s") - contents)) - -;;;; Verbatim - -(defun org-html-verbatim (verbatim _contents info) - "Transcode VERBATIM from Org to HTML. -CONTENTS is nil. INFO is a plist holding contextual -information." - (format (or (cdr (assq 'verbatim (plist-get info :html-text-markup-alist))) "%s") - (org-html-encode-plain-text (org-element-property :value verbatim)))) - -;;;; Verse Block - -(defun org-html-verse-block (_verse-block contents info) - "Transcode a VERSE-BLOCK element from Org to HTML. -CONTENTS is verse block contents. INFO is a plist holding -contextual information." - (format "<p class=\"verse\">\n%s</p>" - ;; Replace leading white spaces with non-breaking spaces. - (replace-regexp-in-string - "^[ \t]+" (lambda (m) (org-html--make-string (length m) " ")) - ;; Replace each newline character with line break. Also - ;; remove any trailing "br" close-tag so as to avoid - ;; duplicates. - (let* ((br (org-html-close-tag "br" nil info)) - (re (format "\\(?:%s\\)?[ \t]*\n" (regexp-quote br)))) - (replace-regexp-in-string re (concat br "\n") contents))))) - - -;;; Filter Functions - -(defun org-html-final-function (contents _backend info) - "Filter to indent the HTML and convert HTML entities." - (with-temp-buffer - (insert contents) - (set-auto-mode t) - (when (plist-get info :html-indent) - (indent-region (point-min) (point-max))) - (buffer-substring-no-properties (point-min) (point-max)))) - - -;;; End-user functions - -;;;###autoload -(defun org-html-export-as-html - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to an HTML buffer. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting buffer should be accessible -through the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write code -between \"<body>\" and \"</body>\" tags. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Export is done in a buffer named \"*Org HTML Export*\", which -will be displayed when `org-export-show-temporary-export-buffer' -is non-nil." - (interactive) - (org-export-to-buffer 'html "*Org HTML Export*" - async subtreep visible-only body-only ext-plist - (lambda () (set-auto-mode t)))) - -;;;###autoload -(defun org-html-convert-region-to-html () - "Assume the current region has Org syntax, and convert it to HTML. -This can be used in any buffer. For example, you can write an -itemized list in Org syntax in an HTML buffer and use this command -to convert it." - (interactive) - (org-export-replace-region-by 'html)) - -;;;###autoload -(defun org-html-export-to-html - (&optional async subtreep visible-only body-only ext-plist) - "Export current buffer to a HTML file. - -If narrowing is active in the current buffer, only export its -narrowed part. - -If a region is active, export that region. - -A non-nil optional argument ASYNC means the process should happen -asynchronously. The resulting file should be accessible through -the `org-export-stack' interface. - -When optional argument SUBTREEP is non-nil, export the sub-tree -at point, extracting information from the headline properties -first. - -When optional argument VISIBLE-ONLY is non-nil, don't export -contents of hidden elements. - -When optional argument BODY-ONLY is non-nil, only write code -between \"<body>\" and \"</body>\" tags. - -EXT-PLIST, when provided, is a property list with external -parameters overriding Org default settings, but still inferior to -file-local settings. - -Return output file's name." - (interactive) - (let* ((extension (concat - (when (> (length org-html-extension) 0) ".") - (or (plist-get ext-plist :html-extension) - org-html-extension - "html"))) - (file (org-export-output-file-name extension subtreep)) - (org-export-coding-system org-html-coding-system)) - (org-export-to-file 'html file - async subtreep visible-only body-only ext-plist))) - -;;;###autoload -(defun org-html-publish-to-html (plist filename pub-dir) - "Publish an org file to HTML. - -FILENAME is the filename of the Org file to be published. PLIST -is the property list for the given project. PUB-DIR is the -publishing directory. - -Return output file name." - (org-publish-org-to 'html filename - (concat (when (> (length org-html-extension) 0) ".") - (or (plist-get plist :html-extension) - org-html-extension - "html")) - plist pub-dir)) - - -(provide 'ox-html) - -;; Local variables: -;; generated-autoload-file: "org-loaddefs.el" -;; End: - -;;; ox-html.el ends here |