mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-29 03:04:38 +08:00
Merge pull request #1022 from RustPython/coolreader18/demo-repl-continuation
Add line continuation for the WASM demo terminal
This commit is contained in:
1 file changed
+60
-24
+60
-24
@@ -82,12 +82,6 @@ snippets.addEventListener('change', updateSnippet);
|
||||
// option selected for the `select`, but the textarea won't be updated)
|
||||
updateSnippet();
|
||||
|
||||
const prompt = '>>>>> ';
|
||||
|
||||
const term = new Terminal();
|
||||
term.open(document.getElementById('terminal'));
|
||||
term.write(prompt);
|
||||
|
||||
function removeNonAscii(str) {
|
||||
if (str === null || str === '') return false;
|
||||
else str = str.toString();
|
||||
@@ -99,38 +93,80 @@ function printToConsole(data) {
|
||||
term.write(removeNonAscii(data) + '\r\n');
|
||||
}
|
||||
|
||||
const term = new Terminal();
|
||||
term.open(document.getElementById('terminal'));
|
||||
|
||||
const terminalVM = rp.vmStore.init('term_vm');
|
||||
terminalVM.setStdout(printToConsole);
|
||||
|
||||
var input = '';
|
||||
function getPrompt(name = 'ps1') {
|
||||
terminalVM.exec(`
|
||||
try:
|
||||
import sys as __sys
|
||||
__prompt = __sys.${name}
|
||||
except:
|
||||
__prompt = ''
|
||||
finally:
|
||||
del __sys
|
||||
`);
|
||||
return String(terminalVM.eval('__prompt'));
|
||||
}
|
||||
|
||||
term.write(getPrompt());
|
||||
|
||||
function resetInput() {
|
||||
continuedInput = [];
|
||||
input = '';
|
||||
continuing = false;
|
||||
}
|
||||
|
||||
let continuedInput, input, continuing;
|
||||
resetInput();
|
||||
|
||||
let ps2;
|
||||
|
||||
term.on('data', data => {
|
||||
const code = data.charCodeAt(0);
|
||||
if (code == 13) {
|
||||
// CR
|
||||
if (input[input.length - 1] == ':') {
|
||||
input += data;
|
||||
term.write('\r\n.....');
|
||||
} else {
|
||||
term.write('\r\n');
|
||||
try {
|
||||
terminalVM.execSingle(input);
|
||||
} catch (err) {
|
||||
if (err instanceof WebAssembly.RuntimeError) {
|
||||
err = window.__RUSTPYTHON_ERROR || err;
|
||||
}
|
||||
printToConsole(err);
|
||||
term.write('\r\n');
|
||||
continuedInput.push(input);
|
||||
if (continuing) {
|
||||
if (input === '') {
|
||||
continuing = false;
|
||||
} else {
|
||||
input = '';
|
||||
term.write(ps2);
|
||||
return;
|
||||
}
|
||||
term.write(prompt);
|
||||
input = '';
|
||||
}
|
||||
} else if (code == 127) {
|
||||
try {
|
||||
terminalVM.execSingle(continuedInput.join('\n'));
|
||||
} catch (err) {
|
||||
if (err instanceof SyntaxError && err.message.includes('EOF')) {
|
||||
ps2 = getPrompt('ps2');
|
||||
term.write(ps2);
|
||||
continuing = true;
|
||||
input = '';
|
||||
return;
|
||||
} else if (err instanceof WebAssembly.RuntimeError) {
|
||||
err = window.__RUSTPYTHON_ERROR || err;
|
||||
}
|
||||
printToConsole(err);
|
||||
}
|
||||
resetInput();
|
||||
term.write(getPrompt());
|
||||
} else if (code == 127 || code == 8) {
|
||||
// Backspace
|
||||
if (input.length > 0) {
|
||||
term.write('\b \b');
|
||||
input = input.slice(0, -1);
|
||||
}
|
||||
} else if (code < 32 || code == 127) {
|
||||
} else if (code < 32) {
|
||||
// Control
|
||||
return;
|
||||
term.write('\r\n' + getPrompt());
|
||||
input = '';
|
||||
continuedInput = [];
|
||||
} else {
|
||||
// Visible
|
||||
term.write(data);
|
||||
|
||||
Reference in new issue
Block a user