;; Inspiration: https://gitlab.com/ambrevar/ambrevar.gitlab.io.
;; TODO: use git time-stamps
(require 'ox-publish)
(require 'seq)
(add-to-list 'load-path ".")
(add-to-list 'load-path "../xah-replace-pairs")
(require 'xah-replace-pairs)
(defun aminb--readfile (filepath)
"Return filepath's content."
(with-temp-buffer
(insert-file-contents filepath)
(buffer-string)))
(defun aminb--find-replace (match-with replace-with string)
"Return the string resulting from replacing `match-with' with
`replace-with' in `string'."
(when (string-match match-with string)
(replace-match replace-with nil nil string)))
(defun aminb--my-html-body-light-filter (output backend info)
"Make adjustments needed for dark/light mode tag to work."
(when (eq backend 'html)
(aminb--find-replace
"
\n"
"\n\n
"
output))))
(add-to-list 'org-export-filter-final-output-functions
'aminb--my-html-body-light-filter)
;; re-defining this (originally in `ox-html.el') to add `?g'
(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))
(git-repo "@%s")
(git-rev (shell-command-to-string "git rev-parse HEAD"))
(git-rev-short (shell-command-to-string "git rev-parse --short HEAD")))
`((?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 "%s" e e))
(split-string (plist-get info :email) ",+ *")
", "))
(?g . ,(format git-repo git-rev git-rev-short))
(?c . ,(plist-get info :creator))
(?C . ,(let ((file (plist-get info :input-file)))
(format-time-string timestamp-format
(and file (nth 5 (file-attributes file))))))
(?v . ,(or (plist-get info :html-validation-link) "")))))
;; timestamps can be used to avoid rebuilding everything
;; should probably be put inside the public/ directory
(setq org-publish-use-timestamps-flag t
org-publish-timestamp-directory "./")
;; get rid of index.html~ and other backup files that may be created during generation
(setq make-backup-files nil)
(setq org-export-with-section-numbers nil
org-export-with-smart-quotes t
org-export-with-email t
org-export-with-date t
org-export-with-tags 'not-in-toc
org-export-with-toc t)
(setq org-html-divs '((preamble "header" "preamble")
(content "main" "content")
(postamble "footer" "postamble"))
;; TODO: link last update to commit history of file
org-html-preamble t
org-html-postamble t
org-html-preamble-format `(("en" ,(aminb--readfile "partials/preamble.html")))
org-html-postamble-format `(("en" ,(aminb--readfile "partials/postamble.html")))
org-html-container-element "section"
org-html-metadata-timestamp-format "%Y-%m-%d"
org-html-checkbox-type 'html
org-html-html5-fancy t
;; use custom css
;; this removes the dependency on `htmlize',
;; but we also lose syntax highlighting.
org-html-htmlize-output-type nil
org-html-validation-link nil
org-html-doctype "html5")
(setq org-publish-project-alist
(list
(list "site-org"
:base-directory "./source/"
:exclude "macros.org"
:recursive t
:publishing-function '(org-html-publish-to-html)
:publishing-directory "./public/"
:html-head-include-default-style nil
:html-head-include-scripts nil)
(list "site-static"
:base-directory "source/"
:exclude "\\.org\\'"
:base-extension 'any
:publishing-directory "./public"
:publishing-function 'org-publish-attachment
:recursive t)
(list "site" :components '("site-org"))))
(defun aminb/publish ()
(org-publish-all))