Skip to content

Instantly share code, notes, and snippets.

@BrettWitty
Last active December 31, 2022 03:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BrettWitty/8abfd0350ab4f7985fe94da76cfc31f9 to your computer and use it in GitHub Desktop.
Save BrettWitty/8abfd0350ab4f7985fe94da76cfc31f9 to your computer and use it in GitHub Desktop.
Custom HTML styling using org-publish
(defun bew/org-roam-is-stub ()
(let ((filetags (org-roam-get-keyword "FILETAGS")))
(if filetags (equal '("STUB") (member "STUB" (split-string filetags ":" t))))))
(defun bew/exocortex-link-decorations ()
"Get little markup for links like stubs."
(if (bew/org-roam-is-stub)
"{{{stub()}}}"
""
))
(defun bew/exocortex-category (cat title description image)
(insert (format "{{{card(%s,%s,%s)}}}\n" title description image))
(let ((files-list nil))
(dolist (result (org-roam-db-query "SELECT title,file,id FROM nodes WHERE level = 0 ORDER BY title COLLATE NOCASE DESC;"))
(let* ((title (car result))
(filename (nth 1 result))
(id (nth 2 result))
(buf (find-file-noselect filename)))
(with-current-buffer buf
(save-excursion
(let ((category (org-roam-get-keyword "CATEGORY")))
(if (or
(string= category cat)
(and (equal cat "") (equal category nil)))
(if (not (equal filename org-roam-index-file))
(add-to-list 'files-list (list id title (bew/exocortex-link-decorations))))))))))
(dolist (result files-list)
(if (equal (nth 2 result) "")
(insert (format "- [[id:%s][%s]]\n" (car result) (nth 1 result)))
(insert (format "- [[id:%s][%s %s]]\n" (car result) (nth 1 result) (nth 2 result)))
)
)
(insert (format "{{{endcard}}}" title description))
))
(defun org-dblock-write:bew/exocortex-category (params)
(let ((category (or (plist-get params :category) ""))
(title (or (plist-get params :title) "Category title"))
(description (or (plist-get params :description) "Category description"))
(image (or (plist-get params :image) "blank")))
(bew/exocortex-category category title description image)))
;; exocortex.el --- Org export backend for html used for an Exocortex
;;; Commentary
;; This mostly is a copy of ox-jujutsu-site.el
;; (https://github.com/grc/jujutsu-website/blob/master/elisp/ox-jujutsu-site.el)
(require 'ox-html)
(require 's)
(defvar org-exocortex-nav-items
'(("/index.html" . "Index"))
"List of navigation menu URLs and their associated labels.")
;;; Define backend
(org-export-define-derived-backend 'exocortex 'html
:translate-alist '((template . org-exocortex-site-template))
:menu-entry '(?E "Exocortex" org-html-export-to-html))
(defun org-exocortex-site-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))
"utf-8"))))))
(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")
(org-exocortex-site-head contents info)
(org-exocortex-site-body contents
(plist-get info :input-file)
(plist-get info :base-directory))
"</html>\n"))
(defun org-exocortex-site-head (contents info)
"Return the HTML head for the web page."
(let ((file (plist-get info :input-file))
(directory (plist-get info :base-directory)))
(concat "<head>\n"
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
(org-html--build-meta-info info)
(org-html--build-head info)
"<link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC\" crossorigin=\"anonymous\">\n"
"<link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n"
(if (equal file org-roam-index-file)
"<link href=\"css/style.css\" rel=\"stylesheet\">\n"
"<link href=\"../css/style.css\" rel=\"stylesheet\">\n"
)
"</head>\n")))
(defun org-exocortex-site-body (contents file directory)
""
(concat "<body>\n"
(org-html--build-pre/postamble 'preamble info)
;; Document title.
"<div class=\"container\">"
(when (plist-get info :with-title)
(let ((title (and (plist-get info :with-title)
(plist-get info :title)))
(subtitle (plist-get info :subtitle)))
(when title
(format "<div class=\"row\"><h1 class=\"title\">%s</h1></div>" (org-export-data title info)))))
;; Contents
"<div class=\"row\">\n"
contents
"</div>\n"
"</div>\n"
;; Postamble.
(org-html--build-pre/postamble 'postamble info)
;; Possibly use the Klipse library live code blocks.
(org-exocortex-bootstrap-scripts file)
;; Closing document.
"</body>\n"
))
(defun org-exocortex-bootstrap-scripts (file)
"Javascript files required for Exocortex."
(concat
"<script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js\" integrity=\"sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM\" crossorigin=\"anonymous\"></script>\n"
"<script src=\"https://code.jquery.com/jquery-3.6.0.min.js\" integrity=\"sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=\" crossorigin=\"anonymous\"></script>\n"
"<script src=\"https://polyfill.io/v3/polyfill.min.js?features=es6\"></script>"
"<script id=\"MathJax-script\" async src=\"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js\"></script>"
(if (equal file org-roam-index-file)
"<script src=\"js/tweaks.js\"></script>\n"
"<script src=\"../js/tweaks.js\"></script>\n"
))
)
(defun org-exocortex-publish-to-html (plist filename pub-dir)
"Publish an org file to Exocortex 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 'exocortex filename
(concat "." (or (plist-get plist :html-extension)
org-html-extension
"html"))
plist
pub-dir))
(provide 'exocortex)

Exocortex Index

{{{icon(map)}}} Guide

  • What is an exocortex?
  • Design guide for this exocortex

{{{icon(category)}}} Categories

{{{spacer}}}

{{{cardgroup}}}

{{{endcardgroup}}}

{{{spacer}}}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment