feat(org): Configure org project alist

Add configuration to produce blog to org-publish-alist
This commit is contained in:
Judah Sotomayor 2024-08-29 15:20:30 -04:00
parent 47facf5c8b
commit e66629c6bd
Signed by: judahsotomayor
SSH Key Fingerprint: SHA256:9Dq4ppxhfAjbX+7HLXEt+ROMiIojI6kqQgUyFUJb9lI

View File

@ -556,6 +556,117 @@ $x + 1 = 3$
#+end_src #+end_src
#+RESULTS: #+RESULTS:
| inline-anki-link-filter | | 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* ** Automatic Citations with *citar* and *org-cite*
:PROPERTIES: :PROPERTIES: