forked from nextjournal/clerk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
meta_toc.clj
47 lines (40 loc) · 1.71 KB
/
meta_toc.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
;; # 📕 Meta Table of Contents
(ns meta-toc
{:nextjournal.clerk/toc true}
(:require [nextjournal.clerk :as clerk]
[nextjournal.clerk.parser :as parser]
[nextjournal.markdown.transform :as md.transform]
[nextjournal.clerk.viewer :as v]))
;; This assembles the table of contents programmatically from a
;; collection of notebooks.
;; ## Notebooks
(def notebooks
["notebooks/how_clerk_works.clj"
"notebooks/cherry.clj"
"notebooks/tracer.clj"
"notebooks/document_linking.clj"])
(defn md-toc->navbar-items [current-notebook file {:keys [children]}]
(mapv (fn [{:as item :keys [emoji attrs]}]
{:title (md.transform/->text item)
:expanded? (= current-notebook file)
:scroll-to-anchor? false
:emoji emoji
:path (clerk/doc-url file (:id attrs))
:items (md-toc->navbar-items current-notebook file item)}) children))
(defn meta-toc [current-notebook paths]
(into []
(mapcat (comp (fn [{:keys [toc file]}] (md-toc->navbar-items current-notebook file toc))
(partial parser/parse-file {:doc? true})))
paths))
(def book-viewer
(update v/notebook-viewer
:transform-fn (fn [original-transform]
(fn [wrapped-value]
(-> wrapped-value
original-transform
(assoc :nextjournal/opts {:expandable? true})
(assoc-in [:nextjournal/value :toc]
(meta-toc (:file (v/->value wrapped-value)) notebooks)))))))
#_(clerk/add-viewers! [book-viewer])
;; Test actual cross-doc toc
(clerk/add-viewers! [book-viewer])