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)