This seems to be a really nice balance of control and getting me to write some more elisp.
161 lines
5.9 KiB
EmacsLisp
161 lines
5.9 KiB
EmacsLisp
(setq wfot-css "https://cdn.jsdelivr.net/npm/holiday.css@0.11.2")
|
|
|
|
(defun wfot-default (page-tree pages _global)
|
|
"willfullyobtuse default render function
|
|
|
|
See `one-is-page', `one-render-pages' and `one-default-css'."
|
|
(let* ((title (org-element-property :raw-value page-tree))
|
|
(path (org-element-property :CUSTOM_ID page-tree))
|
|
(content (org-export-data-with-backend
|
|
(org-element-contents page-tree)
|
|
'one-ox nil))
|
|
(website-name (one-default-website-name pages))
|
|
(nav (one-default-nav path pages)))
|
|
(jack-html
|
|
"<!DOCTYPE html>"
|
|
`(:html
|
|
(:head
|
|
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
|
|
(:link (@ :rel "stylesheet" :href wfot-css))
|
|
(:title ,title))
|
|
(:body
|
|
(:div.header (:a (@ :href "/") ,website-name))
|
|
(:div.content
|
|
(:div.title
|
|
,(if (not (string= path "/"))
|
|
`(:div.title (:h1 ,title))
|
|
'(:div.title-empty)))
|
|
,content
|
|
,nav))))))
|
|
|
|
(defun wfot-default-home-list-pages (page-tree pages _global)
|
|
"Default render function to use in the home page that lists pages.
|
|
|
|
See `one-is-page' for the meaning of PAGE-TREE and PAGES.
|
|
|
|
Also see `one-render-pages' and `one-default-css'."
|
|
(let* ((title (org-element-property :raw-value page-tree))
|
|
(content (org-export-data-with-backend
|
|
(org-element-contents page-tree)
|
|
'one-ox nil))
|
|
(website-name (one-default-website-name pages))
|
|
;; All pages but the home pages
|
|
(pages-list (one-default-pages pages "/.+")))
|
|
(jack-html
|
|
"<!DOCTYPE html>"
|
|
`(:html
|
|
(:head
|
|
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
|
|
(:link (@ :rel "stylesheet" :type "text/css" :href wfot-css))
|
|
(:title ,title))
|
|
(:body
|
|
(:div.header (:a (@ :href "/") ,website-name))
|
|
(:div.content
|
|
(:div/home-list-pages ,content)
|
|
(:div/pages (:ul ,(reverse pages-list)))))))))
|
|
|
|
(defun wfot-default-home (page-tree pages _global)
|
|
"Default render function to use in the home page.
|
|
|
|
See `one-is-page' for the meaning of PAGE-TREE and PAGES.
|
|
|
|
Also see `one-render-pages' and `one-default-css'."
|
|
(let* ((title (org-element-property :raw-value page-tree))
|
|
(content (org-export-data-with-backend
|
|
(org-element-contents page-tree)
|
|
'one-ox nil))
|
|
(website-name (one-default-website-name pages)))
|
|
(jack-html
|
|
"<!DOCTYPE html>"
|
|
`(:html
|
|
(:head
|
|
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
|
|
(:link (@ :rel "stylesheet" :type "text/css" :href wfot-css))
|
|
(:title ,title))
|
|
(:body
|
|
(:div.header ,website-name)
|
|
(:div.content
|
|
(:div/home ,content)))))))
|
|
|
|
(defun wfot-default-with-sidebar (page-tree pages global)
|
|
"Default render function with a sidebar listing PAGES.
|
|
|
|
See `one-is-page' for the meaning of PAGE-TREE and GLOBAL.
|
|
|
|
Also see `one-default-sidebar', `one-render-pages' and `one-default-css'."
|
|
(wfot-default-sidebar page-tree pages global))
|
|
|
|
(defun wfot-default-sidebar (page-tree pages _global &optional with-toc)
|
|
"Return a HTML string with PAGES listed in a sidebar.
|
|
|
|
The arguments PAGE-TREE, PAGES and _GLOBAL are the same as
|
|
render functions take (See `one-is-page').
|
|
|
|
When WITH-TOC is non-nil, add the table of content of PAGE-TREE
|
|
in the HTML string.
|
|
|
|
This function is meant to be used by `one-default-with-sidebar'
|
|
and `one-default-doc' render functions.
|
|
|
|
See `one-render-pages', `one-default-css' and `one-default-pages'."
|
|
(let* ((title (org-element-property :raw-value page-tree))
|
|
(path (org-element-property :CUSTOM_ID page-tree))
|
|
(content (org-export-data-with-backend
|
|
(org-element-contents page-tree)
|
|
'one-ox nil))
|
|
(website-name (one-default-website-name pages))
|
|
(pages-list (one-default-pages pages))
|
|
(headlines (cdr (one-default-list-headlines page-tree)))
|
|
(toc (one-default-toc-component headlines))
|
|
(nav (one-default-nav path pages)))
|
|
(jack-html
|
|
"<!DOCTYPE html>"
|
|
`(:html
|
|
(:head
|
|
(:meta (@ :name "viewport" :content "width=device-width,initial-scale=1"))
|
|
(:link (@ :rel "stylesheet" :type "text/css" :href wfot-css))
|
|
(:title ,title))
|
|
(:body
|
|
;; sidebar-left and sidebar-main are for small devices
|
|
(:div/sidebar-left (@ :onclick "followSidebarLink()")
|
|
(:div (:div "Pages"))
|
|
,pages-list)
|
|
(:div/sidebar-main)
|
|
(:div/sidebar-header
|
|
(:svg/hamburger (@ :viewBox "0 0 24 24" :onclick "sidebarShow()")
|
|
(:path (@ :d "M21,6H3V5h18V6z M21,11H3v1h18V11z M21,17H3v1h18V17z")))
|
|
(:a (@ :href "/") ,website-name))
|
|
(:div/sidebar-content
|
|
(:div/sidebar ,pages-list)
|
|
(:article
|
|
,(if (not (string= path "/"))
|
|
`(:div.title (:h1 ,title))
|
|
'(:div.title-empty))
|
|
,(when with-toc toc)
|
|
,content
|
|
,nav)))
|
|
(:script "
|
|
function sidebarShow() {
|
|
if (window.innerWidth < 481)
|
|
document.getElementById('sidebar-left').style.width = '75vw';
|
|
else {
|
|
document.getElementById('sidebar-left').style.width = 'min(300px, 34vw)';
|
|
}
|
|
document.getElementById('sidebar-main').setAttribute('onclick', 'sidebarHide()');
|
|
document.getElementById('sidebar-main').style.display = 'block';
|
|
}
|
|
function sidebarHide() {
|
|
document.getElementById('sidebar-left').style.width = '0';
|
|
document.getElementById('sidebar-main').style.display = 'none';
|
|
}
|
|
")))))
|
|
|
|
|
|
(defun wfot-default-doc (page-tree pages global)
|
|
"Default render function with a sidebar listing PAGES and the table of content.
|
|
|
|
See `one-is-page' for the meaning of PAGE-TREE and GLOBAL.
|
|
|
|
Also see `one-default-sidebar', `one-render-pages' and `one-default-css'."
|
|
(wfot-default-sidebar page-tree pages global 'with-toc))
|