;; Copyright (C) 2021-2022 Yuchen Pei.
;; This file is part of site generator for Yuchen's personal website (abbreviated to sg4y).
;; sg4y is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; sg4y is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU Affero General Public License for more details.
;; You should have received a copy of the GNU Affero General Public License
;; along with sg4y. If not, see .
(package-initialize)
(require 'ox-publish)
(require 'htmlize)
(defvar this-date-format "%Y-%m-%d")
(defun me/html-preamble (plist)
"PLIST: An entry."
(if (org-export-get-date plist this-date-format)
(plist-put plist
:subtitle
(format "Published on %s"
(org-export-get-date plist this-date-format))))
;; Preamble
(with-temp-buffer
(insert-file-contents "../html-templates/preamble.html") (buffer-string)))
(defun me/html-postamble (plist)
(with-temp-buffer
(insert-file-contents "../html-templates/postamble.html") (buffer-string)))
(defun me/html-postamble-post (plist)
(concat "
"
(me/html-postamble plist)))
(defun me/org-posts-sitemap-format-entry (entry style project)
"Format posts with author and published data in the index page.
ENTRY: file-name
STYLE:
PROJECT: `posts in this case."
(cond ((not (directory-name-p entry))
(format "%s - *[[file:posts/%s][%s]]*"
(format-time-string this-date-format
(org-publish-find-date entry project))
entry
(org-publish-find-title entry project)))
((eq style 'tree) (file-name-nondirectory (directory-file-name entry)))
(t entry)))
(defun org-publish-find-content (file project)
"Finds the content of an org file.
The content starts with the first empty line."
(let ((file (org-publish--expand-file-name file project)))
(when (and (file-readable-p file) (not (directory-name-p file)))
(with-temp-buffer
(insert-file-contents file)
;; important, otherwise org may truncate the sitemap, probably
;; due to some problem in converting all things to a list
(delete-trailing-whitespace)
(goto-char (point-min))
(let ((beg (+ 1 (re-search-forward "^$"))))
(buffer-substring beg (point-max)))))))
(defun me/org-microposts-sitemap-format-entry (entry style project)
"Format microposts with author and published data in the index page.
ENTRY: file-name
STYLE:
PROJECT: `microposts in this case."
(cond ((not (directory-name-p entry))
(format "*[[%s][%s]]* - %s\n<<%s>>\n\n%s"
(file-name-sans-extension entry)
(format-time-string this-date-format
(org-publish-find-date entry project))
(org-publish-find-title entry project)
(file-name-sans-extension entry)
(org-publish-find-content entry project)
))
((eq style 'tree) (file-name-nondirectory (directory-file-name entry)))
(t entry)))
(defun me/org-publish-microblog (plist filename pub-dir)
"Publish RSS with PLIST, only when FILENAME is '../pages/microblog.org'.
PUB-DIR is when the output will be placed."
(if (equal "../pages/microblog.org" (file-name-nondirectory filename))
(org-html-publish-to-html plist filename pub-dir)))
(setq org-src-fontify-natively t)
(setq org-publish-project-alist
'(("posts"
:base-directory "posts"
:base-extension "org"
:publishing-directory "site/posts"
:recursive nil
:publishing-function org-html-publish-to-html
:auto-sitemap t
:section-numbers nil
:sitemap-format-entry me/org-posts-sitemap-format-entry
:sitemap-title "Yuchen's Blog"
:sitemap-sort-files anti-chronologically
:sitemap-filename "../pages/blog.org"
:html-doctype "html5"
:html-head "
"
:html-preamble me/html-preamble
:html-self-link-headlines t
:author ("Yuchen Pei")
:html-postamble me/html-postamble-post
:html-mathjax-options ((path "/js/mathjax/MathJax.js?config=TeX-AMS_CHTML"))
:html-mathjax-template ""
:htmlized-source t
)
("microposts"
:base-directory "microposts"
:base-extension "org"
:publishing-directory "site/microposts"
:recursive t
:publishing-function me/org-publish-microblog
:auto-sitemap t
:sitemap-format-entry me/org-microposts-sitemap-format-entry
:sitemap-title "Yuchen's Microblog"
:sitemap-sort-files anti-chronologically
:sitemap-filename "../pages/microblog.org"
:html-doctype "html5"
:html-head ""
:html-preamble me/html-preamble
:author ("Yuchen Pei")
:html-postamble me/html-postamble
:html-mathjax-options ((path "/js/mathjax/MathJax.js?config=TeX-AMS_CHTML"))
:html-mathjax-template ""
:htmlized-source t
)
("pages"
:base-directory "pages"
:base-extension "org"
:publishing-directory "site"
:recursive t
:publishing-function org-html-publish-to-html
:html-doctype "html5"
:html-head "
"
:html-preamble me/html-preamble
:author ("Yuchen Pei")
:section-numbers nil
:with-toc nil
:html-postamble me/html-postamble
:html-prefer-user-labels t
:html-mathjax-options ((path "/js/mathjax/MathJax.js?config=TeX-AMS_CHTML"))
:html-mathjax-template ""
:htmlized-source t
)
("html-pages"
:base-directory "pages"
:base-extension "html"
:publishing-directory "site"
:recursive t
:publishing-function org-publish-attachment
)
("css"
:base-directory "css"
:base-extension "css"
:publishing-directory "site/css"
:publishing-function org-publish-attachment
:recursive t
)
("js"
:base-directory "js"
:base-extension "js"
:publishing-directory "site/js"
:publishing-function org-publish-attachment
:recursive t
)
("assets"
:base-directory "assets"
:base-extension any
:publishing-directory "site/assets"
:publishing-function org-publish-attachment
:recursive t
)
("all" :components ("posts" "microposts" "pages" "html-pages" "css" "js" "assets"))))