Basically any elisp function could be used within an o-blog template,
as long as they are known when exporting. Meanwhile some functions are
specifically made to be used within templates. These functions are
prefixed by ob:.
Descriptions are taken from function docstrings.
Function: (ob:get-posts &optional PREDICATE COUNT SORTFUNC COLLECT)
Return posts (from POSTS as defined in org-publish-blog) matching
PREDICATE. Limit to COUNT results if defined and sorted using
SORTFUNC.
PREDICATE is a function that runs for each post, with the post
itself as argument. If PREDICATE is nil, no filtering will be done
on posts.
SORTFUNC uses a sort PREDICATE.
If COLLECT is defined, only returns the COLLECT field of a
ob:post structure.
Examples:
Getting the last 10 posts:
(ob:get-posts nil 10)
Getting posts from January 2012:
(ob:get-posts
(lambda (x)
(and (= 2012 (ob:post-year x))
(= 1 (ob:post-month x)))))
Getting all categories:
(ob:get-posts nil nil nil 'category)
Template usages
For archive navigation:
<nav id="archives"> <h1>Archives</h1> <ul> <lisp> (loop for p in (ob:get-posts nil 10) do (insert (format "<li><a href=\"%s/%s\">%s</a></li> " (ob:path-to-root) (ob:post-htmlfile p) (ob:post-title p)))) </lisp> </ul> </nav>
Function: (ob:get-post-by-id ID)
Return post whose id is ID.
Template usages
Posts navigation, setting up links to previous and next post:
<nav class="articles-nav"> <ul> <lisp> (progn ;; Get previous post (let ((ppost (ob:get-post-by-id (1+ (ob:post-id POST))))) (if ppost (insert (format "<li class=\"prev\"><a href=\"%s/%s\">%s</a></li>" (ob:path-to-root) (ob:post-htmlfile ppost) (ob:post-title ppost))) (insert "<li> </li>"))) ;; Get next post (let ((npost (ob:get-post-by-id (1- (ob:post-id POST))))) (if npost (insert (format "<li class=\"next\"><a href=\"%s/%s\">%s</a></li>" (ob:path-to-root) (ob:post-htmlfile npost) (ob:post-title npost))) (insert "<li> </li>")))) </lisp> </ul> </nav>
Function: (ob:get-snippet NAME)
Get first snippet matching NAME.
Template usages
Insert the About section in page footer:
<h1>About</h1> <address> <lisp>(ob:post-content-html (ob:get-snippet "About"))</lisp> </address>
Function: (ob:get-header HEADER &optional ALL)
Get HEADER from blog buffer as defined in BLOG global context variable.
Returns only the first match, unless ALL is defined.
Template usages
Get the last updated header for RSS export:
<updated><lisp>(ob:format-date (ob:get-header "DATE"))</lisp></updated>
Function: (ob:insert-template TEMPLATE)
Insert TEMPLATE in current buffer.
Template usages
Insert html header:
<lisp>(ob:insert-template "page_header.html")</lisp>
Function: (ob:format-date DATE &optional FORMAT LOCALE)
Format DATE using FORMAT and LOCALE.
DATE can either be a string suitable for parse-time-string or a list of
integers using current-time format.
FORMAT is a format-time-string compatible definition. If not
set, ISO8601 %Y-%m-%dT%TZ format will be used.
Template usages
Add a human-readable timestamp for a post:
Posted on <time datetime="<lisp> (ob:format-date (ob:post-timestamp POST)) </lisp>"> <lisp> (ob:format-date (ob:post-timestamp POST) "%A %B, %d %Y at %H:%M:%S") </lisp> </time>.