|
1 | 1 | ;; # 📓 Doc Browser
|
2 | 2 | (ns doc
|
3 |
| - {:nextjournal.clerk/visibility {:code :hide}} |
| 3 | + {:nextjournal.clerk/visibility {:code :hide :result :hide}} |
4 | 4 | (:require [clojure.string :as str]
|
5 |
| - [nextjournal.clerk :as clerk])) |
6 |
| - |
7 |
| -^{::clerk/visibility {:result :hide}} |
8 |
| -(def text-input |
9 |
| - {:pred ::clerk/var-from-def |
10 |
| - :transform-fn (comp (clerk/update-val (fn [{::clerk/keys [var-from-def]}] |
11 |
| - {:var-name (symbol var-from-def) :value @@var-from-def})) |
12 |
| - clerk/mark-presented) |
13 |
| - :render-fn '(fn [{:keys [var-name value]}] |
14 |
| - [:div.my-1.relative |
15 |
| - [:input {:type :text |
16 |
| - :auto-correct "off" |
17 |
| - :spell-check "false" |
18 |
| - :placeholder "Filter namespaces…" |
19 |
| - :value value |
20 |
| - :class "px-3 py-2 relative bg-white bg-white rounded text-base font-sans border border-slate-200 shadow-inner outline-none focus:outline-none focus:ring w-full" |
21 |
| - :on-input #(v/clerk-eval `(reset! ~var-name ~(.. % -target -value)))}] |
22 |
| - [:button.absolute.right-2.text-xl.cursor-pointer |
23 |
| - {:class "top-1/2 -translate-y-1/2" |
24 |
| - :on-click #(v/clerk-eval `(reset! ~var-name ~(clojure.string/join "." (drop-last (clojure.string/split value #"\.")))))} "⏮"]])}) |
25 |
| - |
26 |
| -^{::clerk/viewer text-input} |
| 5 | + [nextjournal.clerk :as clerk] |
| 6 | + [nextjournal.clerk.viewer :as viewer])) |
| 7 | + |
| 8 | +(def render-input |
| 9 | + '(fn [!query] |
| 10 | + (prn :query !query) |
| 11 | + [:div.my-1.relative |
| 12 | + [:input {:type :text |
| 13 | + :auto-correct "off" |
| 14 | + :spell-check "false" |
| 15 | + :placeholder "Filter namespaces…" |
| 16 | + :value @!query |
| 17 | + :class "px-3 py-2 relative bg-white bg-white rounded text-base font-sans border border-slate-200 shadow-inner outline-none focus:outline-none focus:ring w-full" |
| 18 | + :on-input #(reset! !query (.. % -target -value))}] |
| 19 | + [:button.absolute.right-2.text-xl.cursor-pointer |
| 20 | + {:class "top-1/2 -translate-y-1/2" |
| 21 | + :on-click #(reset! !query (clojure.string/join "." (drop-last (clojure.string/split @!query #"\."))))} "⏮"]])) |
| 22 | + |
| 23 | +^{::clerk/sync true} |
27 | 24 | (defonce !ns-query (atom "nextjournal.clerk"))
|
28 | 25 | #_(reset! !ns-query "nextjournal.clerk")
|
29 | 26 |
|
| 27 | + |
| 28 | +!ns-query |
| 29 | + |
| 30 | +^{::clerk/visibility {:result :show} |
| 31 | + ::clerk/viewer {:render-fn render-input |
| 32 | + :transform-fn clerk/mark-presented}} |
| 33 | +(viewer/->viewer-eval `!ns-query) |
| 34 | + |
30 | 35 | ^{::clerk/viewers (clerk/add-viewers
|
31 | 36 | [{:pred seq?
|
32 | 37 | :render-fn '#(into [:div.border.rounded-md.bg-white.shadow.flex.flex-col.mb-1]
|
33 |
| - (v/inspect-children %2) %1) :page-size 20} |
| 38 | + (nextjournal.clerk.render/inspect-children %2) %1) :page-size 20} |
34 | 39 | {:pred string?
|
35 | 40 | :render-fn '(fn [ns] [:button.text-xs.font-medium.font-sans.cursor-pointer.px-3.py-2.hover:bg-blue-100.text-slate-700.text-left
|
36 |
| - {:on-click #(v/clerk-eval `(reset! !ns-query ~ns))} ns])}])} |
| 41 | + {:on-click #(reset! doc/!ns-query ns)} ns])}])} |
| 42 | + |
| 43 | +^{::clerk/visibility {:result :show}} |
37 | 44 | (def ns-matches
|
38 | 45 | (filter (partial re-find (re-pattern @!ns-query)) (sort (map str (all-ns)))))
|
39 | 46 |
|
40 |
| -^{::clerk/visibility {:result :hide}} |
41 | 47 | (defn var->doc-viewer
|
42 | 48 | "Takes a clojure `var` and returns a Clerk viewer to display its documentation."
|
43 | 49 | [var]
|
|
54 | 60 |
|
55 | 61 | #_(var->doc-viewer #'var->doc-viewer)
|
56 | 62 |
|
57 |
| -^{::clerk/visibility {:result :hide}} |
58 | 63 | (def var-doc-viewer {:pred ::clerk/var-from-def
|
59 | 64 | :transform-fn (clerk/update-val (comp var->doc-viewer ::clerk/var-from-def))})
|
60 | 65 |
|
61 |
| -^{::clerk/visibility {:result :hide}} |
62 | 66 | (defn namespace->doc-viewer [ns]
|
63 | 67 | (clerk/html
|
64 | 68 | [:div.text-sm.mt-6
|
|
70 | 74 | (map (comp :nextjournal/value var->doc-viewer val))
|
71 | 75 | (into (sorted-map) (-> ns ns-publics)))]))
|
72 | 76 |
|
73 |
| -^{::clerk/visibility {:result :hide}} |
74 | 77 | (def ns-doc-viewer {:pred #(instance? clojure.lang.Namespace %)
|
75 | 78 | :transform-fn (clerk/update-val namespace->doc-viewer)})
|
76 | 79 |
|
| 80 | +^{::clerk/visibility {:result :show}} |
77 | 81 | (when-let [ns-name (first ns-matches)]
|
78 | 82 | (clerk/with-viewer ns-doc-viewer (find-ns (symbol ns-name))))
|
79 | 83 |
|
|
0 commit comments