|
5 | 5 | syntaxHighlighting]] |
6 | 6 | ["@codemirror/state" :refer [EditorState]] |
7 | 7 | ["@codemirror/view" :refer [EditorView keymap]] |
8 | | - ["katex" :as katex] |
9 | 8 | ["react" :as react] |
10 | 9 | [clojure.string :as str] |
11 | 10 | [nextjournal.clerk.render :as render] |
|
76 | 75 | (react/isValidElement result) result |
77 | 76 | :else [render/inspect result]))]])) |
78 | 77 |
|
79 | | -(def renderers |
| 78 | +(defn renderers [katex] |
80 | 79 | (assoc md.transform/default-hiccup-renderers |
81 | 80 | :code (fn [_ctx node] [clojure-editor {:doc (md.transform/->text node)}]) |
82 | 81 | :todo-item (fn [ctx {:as node :keys [attrs]}] |
83 | 82 | (md.transform/into-markup [:li [:input {:type "checkbox" :default-checked (:checked attrs)}]] ctx node)) |
84 | 83 | :formula (fn [_ctx node] |
85 | | - [:span {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node))}}]) |
| 84 | + [:span {:dangerouslySetInnerHTML (r/unsafe-html (.renderToString katex (md.transform/->text node)))}]) |
86 | 85 | :block-formula (fn [_ctx node] |
87 | | - [:div {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node) #js {:displayMode true})}}]))) |
| 86 | + [:div {:dangerouslySetInnerHTML (r/unsafe-html (.renderToString katex (md.transform/->text node) #js {:displayMode true}))}]))) |
88 | 87 |
|
89 | 88 | (defn inspect-expanded [x] |
90 | 89 | (r/with-let [expanded-at (r/atom {:hover-path [] :prompt-multi-expand? false})] |
91 | 90 | (render/inspect-presented {:!expanded-at expanded-at} |
92 | 91 | (v/present x)))) |
93 | 92 |
|
94 | | -(defn try-markdown [init-text] |
95 | | - (let [text->state (fn [text] |
| 93 | + |
| 94 | + |
| 95 | +(defn try-markdown* [{:keys [init-text katex]}] |
| 96 | + (let [text->state (fn [katex text] |
96 | 97 | (let [parsed (md/parse text)] |
97 | 98 | {:parsed parsed |
98 | | - :hiccup (nextjournal.markdown.transform/->hiccup renderers parsed)})) |
99 | | - !state (hooks/use-state (text->state init-text))] |
| 99 | + :hiccup (nextjournal.markdown.transform/->hiccup (renderers katex) parsed)})) |
| 100 | + !state (hooks/use-state (text->state katex init-text))] |
100 | 101 | [:div.grid.grid-cols-2.m-10 |
101 | 102 | [:div.m-2.p-2.text-xl.border-2.overflow-y-scroll.bg-slate-100 {:style {:height "20rem"}} |
102 | | - [editor {:doc init-text :on-change #(reset! !state (text->state %)) :lang :markdown}]] |
| 103 | + [editor {:doc init-text :on-change #(reset! !state (text->state katex %)) :lang :markdown}]] |
103 | 104 | [:div.m-2.p-2.font-medium.overflow-y-scroll {:style {:height "20rem"}} |
104 | 105 | [inspect-expanded (:parsed @!state)]] |
105 | 106 | [:div.m-2.p-2.overflow-x-scroll |
106 | 107 | [inspect-expanded (:hiccup @!state)]] |
107 | 108 | [:div.m-2.p-2.bg-slate-50.viewer-markdown |
108 | 109 | [v/html (:hiccup @!state)]]])) |
| 110 | + |
| 111 | +(defn try-markdown [init-text] |
| 112 | + ( let [katex ( hooks/use-d3-require "[email protected]")] |
| 113 | + (when katex |
| 114 | + [try-markdown* {:init-text init-text |
| 115 | + :katex katex}]))) |
0 commit comments