#+title: Archive #+options: author:nil date:nil #+html_head: * Post processing :noexport: First we need to get all the posts #+name: collect-posts #+begin_src emacs-lisp (setq posts (nreverse (directory-files (expand-file-name "../content" default-directory) t "^[0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9]-.+\\.org"))) #+end_src Word counting would be helpful, but ~count-words~ includes parts of the document we don't want to count, like code blocks. To help us count words accurately, we can just create a derived export backend which discards elements we don't care about. #+name: count-words-org #+begin_src emacs-lisp (defun org-org-content (_blob content _info) (or content "")) (org-export-define-derived-backend 'org-for-word-counting 'org :translate-alist `((babel-call . ignore) (bold . org-org-content) (code . org-org-content) (export-block . ignore) (headline . org-org-content) (horizontal-rule . ignore) (italic . org-org-content) (keyword . ignore) (latex-environment . ignore) (latex-fragment . ignore) (line-break . ignore) (link . org-org-content) (src-block . ignore) (underline . org-org-content) (verbatim . org-org-content)) :options-alist '((:time-stamp-file nil "timestamp" nil))) (defun count-words-org () (let (content words) (setq content (org-export-as 'org-for-word-counting)) (with-temp-buffer (insert content) (setq words (count-words (point-min) (point-max)))) words)) #+end_src Then we want to format the content for inclusion. #+name: post-formatting #+begin_src emacs-lisp (defun post-item (file) (with-temp-buffer (insert-file-contents file) (setq keywords (org-collect-keywords '("TITLE" "SUBTITLE" "DATE"))) (format "+ @@html:@@ *%s* %s _%d0 words_ @@html:@@" (file-name-base file) (cadr (assoc "DATE" keywords)) (or (cadr (assoc "SUBTITLE" keywords)) (cadr (assoc "TITLE" keywords))) (round (/ (count-words-org) 10.0))))) #+end_src * Output :ignore: #+begin_src emacs-lisp :noweb yes :results raw :exports results <> <> <> (mapconcat (lambda (p) (post-item p)) posts "\n") #+end_src