orgweb/articles/project.el
Tom Willemse 12ec5be353 Add possibility to mark posts as drafts
This way they won't get included in the lists or RSS, but they'll still
get exported and posted.
2014-06-03 22:11:15 +02:00

137 lines
5 KiB
EmacsLisp

(require 'ox-publish)
(require 'cl-lib)
(require 'ox-rss)
(load "../common.el")
(cl-defstruct orgweb:post filename title date tags contents draft)
(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-draft ()
(save-excursion
(goto-char (point-min))
(org-forward-heading-same-level 1)
(org-entry-get (point) "DRAFT")))
(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))
:draft (orgweb-get-draft))))))
(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)
(unless (orgweb:post-draft 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)
(unless (orgweb:post-draft 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"
:preparation-function orgweb-prepare
:base-directory "_build/"
:publishing-directory "../_publish/articles/"
:recursive t
:base-extension "org"
:publishing-function org-html-publish-to-html
:section-numbers nil
:with-toc nil
:html-doctype "<!DOCTYPE html>"
:html-head "<link rel=\"stylesheet\" media=\"screen\" href=\"http://openfontlibrary.org/face/cosmic-sans-neue-mono\" type=\"text/css\" />\n<link href=\"https://ryuslash.org/org.css\" type=\"text/css\" rel=\"stylesheet\" />"
:html-link-up "../blog.html"
: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")))