This commit is contained in:
Michiel Borkent 2021-05-23 16:31:05 +02:00
parent 2548e78966
commit d8fef42c64
8 changed files with 238 additions and 39 deletions

View file

@ -9,35 +9,41 @@
(fn [s]
(str/upper-case (.charAt s 1)))))
(defn defn-macro [_ _ fn-name & args]
(defn- defn-macro [_ _ fn-name & args]
`(let [ns# (ns-name *ns*)]
(clojure.core/defn ~fn-name ~@args)
(sci.script-tag/-export ~fn-name (str ns# "." '~fn-name))))
(def ctx (sci/init {:namespaces {'sci.script-tag
{'defn (with-meta defn-macro
{:sci/macro true})
'-export (fn [f k]
(let [parts (str/split k #"\.")]
(loop [parts parts
prev js/window]
(let [fpart (first parts)
fpart (kebab->camel fpart)]
(if (= 1 (count parts))
(gobject/set prev fpart f)
(do (gobject/set prev fpart #js {})
(recur (rest parts)
(gobject/get prev fpart))))))
(gobject/set js/window k f)))}
'clojure.core {'println println}}
:classes {'js js/window
:allow :all}}))
(def ctx (atom (sci/init {:namespaces {'sci.script-tag
{'defn (with-meta defn-macro
{:sci/macro true})
'-export (fn [f k]
(let [parts (str/split k #"\.")]
(loop [parts parts
prev js/window]
(let [fpart (first parts)
fpart (kebab->camel fpart)]
(if (= 1 (count parts))
(gobject/set prev fpart f)
(if-let [obj (gobject/get prev fpart)]
(recur (rest parts) obj)
(let [obj #js {}]
(gobject/set prev fpart obj)
(recur (rest parts)
obj))))))
(gobject/set js/window k f)))}
'clojure.core {'println println}}
:classes {'js js/window
:allow :all}})))
(defn eval-string [s]
(sci/eval-string* ctx
(sci/eval-string* @ctx
(str "(require '[sci.script-tag :refer :all])"
s)))
(defn merge-ctx [opts]
(swap! ctx sci/merge-opts opts))
(js/document.addEventListener
"DOMContentLoaded"
(fn []

View file

@ -0,0 +1,20 @@
(ns sci.script-tag.plugin-reagent
(:require [reagent.core :as r]
[reagent.dom :as rdom]
[sci.core :as sci]
[sci.script-tag :as st]))
(def rns (sci/create-ns 'reagent.core nil))
(def reagent-namespace
{'atom (sci/copy-var r/atom rns)})
(def rdns (sci/create-ns 'reagent.dom nil))
(def reagent-dom-namespace
{'render (sci/copy-var rdom/render rdns)})
(println :merging)
(st/merge-ctx {:namespaces {'reagent.core reagent-namespace
'reagent.dom reagent-dom-namespace}})
(println :done-merging)