diff --git a/.drone.yml b/.drone.yml index 6cca8f4..2d0e2e2 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,6 +1,12 @@ kind: pipeline name: default steps: + - name: test + image: node + commands: + - cd reagent-reitit-demo + - npm install + - name: Build image: clojure:tools-deps commands: diff --git a/reagent-reitit-demo/src/clojure_demo/core.cljs b/reagent-reitit-demo/src/clojure_demo/core.cljs index 710ec47..85cf505 100644 --- a/reagent-reitit-demo/src/clojure_demo/core.cljs +++ b/reagent-reitit-demo/src/clojure_demo/core.cljs @@ -1,6 +1,6 @@ (ns ^:figwheel-hooks clojure-demo.core (:require ["react-dom/client" :refer [createRoot]] - ["@codemirror/state" :as cm-state :refer [EditorState] ] + ["@codemirror/state" :as cm-state :refer [EditorState Transaction] ] ["@codemirror/view" :as cm-view :refer [EditorView ViewUpdate]] ["@codemirror/commands" :as cm-commands :refer [defaultKeymap]] ["@codemirror/theme-one-dark" :refer [oneDark]] @@ -59,22 +59,36 @@ ;(def sci-ctx (sci/empty-environment)) (sci/alter-var-root sci/print-fn (constantly *print-fn*)) +(defn fetch-selected-text [v transactions] + (reduce (fn [text t] + (if (= "select.pointer" (str (.annotation t (.-userEvent Transaction) ))) + (conj text + (.sliceDoc + ^EditorState (.-state v) + (.-from (.-main (.-selection t))) + (.-to (.-main (.-selection t))))) + text)) + [] + transactions)) + (defn code-editor [content] (let [editor (atom nil) evaled-result (reagent/atom nil) update-timeout (reagent/atom nil) update-fn (.of (.-updateListener EditorView) - (fn [^ViewUpdate v] + (fn [^ViewUpdate view-update] (js/clearTimeout @update-timeout) (reset! update-timeout (js/setTimeout (fn [] - (reset! evaled-result (sci/eval-string* sci-ctx - (.toString (.-doc (.-state v))) #_content )) - (prn "updated delayed")) 2000)) - #_(when (.-docChanged v) - (prn v)))) + (let [selected-text (fetch-selected-text view-update (.-transactions view-update)) + eval-code (if (seq selected-text) + (first selected-text) + (.-doc (.-state view-update)))] + (reset! evaled-result (sci/eval-string* sci-ctx + (.toString eval-code) )) + (prn "updated delayed"))) 1000)))) start-state (.create EditorState (clj->js {:doc content