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