Elisp Breadcrumbs
A breadcrumb is a navigation aid. I just added one to this website, so that it gets easier to browse from any article to its local and parents indexes and back to /dev/dim, the root webpage of this site.
As it was not that much work to implement, here’s the whole of it:
;;;
;;; Breadcrumb support
;;;
(defun tapoueh-breadcrumb-to-current-page ()
"Return a list of (name . link) from the index root page to current one"
(let* ((current (muse-current-file))
(cwd (file-name-directory current))
(project (muse-project-of-file current))
(root (muse-style-element :path (caddr project)))
(path (tapoueh-path-to-root))
(dirs (split-string (file-relative-name current root) "/")))
;; ("blog" "2011" "07" "13-back-from-char11.muse")
(append
(list (cons "/dev/dim" (concat path "index.html")))
(loop for p in (butlast dirs)
collect (cons p (format "%s%s/index.html" path p))
do (setq path (concat path p "/"))))))
(defun tapoueh-insert-breadcrumb-div ()
"The real HTML inserting"
(insert "<div id=\"breadcrumb\">")
(loop for (name . link) in (tapoueh-breadcrumb-to-current-page)
do (insert (format "<a href=%s>%s</a>" link name) " / "))
(insert "</div>\n"))
(defun tapoueh-insert-breadcrumb ()
"Must run with current buffer being a muse article"
(save-excursion
(beginning-of-buffer)
(when (tapoueh-extract-directive "author" (muse-current-file))
(re-search-forward "<body>" nil t) ; find where the article content is
(re-search-forward "<h2>" nil t) ; that's the title line
(beginning-of-line)
(open-line 1)
(tapoueh-insert-breadcrumb-div)
(re-search-forward "<h2>" nil t 2) ; that's the TAG line
(beginning-of-line)
(open-line 1)
(tapoueh-insert-breadcrumb-div))))
This code is now called in the
:after
function of my
Muse project style, and
it gets the work done.