Switching to one.el

This seems to be a really nice balance of control and getting me to
write some more elisp.
This commit is contained in:
2024-10-04 22:19:12 -04:00
parent a73cd37980
commit 43d3891bee
6 changed files with 602 additions and 91 deletions

160
onerc.el Normal file
View File

@@ -0,0 +1,160 @@
(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))