Skip to content

Commit 5e45131

Browse files
committed
test python repl using pyodide
1 parent 07aa3df commit 5e45131

File tree

7 files changed

+67
-14
lines changed

7 files changed

+67
-14
lines changed

package-lock.json

Lines changed: 35 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
"electron-window-state": "5.0.3",
126126
"font-scanner": "0.2.1",
127127
"mdn-data": "2.8.0",
128-
"opentype.js": "1.3.4"
128+
"opentype.js": "1.3.4",
129+
"pyodide": "0.26.1"
129130
}
130131
}

src/electron/preload.cljs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77
["mdn-data" :as mdn] ;; deprecating in favor of w3c/webref
88
["opentype.js" :as opentype]
99
["os" :as os]
10+
["pyodide" :refer [loadPyodide]]
1011
[config]))
1112

13+
(def pyodide (atom nil))
14+
1215
(defn text->path
1316
"https://github.com/opentypejs/opentype.js#loading-a-font-synchronously-nodejs"
1417
[text {:keys [font-url x y font-size]}]
@@ -21,6 +24,7 @@
2124
:receive (fn [channel f]
2225
;; Strip event (_) as it includes `sender`
2326
(.on ipcRenderer channel (fn [_ args] (f args))))
27+
:runPython #(.runPython ^js @pyodide %)
2428
:mdn mdn
2529
:webrefCss css
2630
:platform (.platform os)
@@ -33,7 +37,8 @@
3337
(defn ^:export init []
3438
;; https://docs.sentry.io/platforms/javascript/guides/electron/#configuring-the-client
3539
#_(.init Sentry (clj->js config/sentry-options))
36-
;; Expose protected methods that allow the renderer process to use the
40+
(.then (loadPyodide) #(reset! pyodide %))
41+
;; Expose protected methods that allow the renderer process to use the
3742
;; ipcRenderer without exposing the entire object
3843
;; https://www.electronjs.org/docs/api/context-bridge
3944
(.exposeInMainWorld contextBridge "api" (clj->js api)))

src/renderer/reepl/codemirror.cljs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
["codemirror/addon/runmode/runmode.js"]
99
["codemirror/mode/clojure/clojure.js"]
1010
["codemirror/mode/javascript/javascript.js"]
11+
["codemirror/mode/python/python.js"]
1112
["react" :as react]
1213
[clojure.string :as str]
1314
[reagent.core :as r]))

src/renderer/reepl/core.cljs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
["react-resizable-panels" :refer [Panel PanelResizeHandle]]
44
[cljs.reader]
55
[cljs.tools.reader]
6+
[platform]
67
[re-frame.core :as rf]
78
[reagent.core :as ra]
89
[renderer.components :as comp]
@@ -91,7 +92,8 @@
9192
cm-opts)]
9293
[:div.self-start.h-full.flex.items-center
9394
(repl-mode-button :cljs)
94-
(repl-mode-button :js)]
95+
(repl-mode-button :js)
96+
(when platform/electron? (repl-mode-button :py))]
9597
[comp/toggle-icon-button
9698
{:active? repl-history?
9799
:active-icon "chevron-down"

src/renderer/reepl/replumb.cljs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,10 @@ cljs.js/*load-fn*
237237
(js-attrs proto))))))
238238

239239
(defn js-completion
240-
[text]
240+
[mode text]
241241
(let [parts (vec (.split text "."))
242242
completing (or (last parts) "")
243-
prefix #(str "js/" (str/join "." (conj (vec (butlast parts)) %)))
243+
prefix #(str (when (= mode :cljs) "js/") (str/join "." (conj (vec (butlast parts)) %)))
244244
possibles (js-attrs (reduce aget js/window (butlast parts)))]
245245
(->> possibles
246246
(filter #(not= -1 (.indexOf % completing)))
@@ -289,10 +289,13 @@ cljs.js/*load-fn*
289289
(filter matches? names))))))
290290

291291
(defn process-apropos
292-
[text]
293-
(if (zero? (.indexOf text "js/"))
294-
(js-completion (.slice text 3))
295-
(cljs-completion text)))
292+
[mode text]
293+
(case mode
294+
:js (js-completion mode text)
295+
:cljs (if (zero? (.indexOf text "js/"))
296+
(js-completion mode (.slice text 3))
297+
(cljs-completion text))
298+
:py []))
296299

297300
(defn get-forms
298301
[m]

src/renderer/reepl/views.cljs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,20 @@
2121
(defn root
2222
[]
2323
[reepl/repl
24-
:execute #(replumb/run-repl (if (= @(rf/subscribe [:repl-mode]) :cljs) %1 (str "(js/eval \"" %1 "\")")) {:warning-as-error true} %2)
25-
:complete-word replumb/process-apropos
26-
:get-docs replumb/process-doc
24+
:execute #(replumb/run-repl (case @(rf/subscribe [:repl-mode])
25+
:cljs %1
26+
:js (str "(js/eval \"" %1 "\")")
27+
:py (str "(js/window.api.runPython \"" %1 "\")"))
28+
{:warning-as-error true} %2)
29+
:complete-word (fn [text] (replumb/process-apropos @(rf/subscribe [:repl-mode]) text))
30+
:get-docs (if (= @(rf/subscribe [:repl-mode]) :cljs) replumb/process-doc #())
2731
:state repl-state
2832
:show-value-opts
2933
{:showers [show-devtools/show-devtools
3034
(partial show-function/show-fn-with-docs maybe-fn-docs)]}
31-
:js-cm-opts {:mode (if (= @(rf/subscribe [:repl-mode]) :cljs) "clojure" "javascript")
35+
:js-cm-opts {:mode (case
36+
:cljs "clojure"
37+
:js "javascript"
38+
:py "python")
3239
:keyMap "default"
3340
:showCursorWhenSelecting true}])

0 commit comments

Comments
 (0)