Table of Contents

Nullam tristique diam non turpis. Sed bibendum. Cras placerat accumsan nulla. Fusce sagittis, libero non molestie mollis, magna orci ultrices dolor, at vulputate neque nulla lacinia eros.

1 file variables

2 directory variables

  • ((org-mode . ((output-path . "/out/"))))

3 exporting

3.1 files &c

  • This exports the file and returns the filename.
(org-html-export-to-html nil nil nil nil nil)
  • This grabs that filename and moves it (“renames”) to output-path + filename.
(let ((out-file (org-html-export-to-html nil nil nil nil nil)))
  (rename-file out-file (concat output-path out-file) t))
  • What if more than one file is generated?
.#+BEGIN_SRC ditaa :file gen/hello-world-ditaa.png
|              |
| Hello World! |
|              |

3.2 css

The variable that decides how to export the syntax highlighting in emacs is org-html-htmlize-output-type. Setting it to css let me use my file instead of having a fixed inline styling.

4 index

The function that actually parses an org-mode buffer is (org-element-parse-buffer). If you want to check the output outside the minibuffer, using (with-current-buffer "colophon.org" (org-element-parse-buffer)) will do. It spits lots of (redundant?) information, though.

isn’t hard, that is, after finding the relevant Stack Exchange answer.

Mining what we might want isn’t hard: (with-current-buffer "colophon.org" (org-element-property :value (car (org-global-props "DATE")))). With this we can get whatever information we put in the file header, so if we save the last update time, we can use it to build a time-based index of this weblog. Let’s get this more straightforward:

(defun weblog-get-property (property)
  "I send thee the org-mode buffer property you wish to know."
  (org-element-property :value (car (org-global-props property))))

Saving information to a file seems advisable. I didn’t find anything straightforward on the manuals, but then this on Stack Exchange:

(defun print-to-file (filename data)
  (with-temp-file filename
    (erase-buffer) ;; otherwise it will append instead of rewrite
    (prin1 data (current-buffer))))

(defun print-to-file-raw (filename data)
  (with-temp-file filename
    (erase-buffer) ;; otherwise it will append instead of rewrite
    (princ data (current-buffer))))

(defun read-from-file (filename)
    (insert-file-contents filename)
    (cl-assert (eq (point) (point-min)))
    (read (current-buffer))))

Now we can save stuff inside an alist. A list of entries with filename, title, creation date, last update date, and tags. All this will require more work to use, but having them is a good first step.

(defun weblog-save ()

  ;; in case it’s the first time we use this file
  (unless (file-exists-p "metadata.el")
    (print-to-file "metadata.el" nil))

  (let ((out-file (org-html-export-to-html nil nil nil nil nil))
        (title (weblog-get-property "TITLE"))
        (creation-date (weblog-get-property "DATE"))
        (updating-date (time-convert nil 'integer))
        (categories (weblog-get-property "CATEGORIES"))
        ;; this means we need to update files sequentially,
        ;; otherwise two updates might delete each other
        (metadata-file (read-from-file "metadata.el"))
        (metadata-here nil))

    ;; this send the created file to the right place
    ;; output-path is defined in the directory variables file
    (rename-file out-file (concat output-path out-file) t)

    (setq metadata-here (list :title title
                              :creation-date creation-date
                              :updating-date updating-date
                              :categories categories))

    ;; we delete the older entry for out-file
    (setq metadata-file (assoc-delete-all out-file metadata-file))

    (push (cons out-file metadata-here) metadata-file)

    ;; this saves the metadata for indexing
    (print-to-file "metadata.el" nil)
    (print-to-file "metadata.el" metadata-file)))

· copyright © Edgard Bikelis (eſb) · 2020-03-02 ·
created using Emacs 28.0.50 (Org mode 9.3)