Skip to content

Commit 18a7bed

Browse files
mkborkdudezampino
authored
Make try notebook runnable without custom SCI build (#30)
Co-authored-by: Michiel Borkent <[email protected]> Co-authored-by: Andrea Amantini <[email protected]>
1 parent 07b8b08 commit 18a7bed

File tree

10 files changed

+128
-201
lines changed

10 files changed

+128
-201
lines changed

.dir-locals.el

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
((clojure-mode
2-
(cider-clojure-cli-aliases . ":test:repl")))
2+
(cider-clojure-cli-aliases . ":nextjournal/clerk:test:repl")))

.github/workflows/main.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,14 @@ jobs:
128128
${{ runner.os }}-shadow-cljs-
129129
130130
- name: 🔐 Google Auth
131-
uses: google-github-actions/auth@v0
131+
uses: google-github-actions/auth@v2.1.6
132132
with:
133133
credentials_json: ${{ secrets.GCLOUD_SERVICE_KEY }}
134134

135135
- name: 🔧 Setup Google Cloud SDK
136136
uses: google-github-actions/[email protected]
137137

138-
- name: 🏗 Build Clerk Notebooks with Bundled SCI Context
138+
- name: 🏗 Build Clerk Notebooks
139139
run: bb build:notebooks ${{ github.sha }}
140140

141141
- name: 📠 Copy static build to bucket under SHA

bb.edn

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,17 @@
4242

4343
build:notebooks
4444
{:doc "builds a Clerk static with notebooks specified in deps.edn given a specified git SHA"
45-
:depends [cljs:sci:release]
4645
:task (clojure (str "-X:dev:nextjournal/clerk :git/sha '\"" (or (first *command-line-args*) "SHASHASHA") "\"' :browse? false"))}
4746

4847
dev
49-
{:doc "Boots and watches both shadow browser test and sci builds"
48+
{:doc "Boots and watches shadow browser test"
5049
:depends [yarn-install]
51-
:task (clojure "-M:dev:test:nextjournal/clerk:sci watch sci browser-test")}
52-
53-
cljs:sci
54-
{:doc "watches cljs build"
55-
:depends [yarn-install]
56-
:task (clojure "-M:nextjournal/clerk:sci watch sci")}
57-
58-
cljs:sci:release
59-
{:doc "watches cljs build"
60-
:depends [yarn-install]
61-
:task (clojure "-M:nextjournal/clerk:sci release sci")}
50+
:task (clojure "-M:dev:test:nextjournal/clerk:shadow watch browser-test")}
6251

6352
cljs:compile:tests
6453
{:doc "compiles tests as node executable"
6554
:depends [yarn-install]
66-
:task (clojure "-M:cljs-test compile test")}
67-
68-
test:cljs:browser
69-
{:doc "runs cljs tests in the browsr"
70-
:task (clojure "-M:cljs-test watch browser-test")}
55+
:task (clojure "-M:dev:test:shadow compile test")}
7156

