X-Git-Url: https://git.shemshak.org/~bandali/bndl.org/blobdiff_plain/65641ab439f507b8cf0f24bca67b03fbcfbfa218..b307aaa9dfa368f039b2ea79efadfc217d3f3355:/publish.el
diff --git a/publish.el b/publish.el
new file mode 100644
index 0000000..81e5b60
--- /dev/null
+++ b/publish.el
@@ -0,0 +1,118 @@
+;; 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"
+ 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))