@dodona/papyros 3.0.1 → 4.0.0-beta-9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -72
- package/dist/Library.d.ts +10 -11
- package/dist/Library.js +9 -7
- package/dist/Library.js.map +1 -1
- package/dist/{Backend.d.ts → backend/Backend.d.ts} +3 -12
- package/dist/{Backend.js → backend/Backend.js} +4 -17
- package/dist/backend/Backend.js.map +1 -0
- package/dist/{workers → backend/workers}/javascript/JavaScriptWorker.js +1 -1
- package/dist/backend/workers/javascript/JavaScriptWorker.js.map +1 -0
- package/dist/backend/workers/javascript/worker.js.map +1 -0
- package/dist/{workers → backend/workers}/python/PythonWorker.d.ts +2 -2
- package/dist/{workers → backend/workers}/python/PythonWorker.js +2 -2
- package/dist/backend/workers/python/PythonWorker.js.map +1 -0
- package/dist/backend/workers/python/python_package.tar.gz.load_by_url +0 -0
- package/dist/backend/workers/python/worker.js.map +1 -0
- package/dist/communication/BackendEvent.js.map +1 -0
- package/dist/{BackendEventQueue.d.ts → communication/BackendEventQueue.d.ts} +1 -36
- package/dist/{BackendEventQueue.js → communication/BackendEventQueue.js} +2 -45
- package/dist/communication/BackendEventQueue.js.map +1 -0
- package/dist/{BackendManager.d.ts → communication/BackendManager.d.ts} +2 -2
- package/dist/{BackendManager.js → communication/BackendManager.js} +4 -4
- package/dist/communication/BackendManager.js.map +1 -0
- package/dist/communication/InputServiceWorker.js +37 -0
- package/dist/communication/InputServiceWorker.js.map +1 -0
- package/dist/communication/InputWorker.js.map +1 -0
- package/dist/frontend/components/CodeRunner.d.ts +9 -0
- package/dist/frontend/components/CodeRunner.js +60 -0
- package/dist/frontend/components/CodeRunner.js.map +1 -0
- package/dist/frontend/components/Debugger.d.ts +7 -0
- package/dist/frontend/components/Debugger.js +61 -0
- package/dist/frontend/components/Debugger.js.map +1 -0
- package/dist/frontend/components/Input.d.ts +13 -0
- package/dist/frontend/components/Input.js +65 -0
- package/dist/frontend/components/Input.js.map +1 -0
- package/dist/frontend/components/Output.d.ts +14 -0
- package/dist/frontend/components/Output.js +154 -0
- package/dist/frontend/components/Output.js.map +1 -0
- package/dist/frontend/components/PapyrosElement.d.ts +8 -0
- package/dist/frontend/components/PapyrosElement.js +24 -0
- package/dist/frontend/components/PapyrosElement.js.map +1 -0
- package/dist/frontend/components/app/App.d.ts +24 -0
- package/dist/frontend/components/app/App.js +204 -0
- package/dist/frontend/components/app/App.js.map +1 -0
- package/dist/frontend/components/app/ExamplePicker.d.ts +7 -0
- package/dist/frontend/components/app/ExamplePicker.js +35 -0
- package/dist/frontend/components/app/ExamplePicker.js.map +1 -0
- package/dist/frontend/components/app/LanguagePicker.d.ts +7 -0
- package/dist/frontend/components/app/LanguagePicker.js +35 -0
- package/dist/frontend/components/app/LanguagePicker.js.map +1 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.d.ts +7 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js +39 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js.map +1 -0
- package/dist/frontend/components/app/examples/JavaScriptExamples.js.map +1 -0
- package/dist/frontend/components/app/examples/PythonExamples.js.map +1 -0
- package/dist/frontend/components/app/themes/ThemePicker.d.ts +11 -0
- package/dist/frontend/components/app/themes/ThemePicker.js +47 -0
- package/dist/frontend/components/app/themes/ThemePicker.js.map +1 -0
- package/dist/frontend/components/app/themes/ThemedButton.d.ts +9 -0
- package/dist/frontend/components/app/themes/ThemedButton.js +43 -0
- package/dist/frontend/components/app/themes/ThemedButton.js.map +1 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.d.ts +8 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.js +54 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/CodeEditor.d.ts +24 -0
- package/dist/frontend/components/code_mirror/CodeEditor.js +205 -0
- package/dist/frontend/components/code_mirror/CodeEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.d.ts +20 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js +99 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/Extensions.d.ts +15 -0
- package/dist/frontend/components/code_mirror/Extensions.js +169 -0
- package/dist/frontend/components/code_mirror/Extensions.js.map +1 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.d.ts +5 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.js +109 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.js.map +1 -0
- package/dist/frontend/components/code_runner/ButtonLint.d.ts +9 -0
- package/dist/frontend/components/code_runner/ButtonLint.js +76 -0
- package/dist/frontend/components/code_runner/ButtonLint.js.map +1 -0
- package/dist/frontend/components/code_runner/Code.d.ts +7 -0
- package/dist/frontend/components/code_runner/Code.js +46 -0
- package/dist/frontend/components/code_runner/Code.js.map +1 -0
- package/dist/frontend/components/code_runner/RunState.d.ts +7 -0
- package/dist/frontend/components/code_runner/RunState.js +41 -0
- package/dist/frontend/components/code_runner/RunState.js.map +1 -0
- package/dist/frontend/components/input/BatchInput.d.ts +9 -0
- package/dist/frontend/components/input/BatchInput.js +53 -0
- package/dist/frontend/components/input/BatchInput.js.map +1 -0
- package/dist/frontend/components/input/InteractiveInput.d.ts +13 -0
- package/dist/frontend/components/input/InteractiveInput.js +73 -0
- package/dist/frontend/components/input/InteractiveInput.js.map +1 -0
- package/dist/frontend/state/Constants.d.ts +38 -0
- package/dist/frontend/state/Constants.js +108 -0
- package/dist/frontend/state/Constants.js.map +1 -0
- package/dist/frontend/state/Debugger.d.ts +23 -0
- package/dist/frontend/state/Debugger.js +84 -0
- package/dist/frontend/state/Debugger.js.map +1 -0
- package/dist/frontend/state/Examples.d.ts +11 -0
- package/dist/frontend/state/Examples.js +36 -0
- package/dist/frontend/state/Examples.js.map +1 -0
- package/dist/frontend/state/I18n.d.ts +16 -0
- package/dist/frontend/state/I18n.js +75 -0
- package/dist/frontend/state/I18n.js.map +1 -0
- package/dist/frontend/state/InputOutput.d.ts +64 -0
- package/dist/frontend/state/InputOutput.js +133 -0
- package/dist/frontend/state/InputOutput.js.map +1 -0
- package/dist/frontend/state/Papyros.d.ts +32 -0
- package/dist/frontend/state/Papyros.js +93 -0
- package/dist/frontend/state/Papyros.js.map +1 -0
- package/dist/frontend/state/Runner.d.ts +118 -0
- package/dist/frontend/state/Runner.js +334 -0
- package/dist/frontend/state/Runner.js.map +1 -0
- package/dist/frontend/state/Test.d.ts +11 -0
- package/dist/frontend/state/Test.js +59 -0
- package/dist/frontend/state/Test.js.map +1 -0
- package/dist/frontend/state/Translations.d.ts +178 -0
- package/dist/frontend/state/Translations.js +188 -0
- package/dist/frontend/state/Translations.js.map +1 -0
- package/dist/frontend/state/themes/blue-dark.d.ts +2 -0
- package/dist/frontend/state/themes/blue-dark.js +55 -0
- package/dist/frontend/state/themes/blue-dark.js.map +1 -0
- package/dist/frontend/state/themes/blue-light.d.ts +2 -0
- package/dist/frontend/state/themes/blue-light.js +55 -0
- package/dist/frontend/state/themes/blue-light.js.map +1 -0
- package/dist/frontend/state/themes/green-dark.d.ts +2 -0
- package/dist/frontend/state/themes/green-dark.js +55 -0
- package/dist/frontend/state/themes/green-dark.js.map +1 -0
- package/dist/frontend/state/themes/green-light.d.ts +2 -0
- package/dist/frontend/state/themes/green-light.js +55 -0
- package/dist/frontend/state/themes/green-light.js.map +1 -0
- package/dist/frontend/state/themes/red-dark.d.ts +2 -0
- package/dist/frontend/state/themes/red-dark.js +55 -0
- package/dist/frontend/state/themes/red-dark.js.map +1 -0
- package/dist/frontend/state/themes/red-light.d.ts +2 -0
- package/dist/frontend/state/themes/red-light.js +55 -0
- package/dist/frontend/state/themes/red-light.js.map +1 -0
- package/dist/util/Util.d.ts +0 -43
- package/dist/util/Util.js +0 -91
- package/dist/util/Util.js.map +1 -1
- package/package.json +13 -26
- package/dist/App.d.ts +0 -1
- package/dist/App.js +0 -76
- package/dist/App.js.map +0 -1
- package/dist/Backend.js.map +0 -1
- package/dist/BackendEvent.js.map +0 -1
- package/dist/BackendEventQueue.js.map +0 -1
- package/dist/BackendManager.js.map +0 -1
- package/dist/CodeRunner.d.ts +0 -188
- package/dist/CodeRunner.js +0 -548
- package/dist/CodeRunner.js.map +0 -1
- package/dist/Constants.d.ts +0 -31
- package/dist/Constants.js +0 -36
- package/dist/Constants.js.map +0 -1
- package/dist/Debugger.d.ts +0 -18
- package/dist/Debugger.js +0 -86
- package/dist/Debugger.js.map +0 -1
- package/dist/InputManager.d.ts +0 -38
- package/dist/InputManager.js +0 -101
- package/dist/InputManager.js.map +0 -1
- package/dist/InputServiceWorker.js.map +0 -1
- package/dist/OutputManager.d.ts +0 -90
- package/dist/OutputManager.js +0 -172
- package/dist/OutputManager.js.map +0 -1
- package/dist/Papyros.css +0 -657
- package/dist/Papyros.d.ts +0 -141
- package/dist/Papyros.js +0 -268
- package/dist/Papyros.js.map +0 -1
- package/dist/Translations.d.ts +0 -180
- package/dist/Translations.js +0 -191
- package/dist/Translations.js.map +0 -1
- package/dist/editor/BatchInputEditor.d.ts +0 -41
- package/dist/editor/BatchInputEditor.js +0 -80
- package/dist/editor/BatchInputEditor.js.map +0 -1
- package/dist/editor/CodeEditor.d.ts +0 -81
- package/dist/editor/CodeEditor.js +0 -213
- package/dist/editor/CodeEditor.js.map +0 -1
- package/dist/editor/CodeMirrorEditor.d.ts +0 -133
- package/dist/editor/CodeMirrorEditor.js +0 -169
- package/dist/editor/CodeMirrorEditor.js.map +0 -1
- package/dist/editor/DarkTheme.d.ts +0 -1
- package/dist/editor/DarkTheme.js +0 -72
- package/dist/editor/DarkTheme.js.map +0 -1
- package/dist/editor/DebugExtension.d.ts +0 -11
- package/dist/editor/DebugExtension.js +0 -70
- package/dist/editor/DebugExtension.js.map +0 -1
- package/dist/editor/Gutters.d.ts +0 -109
- package/dist/editor/Gutters.js +0 -201
- package/dist/editor/Gutters.js.map +0 -1
- package/dist/editor/LineEffectExtension.d.ts +0 -13
- package/dist/editor/LineEffectExtension.js +0 -48
- package/dist/editor/LineEffectExtension.js.map +0 -1
- package/dist/editor/TestCodeExtension.d.ts +0 -21
- package/dist/editor/TestCodeExtension.js +0 -134
- package/dist/editor/TestCodeExtension.js.map +0 -1
- package/dist/examples/Examples.d.ts +0 -6
- package/dist/examples/Examples.js +0 -23
- package/dist/examples/Examples.js.map +0 -1
- package/dist/examples/JavaScriptExamples.js.map +0 -1
- package/dist/examples/PythonExamples.js.map +0 -1
- package/dist/input/BatchInputHandler.d.ts +0 -55
- package/dist/input/BatchInputHandler.js +0 -131
- package/dist/input/BatchInputHandler.js.map +0 -1
- package/dist/input/InteractiveInputHandler.d.ts +0 -27
- package/dist/input/InteractiveInputHandler.js +0 -89
- package/dist/input/InteractiveInputHandler.js.map +0 -1
- package/dist/input/UserInputHandler.d.ts +0 -68
- package/dist/input/UserInputHandler.js +0 -39
- package/dist/input/UserInputHandler.js.map +0 -1
- package/dist/util/HTMLShapes.d.ts +0 -15
- package/dist/util/HTMLShapes.js +0 -25
- package/dist/util/HTMLShapes.js.map +0 -1
- package/dist/util/Rendering.d.ts +0 -120
- package/dist/util/Rendering.js +0 -142
- package/dist/util/Rendering.js.map +0 -1
- package/dist/workers/input/InputWorker.js.map +0 -1
- package/dist/workers/javascript/JavaScriptWorker.js.map +0 -1
- package/dist/workers/javascript/worker.js.map +0 -1
- package/dist/workers/python/PythonWorker.js.map +0 -1
- package/dist/workers/python/python_package.tar.gz.load_by_url +0 -0
- package/dist/workers/python/worker.js.map +0 -1
- /package/dist/{workers → backend/workers}/javascript/JavaScriptWorker.d.ts +0 -0
- /package/dist/{workers → backend/workers}/javascript/worker.d.ts +0 -0
- /package/dist/{workers → backend/workers}/javascript/worker.js +0 -0
- /package/dist/{workers → backend/workers}/python/worker.d.ts +0 -0
- /package/dist/{workers → backend/workers}/python/worker.js +0 -0
- /package/dist/{BackendEvent.d.ts → communication/BackendEvent.d.ts} +0 -0
- /package/dist/{BackendEvent.js → communication/BackendEvent.js} +0 -0
- /package/dist/{InputServiceWorker.d.ts → communication/InputServiceWorker.d.ts} +0 -0
- /package/dist/{workers/input → communication}/InputWorker.d.ts +0 -0
- /package/dist/{workers/input → communication}/InputWorker.js +0 -0
- /package/dist/{examples → frontend/components/app/examples}/JavaScriptExamples.d.ts +0 -0
- /package/dist/{examples → frontend/components/app/examples}/JavaScriptExamples.js +0 -0
- /package/dist/{examples → frontend/components/app/examples}/PythonExamples.d.ts +0 -0
- /package/dist/{examples → frontend/components/app/examples}/PythonExamples.js +0 -0
package/dist/Debugger.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Renderable, RenderOptions } from "./util/Rendering";
|
|
2
|
-
import "@dodona/trace-component";
|
|
3
|
-
export type FrameState = {
|
|
4
|
-
line: number;
|
|
5
|
-
outputs: number;
|
|
6
|
-
inputs: number;
|
|
7
|
-
};
|
|
8
|
-
export declare class Debugger extends Renderable<RenderOptions> {
|
|
9
|
-
private frameStates;
|
|
10
|
-
private currentOutputs;
|
|
11
|
-
private currentInputs;
|
|
12
|
-
private traceComponent;
|
|
13
|
-
private traceBuffer;
|
|
14
|
-
constructor();
|
|
15
|
-
protected _render(options: RenderOptions): void;
|
|
16
|
-
reset(): void;
|
|
17
|
-
clearBuffer(): void;
|
|
18
|
-
}
|
package/dist/Debugger.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { Renderable, renderWithOptions } from "./util/Rendering";
|
|
2
|
-
import { getElement, t } from "./util/Util";
|
|
3
|
-
import { BackendManager } from "./BackendManager";
|
|
4
|
-
import { BackendEventType } from "./BackendEvent";
|
|
5
|
-
import "@dodona/trace-component";
|
|
6
|
-
const TRACE_COMPONENT_ID = "trace-component";
|
|
7
|
-
const EXECUTION_LIMIT = 10000;
|
|
8
|
-
function createDelayer() {
|
|
9
|
-
let timer;
|
|
10
|
-
return (callback, ms) => {
|
|
11
|
-
clearTimeout(timer);
|
|
12
|
-
timer = setTimeout(callback, ms);
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
const delay = createDelayer();
|
|
16
|
-
export class Debugger extends Renderable {
|
|
17
|
-
constructor() {
|
|
18
|
-
super();
|
|
19
|
-
this.frameStates = [];
|
|
20
|
-
this.currentOutputs = 0;
|
|
21
|
-
this.currentInputs = 0;
|
|
22
|
-
this.traceBuffer = [];
|
|
23
|
-
this.reset();
|
|
24
|
-
BackendManager.subscribe(BackendEventType.Start, () => {
|
|
25
|
-
this.reset();
|
|
26
|
-
});
|
|
27
|
-
BackendManager.subscribe(BackendEventType.Output, () => {
|
|
28
|
-
this.currentOutputs++;
|
|
29
|
-
});
|
|
30
|
-
BackendManager.subscribe(BackendEventType.Input, () => {
|
|
31
|
-
this.currentInputs++;
|
|
32
|
-
});
|
|
33
|
-
BackendManager.subscribe(BackendEventType.Frame, e => {
|
|
34
|
-
const frame = JSON.parse(e.data);
|
|
35
|
-
const frameState = {
|
|
36
|
-
line: frame.line,
|
|
37
|
-
outputs: this.currentOutputs,
|
|
38
|
-
inputs: this.currentInputs
|
|
39
|
-
};
|
|
40
|
-
this.frameStates.push(frameState);
|
|
41
|
-
this.traceBuffer.push(frame);
|
|
42
|
-
if (this.traceBuffer.length > 100) {
|
|
43
|
-
this.clearBuffer();
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
delay(() => this.clearBuffer(), 100);
|
|
47
|
-
}
|
|
48
|
-
if (this.frameStates.length >= EXECUTION_LIMIT) {
|
|
49
|
-
BackendManager.publish({
|
|
50
|
-
type: BackendEventType.Stop,
|
|
51
|
-
data: "Execution limit reached"
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
_render(options) {
|
|
57
|
-
renderWithOptions(options, `
|
|
58
|
-
<tc-trace id="${TRACE_COMPONENT_ID}"></tc-trace>
|
|
59
|
-
`);
|
|
60
|
-
this.traceComponent = getElement(TRACE_COMPONENT_ID);
|
|
61
|
-
this.traceComponent.translations = t("Papyros.debugger");
|
|
62
|
-
this.traceComponent.addEventListener("frame-change", e => {
|
|
63
|
-
const frame = e.detail.frame;
|
|
64
|
-
BackendManager.publish({
|
|
65
|
-
type: BackendEventType.FrameChange,
|
|
66
|
-
data: this.frameStates[frame]
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
reset() {
|
|
71
|
-
this.frameStates = [];
|
|
72
|
-
this.currentOutputs = 0;
|
|
73
|
-
this.currentInputs = 0;
|
|
74
|
-
if (this.traceComponent) {
|
|
75
|
-
this.traceComponent.trace = [];
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
clearBuffer() {
|
|
79
|
-
var _a;
|
|
80
|
-
for (const frame of this.traceBuffer) {
|
|
81
|
-
(_a = this.traceComponent) === null || _a === void 0 ? void 0 : _a.addFrame(frame);
|
|
82
|
-
}
|
|
83
|
-
this.traceBuffer = [];
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=Debugger.js.map
|
package/dist/Debugger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Debugger.js","sourceRoot":"","sources":["../src/Debugger.ts"],"names":[],"mappings":"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"}
|
package/dist/InputManager.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { UserInputHandler } from "./input/UserInputHandler";
|
|
2
|
-
import { Renderable, RenderOptions } from "./util/Rendering";
|
|
3
|
-
import { EditorStyling } from "./editor/CodeMirrorEditor";
|
|
4
|
-
export declare enum InputMode {
|
|
5
|
-
Interactive = "interactive",
|
|
6
|
-
Batch = "batch"
|
|
7
|
-
}
|
|
8
|
-
export declare const INPUT_MODES: InputMode[];
|
|
9
|
-
export interface InputManagerRenderOptions extends RenderOptions {
|
|
10
|
-
/**
|
|
11
|
-
* Option to allow styling the editor area of the input handler
|
|
12
|
-
*/
|
|
13
|
-
inputStyling?: Partial<EditorStyling>;
|
|
14
|
-
}
|
|
15
|
-
export declare class InputManager extends Renderable<InputManagerRenderOptions> {
|
|
16
|
-
private inputMode;
|
|
17
|
-
private inputHandlers;
|
|
18
|
-
private waiting;
|
|
19
|
-
private prompt;
|
|
20
|
-
private sendInput;
|
|
21
|
-
constructor(sendInput: (input: string) => void, inputMode: InputMode);
|
|
22
|
-
private buildInputHandlerMap;
|
|
23
|
-
getInputMode(): InputMode;
|
|
24
|
-
setInputMode(inputMode: InputMode): void;
|
|
25
|
-
getInputHandler(inputMode: InputMode): UserInputHandler;
|
|
26
|
-
get inputHandler(): UserInputHandler;
|
|
27
|
-
isWaiting(): boolean;
|
|
28
|
-
protected _render(options: InputManagerRenderOptions): void;
|
|
29
|
-
private waitWithPrompt;
|
|
30
|
-
private onUserInput;
|
|
31
|
-
/**
|
|
32
|
-
* Asynchronously handle an input request by prompting the user for input
|
|
33
|
-
* @param {BackendEvent} e Event containing the input data
|
|
34
|
-
*/
|
|
35
|
-
private onInputRequest;
|
|
36
|
-
private onRunStart;
|
|
37
|
-
private onRunEnd;
|
|
38
|
-
}
|
package/dist/InputManager.js
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { SWITCH_INPUT_MODE_A_ID, USER_INPUT_WRAPPER_ID } from "./Constants";
|
|
2
|
-
import { BackendEventType } from "./BackendEvent";
|
|
3
|
-
import { addListener, getElement, t } from "./util/Util";
|
|
4
|
-
import { InteractiveInputHandler } from "./input/InteractiveInputHandler";
|
|
5
|
-
import { BatchInputHandler } from "./input/BatchInputHandler";
|
|
6
|
-
import { BackendManager } from "./BackendManager";
|
|
7
|
-
import { Renderable, renderWithOptions } from "./util/Rendering";
|
|
8
|
-
export var InputMode;
|
|
9
|
-
(function (InputMode) {
|
|
10
|
-
InputMode["Interactive"] = "interactive";
|
|
11
|
-
InputMode["Batch"] = "batch";
|
|
12
|
-
})(InputMode || (InputMode = {}));
|
|
13
|
-
export const INPUT_MODES = [InputMode.Batch, InputMode.Interactive];
|
|
14
|
-
export class InputManager extends Renderable {
|
|
15
|
-
constructor(sendInput, inputMode) {
|
|
16
|
-
super();
|
|
17
|
-
this.onUserInput = this.onUserInput.bind(this);
|
|
18
|
-
this.inputHandlers = this.buildInputHandlerMap();
|
|
19
|
-
this.inputMode = inputMode;
|
|
20
|
-
this.sendInput = sendInput;
|
|
21
|
-
this.waiting = false;
|
|
22
|
-
this.prompt = "";
|
|
23
|
-
BackendManager.subscribe(BackendEventType.Start, () => this.onRunStart());
|
|
24
|
-
BackendManager.subscribe(BackendEventType.End, () => this.onRunEnd());
|
|
25
|
-
BackendManager.subscribe(BackendEventType.Input, e => this.onInputRequest(e));
|
|
26
|
-
}
|
|
27
|
-
buildInputHandlerMap() {
|
|
28
|
-
const interactiveInputHandler = new InteractiveInputHandler(this.onUserInput);
|
|
29
|
-
const batchInputHandler = new BatchInputHandler(this.onUserInput);
|
|
30
|
-
return new Map([
|
|
31
|
-
[InputMode.Interactive, interactiveInputHandler],
|
|
32
|
-
[InputMode.Batch, batchInputHandler]
|
|
33
|
-
]);
|
|
34
|
-
}
|
|
35
|
-
getInputMode() {
|
|
36
|
-
return this.inputMode;
|
|
37
|
-
}
|
|
38
|
-
setInputMode(inputMode) {
|
|
39
|
-
this.inputHandler.toggle(false);
|
|
40
|
-
this.inputMode = inputMode;
|
|
41
|
-
this.render();
|
|
42
|
-
this.inputHandler.toggle(true);
|
|
43
|
-
}
|
|
44
|
-
getInputHandler(inputMode) {
|
|
45
|
-
return this.inputHandlers.get(inputMode);
|
|
46
|
-
}
|
|
47
|
-
get inputHandler() {
|
|
48
|
-
return this.getInputHandler(this.inputMode);
|
|
49
|
-
}
|
|
50
|
-
isWaiting() {
|
|
51
|
-
return this.waiting;
|
|
52
|
-
}
|
|
53
|
-
_render(options) {
|
|
54
|
-
let switchMode = "";
|
|
55
|
-
const otherMode = this.inputMode === InputMode.Interactive ?
|
|
56
|
-
InputMode.Batch : InputMode.Interactive;
|
|
57
|
-
switchMode = `<a id="${SWITCH_INPUT_MODE_A_ID}" data-value="${otherMode}"
|
|
58
|
-
class="_tw-flex _tw-flex-row-reverse hover:_tw-cursor-pointer _tw-text-blue-500">
|
|
59
|
-
${t(`Papyros.switch_input_mode_to.${otherMode}`)}
|
|
60
|
-
</a>`;
|
|
61
|
-
renderWithOptions(options, `
|
|
62
|
-
<div id="${USER_INPUT_WRAPPER_ID}" class="_tw-my-1">
|
|
63
|
-
</div>
|
|
64
|
-
${switchMode}`);
|
|
65
|
-
addListener(SWITCH_INPUT_MODE_A_ID, im => this.setInputMode(im), "click", "data-value");
|
|
66
|
-
this.inputHandler.render({
|
|
67
|
-
parentElementId: USER_INPUT_WRAPPER_ID,
|
|
68
|
-
darkMode: options.darkMode,
|
|
69
|
-
inputStyling: options.inputStyling
|
|
70
|
-
});
|
|
71
|
-
this.inputHandler.waitWithPrompt(this.waiting, this.prompt);
|
|
72
|
-
}
|
|
73
|
-
waitWithPrompt(waiting, prompt = "") {
|
|
74
|
-
this.waiting = waiting;
|
|
75
|
-
this.prompt = prompt;
|
|
76
|
-
this.inputHandler.waitWithPrompt(this.waiting, this.prompt);
|
|
77
|
-
}
|
|
78
|
-
onUserInput(line) {
|
|
79
|
-
this.sendInput(line);
|
|
80
|
-
this.waitWithPrompt(false);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Asynchronously handle an input request by prompting the user for input
|
|
84
|
-
* @param {BackendEvent} e Event containing the input data
|
|
85
|
-
*/
|
|
86
|
-
onInputRequest(e) {
|
|
87
|
-
this.waitWithPrompt(true, e.data);
|
|
88
|
-
}
|
|
89
|
-
onRunStart() {
|
|
90
|
-
// Prevent switching input mode during runs
|
|
91
|
-
getElement(SWITCH_INPUT_MODE_A_ID).hidden = true;
|
|
92
|
-
this.waitWithPrompt(false);
|
|
93
|
-
this.inputHandler.onRunStart();
|
|
94
|
-
}
|
|
95
|
-
onRunEnd() {
|
|
96
|
-
getElement(SWITCH_INPUT_MODE_A_ID).hidden = false;
|
|
97
|
-
this.inputHandler.onRunEnd();
|
|
98
|
-
this.waitWithPrompt(false);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=InputManager.js.map
|
package/dist/InputManager.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InputManager.js","sourceRoot":"","sources":["../src/InputManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InputServiceWorker.js","sourceRoot":"","sources":["../src/InputServiceWorker.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;GAEG;AACH,wDAAwD;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,4DAA4D;AAC5D,8BAA8B;AAC9B,yDAAyD;AACzD,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,+DAA+D;AAClF,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAE7C,gBAAgB,CAAC,OAAO,EAAE,UAAgB,KAAiB;;QACvD,IAAI,CAAC,CAAA,MAAM,YAAY,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA,EAAE,CAAC;YAChD,iCAAiC;YACjC,4CAA4C;YAC5C,oEAAoE;YACpE,OAAO;QACX,CAAC;IACL,CAAC;CAAA,CAAC,CAAC;AACH,uDAAuD;AACvD,gBAAgB,CAAC,SAAS,EAAE,UAAU,KAAsB;IACxD,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AACH,gBAAgB,CAAC,UAAU,EAAE,UAAU,KAAsB;IACzD,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
|
package/dist/OutputManager.d.ts
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { BackendEvent } from "./BackendEvent";
|
|
2
|
-
import { Renderable, RenderOptions } from "./util/Rendering";
|
|
3
|
-
/**
|
|
4
|
-
* Shape of Error objects that are easy to interpret
|
|
5
|
-
*/
|
|
6
|
-
export interface FriendlyError {
|
|
7
|
-
/**
|
|
8
|
-
* The name of the Error
|
|
9
|
-
*/
|
|
10
|
-
name: string;
|
|
11
|
-
/**
|
|
12
|
-
* Traceback for where in the code the Error occurred
|
|
13
|
-
*/
|
|
14
|
-
traceback?: string;
|
|
15
|
-
/**
|
|
16
|
-
* General information about this type of Error
|
|
17
|
-
*/
|
|
18
|
-
info?: string;
|
|
19
|
-
/**
|
|
20
|
-
* Information about what went wrong in this case
|
|
21
|
-
*/
|
|
22
|
-
what?: string;
|
|
23
|
-
/**
|
|
24
|
-
* Information about why this is wrong and how to fix it
|
|
25
|
-
*/
|
|
26
|
-
why?: string;
|
|
27
|
-
/**
|
|
28
|
-
* Where specifically in the source code the Error occurred
|
|
29
|
-
*/
|
|
30
|
-
where?: string;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Component for displaying code output or errors to the user
|
|
34
|
-
*/
|
|
35
|
-
export declare class OutputManager extends Renderable {
|
|
36
|
-
/**
|
|
37
|
-
* Store the HTML that is rendered to restore when changing language/theme
|
|
38
|
-
*/
|
|
39
|
-
private content;
|
|
40
|
-
/**
|
|
41
|
-
* Whether overflow has occurred
|
|
42
|
-
*/
|
|
43
|
-
private overflown;
|
|
44
|
-
/**
|
|
45
|
-
* Function to call when the user wants to download overflow results
|
|
46
|
-
*/
|
|
47
|
-
private downloadCallback;
|
|
48
|
-
private _debugMode;
|
|
49
|
-
set debugMode(value: boolean);
|
|
50
|
-
constructor();
|
|
51
|
-
/**
|
|
52
|
-
* Retrieve the parent element containing all output parts
|
|
53
|
-
*/
|
|
54
|
-
private get outputArea();
|
|
55
|
-
/**
|
|
56
|
-
* Render an element in the next position of the output area
|
|
57
|
-
* @param {string} html Safe string version of the next child to render
|
|
58
|
-
* @param {boolean} isNewElement Whether this a newly generated element
|
|
59
|
-
*/
|
|
60
|
-
private renderNextElement;
|
|
61
|
-
/**
|
|
62
|
-
* Convert a piece of text to a span element for displaying
|
|
63
|
-
* @param {string} text The text content for the span
|
|
64
|
-
* @param {boolean} ignoreEmpty Whether to remove empty lines in the text
|
|
65
|
-
* @param {string} className Optional class name for the span
|
|
66
|
-
* @return {string} String version of the created span
|
|
67
|
-
*/
|
|
68
|
-
private spanify;
|
|
69
|
-
/**
|
|
70
|
-
* Display output to the user, based on its content type
|
|
71
|
-
* @param {BackendEvent} output Event containing the output data
|
|
72
|
-
*/
|
|
73
|
-
showOutput(output: BackendEvent): void;
|
|
74
|
-
/**
|
|
75
|
-
* Display to the user that overflow has occurred, limiting the shown output
|
|
76
|
-
* @param {function():void | null} downloadCallback Optional callback to download overflow
|
|
77
|
-
*/
|
|
78
|
-
onOverflow(downloadCallback: (() => void) | null): void;
|
|
79
|
-
/**
|
|
80
|
-
* Display an error to the user
|
|
81
|
-
* @param {BackendEvent} error Event containing the error data
|
|
82
|
-
*/
|
|
83
|
-
showError(error: BackendEvent): void;
|
|
84
|
-
protected _render(options: RenderOptions): void;
|
|
85
|
-
/**
|
|
86
|
-
* Clear the contents of the output area
|
|
87
|
-
*/
|
|
88
|
-
reset(): void;
|
|
89
|
-
private onRunEnd;
|
|
90
|
-
}
|
package/dist/OutputManager.js
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import escapeHTML from "escape-html";
|
|
2
|
-
import { BackendEventType } from "./BackendEvent";
|
|
3
|
-
import { BackendManager } from "./BackendManager";
|
|
4
|
-
import { renderInCircle } from "./util/HTMLShapes";
|
|
5
|
-
import { getElement, parseData, t } from "./util/Util";
|
|
6
|
-
import { LogType, papyrosLog } from "./util/Logging";
|
|
7
|
-
import { Renderable, renderWithOptions } from "./util/Rendering";
|
|
8
|
-
import { OUTPUT_AREA_ID, OUTPUT_OVERFLOW_ID } from "./Constants";
|
|
9
|
-
/**
|
|
10
|
-
* Component for displaying code output or errors to the user
|
|
11
|
-
*/
|
|
12
|
-
export class OutputManager extends Renderable {
|
|
13
|
-
set debugMode(value) {
|
|
14
|
-
this.outputArea.classList.toggle("papyros-debug", value);
|
|
15
|
-
this._debugMode = value;
|
|
16
|
-
}
|
|
17
|
-
constructor() {
|
|
18
|
-
super();
|
|
19
|
-
this._debugMode = false;
|
|
20
|
-
this.content = [];
|
|
21
|
-
this.overflown = false;
|
|
22
|
-
this.downloadCallback = null;
|
|
23
|
-
BackendManager.subscribe(BackendEventType.Start, () => this.reset());
|
|
24
|
-
BackendManager.subscribe(BackendEventType.Output, e => this.showOutput(e));
|
|
25
|
-
BackendManager.subscribe(BackendEventType.Error, e => this.showError(e));
|
|
26
|
-
BackendManager.subscribe(BackendEventType.End, () => this.onRunEnd());
|
|
27
|
-
BackendManager.subscribe(BackendEventType.FrameChange, e => {
|
|
28
|
-
const outputsToHighlight = e.data.outputs;
|
|
29
|
-
const outputElements = this.outputArea.children;
|
|
30
|
-
for (let i = 0; i < outputElements.length; i++) {
|
|
31
|
-
const outputElement = outputElements[i];
|
|
32
|
-
outputElement.classList.toggle("papyros-highlight-debugged", i < outputsToHighlight);
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Retrieve the parent element containing all output parts
|
|
38
|
-
*/
|
|
39
|
-
get outputArea() {
|
|
40
|
-
return getElement(OUTPUT_AREA_ID);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Render an element in the next position of the output area
|
|
44
|
-
* @param {string} html Safe string version of the next child to render
|
|
45
|
-
* @param {boolean} isNewElement Whether this a newly generated element
|
|
46
|
-
*/
|
|
47
|
-
renderNextElement(html, isNewElement = true) {
|
|
48
|
-
if (isNewElement) { // Only save new ones to prevent duplicating
|
|
49
|
-
this.content.push(html);
|
|
50
|
-
}
|
|
51
|
-
this.outputArea.insertAdjacentHTML("beforeend", html);
|
|
52
|
-
// Ensure overflowElement is at the bottom
|
|
53
|
-
const overflowElement = document.getElementById(OUTPUT_OVERFLOW_ID);
|
|
54
|
-
if (overflowElement) {
|
|
55
|
-
this.outputArea.append(overflowElement);
|
|
56
|
-
}
|
|
57
|
-
// Scroll to bottom to show latest output
|
|
58
|
-
this.outputArea.scrollTop = this.outputArea.scrollHeight;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Convert a piece of text to a span element for displaying
|
|
62
|
-
* @param {string} text The text content for the span
|
|
63
|
-
* @param {boolean} ignoreEmpty Whether to remove empty lines in the text
|
|
64
|
-
* @param {string} className Optional class name for the span
|
|
65
|
-
* @return {string} String version of the created span
|
|
66
|
-
*/
|
|
67
|
-
spanify(text, ignoreEmpty = false, className = "") {
|
|
68
|
-
let spanText = text;
|
|
69
|
-
if (spanText.includes("\n") && spanText !== "\n") {
|
|
70
|
-
spanText = spanText.split("\n")
|
|
71
|
-
.filter(line => !ignoreEmpty || line.trim().length > 0)
|
|
72
|
-
.join("\n");
|
|
73
|
-
}
|
|
74
|
-
return `<span class="${className}">${escapeHTML(spanText)}</span>`;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Display output to the user, based on its content type
|
|
78
|
-
* @param {BackendEvent} output Event containing the output data
|
|
79
|
-
*/
|
|
80
|
-
showOutput(output) {
|
|
81
|
-
const data = parseData(output.data, output.contentType);
|
|
82
|
-
if (output.contentType && output.contentType.startsWith("img")) {
|
|
83
|
-
this.renderNextElement(`<img src="data:${output.contentType}, ${data}"></img>`);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
this.renderNextElement(this.spanify(data, false));
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Display to the user that overflow has occurred, limiting the shown output
|
|
91
|
-
* @param {function():void | null} downloadCallback Optional callback to download overflow
|
|
92
|
-
*/
|
|
93
|
-
onOverflow(downloadCallback) {
|
|
94
|
-
this.overflown = true;
|
|
95
|
-
this.downloadCallback = downloadCallback;
|
|
96
|
-
if (document.getElementById(OUTPUT_OVERFLOW_ID) == null) {
|
|
97
|
-
this.renderNextElement(`
|
|
98
|
-
<div id=${OUTPUT_OVERFLOW_ID}><span class="_tw-text-red-500
|
|
99
|
-
_tw-text-bold">${t("Papyros.output_overflow")}</span>
|
|
100
|
-
<a class="hover:_tw-cursor-pointer _tw-text-blue-500"
|
|
101
|
-
hidden>${t("Papyros.output_overflow_download")}</a>
|
|
102
|
-
</div>`, false);
|
|
103
|
-
}
|
|
104
|
-
const overflowDiv = getElement(OUTPUT_OVERFLOW_ID);
|
|
105
|
-
if (this.downloadCallback !== null) {
|
|
106
|
-
const overflowLink = overflowDiv.lastElementChild;
|
|
107
|
-
overflowLink.hidden = false;
|
|
108
|
-
overflowLink.addEventListener("click", this.downloadCallback);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Display an error to the user
|
|
113
|
-
* @param {BackendEvent} error Event containing the error data
|
|
114
|
-
*/
|
|
115
|
-
showError(error) {
|
|
116
|
-
let errorHTML = "";
|
|
117
|
-
const errorData = parseData(error.data, error.contentType);
|
|
118
|
-
papyrosLog(LogType.Debug, "Showing error: ", errorData);
|
|
119
|
-
if (typeof (errorData) === "string") {
|
|
120
|
-
errorHTML = this.spanify(errorData, false, "_tw-text-red-500");
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
const errorObject = errorData;
|
|
124
|
-
let shortTraceback = (errorObject.where || "").trim();
|
|
125
|
-
// Prepend a bit of indentation, so every part has indentation
|
|
126
|
-
if (shortTraceback) {
|
|
127
|
-
shortTraceback = this.spanify(" " + shortTraceback, true, "where");
|
|
128
|
-
}
|
|
129
|
-
errorHTML += "<div class=\"_tw-text-red-500 _tw-text-bold\">";
|
|
130
|
-
const infoQM = renderInCircle("?", escapeHTML(errorObject.info), "_tw-text-blue-500 _tw-border-blue-500 dark:_tw-text-dark-mode-blue dark:_tw-border-dark-mode-blue");
|
|
131
|
-
const tracebackEM = renderInCircle("!", escapeHTML(errorObject.traceback), "_tw-text-red-500 _tw-border-red-500");
|
|
132
|
-
errorHTML += `${infoQM}${errorObject.name} traceback:${tracebackEM}\n`;
|
|
133
|
-
errorHTML += shortTraceback;
|
|
134
|
-
errorHTML += "</div>\n";
|
|
135
|
-
if (errorObject.what) {
|
|
136
|
-
errorHTML += this.spanify(errorObject.what.trim(), true, "what") + "\n";
|
|
137
|
-
}
|
|
138
|
-
if (errorObject.why) {
|
|
139
|
-
errorHTML += this.spanify(errorObject.why.trim(), true, "why") + "\n";
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
this.renderNextElement(errorHTML);
|
|
143
|
-
}
|
|
144
|
-
_render(options) {
|
|
145
|
-
renderWithOptions(options, `
|
|
146
|
-
<div id=${OUTPUT_AREA_ID} class="_tw-border-2 _tw-w-full _tw-min-h-1/4
|
|
147
|
-
_tw-max-h-3/5 _tw-overflow-auto papyros-font-family
|
|
148
|
-
_tw-py-1 _tw-px-2 _tw-whitespace-pre _tw-rounded-lg dark:_tw-border-dark-mode-content
|
|
149
|
-
with-placeholder ${this._debugMode ? "papyros-debug" : ""}" data-placeholder="${t("Papyros.output_placeholder")}"></div>
|
|
150
|
-
`);
|
|
151
|
-
// Restore previously rendered items
|
|
152
|
-
this.content.forEach(html => this.renderNextElement(html, false));
|
|
153
|
-
if (this.overflown) {
|
|
154
|
-
this.onOverflow(this.downloadCallback);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Clear the contents of the output area
|
|
159
|
-
*/
|
|
160
|
-
reset() {
|
|
161
|
-
this.content = [];
|
|
162
|
-
this.overflown = false;
|
|
163
|
-
this.downloadCallback = null;
|
|
164
|
-
this.render();
|
|
165
|
-
}
|
|
166
|
-
onRunEnd() {
|
|
167
|
-
if (this.outputArea.childElementCount === 0) {
|
|
168
|
-
this.outputArea.setAttribute("data-placeholder", t("Papyros.no_output"));
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=OutputManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OutputManager.js","sourceRoot":"","sources":["../src/OutputManager.ts"],"names":[],"mappings":"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"}
|