|
3 | 3 | {:nextjournal.clerk/visibility {:code :hide :result :hide}}
|
4 | 4 | (:require [clojure.string :as str]
|
5 | 5 | [nextjournal.clerk :as clerk]
|
6 |
| - [nextjournal.clerk.viewer :as viewer])) |
| 6 | + [nextjournal.clerk.viewer :as viewer] |
| 7 | + [nextjournal.markdown.transform :as md.transform])) |
7 | 8 |
|
8 | 9 | (def render-input
|
9 | 10 | '(fn [!query]
|
|
202 | 203 | (not (qualified-symbol? (symbol link))))
|
203 | 204 | (str @!active-ns "/"))))
|
204 | 205 |
|
| 206 | +(defn spy [x] (println :x (str "'" x "'") |
| 207 | + :t (type x) |
| 208 | + :ns (ns-name *ns*)) x) |
| 209 | + |
| 210 | +^::clerk/no-cache |
| 211 | +(clerk/eval-cljs |
| 212 | + '(defn handle-click [{:keys [label var ns]} e] |
| 213 | + (js/console.log :handle-click/ns ns :var var) |
| 214 | + (.stopPropagation e) (.preventDefault e) |
| 215 | + (when (resolve '!active-ns) |
| 216 | + (let [scroll-to-target (fn [] |
| 217 | + (if var |
| 218 | + (when-some [el (js/document.getElementById (name var))] |
| 219 | + (.scrollIntoView el)) |
| 220 | + (when ns |
| 221 | + (when-some [page (js/document.getElementById "main-column")] |
| 222 | + (.scroll page (applied-science.js-interop/obj :top 0))))))] |
| 223 | + (when ns |
| 224 | + (if (not= @!active-ns (str ns)) |
| 225 | + (do (reset! !active-ns (str ns)) |
| 226 | + (js/setTimeout scroll-to-target 500)) ;; TODO: smarter |
| 227 | + (scroll-to-target))))))) |
| 228 | + |
| 229 | +^::clerk/no-cache |
| 230 | +(clerk/eval-cljs |
| 231 | + '(defn render-link [{:as info :keys [label]} _] |
| 232 | + [:a {:href "#" :on-click (partial handle-click info)} label])) |
| 233 | + |
| 234 | +(def get-info |
| 235 | + (comp clerk/mark-presented |
| 236 | + (fn [wv] |
| 237 | + (let [{:as node :keys [type text attrs]} (-> wv :nextjournal/value)] |
| 238 | + (when-some [{:as info :keys [ns var]} |
| 239 | + (some-> (resolve-internal-link (case type :internal-link text :link (:href attrs))) |
| 240 | + (viewer/update-if :ns ns-name) |
| 241 | + (viewer/update-if :var symbol))] |
| 242 | + (assoc info :label |
| 243 | + (str (case type |
| 244 | + :internal-link (or var ns) |
| 245 | + :link (md.transform/->text node))))))))) |
| 246 | + |
205 | 247 | (def custom-markdown-viewers
|
206 | 248 | [{:name :nextjournal.markdown/internal-link
|
207 |
| - :transform-fn (comp clerk/mark-presented |
208 |
| - (fn [wv] |
209 |
| - (when-some [info (-> wv :nextjournal/value :text resolve-internal-link)] |
210 |
| - (-> info |
211 |
| - (viewer/update-if :var symbol) |
212 |
| - (viewer/update-if :ns ns-name))))) |
213 |
| - :render-fn '(fn [{:keys [var ns]} _] |
214 |
| - [:a {:href (str "#" var) |
215 |
| - :on-click (fn [e] (.stopPropagation e) (.preventDefault e) |
216 |
| - (when (resolve '!active-ns) |
217 |
| - (let [scroll-to-target (fn [] |
218 |
| - (if var |
219 |
| - (when-some [el (js/document.getElementById (name var))] |
220 |
| - (.scrollIntoView el)) |
221 |
| - (when ns |
222 |
| - (when-some [page (js/document.getElementById "main-column")] |
223 |
| - (.scroll page (applied-science.js-interop/obj :top 0))))))] |
224 |
| - (when ns |
225 |
| - (if (not= @!active-ns (str ns)) |
226 |
| - (do (reset! !active-ns (str ns)) |
227 |
| - (js/setTimeout scroll-to-target 500)) ;; TODO: smarter |
228 |
| - (scroll-to-target))))))} (str (or var ns))])}]) |
| 249 | + :render-fn 'render-link |
| 250 | + :transform-fn get-info} |
| 251 | + {:name :nextjournal.markdown/link |
| 252 | + :render-fn 'render-link |
| 253 | + :transform-fn get-info}]) |
229 | 254 |
|
230 | 255 | (def custom-internal-links
|
231 | 256 | (update viewer/markdown-viewer :add-viewers viewer/add-viewers custom-markdown-viewers))
|
232 | 257 |
|
233 | 258 | (viewer/add-viewers! [custom-internal-links])
|
| 259 | + |
| 260 | +#_(clerk/clear-cache!) |
0 commit comments