11 Jun 2024
Switching from stream to blog
I wanted to transform my stream for a long time, switching from a single .org file where I kept adding things, to a more appropriate blog structure, with individual posts, index, archive, tag pages, a feed and so on. Thanks to Org, it was relatively easy to use the original material to produce the files I then fed to org-static-blog.
Here the code I used (I just omitted a few service functions)
(defun split-org-file (input-file output-dir)
"Split an .org file into separate files for each top-level entry.
INPUT-FILE is the path to the .org file.
OUTPUT-DIR is the directory where the separate files will be saved."
(with-current-buffer (find-file-noselect input-file)
(goto-char (point-min))
(org-map-entries
(lambda ()
(let* ((entry-title (nth 4 (org-heading-components)))
(tags (parse-tags-into-filetags
(nth 5 (org-heading-components))))
(ts (get-timestamp-from-title entry-title))
(entry-title-stripped (strip-entry-title entry-title))
(output-file (expand-file-name
(format "%s.org" (dirify-string entry-title-stripped))
output-dir)))
(let ((body (org-copy-subtree))
(cleaned-body (with-temp-buffer
(insert (car kill-ring))
(goto-char (point-min))
(when (re-search-forward "^\\*+ \\(.*\\)$" nil t)
(replace-match "" nil nil))
(buffer-string))))
(with-temp-file output-file
(insert (format "#+title: %s\n" entry-title-stripped)
(format "#+date: %s\n" (or ts "2000-01-01"))
(format "#+filetags: %s\n" (or tags ""))
"\n\n"
(format "%s" cleaned-body))))))
"LEVEL=1")))
Tags: