Skip to content

Commit

Permalink
add repl example
Browse files Browse the repository at this point in the history
  • Loading branch information
bugzpodder committed Nov 3, 2023
1 parent b2f0834 commit 39c5fc3
Show file tree
Hide file tree
Showing 26 changed files with 324 additions and 24 deletions.
1 change: 1 addition & 0 deletions docs/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export default defineConfig({
github: "https://github.com/bugzpodder/pysandbox",
discord: "https://discord.gg/BYB2kvyFwm",
},
customCss: ["./src/styles/custom.css"],
sidebar: [
{
label: "Guides",
Expand Down
8 changes: 6 additions & 2 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,18 @@
"build": "astro build",
"preview": "astro preview",
"astro": "astro",
"format": "prettier -w src src/**/*.astro *.mjs *.js *.json"
"format": "prettier -w src src/**/*.astro *.mjs *.js *.json *.css"
},
"dependencies": {
"@astrojs/starlight": "^0.10.0",
"@codemirror/lang-python": "^6.1.3",
"@xterm/addon-fit": "^0.9.0-beta.1",
"astro": "^3.0.6",
"codemirror": "^6.0.1",
"pysandbox": "link:.."
"pysandbox": "link:..",
"xterm": "^5.3.0",
"xterm-addon-fit": "^0.8.0",
"xterm-readline": "^1.1.1"
},
"devDependencies": {
"prettier": "^3.0.3",
Expand Down
209 changes: 209 additions & 0 deletions docs/public/xterm.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
/**
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
* https://github.com/chjj/term.js
* @license MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Originally forked from (with the author's permission):
* Fabrice Bellard's javascript vt100 for jslinux:
* http://bellard.org/jslinux/
* Copyright (c) 2011 Fabrice Bellard
* The original design remains. The terminal itself
* has been extended to include xterm CSI codes, among
* other features.
*/

/**
* Default styles for xterm.js
*/

.xterm {
cursor: text;
position: relative;
user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
}

.xterm.focus,
.xterm:focus {
outline: none;
}

.xterm .xterm-helpers {
position: absolute;
top: 0;
/**
* The z-index of the helpers must be higher than the canvases in order for
* IMEs to appear on top.
*/
z-index: 5;
}

.xterm .xterm-helper-textarea {
padding: 0;
border: 0;
margin: 0;
/* Move textarea out of the screen to the far left, so that the cursor is not visible */
position: absolute;
opacity: 0;
left: -9999em;
top: 0;
width: 0;
height: 0;
z-index: -5;
/** Prevent wrapping so the IME appears against the textarea at the correct position */
white-space: nowrap;
overflow: hidden;
resize: none;
}

.xterm .composition-view {
/* TODO: Composition position got messed up somewhere */
background: #000;
color: #FFF;
display: none;
position: absolute;
white-space: nowrap;
z-index: 1;
}

.xterm .composition-view.active {
display: block;
}

.xterm .xterm-viewport {
/* On OS X this is required in order for the scroll bar to appear fully opaque */
background-color: #000;
overflow-y: scroll;
cursor: default;
position: absolute;
right: 0;
left: 0;
top: 0;
bottom: 0;
}

.xterm .xterm-screen {
position: relative;
}

.xterm .xterm-screen canvas {
position: absolute;
left: 0;
top: 0;
}

.xterm .xterm-scroll-area {
visibility: hidden;
}

.xterm-char-measure-element {
display: inline-block;
visibility: hidden;
position: absolute;
top: 0;
left: -9999em;
line-height: normal;
}

.xterm.enable-mouse-events {
/* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */
cursor: default;
}

.xterm.xterm-cursor-pointer,
.xterm .xterm-cursor-pointer {
cursor: pointer;
}

.xterm.column-select.focus {
/* Column selection mode */
cursor: crosshair;
}

.xterm .xterm-accessibility,
.xterm .xterm-message {
position: absolute;
left: 0;
top: 0;
bottom: 0;
right: 0;
z-index: 10;
color: transparent;
pointer-events: none;
}

.xterm .live-region {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}

.xterm-dim {
/* Dim should not apply to background, so the opacity of the foreground color is applied
* explicitly in the generated class and reset to 1 here */
opacity: 1 !important;
}

.xterm-underline-1 { text-decoration: underline; }
.xterm-underline-2 { text-decoration: double underline; }
.xterm-underline-3 { text-decoration: wavy underline; }
.xterm-underline-4 { text-decoration: dotted underline; }
.xterm-underline-5 { text-decoration: dashed underline; }

.xterm-overline {
text-decoration: overline;
}

.xterm-overline.xterm-underline-1 { text-decoration: overline underline; }
.xterm-overline.xterm-underline-2 { text-decoration: overline double underline; }
.xterm-overline.xterm-underline-3 { text-decoration: overline wavy underline; }
.xterm-overline.xterm-underline-4 { text-decoration: overline dotted underline; }
.xterm-overline.xterm-underline-5 { text-decoration: overline dashed underline; }

.xterm-strikethrough {
text-decoration: line-through;
}

.xterm-screen .xterm-decoration-container .xterm-decoration {
z-index: 6;
position: absolute;
}

.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer {
z-index: 7;
}

.xterm-decoration-overview-ruler {
z-index: 8;
position: absolute;
top: 0;
right: 0;
pointer-events: none;
}

.xterm-decoration-top {
z-index: 2;
position: relative;
}
49 changes: 49 additions & 0 deletions docs/src/components/PyTerminal.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<script src="/pysandbox/coi-serviceworker.min.js" is:inline></script>
<link rel="stylesheet" href="/pysandbox/xterm.css" />
<script>
import { Readline } from "xterm-readline";
import { FitAddon } from "xterm-addon-fit";

const rl = new Readline();
rl.setCheckHandler((text) => !text.trimEnd().endsWith("&&"));

import { Terminal } from "xterm";
const term = new Terminal({ cursorBlink: true });
term.loadAddon(rl);
const fitAddon = new FitAddon();
term.loadAddon(fitAddon);
term.open(document.getElementById("terminal")!);
fitAddon.fit();
term.focus();

import { PyWorkerSandbox } from "pysandbox";
const sandbox = new PyWorkerSandbox({
jsApi: {
readline: (prompt: string) => rl.read(prompt),
write: (lines: string) => {
lines
.split("\n")
.map((line) => line.trim() && term.writeln(String(line)));
},
},
});
await sandbox.init();
await sandbox.exec(`###### magic monkey patching ######
import builtins
import sys

from pyodide.code import eval_code
from polyscript.xworker import sync

sys.stdout = sync
sys.stderr = sync
builtins.input = sync.readline

####### main code ######
import code

code.interact()
`);
</script>

<div id="terminal" style="height: 300px;"></div>
3 changes: 1 addition & 2 deletions docs/src/content/config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { defineCollection } from "astro:content";
import { docsSchema, i18nSchema } from "@astrojs/starlight/schema";
import { docsSchema } from "@astrojs/starlight/schema";

export const collections = {
docs: defineCollection({ schema: docsSchema() }),
i18n: defineCollection({ type: "data", schema: i18nSchema() }),
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
title: stdout
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample code="print('hello from PySandbox')" />
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: display
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample
code="display('hello from PySandbox', target=current_target())"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: seaborn
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample code={`import numpy as np
import seaborn as sns
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: document
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample
code="import js
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
title: stdout
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample code="print('hello from PySandbox')" restricted="1" />
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: display
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample
code="display('hello from PySandbox', target=current_target())"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: seaborn
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample code={`import numpy as np
import seaborn as sns
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: document
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample
code="import js
Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/examples/Worker/example1_stdout.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
title: stdout
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample code="print('hello from PySandbox')" worker="1" />
2 changes: 1 addition & 1 deletion docs/src/content/docs/examples/Worker/example2_display.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: display
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample
code="display('hello from PySandbox', target=current_target())"
Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/examples/Worker/example3_seaborn.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: seaborn
---

import PySandboxExample from "../../../../components/PySandboxExample.astro";
import PySandboxExample from "@components/PySandboxExample.astro";

<PySandboxExample code={`import numpy as np
import seaborn as sns
Expand Down
Loading

0 comments on commit 39c5fc3

Please sign in to comment.