;; 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"))))