;;; build-html.el --- HTML export customisation -*- lexical-binding: t; -*-
;;; Code:
(require 'org)
(require 'ox-html)
(require 'subr-x)
(require 'tags)
(require 'sidenotes)
(require 'build-comments)
(setq org-export-global-macros
(append
org-export-global-macros
'(("sidenote"
. "@@html:\
\
$2@@")
("epigraph"
. "@@html:
@@")
("epigraph_single"
. "@@html:@@")
("epigraph3"
. "@@html:@@")
("kbd"
. "@@html:$1@@@@latex:\\texttt{$1}@@")
("margimg"
. "@@html:@@")
("countdown"
. "@@html:@@"))))
(defvar z/preamble
"
Updated: %C
")
(defvar z/postamble
"")
(defun z/org-html-src-block-mermaid (orig-fun src-block contents info)
"Export Mermaid source blocks as Mermaid divs."
(let ((lang (org-element-property :language src-block)))
(if (string= lang "mermaid")
(let ((code (org-remove-indentation
(org-element-property :value src-block))))
(format "\n%s\n
" code))
(funcall orig-fun src-block contents info))))
(advice-add 'org-html-src-block :around #'z/org-html-src-block-mermaid)
(defun z/org-html-add-body-classes (output backend info)
"Add layout-related classes to based on file metadata."
(if (and (org-export-derived-backend-p backend 'html)
(not (and (fboundp 'z/rpg-standalone-file-p)
(z/rpg-standalone-file-p info))))
(let* ((input-file (plist-get info :input-file))
(classes
(delq nil
(list
(when (and input-file (z/no-sidenotes-file-p input-file))
"no-sidenotes")))))
(if classes
(replace-regexp-in-string
"]*\\)>"
(format ""
(string-join classes " "))
output)
output))
output))
(add-to-list 'org-export-filter-final-output-functions
#'z/org-html-add-body-classes)
(add-to-list 'org-export-filter-body-functions
#'z/org-html-insert-comments-into-body)
(defconst z/rpg-standalone-start "")
(defconst z/rpg-standalone-end "")
(defun z/rpg-standalone-file-p (info)
"Return non-nil when INFO describes the dedicated RPG page."
(let ((input-file (plist-get info :input-file)))
(and input-file
(string= (file-truename input-file)
(file-truename (site-path "play/rpg.org"))))))
(defun z/render-rpg-standalone (output backend info)
"Replace normal site chrome with a dedicated game document for the RPG."
(if (and (org-export-derived-backend-p backend 'html)
(z/rpg-standalone-file-p info))
(let* ((start (string-match (regexp-quote z/rpg-standalone-start) output))
(end (and start (string-match (regexp-quote z/rpg-standalone-end) output start))))
(if (and start end)
(let* ((body-start (+ start (length z/rpg-standalone-start)))
(body (substring output body-start end))
(body (replace-regexp-in-string
""
""
body)))
(concat
"\n\n\n"
"\n"
"\n"
"\n"
"\n"
"Rescue Princess Lima\n"
"\n"
"\n"
"\n\n"
body
"\n\n\n"))
output))
output))
(add-to-list 'org-export-filter-final-output-functions
#'z/render-rpg-standalone)
(org-export-define-derived-backend 'z-html 'html
:filters-alist '((:filter-final-output . z/insert-filetags-after-title)))
(defun z/z-publish-to-html (plist filename pub-dir)
"Publish FILENAME to HTML using the z-html backend."
(org-publish-org-to 'z-html filename ".html" plist pub-dir))
(provide 'build-html)
;;; build-html.el ends here