diff --git a/.gitignore b/.gitignore index 2d228ec..df83cd7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ _site _tmp/ *~ .cask/ -*.elc \ No newline at end of file +*.elc +build/ \ No newline at end of file diff --git a/Makefile b/Makefile index 91bfa78..d79f731 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ clean: rm -rf build + rm -rf ./orgs/index.org ./orgs/categories/index.org ./orgs/tags/index.org rm -rf `find . -iname "*~"` dev-build: diff --git a/build.el b/build.el index b72fcf2..718bf02 100755 --- a/build.el +++ b/build.el @@ -5,10 +5,14 @@ ;;; Commentary: ;;; Code: (require 'org) +(require 'seq) (require 'ox-html) +(require 'ox-latex) (require 'ox-publish) (require 'dracula-theme) (require 'lisp/ox-template) +(require 'lisp/utils) + (setq debug-on-error t) @@ -21,15 +25,116 @@ (defvar project-root nil "Root directory of the website source code.") + +(defvar orgs-files-dir "/orgs/" + "Path to the directory containing all the renderable org files.") + + (defun from-root (path) "Return the full path of the given PATH in the project root." (concat project-root path)) -(defun prod-p () - "Return non-nil if we're in development mode." - (when (getenv "LXHOME_PROD") - t)) +(defun all-org-files () + "Return a list of all the org files in the orgs directory." + (mapcar (lambda (x) x) + (split-string + (shell-command-to-string (format "find %s -iname \"*.org\"" org-directory)) + "\n" t))) + +(comment + (all-org-files)) + + +(defun get-all-tags () + "Return a list of all the tags in the org files." + (seq-reduce + ;; all-tags is in (tags . tags->files) form + (lambda (all-tags file) + (with-temp-buffer + (insert-file-contents file) + (let ((tags (mapcar #'car (org-get-buffer-tags)))) + (seq-reduce + (lambda (result tag) + (let ((tag-list (car result)) + (tag->file (cdr result))) + (cons + ;; Tag list + (if (member tag tag-list) tag-list (sort (cons tag tag-list) 'string<)) + ;; tag->file + (cons (cons tag + ;; Current value of the the given tag (all the files + ;; that contain that tag) + (append (list file) (cdr (assoc tag tag->file)))) + tag->file)))) + tags + all-tags)))) + (all-org-files) + '())) + + +(defun get-all-posts () + "Return all the post org files. +Not pages." + (let ((files (all-org-files))) + (seq-reduce + (lambda (result file) + (let ((is-page? (string= (get-file-global-props file "PAGE") "true"))) + (if (not is-page?) + ;; It's a post + (cons + (list + ;; This is not effecient since we parse the file + ;; on each query, but who cares :D ? + (->epoch (get-file-global-props file "DATE")) + (get-file-global-props file "TITLE") + (replace-regexp-in-string "\\.org" ".html" + (file-name-nondirectory file))) + result) + result))) + files + '()))) + + +(defun get-all-sorted-posts () + "Return all posts in sorted order." + (sort + (get-all-posts) + (lambda (x y) (> (car x) (car y))))) + + +(comment + (get-all-sorted-posts)) + + +(defun get-all-categories () + "Return all the categories of the org files." + (seq-reduce + ;; all-cats is in (cats . cat->files) form + (lambda (all-cats file) + (let ((is-page? (string= (get-file-global-props file "PAGE") "true")) + (cat (get-file-global-props file "CATEGORY")) + (cat-list (car all-cats)) + (cat->file (cdr all-cats))) + + (if (not is-page?) + (cons + ;; Category list + (if (member cat cat-list) cat-list (sort (cons cat cat-list) 'string<)) + ;; cat->file + (cons (cons cat + ;; Current value of the the given cat (all the files + ;; under that category) + (append (list file) (cdr (assoc cat cat->file)))) + cat->file)) + all-cats))) + (all-org-files) + '())) + + +(comment + (get-file-global-props "./orgs/essays/serene-blah.org" "CATEGORY") + (get-all-categories)) (defun extra-headers () @@ -38,6 +143,42 @@ "")) +(defun category-org-list () + "Return a list of links to the categories in org format." + (let ((categories (get-all-categories))) + (mapconcat + (lambda (cat) + (let ((count (length (cdr (assoc cat (cdr categories)))))) + (format " - [[//categories/%s.html][%s(%s)]]" cat cat count))) + (car categories) + "\n"))) + + +(defun tags-org-list () + "Return a list of links to the tags in org format." + (let ((tags (get-all-tags))) + (mapconcat + (lambda (tag) + (let ((count (length (cdr (assoc tag (cdr tags)))))) + (format " - [[//tags/%s.html][%s(%s)]]" tag tag count))) + (car tags) + "\n"))) + + +(defun latest-org-list (base-url) + "Return a list of links (using BASE-URL) to the tags in org format." + (let ((posts (get-all-sorted-posts))) + (mapconcat + (lambda (post) + (format " - [[%s/essays/%s][%s]]" base-url (nth 2 post) (nth 1 post))) + posts + "\n"))) + + +(comment + (latest-org-list)) + + (defun main () "The entry point to the build script." @@ -46,37 +187,63 @@ (load-theme 'dracula t) (enable-theme 'dracula) + (setq project-root (car command-line-args-left)) + ;; We will use the org-agenda to extract all the tags + (setq org-directory (from-root orgs-files-dir)) + (setq org-agenda-files (all-org-files)) (setf user-full-name author-name) (setf user-mail-address author-email) - ;; Disable default header links (top, next) (setf org-html-home/up-format "") (setf org-html-link-up "") (setf org-html-link-home "") (setf org-html-scripts "") - (let ((html-build-dir (from-root "/build/html/"))) + (let ((build-dir (from-root "/build/")) + (base-url (if (prod-p) "https://lxsameer.com" "http://localhost:3003"))) + (copy-template (from-root "/templates/index.org") + (from-root "/orgs/index.org") + (latest-org-list base-url)) + + (copy-template (from-root "/templates/categories.org") + (from-root "/orgs/categories/index.org") + (category-org-list)) + + (copy-template (from-root "/templates/tags.org") + (from-root "/orgs/tags/index.org") + (tags-org-list)) + + (setq org-html-preamble #'preamble-fn) + + (setq org-publish-project-alist `(("lxsameer.com" :base-directory ,(from-root "/orgs") :root-directory ,project-root :recursive t :base-extension "org" - :publishing-directory ,(from-root "/build/html") + :publishing-directory ,build-dir ;; Exclude the blog archive index autogenerated below ;; Note that the regexp is relative to :base-directory ;; :exclude "^index.org" :section-numbers nil + :with-author t + :with-drawers t + :with-properties t + :with-tags t + :with-timestamps t :with-toc nil - :with-date nil - :base-url ,(if (prod-p) "https://lxsameer.com" "http://localhost:3003") + :base-url ,base-url + :html-link-home "/" :html-head-extra ,(extra-headers) :html-template ,(from-root "/templates/blog.html") - :html-headline-template ,(from-root "/templates/tags.html") + :html-page-preamble-template ,(from-root "/templates/page-preamble.html") + :html-post-preabmle-template ,(from-root "/templates/post-preamble.html") + :html-tags-template ,(from-root "/templates/tags.html") :publishing-function org-html-publish-to-templated-html :auto-sitemap t :htmlized-source t @@ -84,12 +251,14 @@ :sitemap-style list :sitemap-title "lxsameer's nest" :sitemap-filename "sitemap.inc" - :sitemap-sort-files anti-chronologically) + :sitemap-sort-files anti-chronologically + :html-format-headline-function headline-format + :makeindex nil) ("org->html" :base-directory ,(from-root "/orgs") :base-extension "org" - :publishing-directory ,html-build-dir + :publishing-directory ,build-dir :recursive t :publishing-function org-html-publish-to-html :headline-levels 4 @@ -101,20 +270,28 @@ :html-head-extra ,(extra-headers) :makeindex nil) + ("pdfs" + :base-directory ,(from-root "/orgs") + :root-directory ,project-root + :recursive t + :base-extension "org" + :publishing-directory ,build-dir + :publishing-function) + + ("statics" :base-directory ,project-root :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|svg" - :publishing-directory ,html-build-dir + :publishing-directory ,build-dir :recursive t :publishing-function org-publish-attachment) - ("build" :components ("lxsameer.com" "statics"))))) + ("build" :components ("lxsameer.com" "statics")))) + + (org-publish-project "build" t nil)) - (org-publish-project "build" t nil) (message "Build complete.")) - - (provide 'build) ;; Local Variables: ;; mode: emacs-lisp diff --git a/build/html/assets/styles/dark.css b/build/html/assets/styles/dark.css deleted file mode 100644 index 1d78ae1..0000000 --- a/build/html/assets/styles/dark.css +++ /dev/null @@ -1,800 +0,0 @@ -/** - * Forced dark theme version - */ - -:root { - --background-body: #202b38; - --background: #161f27; - --background-alt: #1a242f; - --selection: #1c76c5; - --text-main: #dbdbdb; - --text-bright: #fff; - --text-muted: #a9b1ba; - --links: #41adff; - --focus: #0096bfab; - --border: #526980; - --code: #ffbe85; - --animation-duration: 0.1s; - --button-hover: #324759; - --scrollbar-thumb: var(--button-hover); - --scrollbar-thumb-hover: rgb(65, 92, 115); - --form-placeholder: #a9a9a9; - --form-text: #fff; - --variable: #d941e2; - --highlight: #efdb43; - --select-arrow: url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E"); -} - -html { - scrollbar-color: #324759 #202b38; - scrollbar-color: var(--scrollbar-thumb) var(--background-body); - scrollbar-width: thin; -} - -body { - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Segoe UI Emoji', 'Apple Color Emoji', 'Noto Color Emoji', sans-serif; - line-height: 1.4; - max-width: 800px; - margin: 20px auto; - padding: 0 10px; - word-wrap: break-word; - color: #dbdbdb; - color: var(--text-main); - background: #202b38; - background: var(--background-body); - text-rendering: optimizeLegibility; -} - -button { - transition: - background-color 0.1s linear, - border-color 0.1s linear, - color 0.1s linear, - box-shadow 0.1s linear, - transform 0.1s ease; - transition: - background-color var(--animation-duration) linear, - border-color var(--animation-duration) linear, - color var(--animation-duration) linear, - box-shadow var(--animation-duration) linear, - transform var(--animation-duration) ease; -} - -input { - transition: - background-color 0.1s linear, - border-color 0.1s linear, - color 0.1s linear, - box-shadow 0.1s linear, - transform 0.1s ease; - transition: - background-color var(--animation-duration) linear, - border-color var(--animation-duration) linear, - color var(--animation-duration) linear, - box-shadow var(--animation-duration) linear, - transform var(--animation-duration) ease; -} - -textarea { - transition: - background-color 0.1s linear, - border-color 0.1s linear, - color 0.1s linear, - box-shadow 0.1s linear, - transform 0.1s ease; - transition: - background-color var(--animation-duration) linear, - border-color var(--animation-duration) linear, - color var(--animation-duration) linear, - box-shadow var(--animation-duration) linear, - transform var(--animation-duration) ease; -} - -h1 { - font-size: 2.2em; - margin-top: 0; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin-bottom: 12px; - margin-top: 24px; -} - -h1 { - color: #fff; - color: var(--text-bright); -} - -h2 { - color: #fff; - color: var(--text-bright); -} - -h3 { - color: #fff; - color: var(--text-bright); -} - -h4 { - color: #fff; - color: var(--text-bright); -} - -h5 { - color: #fff; - color: var(--text-bright); -} - -h6 { - color: #fff; - color: var(--text-bright); -} - -strong { - color: #fff; - color: var(--text-bright); -} - -h1, -h2, -h3, -h4, -h5, -h6, -b, -strong, -th { - font-weight: 600; -} - -q::before { - content: none; -} - -q::after { - content: none; -} - -blockquote { - border-left: 4px solid #0096bfab; - border-left: 4px solid var(--focus); - margin: 1.5em 0; - padding: 0.5em 1em; - font-style: italic; -} - -q { - border-left: 4px solid #0096bfab; - border-left: 4px solid var(--focus); - margin: 1.5em 0; - padding: 0.5em 1em; - font-style: italic; -} - -blockquote > footer { - font-style: normal; - border: 0; -} - -blockquote cite { - font-style: normal; -} - -address { - font-style: normal; -} - -a[href^='mailto\:']::before { - content: '📧 '; -} - -a[href^='tel\:']::before { - content: '📞 '; -} - -a[href^='sms\:']::before { - content: '💬 '; -} - -mark { - background-color: #efdb43; - background-color: var(--highlight); - border-radius: 2px; - padding: 0 2px 0 2px; - color: #000; -} - -button, -select, -input[type='submit'], -input[type='button'], -input[type='checkbox'], -input[type='range'], -input[type='radio'] { - cursor: pointer; -} - -input:not([type='checkbox']):not([type='radio']), -select { - display: block; -} - -input { - color: #fff; - color: var(--form-text); - background-color: #161f27; - background-color: var(--background); - font-family: inherit; - font-size: inherit; - margin-right: 6px; - margin-bottom: 6px; - padding: 10px; - border: none; - border-radius: 6px; - outline: none; -} - -button { - color: #fff; - color: var(--form-text); - background-color: #161f27; - background-color: var(--background); - font-family: inherit; - font-size: inherit; - margin-right: 6px; - margin-bottom: 6px; - padding: 10px; - border: none; - border-radius: 6px; - outline: none; -} - -textarea { - color: #fff; - color: var(--form-text); - background-color: #161f27; - background-color: var(--background); - font-family: inherit; - font-size: inherit; - margin-right: 6px; - margin-bottom: 6px; - padding: 10px; - border: none; - border-radius: 6px; - outline: none; -} - -select { - color: #fff; - color: var(--form-text); - background-color: #161f27; - background-color: var(--background); - font-family: inherit; - font-size: inherit; - margin-right: 6px; - margin-bottom: 6px; - padding: 10px; - border: none; - border-radius: 6px; - outline: none; -} - -input[type='checkbox'], -input[type='radio'] { - height: 1em; - width: 1em; -} - -input[type='radio'] { - border-radius: 100%; -} - -input { - vertical-align: top; -} - -label { - vertical-align: middle; - margin-bottom: 4px; - display: inline-block; -} - -input:not([type='checkbox']):not([type='radio']), -input[type='range'], -select, -button, -textarea { - -webkit-appearance: none; -} - -textarea { - display: block; - margin-right: 0; - box-sizing: border-box; - resize: vertical; -} - -textarea:not([cols]) { - width: 100%; -} - -textarea:not([rows]) { - min-height: 40px; - height: 140px; -} - -select { - background: #161f27 url("data:image/svg+xml;charset=utf-8,%3C?xml version='1.0' encoding='utf-8'?%3E %3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='62.5' width='116.9' fill='%23efefef'%3E %3Cpath d='M115.3,1.6 C113.7,0 111.1,0 109.5,1.6 L58.5,52.7 L7.4,1.6 C5.8,0 3.2,0 1.6,1.6 C0,3.2 0,5.8 1.6,7.4 L55.5,61.3 C56.3,62.1 57.3,62.5 58.4,62.5 C59.4,62.5 60.5,62.1 61.3,61.3 L115.2,7.4 C116.9,5.8 116.9,3.2 115.3,1.6Z'/%3E %3C/svg%3E") calc(100% - 12px) 50% / 12px no-repeat; - background: var(--background) var(--select-arrow) calc(100% - 12px) 50% / 12px no-repeat; - padding-right: 35px; -} - -select::-ms-expand { - display: none; -} - -select[multiple] { - padding-right: 10px; - background-image: none; - overflow-y: auto; -} - -button, -input[type='submit'], -input[type='button'] { - padding-right: 30px; - padding-left: 30px; -} - -button:hover { - background: #324759; - background: var(--button-hover); -} - -input[type='submit']:hover { - background: #324759; - background: var(--button-hover); -} - -input[type='button']:hover { - background: #324759; - background: var(--button-hover); -} - -input:focus { - box-shadow: 0 0 0 2px #0096bfab; - box-shadow: 0 0 0 2px var(--focus); -} - -select:focus { - box-shadow: 0 0 0 2px #0096bfab; - box-shadow: 0 0 0 2px var(--focus); -} - -button:focus { - box-shadow: 0 0 0 2px #0096bfab; - box-shadow: 0 0 0 2px var(--focus); -} - -textarea:focus { - box-shadow: 0 0 0 2px #0096bfab; - box-shadow: 0 0 0 2px var(--focus); -} - -input[type='checkbox']:active, -input[type='radio']:active, -input[type='submit']:active, -input[type='button']:active, -input[type='range']:active, -button:active { - transform: translateY(2px); -} - -input:disabled, -select:disabled, -button:disabled, -textarea:disabled { - cursor: not-allowed; - opacity: 0.5; -} - -::-moz-placeholder { - color: #a9a9a9; - color: var(--form-placeholder); -} - -:-ms-input-placeholder { - color: #a9a9a9; - color: var(--form-placeholder); -} - -::-ms-input-placeholder { - color: #a9a9a9; - color: var(--form-placeholder); -} - -::placeholder { - color: #a9a9a9; - color: var(--form-placeholder); -} - -fieldset { - border: 1px #0096bfab solid; - border: 1px var(--focus) solid; - border-radius: 6px; - margin: 0; - margin-bottom: 12px; - padding: 10px; -} - -legend { - font-size: 0.9em; - font-weight: 600; -} - -input[type='range'] { - margin: 10px 0; - padding: 10px 0; - background: transparent; -} - -input[type='range']:focus { - outline: none; -} - -input[type='range']::-webkit-slider-runnable-track { - width: 100%; - height: 9.5px; - -webkit-transition: 0.2s; - transition: 0.2s; - background: #161f27; - background: var(--background); - border-radius: 3px; -} - -input[type='range']::-webkit-slider-thumb { - box-shadow: 0 1px 1px #000, 0 0 1px #0d0d0d; - height: 20px; - width: 20px; - border-radius: 50%; - background: #526980; - background: var(--border); - -webkit-appearance: none; - margin-top: -7px; -} - -input[type='range']:focus::-webkit-slider-runnable-track { - background: #161f27; - background: var(--background); -} - -input[type='range']::-moz-range-track { - width: 100%; - height: 9.5px; - -moz-transition: 0.2s; - transition: 0.2s; - background: #161f27; - background: var(--background); - border-radius: 3px; -} - -input[type='range']::-moz-range-thumb { - box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; - height: 20px; - width: 20px; - border-radius: 50%; - background: #526980; - background: var(--border); -} - -input[type='range']::-ms-track { - width: 100%; - height: 9.5px; - background: transparent; - border-color: transparent; - border-width: 16px 0; - color: transparent; -} - -input[type='range']::-ms-fill-lower { - background: #161f27; - background: var(--background); - border: 0.2px solid #010101; - border-radius: 3px; - box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; -} - -input[type='range']::-ms-fill-upper { - background: #161f27; - background: var(--background); - border: 0.2px solid #010101; - border-radius: 3px; - box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; -} - -input[type='range']::-ms-thumb { - box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; - border: 1px solid #000; - height: 20px; - width: 20px; - border-radius: 50%; - background: #526980; - background: var(--border); -} - -input[type='range']:focus::-ms-fill-lower { - background: #161f27; - background: var(--background); -} - -input[type='range']:focus::-ms-fill-upper { - background: #161f27; - background: var(--background); -} - -a { - text-decoration: none; - color: #41adff; - color: var(--links); -} - -a:hover { - text-decoration: underline; -} - -code { - background: #161f27; - background: var(--background); - color: #ffbe85; - color: var(--code); - padding: 2.5px 5px; - border-radius: 6px; - font-size: 1em; -} - -samp { - background: #161f27; - background: var(--background); - color: #ffbe85; - color: var(--code); - padding: 2.5px 5px; - border-radius: 6px; - font-size: 1em; -} - -time { - background: #161f27; - background: var(--background); - color: #ffbe85; - color: var(--code); - padding: 2.5px 5px; - border-radius: 6px; - font-size: 1em; -} - -pre > code { - padding: 10px; - display: block; - overflow-x: auto; -} - -var { - color: #d941e2; - color: var(--variable); - font-style: normal; - font-family: monospace; -} - -kbd { - background: #161f27; - background: var(--background); - border: 1px solid #526980; - border: 1px solid var(--border); - border-radius: 2px; - color: #dbdbdb; - color: var(--text-main); - padding: 2px 4px 2px 4px; -} - -img, -video { - max-width: 100%; - height: auto; -} - -hr { - border: none; - border-top: 1px solid #526980; - border-top: 1px solid var(--border); -} - -table { - border-collapse: collapse; - margin-bottom: 10px; - width: 100%; - table-layout: fixed; -} - -table caption { - text-align: left; -} - -td, -th { - padding: 6px; - text-align: left; - vertical-align: top; - word-wrap: break-word; -} - -thead { - border-bottom: 1px solid #526980; - border-bottom: 1px solid var(--border); -} - -tfoot { - border-top: 1px solid #526980; - border-top: 1px solid var(--border); -} - -tbody tr:nth-child(even) { - background-color: #1a242f; - background-color: var(--background-alt); -} - -::-webkit-scrollbar { - height: 10px; - width: 10px; -} - -::-webkit-scrollbar-track { - background: #161f27; - background: var(--background); - border-radius: 6px; -} - -::-webkit-scrollbar-thumb { - background: #324759; - background: var(--scrollbar-thumb); - border-radius: 6px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgb(65, 92, 115); - background: var(--scrollbar-thumb-hover); -} - -::-moz-selection { - background-color: #1c76c5; - background-color: var(--selection); - color: #fff; - color: var(--text-bright); -} - -::selection { - background-color: #1c76c5; - background-color: var(--selection); - color: #fff; - color: var(--text-bright); -} - -details { - display: flex; - flex-direction: column; - align-items: flex-start; - background-color: #1a242f; - background-color: var(--background-alt); - padding: 10px 10px 0; - margin: 1em 0; - border-radius: 6px; - overflow: hidden; -} - -details[open] { - padding: 10px; -} - -details > :last-child { - margin-bottom: 0; -} - -details[open] summary { - margin-bottom: 10px; -} - -summary { - display: list-item; - background-color: #161f27; - background-color: var(--background); - padding: 10px; - margin: -10px -10px 0; - cursor: pointer; - outline: none; -} - -summary:hover, -summary:focus { - text-decoration: underline; -} - -details > :not(summary) { - margin-top: 0; -} - -summary::-webkit-details-marker { - color: #dbdbdb; - color: var(--text-main); -} - -footer { - border-top: 1px solid #526980; - border-top: 1px solid var(--border); - padding-top: 10px; - color: #a9b1ba; - color: var(--text-muted); -} - -body > footer { - margin-top: 40px; -} - -@media print { - body, - pre, - code, - summary, - details, - button, - input, - textarea { - background-color: #fff; - } - - button, - input, - textarea { - border: 1px solid #000; - } - - body, - h1, - h2, - h3, - h4, - h5, - h6, - pre, - code, - button, - input, - textarea, - footer, - summary, - strong { - color: #000; - } - - summary::marker { - color: #000; - } - - summary::-webkit-details-marker { - color: #000; - } - - tbody tr:nth-child(even) { - background-color: #f2f2f2; - } - - a { - color: #00f; - text-decoration: underline; - } -} - -/*# sourceMappingURL=dark.css.map */ diff --git a/build/html/assets/styles/main.css b/build/html/assets/styles/main.css deleted file mode 100644 index fa6fe52..0000000 --- a/build/html/assets/styles/main.css +++ /dev/null @@ -1,20 +0,0 @@ -.row { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; -} - -body { - margin: 20px auto; - max-width: 800px; - padding: 0 10px; - background: var(--background-body); -} - - -pre.src { - background: #1a242f; - padding: 10px 20px; - border-radius: 2px; -} diff --git a/build/html/index.html b/build/html/index.html deleted file mode 100644 index 39cd4e8..0000000 --- a/build/html/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - -
-

lxsameer's nest

- -
- -
- -
-

Welcome   
-
(ABD BD)
-
-

-
-

-blha bbasd asds asd a asd asdasd somer `asdasd` sadasd asdasD asdasd asdasd asdasd. -ads ad asd asd as dasd asd -

-
    -
  • list a
  • -
  • [ ] asdasdasd
  • -
  • [X] asdasd
  • -
-
-
-

TODO asdasdasdsad   
-
(ABD)
-
-

-
-
-
class Blah() {
- int main() {
-     return 0;
- }
-}
-
-
-
-
-
- -
- - - - - - diff --git a/build/html/sitemap.html b/build/html/sitemap.html deleted file mode 100644 index 8265fd4..0000000 --- a/build/html/sitemap.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - -
-

lxsameer's nest

- -
- -
- - -
- - - - - - diff --git a/config.org b/config.org index e636591..c29c693 100644 --- a/config.org +++ b/config.org @@ -1,7 +1,7 @@ #+AUTHOR: Sameer Rahmani #+EMAIL: lxsameer@gnu.org #+LANGUAGE: en -#+OPTIONS: toc:2 +#+OPTIONS: toc:nil <:t #+options: html5-fancy:t tex:t #+html_doctype: html5 #+HTML_CONTAINER: div class="column" diff --git a/lisp/ox-template.el b/lisp/ox-template.el index f667c9e..4693d88 100644 --- a/lisp/ox-template.el +++ b/lisp/ox-template.el @@ -21,18 +21,13 @@ ;; We ensure the org infrastructure (require 'org) +(require 'seq) (require 'ox-publish) (require 'mustache) (require 'htmlize) +(require 'pp) (require 'ht) - -(advice-add 'org-html--tags :override 'org-html-tag-template) -(defun org-html-tag-template (tags info) - (message "<<<<<<<<<<<< %s" tags) - (let ((template (plist-get info :html-headline-template)) - (ctx (ht ("tags" (format "%s" tags)) - ("base-url" (plist-get info :base-url))))) - (mustache-render (use-html template) ctx))) +(require 'lisp/utils) (defun use-html (path-to-template) @@ -42,16 +37,91 @@ (buffer-string))) +(defun render-tags (tags) + "Return a string representing TAGS html." + (if tags + (mapconcat (lambda (x) (format "#%s" x x)) + tags + " | ") + "")) + + +(defun preamble-fn (info) + "Return a string for the header section of pages using INFO plist." + (let* ((file (plist-get info :input-file)) + (page-template (or (plist-get info :html-page-preamble-template) "page-preamble.html")) + (post-template (or (plist-get info :html-post-preabmle-template) "post-preamble.html")) + (is-page? (string= (get-file-global-props file "PAGE") "true")) + (tags (get-file-tags file))) + + (let ((title (get-file-global-props file "TITLE")) + (date (get-file-global-props file "DATE"))) + + (when (not title) + (message "'#+TITLE' is missing from '%s'" file) + (error "'#+TITLE' is missing from '%s'" file)) + + (if is-page? + (mustache-render (use-html page-template) + (ht ("title" title))) + (progn + + (mustache-render (use-html post-template) + (ht + ("title" title) + ("date" (or date "")) + ("tags" (render-tags tags))))))))) + + +(defun org-html-render-tag-template (tags info) + "Render the given TAGS and INFO using the :html-headline-template." + (let ((template (plist-get info :html-tags-template)) + (ctx (ht ("tags" (format "%s" tags)) + ("base-url" (plist-get info :base-url))))) + (if (null tags) + "" + (mustache-render (use-html template) ctx)))) + + +;; Replace org-html--tags with our impelementation if the +;; `:html-headline-template' configuration exists +(advice-add 'org-html--tags :around 'org-html-tag-template) + +(defun org-html-tag-template (orig-fn &rest args) + "Decide whether to run ORIG-FN with ARGS or the org-html-render-tag-template. +It looks for `:html-tags-template' in the info and if i exists it will +call `org-html-render-tag-template' otherwise will call ORIG-FN." + (let ((template (plist-get (cadr args) :html-tags-template))) + (if template + (apply #'org-html-render-tag-template args) + (apply orig-fn args)))) + + + (org-export-define-derived-backend 'templated-html 'html - :translate-alist '(;;(headline . templated-html-headline-fn) - (template . templated-html-template-fn))) + :translate-alist '((template . templated-html-template-fn))) + + +(defun headline-format (todo todo-type priority text tags info) + "Format the headline using TODO TODO-TYPE PRIORITY TEXT TAGS and INFO." + (let ((todo (org-html--todo todo info)) + (priority (org-html--priority priority info)) + ;; We don't care about the tags here since we put the in the preamble + (tags nil)) + + (concat todo (and todo " ") + priority (and priority " ") + text + (and tags "   ") tags))) (defun render-template (template-name contents info) "Render the given template TEMPLATE-NAME using CONTENTS and INFO." (let ((ctx (ht ("content" contents) ("head" (plist-get info :html-head-extra)) - ("base-url" (plist-get info :base-url))))) + ("base-url" (plist-get info :base-url)) + ("preamble" (org-html--build-pre/postamble 'preamble info)) + ("postamble" (org-html--build-pre/postamble 'postamble info))))) (mustache-render (use-html template-name) ctx))) @@ -62,6 +132,7 @@ (render-template template contents info) (org-html-template contents info)))) + (defun org-html-publish-to-templated-html (plist filename pub-dir) "Publish an org file to HTML. diff --git a/orgs/index.org b/orgs/index.org index 946369b..da4c66a 100644 --- a/orgs/index.org +++ b/orgs/index.org @@ -2,23 +2,17 @@ #+OPTIONS: toc:nil #+EXPORT_FILE_NAME: index.html #+TAGS: ABD(a) BD(c) ASDK(k) +#+DATE: 2021-02-11 +#+CATEGORY: blah #+TITLE: blah +#+PAGE: true * Welcome :ABD:BD: - #+CATEGORY: WELCO + :PROPERTIES: + :BLAH: s + :END: blha bbasd asds asd a asd =asdasd= somer `asdasd` sadasd *asdasD* asdasd /asdasd/ asdasd. ads ad asd asd as dasd asd - - list a - - [ ] asdasdasd - - [X] asdasd -** TODO asdasdasdsad :ABD: - SCHEDULED: <2021-02-08 Mon> - - #+NAME: src1 - #+BEGIN_SRC java - class Blah() { - int main() { - return 0; - } - } - #+END_SRC + - [[http://localhost:3003/essays/serene-blah.html][Serene blah]] + - [[http://localhost:3003/essays/javascript-blah.html][javascript blah]] + - [[http://localhost:3003/essays/theindex.html][Index]] diff --git a/orgs/sitemap.inc b/orgs/sitemap.inc index 30d2de5..05006af 100644 --- a/orgs/sitemap.inc +++ b/orgs/sitemap.inc @@ -1,3 +1,8 @@ #+TITLE: lxsameer's nest +- [[file:theindex.org][Index]] +- [[file:essays/javascript-blah.org][javascript blah]] +- [[file:tags/index.org][index]] +- [[file:categories/index.org][index]] +- [[file:essays/serene-blah.org][Serene blah]] - [[file:index.org][blah]] \ No newline at end of file diff --git a/templates/blog.html b/templates/blog.html index bce666b..b7b2768 100644 --- a/templates/blog.html +++ b/templates/blog.html @@ -2,21 +2,25 @@ {{{head}}} - - + +
-

lxsameer's nest

-
-
+
+ {{{preamble}}} +
+ +
{{{content}}} -
+