Skip to content

Commit a408a8c

Browse files
authored
Fix Eval (#34)
* Eval code cells only when leaving edit mode and in the initial load * Eval only code cells not markdown ones
1 parent d414976 commit a408a8c

File tree

2 files changed

+18
-17
lines changed

2 files changed

+18
-17
lines changed

demo/src/nextjournal/clojure_mode/demo/livedoc.cljs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@
8989
(case type
9090
:markdown
9191
[:div.p-3.rounded.border
92-
[:div.max-w-prose
93-
[sv/inspect-paginated (v/with-viewer :markdown (:text @state))]]]
92+
[sv/inspect-paginated (v/with-viewer :markdown (:text @state))]]
9493

9594
:code
9695
[:<>

src/nextjournal/livedoc.cljs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
[reagent.core :as r]
1919
[reagent.dom :as rdom]))
2020

21-
(declare state->blocks block-opts->decoration get-blocks)
21+
(declare state->blocks block-opts->decoration get-blocks eval-all! eval-widget!)
2222

2323
;; Helpers
2424
(defn doc? [^js node] (== (.-Document lezer-markdown/parser.nodeTypes) (.. node -type -id)))
@@ -91,13 +91,17 @@
9191
;; :doc-changed? Boolean }
9292

9393
(defn decorate [state] (.set Decoration (state->blocks state)))
94+
(defn decorate+eval! [state] (eval-all! state (.set Decoration (state->blocks state))))
9495

9596
(defn edit-gap-blocks [{:keys [edit-from blocks]} state]
9697
(when edit-from
97-
(state->blocks state
98-
{:from edit-from
99-
:to (or (:from (some (when-fn #(< edit-from (:from %))) (rangeset-seq blocks edit-from)))
100-
(.. state -doc -length))})))
98+
(let [bs (state->blocks state
99+
{:from edit-from
100+
:to (or (:from (some (when-fn #(< edit-from (:from %))) (rangeset-seq blocks edit-from)))
101+
(.. state -doc -length))})]
102+
103+
(doseq [^js b bs] (eval-widget! state (.. b -value -widget)))
104+
bs)))
101105

102106
(defn edit-at [{:as doc :keys [selected blocks edit-from]} ^js tr pos]
103107
;; we patch the existing decoration with blocks arising from last editable region
@@ -133,7 +137,7 @@
133137
(defn preview-all+select+eval [doc tr]
134138
;; rebuild all decorations to get new selection right (investigate filter/add)
135139
(-> doc
136-
(assoc :blocks (decorate (.-state tr)))
140+
(assoc :blocks (decorate+eval! (.-state tr)))
137141
(set-selected (->cursor-pos (.-state tr)))
138142
(dissoc :edit-all? :doc-changed? :edit-from)))
139143

@@ -166,13 +170,13 @@
166170
doc)
167171

168172
;; eval
169-
(defn eval-block! [state {:keys [val]}]
170-
(when (= :code (:type @(.. val -widget -state)))
173+
(defn eval-widget! [state ^js widget]
174+
(when (= :code (:type @(.-state widget)))
171175
(when-some [eval-fn! (config-get state :eval-fn!)]
172-
(eval-fn! (.. val -widget -state)))))
176+
(eval-fn! (.-state widget)))))
173177

174178
(defn eval-all! [state blocks]
175-
(doseq [b (rangeset-seq blocks)] (eval-block! state b))
179+
(doseq [{:keys [^js val]} (rangeset-seq blocks)] (eval-widget! state (.-widget val)))
176180
blocks)
177181

178182
(defn preview+eval [{:as doc :keys [selected edit-from edit-all? blocks]} tr all?]
@@ -184,8 +188,8 @@
184188
all?
185189
(eval-all! (.-state tr) blocks)
186190
(and selected (not all?))
187-
(when-some [block (nth (rangeset-seq blocks) selected)]
188-
(eval-block! (.-state tr) block)))
191+
(when-some [{:keys [^js val]} (nth (rangeset-seq blocks) selected)]
192+
(eval-widget! (.-state tr) (.-widget val))))
189193
doc)))
190194

191195
;; Doc State Field
@@ -194,7 +198,7 @@
194198
(.define StateField
195199
(j/obj
196200
:provide (fn [field] (.. EditorView -decorations (from field #(get % :blocks))))
197-
:create (fn [cm-state] {:selected 0 :blocks (decorate cm-state)})
201+
:create (fn [cm-state] {:selected 0 :blocks (decorate+eval! cm-state)})
198202
:update (fn [{:as doc :keys [edit-all?]} ^js tr]
199203
(let [{:as apply-op :keys [op args]} (get-effect-value tr doc-apply-op)
200204
{:as me :strs [Meta Shift]} (get-effect-value tr eval-region/modifier-effect)]
@@ -218,8 +222,6 @@
218222
editor-state (.-state view)
219223
widget-state (.-state widget)
220224
render (config-get editor-state :render)]
221-
;; always eval once on decoration construction
222-
(when-some [eval-fn! (config-get editor-state :eval-fn!)] (eval-fn! widget-state))
223225
(rdom/render [:div.cursor-pointer
224226
{:on-click (fn [_e]
225227
;; since decorations might have been mapped since widget creation we cannot argue by range from/to

0 commit comments

Comments
 (0)