|
172 | 172 | (defn download-text-file [url]
|
173 | 173 | (:body (http/get url)))
|
174 | 174 |
|
| 175 | +(defn local-js [url tmp-dir] |
| 176 | + (if (str/starts-with? url "http") |
| 177 | + (let [tmp (-> tmp-dir |
| 178 | + (fs/file (-> (fs/file-name url) |
| 179 | + (str/split #"\?") |
| 180 | + (first) |
| 181 | + (str/replace #".js$" ".mjs"))) |
| 182 | + (fs/delete-on-exit) |
| 183 | + str) |
| 184 | + src (download-text-file url) |
| 185 | + src (str/replace src "viewer.js" "viewer.mjs")] |
| 186 | + (spit tmp src) |
| 187 | + tmp) |
| 188 | + url)) |
| 189 | + |
175 | 190 | (defn- node-ssr!
|
176 | 191 | [{:keys [viewer-js state]
|
177 | 192 | :or {viewer-js
|
178 | 193 | ;; for local REPL testing
|
179 | 194 | "./public/js/viewer.js"}}]
|
180 |
| - (let [viewer-js (if (str/starts-with? viewer-js "http") |
181 |
| - (let [tmp (-> (fs/create-temp-file {:suffix ".mjs"}) |
182 |
| - (fs/file) |
183 |
| - (fs/delete-on-exit) |
184 |
| - str) |
185 |
| - src (download-text-file viewer-js)] |
186 |
| - (spit tmp src) |
187 |
| - tmp) |
188 |
| - viewer-js) |
| 195 | + (let [tmp-dir (fs/create-temp-dir) |
| 196 | + katex? (-> state :doc :katex?) |
| 197 | + [viewer-js katex-js] [(local-js viewer-js tmp-dir) |
| 198 | + (when katex? |
| 199 | + (local-js (str/replace viewer-js "viewer.js" "katex.js") tmp-dir))] |
189 | 200 | in (str "import '" viewer-js "';"
|
190 |
| - "globalThis.CLERK_SSR = true;" |
191 |
| - "console.log(nextjournal.clerk.sci_env.ssr(" (pr-str (pr-str state)) "))")] |
192 |
| - (sh {:in in} |
193 |
| - "node" |
194 |
| - "--abort-on-uncaught-exception" |
195 |
| - "--input-type=module" |
196 |
| - "--trace-warnings"))) |
| 201 | + (when katex? |
| 202 | + (format (str "import * as katex from \"%s\";" |
| 203 | + "globalThis.clerk$katex = katex;") |
| 204 | + katex-js)) |
| 205 | + "globalThis.CLERK_SSR = true; |
| 206 | + new Promise((resolve) => { setTimeout(resolve, 2000)});\n" |
| 207 | + "console.log(nextjournal.clerk.sci_env.ssr(" (pr-str (pr-str state )) "))")] |
| 208 | + #_(spit "in.mjs" in) |
| 209 | + (sh |
| 210 | + {:out :string :in in :err :inherit} |
| 211 | + "node" |
| 212 | + "--abort-on-uncaught-exception" |
| 213 | + "--input-type=module" |
| 214 | + "--trace-warnings"))) |
197 | 215 |
|
198 | 216 | (comment
|
199 | 217 | (declare so) ;; captured in REPL in ssr! function
|
|
219 | 237 | (throw (ex-info (str "Clerk ssr! failed\n" out "\n" err) result)))))
|
220 | 238 |
|
221 | 239 | (defn cleanup [build-opts]
|
222 |
| - (select-keys build-opts |
223 |
| - [:package :render-router :path->doc :current-path :resource->url :exclude-js? :index :html])) |
| 240 | + (cond-> (select-keys build-opts |
| 241 | + [:package :render-router :path->doc :current-path :resource->url :exclude-js? :index :html]) |
| 242 | + (-> build-opts :doc :katex?) |
| 243 | + (assoc :katex? true))) |
224 | 244 |
|
225 | 245 | (defn write-static-app!
|
226 | 246 | [opts docs]
|
|
244 | 264 | (dissoc :path->doc)
|
245 | 265 | cleanup))))))
|
246 | 266 | (when browse?
|
247 |
| - (browse/browse-url (if-let [server-url (and (= out-path "public/build") (webserver/server-url))] |
| 267 | + (browse/browse-url (if-let [server-url (and (= "public/build" out-path) (webserver/server-url))] |
248 | 268 | (str server-url "/build/")
|
249 | 269 | (-> index-html fs/absolutize .toString path-to-url-canonicalize))))
|
250 | 270 | {:docs docs
|
|
386 | 406 | (build-static-app! {:index "notebooks/document_linking.clj"
|
387 | 407 | :paths ["notebooks/viewers/html.clj" "notebooks/rule_30.clj"]})
|
388 | 408 |
|
| 409 | + ;; document is not defined |
389 | 410 | (build-static-app! {:ssr? true
|
390 | 411 | :exclude-js? true
|
391 | 412 | ;; test against cljs release `bb build:js`
|
392 | 413 | :resource->url {"/js/viewer.js" "./build/viewer.js"}
|
393 |
| - :index "notebooks/rule_30.clj"}) |
| 414 | + :index "notebooks/viewers/katex.clj"}) |
394 | 415 |
|
395 | 416 | (build-static-app! {:ssr? true
|
396 | 417 | :exclude-js? true
|
|
0 commit comments