diff --git a/config.org b/config.org index 6a69f1d..b187de3 100644 --- a/config.org +++ b/config.org @@ -556,6 +556,117 @@ $x + 1 = 3$ #+end_src #+RESULTS: | inline-anki-link-filter | +*** HTML +**** Custom functions +A lot of this section I steal from [[https://gitlab.com/to1ne/blog/blob/master/elisp/publish.el#L170-204][writepermission.com]]. +He has some great work for rss feed creation and other stuff. +#+begin_src elisp +(defun rw/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 + (org-mode) + (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 rw/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 rw/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)) + (let ((file-name (org-rss-publish-to-rss plist filename pub-dir))) + (shell-command (format "tail -n +2 %s > random-file-temp.xml" file-name file-name)) + (shell-command (format "mv random-file-temp.xml %s" file-name)) + file-name))) + +(use-package! ox-rss) +#+end_src + +We will need ox-rss for rss feed production. +#+begin_src elisp :tangle packages.el +(package! ox-rss) +#+end_src + + + +**** Project list configuration +Finally, configure the project alist using a series of projects. +1. ~blog-posts~ processes the normal .org file to create posts. +2. ~blog-static~ brings static css and images into the publishing dir. +3. ~blog-rss~ creates the rss feed as a special type of sitemap. It uses ox-rss, which we just loaded! +4. Finally, the whole blog. This uses both blog-posts and blog-rss. +#+begin_src elisp :results none +(setq org-html-htmlize-output-type 'css + org-html-html5-fancy t + org-html-metadata-timestamp-format "%Y-%m-%d" + org-html-checkbox-type 'html + org-html-doctype "html5") +(let ((blog--root (concat (file-name-as-directory org-directory) "blog")) + (blog--public-root "~/10-19-personal-projects/15-blog") + (blog--url "https://judah.freedomland.xyz") + (blog--static-attachment-extensions (regexp-opt '("jpg" "jpeg" "gif" "png" "svg" "pdf" "css")))) + (setq org-publish-project-alist + (list + (list "blog-posts" + :auto-sitemap t + :base-directory blog--root + :exclude (regexp-opt '("rss.org")) + :html-htmlized-css-url "static/style.css" + :html-head-include-default-style nil + :publishing-directory blog--public-root + :publishing-function 'org-html-publish-to-html + :recursive nil + :sitemap-filename "index.org" + :sitemap-title "Judah Sotomayor's Blog" + :sitemap-sort-files 'anti-chronologically + :sitemap-style 'tree) + (list "blog-static" + :base-directory (expand-file-name "static" blog--root) + :base-extension blog--static-attachment-extensions + :publishing-directory (expand-file-name "static" blog--public-root) + :publishing-function 'org-publish-attachment + :recursive t) + (list "blog-rss" + :auto-sitemap t + :base-directory blog--root + :exclude (regexp-opt '("rss.org" "index.org" "404.org")) + :html-link-home blog--url + :html-link-use-abs-url t + :html-link-org-files-as-html t + :publishing-directory blog--public-root + :publishing-function 'rw/org-rss-publish-to-rss + :rss-extension "xml" + :sitemap-filename "rss.org" + :sitemap-format-entry 'rw/format-rss-feed-entry + :sitemap-function 'rw/format-rss-feed + :sitemap-sort-files 'anti-chronologically + :sitemap-style 'list) + (list "blog" + :components '("blog-posts" "blog-rss" "blog-static"))))) +#+end_src + + + ** Automatic Citations with *citar* and *org-cite* :PROPERTIES: