diff --git a/publish.el b/publish.el index dcb5a99..b658730 100755 --- a/publish.el +++ b/publish.el @@ -13,6 +13,7 @@ (unless (package-installed-p 'use-package) (package-install 'use-package)) + (require 'use-package) (setq use-package-always-ensure t) @@ -28,21 +29,68 @@ :pin org) (use-package htmlize) +(use-package ox-rss) (require 'ox-publish) (require 'ox-html) -(require 'htmlize) + +(defvar fo-base-directory "/var/www/htdocs/sha256.net/" + "Where the org files live.") + +(defvar fo-url "https://openbsd-build.home.narrans.de/sha256.net/" + "URL where the site will be published.") + +(defvar fo-title "sha256.net - Florian Obser" + "Title of the site.") + (setq org-html-doctype "html5") (setq org-html-htmlize-output-type 'css) (setq org-export-time-stamp-file nil) (setq org-html-validation-link nil) (setq org-html-head-include-default-style nil) -(setq org-publish-project-alist - '(("tlakh" - :base-directory "/var/www/sha256.net/" - :publishing-function org-html-publish-to-html - :publishing-directory "/var/www/sha256.net/" + +(defun fo/format-rss-feed-entry (entry style project) + "Format ENTRY for the RSS feed. +ENTRY is a file name. STYLE is either 'list' or 'tree'. +PROJECT is the current project." + (cond ((not (directory-name-p entry)) + (let* ((file (org-publish--expand-file-name entry project)) + (title (org-publish-find-title entry project)) + (date (format-time-string "%Y-%m-%d" (org-publish-find-date entry project))) + (link (concat (file-name-sans-extension entry) ".html"))) + (with-temp-buffer + (insert (format "* [[file:%s][%s]]\n" file title)) + (org-set-property "RSS_PERMALINK" link) + (org-set-property "PUBDATE" date) + (insert-file-contents file) + (buffer-string)))) + ((eq style 'tree) + ;; Return only last subdir. + (file-name-nondirectory (directory-file-name entry))) + (t entry))) + +(defun fo/format-rss-feed (title list) + "Generate RSS feed, as a string. +TITLE is the title of the RSS feed. LIST is an internal +representation for the files to include, as returned by +`org-list-to-lisp'. PROJECT is the current project." + (concat "#+TITLE: " title "\n\n" + (org-list-to-subtree list 1 '(:icount "" :istart "")))) + +(defun fo/org-rss-publish-to-rss (plist filename pub-dir) + "Publish RSS with PLIST, only when FILENAME is 'rss.org'. +PUB-DIR is when the output will be placed." + (if (equal "rss.org" (file-name-nondirectory filename)) + (org-rss-publish-to-rss plist filename pub-dir))) + +(defvar fo--publish-project-alist + (list + (list "sha256.net" + :base-directory fo-base-directory + :publishing-function 'org-html-publish-to-html + :publishing-directory fo-base-directory + :exclude (regexp-opt '("rss.org")) :section-numbers nil :with-author nil :with-email nil @@ -57,6 +105,49 @@ Copyright © 2014 - 2023 Florian Obser. All rights reserved. :html-head-include-default-style: nil :html-head " -"))) +") + (list "sha256.net-rss" + :base-directory fo-base-directory + :publishing-directory fo-base-directory + :base-extension "org" + :recursive nil + :exclude (regexp-opt '("rss.org" "index.org" "404.org" "50x.org")) + :publishing-function 'fo/org-rss-publish-to-rss + :rss-extension "xml" + :html-link-home fo-url + :html-link-use-abs-url t + :html-link-org-files-as-html t + :auto-sitemap t + :sitemap-filename "rss.org" + :sitemap-title fo-title + :sitemap-style 'list + :sitemap-sort-files 'anti-chronologically + :sitemap-function 'fo/format-rss-feed + :sitemap-format-entry 'fo/format-rss-feed-entry + :author "Florian Obser" + :email "") + (list "site" + :components '("sha256.net")))) -(org-publish "tlakh") +(defun fo-publish-all () + "Publish the blog to HTML." + (interactive) + (let ((org-publish-project-alist fo--publish-project-alist) + (org-publish-timestamp-directory "./.timestamps/") + (org-export-with-section-numbers nil) + (org-export-with-smart-quotes t) + (org-export-with-toc nil) + (org-export-with-sub-superscripts '{}) + (org-html-divs '((preamble "header" "top") + (content "main" "content") + (postamble "footer" "postamble"))) + (org-html-container-element "section") + (org-html-metadata-timestamp-format "%Y-%m-%d") + (org-html-checkbox-type 'html) + (org-html-html5-fancy t) + (org-html-validation-link nil) + (org-html-doctype "html5") + (org-html-htmlize-output-type 'css)) + (org-publish-all))) + +(fo-publish-all)