Export manually
This commit is contained in:
parent
4f0bfa0d4c
commit
781d978384
2
deps.edn
2
deps.edn
|
@ -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"}
|
||||||
|
|
|
@ -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"><head>
|
<code class="html"><head>
|
||||||
<script src="https://borkdude.github.io/sci-script-tag/js/sci-script-tag.js" type="application/javascript"></script>
|
<script src="https://borkdude.github.io/sci-script-tag/js/sci-script-tag.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!"))
|
||||||
|
|
||||||
|
;; export function to use from JavaScript:
|
||||||
|
(set! (.-my_alert js/window) my-alert)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue