diff --git a/build.el b/build.el
index 15bba60..ff7cfec 100644
--- a/build.el
+++ b/build.el
@@ -19,6 +19,10 @@
linkedin.com/in/aner-zakobar
+
+
+ RSS
+
")
(setq blog-nav
@@ -61,9 +65,69 @@
"\n")))))
(insert "\n#+END_EXPORT\n"))))
+(defun blog-escape-xml (str)
+ "Escape XML special characters in STR."
+ (let ((s (or str "")))
+ (setq s (replace-regexp-in-string "&" "&" s))
+ (setq s (replace-regexp-in-string "<" "<" s))
+ (setq s (replace-regexp-in-string ">" ">" s))
+ s))
+
+(defun blog-date-to-rfc822 (date-str)
+ "Convert YYYY-MM-DD string to RFC 822 format."
+ (let* ((parts (split-string date-str "-"))
+ (year (string-to-number (nth 0 parts)))
+ (month (string-to-number (nth 1 parts)))
+ (day (string-to-number (nth 2 parts)))
+ (month-names '("Jan" "Feb" "Mar" "Apr" "May" "Jun"
+ "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"))
+ (day-names '("Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat"))
+ (time (encode-time 0 0 0 day month year))
+ (decoded (decode-time time))
+ (dow (nth 6 decoded)))
+ (format "%s, %02d %s %04d 00:00:00 +0000"
+ (nth dow day-names)
+ day
+ (nth (1- month) month-names)
+ year)))
+
+(defun blog-generate-rss (_project)
+ "Write public/feed.xml from all blog posts."
+ (let* ((blog-dir "./content/blog")
+ (base-url "https://aner.zakobar.com")
+ (pattern (concat blog-dir "/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-*.org"))
+ (files (sort (file-expand-wildcards pattern t)
+ (lambda (a b) (string> (file-name-base a)
+ (file-name-base b))))))
+ (make-directory "./public" t)
+ (with-temp-file "./public/feed.xml"
+ (insert "\n")
+ (insert "\n")
+ (insert " \n")
+ (insert " Aner Zakobar\n")
+ (insert (format " %s\n" base-url))
+ (insert " Personal blog of Aner Zakobar\n")
+ (insert (format " \n" base-url))
+ (dolist (file files)
+ (let* ((base (file-name-base file))
+ (date (substring base 0 10))
+ (title (blog-escape-xml (blog-extract-title file)))
+ (excerpt (blog-escape-xml (blog-extract-excerpt file)))
+ (url (format "%s/blog/%s.html" base-url base)))
+ (insert " - \n")
+ (insert (format " %s\n" title))
+ (insert (format " %s\n" url))
+ (insert (format " %s\n" url))
+ (insert (format " %s\n" (blog-date-to-rfc822 date)))
+ (insert (format " %s\n" excerpt))
+ (insert "
\n")))
+ (insert " \n")
+ (insert "\n"))))
+
(defun site-prepare (project)
"Run all site preparation steps."
(blog-generate-listings project)
+ (blog-generate-rss project)
(things-generate-page project))
(defun blog-extract-title (file)
@@ -140,7 +204,7 @@
:preparation-function site-prepare
:html-head-include-default-style nil
:html-head-include-scripts nil
- :html-head ""
+ :html-head ""
:html-preamble ,site-nav
:html-postamble nil
:with-author nil
@@ -157,7 +221,7 @@
:publishing-function org-html-publish-to-html
:html-head-include-default-style nil
:html-head-include-scripts nil
- :html-head ""
+ :html-head ""
:html-preamble ,blog-nav
:html-postamble nil
:with-author nil