new-ryuslash.org/publish.el
2020-03-19 20:23:37 -07:00

124 lines
4.8 KiB
EmacsLisp

;;; publish.el --- Publishing configuration for ryuslash.org -*- lexical-binding: t; -*-
;; Copyright (C) 2020 Tom Willemse
;; Author: Tom Willemse <tom@ryuslash.org>
;; 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 <https://www.gnu.org/licenses/>.
;;; Commentary:
;;
;;; Code:
(require 'ox-publish)
(require 'ox-rss)
(require 'subr-x)
(require 'dockerfile-mode)
(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-html-htmlize-output-type 'css)
(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 "<link rel=\"stylesheet\" href=\"assets/css/main.css\" type=\"text/css\"/>"
: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