From 520da7b85a75029830702e4e5923a0eb263c73be Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sun, 30 Mar 2014 23:39:39 +0200 Subject: [PATCH] Automatically generate blog structure from org files --- articles/.gitignore | 1 + articles/_build/.gitignore | 2 + articles/project.el | 118 +++++++++++++++++++++++++++++++++++-- blog.org | 52 ---------------- index.org | 12 +--- project.el | 7 --- 6 files changed, 118 insertions(+), 74 deletions(-) create mode 100644 articles/.gitignore create mode 100644 articles/_build/.gitignore delete mode 100644 blog.org diff --git a/articles/.gitignore b/articles/.gitignore new file mode 100644 index 0000000..b8103a1 --- /dev/null +++ b/articles/.gitignore @@ -0,0 +1 @@ +shortlist.org diff --git a/articles/_build/.gitignore b/articles/_build/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/articles/_build/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/articles/project.el b/articles/project.el index eb1e89a..10c3354 100644 --- a/articles/project.el +++ b/articles/project.el @@ -1,13 +1,116 @@ (require 'ox-publish) +(require 'cl-lib) +(require 'ox-rss) (load "../common.el") -(setq org-publish-use-timestamps-flag t +(cl-defstruct orgweb:post filename title date tags contents) + +(defun orgweb-get-permalink (entry) + (let ((entry-date (org-date-to-gregorian (orgweb:post-date entry)))) + (format "%s/%s/%s/%s.html" (nth 2 entry-date) (nth 0 entry-date) + (nth 1 entry-date) (file-name-sans-extension + (file-name-nondirectory + (orgweb:post-filename entry)))))) + +(defun orgweb-get-date () + (save-excursion + (goto-char (point-min)) + (org-forward-heading-same-level 1) + (org-entry-get (point) "PUBDATE"))) + +(defun orgweb-get-title () + (save-excursion + (goto-char (point-min)) + (org-forward-heading-same-level 1) + (nth 4 (org-heading-components)))) + +(defun orgweb-get-tags () + (save-excursion + (goto-char (point-min)) + (when (org-forward-heading-same-level 1) + (org-get-tags)))) + +(defun orgweb-get-entries () + (delq nil + (mapcar (lambda (orgfile) + (with-temp-buffer + (insert-file-contents orgfile) + (org-mode) + (let ((date (orgweb-get-date))) + (when date + (make-orgweb:post + :filename orgfile + :title (orgweb-get-title) + :date date + :tags (orgweb-get-tags) + :contents (buffer-substring-no-properties + (point-min) (point-max))))))) + (directory-files "/home/slash/projects/orgweb/articles" + t "^[^.].*\\.org$")))) + +(defun orgweb-get-sorted-entries () + (sort (orgweb-get-entries) + (lambda (a b) + (not (string< (orgweb:post-date a) (orgweb:post-date b)))))) + +(defun orgweb-link (entry &optional prefix) + (format "[[file:%s%s][%s]]" (or prefix "") (orgweb-get-permalink entry) + (orgweb:post-title entry))) + +(defun orgweb-shortlist (entries) + (with-temp-buffer + (mapc (lambda (entry) + (insert "* " (orgweb-link entry "articles/") " " + (orgweb:post-date entry) "\n")) + entries) + (write-file "shortlist.org"))) + +(defun orgweb-list (entries) + (with-temp-buffer + (insert "#+TITLE:\n#+OPTIONS: toc:nil\n\n") + (mapc (lambda (entry) + (insert + (with-temp-buffer + (insert (orgweb:post-contents entry)) + (org-mode) + (goto-char (point-min)) + (org-forward-heading-same-level 1) + (org-set-property "RSS_PERMALINK" + (concat "articles/" (orgweb-get-permalink entry))) + (let ((heading-start (point))) + (forward-paragraph) + (newline) + (insert (format "[[file:%s][Read more]]" + (orgweb-get-permalink entry))) + (buffer-substring-no-properties + heading-start (point)))) + "\n\n") + (let* ((gdate (org-date-to-gregorian + (orgweb:post-date entry))) + (date-tree (format "_build/%s/%s/%s" + (nth 2 gdate) + (nth 0 gdate) + (nth 1 gdate)))) + (mkdir date-tree :with-parents) + (copy-file (orgweb:post-filename entry) date-tree t))) + entries) + (write-file "_build/index.org"))) + +(defun orgweb-prepare () + (let ((entries (delete nil (cl-subseq (orgweb-get-sorted-entries) 0 6)))) + (mkdir "_build" :without-error) + (orgweb-shortlist entries) + (orgweb-list entries))) + +(setq org-publish-use-timestamps-flag nil + org-rss-extension "rss" org-publish-project-alist '(("blog" - :base-directory "./" + :preparation-function orgweb-prepare + :base-directory "_build/" :publishing-directory "../_publish/articles/" - :recursive nil + :recursive t :base-extension "org" :publishing-function org-html-publish-to-html :section-numbers nil @@ -15,4 +118,11 @@ :html-doctype "" :html-head "\n" :html-link-up "../blog.html" - :html-link-home "/"))) + :html-link-home "/") + ("rss" + :base-directory "_build/" + :publishing-directory "../_publish/articles/" + :base-extension "" + :publishing-function org-rss-publish-to-rss + :include ("index.org") + :html-link-home "https://ryuslash.org"))) diff --git a/blog.org b/blog.org deleted file mode 100644 index 3975273..0000000 --- a/blog.org +++ /dev/null @@ -1,52 +0,0 @@ -#+TITLE: -#+OPTIONS: toc:nil -#+STARTUP: showall -#+HTML_LINK_UP: ./ -#+RSS_EXTENSION: rss - -# * Python mixins :python:coding: -# :PROPERTIES: -# :PUBDATE: <2013-11-10 Sun 15:35> -# :RSS_PERMALINK: articles/python-mixins.html -# :END: -# A little explanation of one of the things that I think make Mixins -# in Python an interesting idea. - -# [[file:articles/python-mixins.org][Read]] - -* Mounting music dir before MPD :systemd:mpd:config: - :PROPERTIES: - :RSS_PERMALINK: articles/mounting_music_dir_before_mpd.html - :PUBDATE: <2013-11-24 Sun 14:03> - :END: - I use an NFS drive to store my music files, which I don't mount by - default (to keep startup fast). It was a pain to have to mount the - drive manually each time before starting MPD. [[file:articles/mounting_music_dir_before_mpd.org][Read]] - -* rlwrapping sbcl :sbcl:lisp:utility: - :PROPERTIES: - :RSS_PERMALINK: articles/rlwrapping_sbcl.html - :PUBDATE: <2013-10-06 13:02> - :END: - A useful addition to SBCL. [[file:articles/rlwrapping_sbcl.org][Read]] - -* C-d to close eshell :eshell:emacs:elisp:config: - :PROPERTIES: - :PUBDATE: <2013-08-17 2:25> - :RSS_PERMALINK: articles/c-d_to_close_eshell.html - :END: - A little trick to improve your eshell experience. [[file:articles/c-d_to_close_eshell.org][Read]] - -* Some quick git diff tips :org:lisp:hy:elisp:scheme:config: - :PROPERTIES: - :RSS_PERMALINK: articles/some_quick_git_diff_tips.html - :PUBDATE: <2013-08-11 0:54> - :END: - Making git see more diff. [[file:articles/some_quick_git_diff_tips.org][Read]] - -* Notstumpwm :notion:wm:lua:config: - :PROPERTIES: - :RSS_PERMALINK: articles/notstumpwm.html - :PUBDATE: <2013-05-24 0:10> - :END: - Pretending Notion is (like) stumpwm. [[file:articles/notstumpwm.org][Read]] diff --git a/index.org b/index.org index 085f415..872fc4e 100644 --- a/index.org +++ b/index.org @@ -7,17 +7,7 @@ Some thoughts I may have had, and was foolish enough to write down. - #+BEGIN_SRC emacs-lisp :exports results :results value raw - (apply - #'concat - (with-current-buffer (find-file-noselect "blog.org") - (org-map-entries - (lambda () - (format "* [[file:%s][%s]] %s\n" - (org-entry-get (point) "RSS_PERMALINK") - (nth 4 (org-heading-components)) - (org-entry-get (point) "PUBDATE")))))) - #+END_SRC +#+INCLUDE: articles/shortlist.org * Projects diff --git a/project.el b/project.el index 8f9cbc6..0d8c194 100644 --- a/project.el +++ b/project.el @@ -162,11 +162,4 @@ :table-of-contents 1 :html-doctype "" :html-head "\n" - :html-link-home "https://ryuslash.org") - ("rss" - :base-directory "./" - :publishing-directory "_publish/" - :base-extension "" - :publishing-function org-rss-publish-to-rss - :include ("blog.org") :html-link-home "https://ryuslash.org")))