From 830432c2381acb91acbe614767d8f223e4fc7fb9 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Thu, 19 Mar 2020 00:11:07 -0700 Subject: Update the way the blog is generated Instead of using a dynamic block to generate the index, use a sitemap function. --- publish.el | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 publish.el (limited to 'publish.el') diff --git a/publish.el b/publish.el new file mode 100644 index 0000000..652f064 --- /dev/null +++ b/publish.el @@ -0,0 +1,121 @@ +;;; publish.el --- Publishing configuration for ryuslash.org -*- lexical-binding: t; -*- + +;; Copyright (C) 2020 Tom Willemse + +;; Author: Tom Willemse +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program 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 General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'ox-publish) +(require 'ox-rss) +(require 'subr-x) + +(defun publish-calculate-reading-time (buffer) + "Calculate the amount of minutes it would take to read the contents of BUFFER." + (with-current-buffer buffer + (max 1 (/ (count-words (point-min) (point-max)) 228)))) + +(defun publish-format-reading-time (time) + "Return a string describing TIME." + (format "%d minute%s" + time + (if (= time 1) "" "s"))) + +(defun publish-org-sitemap (title list) + "Create a site map file. TITLE is used as the title, LIST is turned into a subtree." + (concat "#+TITLE: " title "\n" + "#+OPTIONS: toc:nil num:nil\n\n" + ;; (message "Lets see here: %S" list) + (org-list-to-subtree list))) + +(defun publish-org-sitemap-format-entry (entry style project) + "Format ENTRY as a healine. +STYLE is ignored and PROJECT is passed on directly to related functions." + (unless (directory-name-p entry) + (format "%s\n :PROPERTIES:\n :ID: %s\n :RSS_PERMALINK: %s\n :PUBDATE: %s\n :END:\n %s\n Published on: %s\n\n [[file:%s][Read More]] (%s)" + (org-publish-find-title entry project) + entry + (concat (string-remove-suffix ".org" entry) ".html") + (format-time-string + (cdr org-time-stamp-formats) + (org-publish-find-date entry project)) + + (with-temp-buffer + (insert-file-contents (concat (plist-get (cdr project) :base-directory) "/" entry)) + (goto-char (point-min)) + (let ((current-element (org-element-at-point))) + (while (not (equal (org-element-type current-element) 'paragraph)) + (org-forward-element) + (setq current-element (org-element-at-point))) + (buffer-substring-no-properties + (plist-get (cadr current-element) :contents-begin) + (plist-get (cadr current-element) :contents-end)))) + (format-time-string + (cdr org-time-stamp-formats) + (org-publish-find-date entry project)) + entry + (with-temp-buffer + (insert-file-contents (concat (plist-get (cdr project) :base-directory) "/" entry)) + (publish-format-reading-time + (publish-calculate-reading-time (current-buffer))))))) + +(setq org-rss-use-entry-url-as-guid t) + +(setq org-export-exclude-tags '("noexport" "draft")) + +(setq org-publish-project-alist + '(("posts" + :base-directory "posts/" + :base-extension "org" + :publishing-directory "public/" + :recursive t + :publishing-function org-html-publish-to-html + :html-head "" + :html-preamble (lambda (project) + (let ((buffer (find-file-noselect (buffer-file-name)))) + (unless (string= "ryuslash.org" + (car (org-publish-find-property (buffer-file-name) :title project))) + (publish-format-reading-time + (publish-calculate-reading-time buffer))))) + :auto-sitemap t + :sitemap-filename "index.org" + :sitemap-title "ryuslash.org" + :sitemap-format-entry publish-org-sitemap-format-entry + :sitemap-style list + :sitemap-function publish-org-sitemap + :sitemap-sort-files anti-chronologically) + ("rss" + :base-directory "posts/" + :base-extension "org" + :html-link-home "https://ryuslash.org/" + :rss-link-home "https://ryuslash.org/" + :html-link-use-abs-url t + :rss-extension "xml" + :publishing-directory "public" + :publishing-function (org-rss-publish-to-rss) + :section-number nil + :exclude ".*" + :include ("index.org") + :table-of-contents nil) + ("all" :components ("posts" "rss")))) + +(provide 'publish) +;;; publish.el ends here -- cgit v1.2.3-54-g00ecf