Export manually

This commit is contained in:
Michiel Borkent 2021-05-25 12:45:03 +02:00
parent 4f0bfa0d4c
commit 781d978384
3 changed files with 13 additions and 43 deletions

View file

@ -3,7 +3,7 @@
:deps :deps
{org.clojure/clojure {:mvn/version "1.10.3"} {org.clojure/clojure {:mvn/version "1.10.3"}
borkdude/sci {:git/url "https://github.com/borkdude/sci" borkdude/sci {:git/url "https://github.com/borkdude/sci"
:sha "4de7c78024bfdb5c52e273be372144d46228939a"} :sha "02733a591bfa2f425b8abe0377d6668559ac278a"}
reagent/reagent {:mvn/version "1.0.0"} reagent/reagent {:mvn/version "1.0.0"}
cljsjs/react {:mvn/version "17.0.2-0"} cljsjs/react {:mvn/version "17.0.2-0"}
cljsjs/react-dom {:mvn/version "17.0.2-0"} cljsjs/react-dom {:mvn/version "17.0.2-0"}

View file

@ -5,9 +5,11 @@
<script src="js/sci-script-tag-plugin-reagent.js" type="application/javascript"></script> <script src="js/sci-script-tag-plugin-reagent.js" type="application/javascript"></script>
<script type="application/x-sci"> <script type="application/x-sci">
(defn ^:export my-alert [] (defn my-alert []
(js/alert "You clicked!")) (js/alert "You clicked!"))
(set! (.-my_alert js/window) my-alert)
(require '[reagent.core :as r] (require '[reagent.core :as r]
'[reagent.dom :as rdom]) '[reagent.dom :as rdom])
@ -47,17 +49,18 @@
Include <tt>sci-script-tag.js</tt> and write a <tt>script</tt> tag Include <tt>sci-script-tag.js</tt> and write a <tt>script</tt> tag
where <tt>type</tt> is set where <tt>type</tt> is set
to <tt>application/x-sci</tt>. Use <tt>:export</tt> to make the function to <tt>application/x-sci</tt>.
available in the JavaScript environment. The name is processed
using <tt>munge</tt>.
<pre> <pre>
<code class="html">&lt;head&gt; <code class="html">&lt;head&gt;
&lt;script src=&quot;https://borkdude.github.io/sci-script-tag/js/sci-script-tag.js&quot; type=&quot;application/javascript&quot;&gt;&lt;/script&gt; &lt;script src=&quot;https://borkdude.github.io/sci-script-tag/js/sci-script-tag.js&quot; type=&quot;application/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;application/x-sci&quot;&gt; &lt;script type=&quot;application/x-sci&quot;&gt;
(defn ^:export my-alert [] (defn my-alert []
(js/alert &quot;You clicked!&quot;)) (js/alert &quot;You clicked!&quot;))
;; export function to use from JavaScript:
(set! (.-my_alert js/window) my-alert)
&lt;/script&gt; &lt;/script&gt;
&lt;/head&gt; &lt;/head&gt;

View file

@ -1,7 +1,6 @@
(ns sci.script-tag (ns sci.script-tag
(:refer-clojure :exclude [defn time]) (:refer-clojure :exclude [defn time])
(:require [clojure.core :as c] (:require [clojure.core :as c]
[clojure.string :as str]
[goog.object :as gobject] [goog.object :as gobject]
[goog.string] [goog.string]
[sci.core :as sci])) [sci.core :as sci]))
@ -16,31 +15,11 @@
" msecs")) " msecs"))
ret#)) ret#))
(c/defn export [k f]
(let [k (munge k)
parts (str/split k #"\.")]
(loop [parts parts
prev js/window]
(when-first [fpart parts]
(cond (= "user" fpart)
(recur (rest parts) prev)
(= 1 (count parts))
(gobject/set prev fpart f)
:else
(if-let [obj (gobject/get prev fpart)]
(recur (rest parts) obj)
(let [obj #js {}]
(gobject/set prev fpart obj)
(recur (rest parts)
obj))))))))
(def stns (sci/create-ns 'sci.script-tag nil)) (def stns (sci/create-ns 'sci.script-tag nil))
(def cljns (sci/create-ns 'clojure.core nil)) (def cljns (sci/create-ns 'clojure.core nil))
(def namespaces (def namespaces
{'sci.script-tag {'clojure.core
{'export (sci/copy-var export stns)}
'clojure.core
{'println (sci/copy-var println cljns) {'println (sci/copy-var println cljns)
'prn (sci/copy-var prn cljns) 'prn (sci/copy-var prn cljns)
'system-time (sci/copy-var system-time cljns) 'system-time (sci/copy-var system-time cljns)
@ -51,9 +30,7 @@
:allow :all}}))) :allow :all}})))
(c/defn eval-string [s] (c/defn eval-string [s]
(sci/eval-string* @ctx (sci/eval-string* @ctx s))
(str "(require '[sci.script-tag :refer :all])"
s)))
(c/defn register-plugin! [plug-in-name sci-opts] (c/defn register-plugin! [plug-in-name sci-opts]
plug-in-name ;; unused for now plug-in-name ;; unused for now
@ -64,7 +41,7 @@
(disj 'user))) (disj 'user)))
(c/defn- load-contents [script-tags] (c/defn- load-contents [script-tags]
(if-let [tag (first script-tags)] (when-let [tag (first script-tags)]
(if-let [text (not-empty (gobject/get tag "textContent"))] (if-let [text (not-empty (gobject/get tag "textContent"))]
(do (eval-string text) (do (eval-string text)
(load-contents (rest script-tags))) (load-contents (rest script-tags)))
@ -76,17 +53,7 @@
(let [response (gobject/get this "response")] (let [response (gobject/get this "response")]
(eval-string response)) (eval-string response))
(load-contents (rest script-tags)))))] (load-contents (rest script-tags)))))]
(.send req))) (.send req)))))
(eval-string (str/replace"
(run! (fn [ns]
(let [nsn (ns-name ns)]
(when-not (contains? '%s nsn)
(run! (fn [var]
(let [m (meta var)]
(when (:export m)
(sci.script-tag/export (str nsn \".\" (:name m)) @var))))
(vals (ns-publics ns))))))
(all-ns))" "%s" built-in))))
(js/document.addEventListener (js/document.addEventListener
"DOMContentLoaded" "DOMContentLoaded"