7257
test:cljs
7358
{:doc "runs cljs tests via node"

deps.edn

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
:aliases
1111
{:nextjournal/clerk
1212
{:extra-paths ["notebooks" "dev"]
13-
:extra-deps {io.github.nextjournal/clerk {:git/sha "f7b47ebb639ea157a0f72d6a63e7f263179c72a9"
13+
:extra-deps {io.github.nextjournal/clerk {:git/sha "80b3e0832d08b75e13e3b862bd46660cb1c66d5c"
1414
:exclusions [io.github.nextjournal/markdown]}}
1515
:jvm-opts ["-Dclojure.main.report=stderr"
16-
"-Dclerk.resource_manifest={\"/js/viewer.js\" \"js/viewer.js\"}"] ;;
16+
#_"-Dclerk.resource_manifest={\"/js/viewer.js\" \"js/viewer.js\"}"] ;;
1717
:exec-fn nextjournal.clerk/build!
1818
:exec-args {:git/url "https://github.com/nextjournal/markdown"
1919
:paths ["README.md"
@@ -41,19 +41,9 @@
4141
:extra-deps {nubank/matcher-combinators {:mvn/version "3.8.3"}}
4242
:exec-fn test-runner/run}
4343

44-
:cljs-test
45-
{:extra-paths ["test"]
46-
:main-opts ["-m" "shadow.cljs.devtools.cli"]
47-
:extra-deps {thheller/shadow-cljs {:mvn/version "2.18.0"}
48-
nubank/matcher-combinators {:mvn/version "3.8.3"}}}
49-
50-
:sci
51-
{:extra-paths ["sci"]
52-
:main-opts ["-m" "shadow.cljs.devtools.cli"]
53-
:jvm-opts ["-Dclerk.resource_manifest={\"/js/viewer.js\" \"http://localhost:8021/viewer.js\"}"]
54-
:extra-deps {io.github.nextjournal/clerk.render {:git/url "https://github.com/nextjournal/clerk"
55-
:git/sha "f7b47ebb639ea157a0f72d6a63e7f263179c72a9"
56-
:deps/root "render"}}}
44+
:shadow
45+
{:main-opts ["-m" "shadow.cljs.devtools.cli"]
46+
:extra-deps {thheller/shadow-cljs {:mvn/version "2.18.0"}}}
5747

5848
:build
5949
{:ns-default build

dev/nextjournal/markdown/graaljs.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,4 @@
8989
")
9090

9191
;; launch shadow cljs repl
92-
(shadow.cljs.devtools.api/repl :sci))
92+
(shadow.cljs.devtools.api/repl :browser-test))

dev/nextjournal/markdown/render.cljs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
(ns nextjournal.markdown.render
2+
(:require
3+
["katex" :as katex]
4+
["@codemirror/language" :refer [defaultHighlightStyle syntaxHighlighting LanguageSupport]]
5+
["@codemirror/state" :refer [EditorState]]
6+
["@codemirror/view" :refer [EditorView keymap]]
7+
["@codemirror/lang-markdown" :as MD :refer [markdown markdownLanguage]]
8+
["react" :as react]
9+
[nextjournal.markdown :as md]
10+
[nextjournal.clerk.viewer :as v]
11+
[nextjournal.clerk.render.hooks :as hooks]
12+
[nextjournal.markdown.transform :as md.transform]
13+
[nextjournal.clojure-mode :as clojure-mode]
14+
[nextjournal.clerk.render.code :as code]
15+
[clojure.string :as str]
16+
[nextjournal.clerk.render :as render]
17+
[reagent.core :as r]))
18+
19+
(def theme #js {"&.cm-editor.cm-focused" #js {:outline "none"}
20+
".cm-activeLine" #js {:background-color "rgb(226 232 240)"}
21+
".cm-line" #js {:padding "0"
22+
:line-height "1.6"
23+
:font-size "15px"
24+
:font-family "\"Fira Mono\", monospace"}})
25+
26+
;; syntax (an LRParser) + support (a set of extensions)
27+
(def clojure-lang (LanguageSupport. (clojure-mode/syntax)
28+
(.. clojure-mode/default-extensions (slice 1))))
29+
(defn on-change-ext [f]
30+
(.. EditorState -transactionExtender
31+
(of (fn [^js tr]
32+
(when (.-docChanged tr) (f (.. tr -state sliceDoc)))
33+
#js {}))))
34+
35+
(defn eval-string [source]
36+
(when (not-empty (str/trim source))
37+
(try {:result #_:clj-kondo/ignore (load-string source)}
38+
(catch js/Error e
39+
{:error (str (.-message e))}))))
40+
41+
(defn editor [{:keys [doc lang editable? on-change] :or {editable? true}}]
42+
(let [!editor-el (hooks/use-ref)
43+
extensions (into-array (cond-> [(syntaxHighlighting defaultHighlightStyle)
44+
(.. EditorState -allowMultipleSelections (of editable?))
45+
#_(foldGutter)
46+
(.. EditorView -editable (of editable?))
47+
(.of keymap clojure-mode/complete-keymap)
48+
(.theme EditorView theme)]
49+
50+
on-change
51+
(conj (on-change-ext on-change))
52+
53+
(= :clojure lang)
54+
(conj (.-extension clojure-lang))
55+
56+
(= :markdown lang)
57+
(conj (markdown #js {:base markdownLanguage
58+
:defaultCodeLanguage clojure-lang}))))]
59+
(hooks/use-effect
60+
(fn []
61+
(let [editor-view* (code/make-view (code/make-state doc extensions) @!editor-el)]
62+
#(.destroy editor-view*))) [doc])
63+
[:div {:ref !editor-el}]))
64+
65+
(defn clojure-editor [{:as opts :keys [doc]}]
66+
(let [!result (hooks/use-state nil)]
67+
(hooks/use-effect (fn [] (reset! !result (eval-string doc))) [doc])
68+
[:div
69+
[:div.p-2.bg-slate-100
70+
[editor (assoc opts :lang :clojure :editable? false)]]
71+
[:div.viewer-result.mt-1.ml-5
72+
(when-some [{:keys [error result]} @!result]
73+
(cond
74+
error [:div.red error]
75+
(react/isValidElement result) result
76+
:else [render/inspect result]))]]))
77+
78+
(def renderers
79+
(assoc md.transform/default-hiccup-renderers
80+
:code (fn [_ctx node] [clojure-editor {:doc (md.transform/->text node)}])
81+
:todo-item (fn [ctx {:as node :keys [attrs]}]
82+
(md.transform/into-markup [:li [:input {:type "checkbox" :default-checked (:checked attrs)}]] ctx node))
83+
:formula (fn [_ctx node]
84+
[:span {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node))}}])
85+
:block-formula (fn [_ctx node]
86+
[:div {:dangerouslySetInnerHTML {:__html (.renderToString katex (md.transform/->text node) #js {:displayMode true})}}])))
87+
88+
(defn inspect-expanded [x]
89+
(r/with-let [expanded-at (r/atom {:hover-path [] :prompt-multi-expand? false})]
90+
(render/inspect-presented {:!expanded-at expanded-at}
91+
(v/present x))))
92+
93+
(defn try-markdown [init-text]
94+
(let [text->state (fn [text]
95+
(let [parsed (md/parse text)]
96+
{:parsed parsed
97+
:hiccup (nextjournal.markdown.transform/->hiccup renderers parsed)}))
98+
!state (hooks/use-state (text->state init-text))]
99+
[:div.grid.grid-cols-2.m-10
100+
[:div.m-2.p-2.text-xl.border-2.overflow-y-scroll.bg-slate-100 {:style {:height "20rem"}}
101+
[editor {:doc init-text :on-change #(reset! !state (text->state %)) :lang :markdown}]]
102+
[:div.m-2.p-2.font-medium.overflow-y-scroll {:style {:height "20rem"}}
103+
[inspect-expanded (:parsed @!state)]]
104+
[:div.m-2.p-2.overflow-x-scroll
105+
[inspect-expanded (:hiccup @!state)]]
106+
[:div.m-2.p-2.bg-slate-50.viewer-markdown
107+
[v/html (:hiccup @!state)]]]))

notebooks/try.clj

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,17 @@
44
(:require [nextjournal.clerk :as clerk]))
55
;; _Edit markdown text, see parsed AST and transformed hiccup live. Preview how Clerk renders it._
66
^{::clerk/width :full
7-
::clerk/visibility {:code :fold}
8-
::clerk/viewer {:render-fn '(fn [_]
9-
(let [init-text "# 👋 Hello Markdown
7+
::clerk/visibility {:code :fold}}
8+
(clerk/with-viewer {:render-fn 'nextjournal.markdown.render/try-markdown
9+
:require-cljs true}
10+
"# 👋 Hello Markdown
1011
1112
```clojure id=xxyyzzww
1213
(reduce + [1 2 3])
1314
```
1415
## Subsection
1516
- [x] type **some**
1617
- [x] ~~nasty~~
17-
- [ ] _stuff_ here"
18-
text->state (fn [text]
19-
(let [parsed (md/parse text)]
20-
{:parsed parsed
21-
:hiccup (md.transform/->hiccup md.demo/renderers parsed)}))
22-
!state (nextjournal.clerk.render.hooks/use-state (text->state init-text))]
23-
[:div.grid.grid-cols-2.m-10
24-
[:div.m-2.p-2.text-xl.border-2.overflow-y-scroll.bg-slate-100 {:style {:height "20rem"}}
25-
[md.demo/editor {:doc init-text :on-change #(reset! !state (text->state %)) :lang :markdown}]]
26-
[:div.m-2.p-2.font-medium.overflow-y-scroll {:style {:height "20rem"}}
27-
[md.demo/inspect-expanded (:parsed @!state)]]
28-
[:div.m-2.p-2.overflow-x-scroll
29-
[md.demo/inspect-expanded (:hiccup @!state)]]
30-
[:div.m-2.p-2.bg-slate-50.viewer-markdown
31-
[nextjournal.clerk.viewer/html (:hiccup @!state)]]]))}}
32-
(Object.)
18+
- [ ] _stuff_ here")
19+
20+
#_(clerk/serve! {:port 8989 :browse true})

sci/deps.cljs

Lines changed: 0 additions & 2 deletions
This file was deleted.

sci/nextjournal/clerk/sci_ext.cljs

Lines changed: 0 additions & 132 deletions
This file was deleted.

0 commit comments

Comments
 (0)