forked from varia/varia.website
62 lines
2.4 KiB
EmacsLisp
62 lines
2.4 KiB
EmacsLisp
(require 'json)
|
|
(require 'org)
|
|
(require 'ox)
|
|
|
|
(defun org->pelican (filename backend)
|
|
(progn
|
|
(save-excursion
|
|
; open org file
|
|
(find-file filename)
|
|
|
|
; pre-process some metadata
|
|
(let (; extract org export properties
|
|
(org-export-env (org-export-get-environment))
|
|
; convert MODIFIED prop to string
|
|
(modifiedstr (cdr (assoc-string "MODIFIED" org-file-properties t)))
|
|
; prepare date property
|
|
(dateobj (car (plist-get (org-export-get-environment) ':date)))
|
|
)
|
|
|
|
; check if #+TITLE: is given and give sensible error message if not
|
|
(if (symbolp (car (plist-get org-export-env :title)))
|
|
(error "Each page/article must have a #+TITLE: property"))
|
|
|
|
; construct the JSON object
|
|
(princ (json-encode
|
|
(list
|
|
; org export environment
|
|
:title (substring-no-properties
|
|
(car (plist-get org-export-env :title)))
|
|
; if #+DATE is not given, dateobj is nil
|
|
; if #+DATE is a %Y-%m-%d string, dateobj is a string,
|
|
; and otherwise we assume #+DATE is a org timestamp
|
|
:date (if (symbolp dateobj)
|
|
""
|
|
(if (stringp dateobj)
|
|
(org-read-date nil nil dateobj nil)
|
|
(org-timestamp-format dateobj "%Y-%m-%d")))
|
|
|
|
:author (substring-no-properties
|
|
(car (plist-get org-export-env ':author)))
|
|
|
|
; org file properties
|
|
:category (cdr (assoc-string "CATEGORY" org-file-properties t))
|
|
|
|
; custom org file properties, defined as #+PROPERTY: NAME ARG
|
|
:language (cdr (assoc-string "LANGUAGE" org-file-properties t))
|
|
:save_as (cdr (assoc-string "SAVE_AS" org-file-properties t))
|
|
:tags (cdr (assoc-string "TAGS" org-file-properties t))
|
|
:summary (cdr (assoc-string "SUMMARY" org-file-properties t))
|
|
:slug (cdr (assoc-string "SLUG" org-file-properties t))
|
|
:modified (if (stringp modifiedstr)
|
|
(org-read-date nil nil modifiedstr nil)
|
|
"")
|
|
:post (org-export-as backend nil nil t)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|