@dodona/papyros 1.0.0 → 2.0.0-beta.0

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.
Files changed (109) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +0 -0
  3. package/dist/App.d.ts +1 -1
  4. package/dist/App.js +73 -0
  5. package/dist/App.js.map +1 -0
  6. package/dist/Backend.d.ts +0 -48
  7. package/dist/Backend.js +76 -0
  8. package/dist/Backend.js.map +1 -0
  9. package/dist/BackendEvent.d.ts +0 -0
  10. package/dist/BackendEvent.js +24 -0
  11. package/dist/BackendEvent.js.map +1 -0
  12. package/dist/BackendEventQueue.d.ts +0 -0
  13. package/dist/BackendEventQueue.js +135 -0
  14. package/dist/BackendEventQueue.js.map +1 -0
  15. package/dist/BackendManager.d.ts +1 -1
  16. package/dist/BackendManager.js +94 -0
  17. package/dist/BackendManager.js.map +1 -0
  18. package/dist/CodeRunner.d.ts +0 -0
  19. package/dist/CodeRunner.js +372 -0
  20. package/dist/CodeRunner.js.map +1 -0
  21. package/dist/Constants.d.ts +0 -0
  22. package/dist/Constants.js +36 -0
  23. package/dist/Constants.js.map +1 -0
  24. package/dist/InputManager.d.ts +0 -0
  25. package/dist/InputManager.js +102 -0
  26. package/dist/InputManager.js.map +1 -0
  27. package/dist/InputServiceWorker.d.ts +0 -0
  28. package/dist/InputServiceWorker.js +37 -0
  29. package/dist/InputServiceWorker.js.map +1 -0
  30. package/dist/Library.d.ts +2 -2
  31. package/dist/Library.js +9 -1
  32. package/dist/Library.js.map +1 -0
  33. package/dist/OutputManager.d.ts +0 -0
  34. package/dist/OutputManager.js +161 -0
  35. package/dist/OutputManager.js.map +1 -0
  36. package/dist/Papyros.css +563 -0
  37. package/dist/Papyros.d.ts +0 -1
  38. package/dist/Papyros.js +268 -0
  39. package/dist/Papyros.js.map +1 -0
  40. package/dist/ProgrammingLanguage.d.ts +0 -0
  41. package/dist/ProgrammingLanguage.js +9 -0
  42. package/dist/ProgrammingLanguage.js.map +1 -0
  43. package/dist/Translations.d.ts +74 -74
  44. package/dist/Translations.js +164 -0
  45. package/dist/Translations.js.map +1 -0
  46. package/dist/editor/BatchInputEditor.d.ts +0 -0
  47. package/dist/editor/BatchInputEditor.js +71 -0
  48. package/dist/editor/BatchInputEditor.js.map +1 -0
  49. package/dist/editor/CodeEditor.d.ts +0 -5
  50. package/dist/editor/CodeEditor.js +180 -0
  51. package/dist/editor/CodeEditor.js.map +1 -0
  52. package/dist/editor/CodeMirrorEditor.d.ts +0 -0
  53. package/dist/editor/CodeMirrorEditor.js +168 -0
  54. package/dist/editor/CodeMirrorEditor.js.map +1 -0
  55. package/dist/editor/DarkTheme.d.ts +0 -0
  56. package/dist/editor/DarkTheme.js +73 -0
  57. package/dist/editor/DarkTheme.js.map +1 -0
  58. package/dist/editor/Gutters.d.ts +0 -0
  59. package/dist/editor/Gutters.js +162 -0
  60. package/dist/editor/Gutters.js.map +1 -0
  61. package/dist/examples/Examples.d.ts +0 -0
  62. package/dist/examples/Examples.js +23 -0
  63. package/dist/examples/Examples.js.map +1 -0
  64. package/dist/examples/JavaScriptExamples.d.ts +0 -0
  65. package/dist/examples/JavaScriptExamples.js +16 -0
  66. package/dist/examples/JavaScriptExamples.js.map +1 -0
  67. package/dist/examples/PythonExamples.d.ts +0 -0
  68. package/dist/examples/PythonExamples.js +163 -0
  69. package/dist/examples/PythonExamples.js.map +1 -0
  70. package/dist/input/BatchInputHandler.d.ts +0 -0
  71. package/dist/input/BatchInputHandler.js +112 -0
  72. package/dist/input/BatchInputHandler.js.map +1 -0
  73. package/dist/input/InteractiveInputHandler.d.ts +0 -0
  74. package/dist/input/InteractiveInputHandler.js +90 -0
  75. package/dist/input/InteractiveInputHandler.js.map +1 -0
  76. package/dist/input/UserInputHandler.d.ts +0 -0
  77. package/dist/input/UserInputHandler.js +40 -0
  78. package/dist/input/UserInputHandler.js.map +1 -0
  79. package/dist/util/HTMLShapes.d.ts +0 -0
  80. package/dist/util/HTMLShapes.js +25 -0
  81. package/dist/util/HTMLShapes.js.map +1 -0
  82. package/dist/util/Logging.d.ts +0 -0
  83. package/dist/util/Logging.js +30 -0
  84. package/dist/util/Logging.js.map +1 -0
  85. package/dist/util/Rendering.d.ts +0 -0
  86. package/dist/util/Rendering.js +139 -0
  87. package/dist/util/Rendering.js.map +1 -0
  88. package/dist/util/Util.d.ts +1 -1
  89. package/dist/util/Util.js +148 -0
  90. package/dist/util/Util.js.map +1 -0
  91. package/dist/workers/input/InputWorker.d.ts +0 -0
  92. package/dist/workers/input/InputWorker.js +63 -1
  93. package/dist/workers/input/InputWorker.js.map +1 -0
  94. package/dist/workers/javascript/JavaScriptWorker.d.ts +39 -0
  95. package/dist/workers/javascript/JavaScriptWorker.js +148 -0
  96. package/dist/workers/javascript/JavaScriptWorker.js.map +1 -0
  97. package/dist/workers/javascript/worker.d.ts +1 -0
  98. package/dist/workers/javascript/worker.js +5 -0
  99. package/dist/workers/javascript/worker.js.map +1 -0
  100. package/dist/workers/python/PythonWorker.d.ts +31 -0
  101. package/dist/workers/python/PythonWorker.js +106 -0
  102. package/dist/workers/python/PythonWorker.js.map +1 -0
  103. package/dist/workers/python/python_package.tar.gz +0 -0
  104. package/dist/workers/python/worker.d.ts +1 -0
  105. package/dist/workers/python/worker.js +5 -0
  106. package/dist/workers/python/worker.js.map +1 -0
  107. package/package.json +45 -42
  108. package/dist/workers/javascript/JavaScriptWorker.worker.d.ts +0 -2
  109. package/dist/workers/python/PythonWorker.worker.d.ts +0 -2
@@ -0,0 +1,372 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { proxy } from "comlink";
11
+ import { BackendEventType } from "./BackendEvent";
12
+ import { BackendManager } from "./BackendManager";
13
+ import { CodeEditor } from "./editor/CodeEditor";
14
+ import { addPapyrosPrefix, APPLICATION_STATE_TEXT_ID, CODE_BUTTONS_WRAPPER_ID, DEFAULT_EDITOR_DELAY, RUN_BTN_ID, STATE_SPINNER_ID, STOP_BTN_ID } from "./Constants";
15
+ import { InputManager } from "./InputManager";
16
+ import { renderSpinningCircle } from "./util/HTMLShapes";
17
+ import { addListener, getElement, t, downloadResults, parseData } from "./util/Util";
18
+ import { renderWithOptions, renderButton, Renderable, appendClasses } from "./util/Rendering";
19
+ import { OutputManager } from "./OutputManager";
20
+ /**
21
+ * Enum representing the possible states while processing code
22
+ */
23
+ export var RunState;
24
+ (function (RunState) {
25
+ RunState["Loading"] = "loading";
26
+ RunState["Running"] = "running";
27
+ RunState["AwaitingInput"] = "awaiting_input";
28
+ RunState["Stopping"] = "stopping";
29
+ RunState["Ready"] = "ready";
30
+ })(RunState || (RunState = {}));
31
+ /**
32
+ * Helper component to manage and visualize the current RunState
33
+ */
34
+ export class CodeRunner extends Renderable {
35
+ /**
36
+ * Construct a new RunStateManager with the given listeners
37
+ * @param {ProgrammingLanguage} programmingLanguage The language to use
38
+ * @param {InputMode} inputMode The input mode to use
39
+ */
40
+ constructor(programmingLanguage, inputMode) {
41
+ super();
42
+ this.programmingLanguage = programmingLanguage;
43
+ this.editor = new CodeEditor(() => {
44
+ if (this.state === RunState.Ready) {
45
+ this.runCode(this.editor.getText());
46
+ }
47
+ });
48
+ this.inputManager = new InputManager((input) => __awaiter(this, void 0, void 0, function* () {
49
+ const backend = yield this.backend;
50
+ backend.writeMessage(input);
51
+ this.setState(RunState.Running);
52
+ }), inputMode);
53
+ this.outputManager = new OutputManager();
54
+ this.backend = Promise.resolve({});
55
+ this.buttons = [];
56
+ this.editor.onChange({
57
+ onChange: (code) => __awaiter(this, void 0, void 0, function* () {
58
+ const backend = yield this.backend;
59
+ const modes = yield backend.workerProxy.runModes(code);
60
+ modes.forEach(mode => {
61
+ const id = addPapyrosPrefix(mode.mode);
62
+ if (mode.active) {
63
+ this.addButton({
64
+ id: id,
65
+ buttonText: t(`Papyros.run_modes.${mode.mode}`),
66
+ classNames: "_tw-text-white _tw-bg-neutral-bg"
67
+ }, () => this.runCode(this.editor.getText(), mode.mode));
68
+ }
69
+ else {
70
+ this.removeButton(id);
71
+ }
72
+ });
73
+ this.renderButtons();
74
+ }),
75
+ delay: DEFAULT_EDITOR_DELAY
76
+ });
77
+ BackendManager.subscribe(BackendEventType.Input, () => this.setState(RunState.AwaitingInput));
78
+ this.loadingPackages = [];
79
+ BackendManager.subscribe(BackendEventType.Loading, e => this.onLoad(e));
80
+ BackendManager.subscribe(BackendEventType.Start, e => this.onStart(e));
81
+ this.previousState = RunState.Ready;
82
+ this.runStartTime = new Date().getTime();
83
+ this.state = RunState.Ready;
84
+ }
85
+ /**
86
+ * Start the backend to enable running code
87
+ */
88
+ start() {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ this.setState(RunState.Loading);
91
+ const backend = BackendManager.getBackend(this.programmingLanguage);
92
+ this.editor.setProgrammingLanguage(this.programmingLanguage);
93
+ // Use a Promise to immediately enable running while downloading
94
+ // eslint-disable-next-line no-async-promise-executor
95
+ this.backend = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
96
+ const workerProxy = backend.workerProxy;
97
+ yield workerProxy
98
+ // Allow passing messages between worker and main thread
99
+ .launch(proxy((e) => BackendManager.publish(e)), proxy(() => {
100
+ this.outputManager.onOverflow(null);
101
+ }));
102
+ this.editor.setLintingSource((view) => __awaiter(this, void 0, void 0, function* () {
103
+ const workerDiagnostics = yield workerProxy.lintCode(this.editor.getText());
104
+ return workerDiagnostics.map(d => {
105
+ const fromline = view.state.doc.line(d.lineNr);
106
+ const toLine = view.state.doc.line(d.endLineNr);
107
+ const from = Math.min(fromline.from + d.columnNr, fromline.to);
108
+ const to = Math.min(toLine.from + d.endColumnNr, toLine.to);
109
+ return Object.assign(Object.assign({}, d), { from: from, to: to });
110
+ });
111
+ }));
112
+ return resolve(backend);
113
+ }));
114
+ this.editor.focus();
115
+ this.setState(RunState.Ready);
116
+ });
117
+ }
118
+ /**
119
+ * Interrupt the currently running code
120
+ * @return {Promise<void>} Promise of stopping
121
+ */
122
+ stop() {
123
+ return __awaiter(this, void 0, void 0, function* () {
124
+ this.setState(RunState.Stopping);
125
+ BackendManager.publish({
126
+ type: BackendEventType.End,
127
+ data: "User cancelled run", contentType: "text/plain"
128
+ });
129
+ const backend = yield this.backend;
130
+ yield backend.interrupt();
131
+ });
132
+ }
133
+ /**
134
+ * Set the used programming language to the given one to allow editing and running code
135
+ * @param {ProgrammingLanguage} programmingLanguage The language to use
136
+ */
137
+ setProgrammingLanguage(programmingLanguage) {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ if (this.programmingLanguage !== programmingLanguage) { // Expensive, so ensure it is needed
140
+ yield this.backend.then(b => b.interrupt());
141
+ this.programmingLanguage = programmingLanguage;
142
+ yield this.start();
143
+ }
144
+ });
145
+ }
146
+ /**
147
+ * @return {ProgrammingLanguage} The current programming language
148
+ */
149
+ getProgrammingLanguage() {
150
+ return this.programmingLanguage;
151
+ }
152
+ /**
153
+ * Show or hide the spinning circle, representing a running animation
154
+ * @param {boolean} show Whether to show the spinner
155
+ */
156
+ showSpinner(show) {
157
+ getElement(STATE_SPINNER_ID).style.display = show ? "" : "none";
158
+ }
159
+ /**
160
+ * Show the current state of the program to the user
161
+ * @param {RunState} state The current state of the run
162
+ * @param {string} message Optional message to indicate the state
163
+ */
164
+ setState(state, message) {
165
+ getElement(APPLICATION_STATE_TEXT_ID).innerText =
166
+ message || t(`Papyros.states.${state}`);
167
+ if (state !== this.state) {
168
+ this.previousState = this.state;
169
+ this.state = state;
170
+ }
171
+ this.showSpinner(this.state !== RunState.Ready);
172
+ this.renderButtons();
173
+ }
174
+ /**
175
+ * @return {RunState} The state of the current run
176
+ */
177
+ getState() {
178
+ return this.state;
179
+ }
180
+ /**
181
+ * Remove a button from the internal button list. Requires a re-render to update
182
+ * @param {string} id Identifier of the button to remove
183
+ */
184
+ removeButton(id) {
185
+ const existingIndex = this.buttons.findIndex(b => b.id === id);
186
+ if (existingIndex !== -1) {
187
+ this.buttons.splice(existingIndex, 1);
188
+ }
189
+ }
190
+ /**
191
+ * Add a button to display to the user
192
+ * @param {ButtonOptions} options Options for rendering the button
193
+ * @param {function} onClick Listener for click events on the button
194
+ */
195
+ addButton(options, onClick) {
196
+ this.removeButton(options.id);
197
+ this.buttons.push({
198
+ id: options.id,
199
+ buttonHTML: renderButton(options),
200
+ onClick: onClick
201
+ });
202
+ }
203
+ /**
204
+ * Generate a button that the user can click to process code
205
+ * Can either run the code or interrupt it if already running
206
+ * @return {DynamicButton} A button to interact with the code according to the current state
207
+ */
208
+ getCodeActionButton() {
209
+ let buttonOptions;
210
+ let buttonHandler;
211
+ if ([RunState.Ready, RunState.Loading].includes(this.state)) {
212
+ buttonOptions = {
213
+ id: RUN_BTN_ID,
214
+ buttonText: t("Papyros.run"),
215
+ classNames: "_tw-text-white _tw-bg-blue-500"
216
+ };
217
+ buttonHandler = () => this.runCode(this.editor.getText());
218
+ }
219
+ else {
220
+ buttonOptions = {
221
+ id: STOP_BTN_ID,
222
+ buttonText: t("Papyros.stop"),
223
+ classNames: "_tw-text-white _tw-bg-red-500"
224
+ };
225
+ buttonHandler = () => this.stop();
226
+ }
227
+ appendClasses(buttonOptions, "_tw-min-w-[60px]");
228
+ return {
229
+ id: buttonOptions.id,
230
+ buttonHTML: renderButton(buttonOptions),
231
+ onClick: buttonHandler
232
+ };
233
+ }
234
+ /**
235
+ * Specific helper method to render only the buttons required by the user
236
+ */
237
+ renderButtons() {
238
+ const buttons = [this.getCodeActionButton(), ...this.buttons];
239
+ getElement(CODE_BUTTONS_WRAPPER_ID).innerHTML =
240
+ buttons.map(b => b.buttonHTML).join("\n");
241
+ // Buttons are freshly added to the DOM, so attach listeners now
242
+ buttons.forEach(b => addListener(b.id, b.onClick, "click"));
243
+ }
244
+ _render(options) {
245
+ appendClasses(options.statusPanelOptions,
246
+ // eslint-disable-next-line max-len
247
+ "_tw-border-solid _tw-border-gray-200 _tw-border-b-2 dark:_tw-border-dark-mode-content");
248
+ const rendered = renderWithOptions(options.statusPanelOptions, `
249
+ <div class="_tw-grid _tw-grid-cols-2 _tw-items-center _tw-px-1">
250
+ <div id="${CODE_BUTTONS_WRAPPER_ID}" class="_tw-col-span-1 _tw-flex _tw-flex-row">
251
+ </div>
252
+ <div class="_tw-col-span-1 _tw-flex _tw-flex-row-reverse _tw-items-center">
253
+ <div id="${APPLICATION_STATE_TEXT_ID}"></div>
254
+ ${renderSpinningCircle(STATE_SPINNER_ID, "_tw-border-gray-200 _tw-border-b-red-500")}
255
+ </div>
256
+ </div>`);
257
+ this.setState(this.state);
258
+ this.inputManager.render(options.inputOptions);
259
+ this.outputManager.render(options.outputOptions);
260
+ this.editor.render(options.codeEditorOptions);
261
+ this.editor.setPanel(rendered);
262
+ // Set language again to update the placeholder
263
+ this.editor.setProgrammingLanguage(this.programmingLanguage);
264
+ return rendered;
265
+ }
266
+ /**
267
+ * @param {string} code The code to run
268
+ * @param {string} mode The mode to run with
269
+ * @return {Promise<void>} Promise of running the code
270
+ */
271
+ runCode(code, mode) {
272
+ return __awaiter(this, void 0, void 0, function* () {
273
+ // Setup pre-run
274
+ this.setState(RunState.Loading);
275
+ // Ensure we go back to Loading after finishing any remaining installs
276
+ this.previousState = RunState.Loading;
277
+ BackendManager.publish({
278
+ type: BackendEventType.Start,
279
+ data: "StartClicked", contentType: "text/plain"
280
+ });
281
+ let interrupted = false;
282
+ let terminated = false;
283
+ const backend = yield this.backend;
284
+ this.runStartTime = new Date().getTime();
285
+ try {
286
+ yield backend.call(backend.workerProxy.runCode, code, mode);
287
+ }
288
+ catch (error) {
289
+ if (error.type === "InterruptError") {
290
+ // Error signaling forceful interrupt
291
+ interrupted = true;
292
+ terminated = true;
293
+ }
294
+ else {
295
+ BackendManager.publish({
296
+ type: BackendEventType.Error,
297
+ data: JSON.stringify(error),
298
+ contentType: "text/json"
299
+ });
300
+ BackendManager.publish({
301
+ type: BackendEventType.End,
302
+ data: "RunError", contentType: "text/plain"
303
+ });
304
+ }
305
+ }
306
+ finally {
307
+ if (this.state === RunState.Stopping) {
308
+ // Was interrupted, End message already published
309
+ interrupted = true;
310
+ }
311
+ this.setState(RunState.Ready, t(interrupted ? "Papyros.interrupted" : "Papyros.finished", { time: (new Date().getTime() - this.runStartTime) / 1000 }));
312
+ if (terminated) {
313
+ yield this.start();
314
+ }
315
+ else if (yield backend.workerProxy.hasOverflow()) {
316
+ this.outputManager.onOverflow(() => __awaiter(this, void 0, void 0, function* () {
317
+ const backend = yield this.backend;
318
+ const overflowResults = (yield backend.workerProxy.getOverflow())
319
+ .map(e => e.data).join("");
320
+ downloadResults(overflowResults, "overflow-results.txt");
321
+ }));
322
+ }
323
+ }
324
+ });
325
+ }
326
+ /**
327
+ * Callback to handle loading events
328
+ * @param {BackendEvent} e The loading event
329
+ */
330
+ onLoad(e) {
331
+ const loadingData = parseData(e.data, e.contentType);
332
+ if (loadingData.status === "loading") {
333
+ loadingData.modules.forEach(m => {
334
+ if (!this.loadingPackages.includes(m)) {
335
+ this.loadingPackages.push(m);
336
+ }
337
+ });
338
+ }
339
+ else if (loadingData.status === "loaded") {
340
+ loadingData.modules.forEach(m => {
341
+ const index = this.loadingPackages.indexOf(m);
342
+ if (index !== -1) {
343
+ this.loadingPackages.splice(index, 1);
344
+ }
345
+ });
346
+ }
347
+ else { // failed
348
+ // If it is a true module, an Exception will be raised when running
349
+ // So this does not need to be handled here, as it is often an incomplete package-name
350
+ // that causes micropip to not find the correct wheel
351
+ this.loadingPackages = [];
352
+ }
353
+ if (this.loadingPackages.length > 0) {
354
+ const packageMessage = t("Papyros.loading", {
355
+ // limit amount of package names shown
356
+ packages: this.loadingPackages.slice(0, 3).join(", ")
357
+ });
358
+ this.setState(RunState.Loading, packageMessage);
359
+ }
360
+ else {
361
+ this.setState(this.previousState);
362
+ }
363
+ }
364
+ onStart(e) {
365
+ const startData = parseData(e.data, e.contentType);
366
+ if (startData.includes("RunCode")) {
367
+ this.runStartTime = new Date().getTime();
368
+ this.setState(RunState.Running);
369
+ }
370
+ }
371
+ }
372
+ //# sourceMappingURL=CodeRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeRunner.js","sourceRoot":"","sources":["../src/CodeRunner.ts"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,36 @@
1
+ import { ProgrammingLanguage } from "./ProgrammingLanguage";
2
+ /**
3
+ * Add a prefix to a string, ensuring uniqueness in the page
4
+ * @param {string} s The value to add a prefix to
5
+ * @return {string} The value with an almost certainly unused prefix
6
+ */
7
+ export function addPapyrosPrefix(s) {
8
+ return `__papyros-${s}`;
9
+ }
10
+ /* Default HTML ids for various elements */
11
+ export const MAIN_APP_ID = addPapyrosPrefix("root");
12
+ export const OUTPUT_AREA_WRAPPER_ID = addPapyrosPrefix("code-output-area-wrapper");
13
+ export const OUTPUT_AREA_ID = addPapyrosPrefix("code-output-area");
14
+ export const OUTPUT_OVERFLOW_ID = addPapyrosPrefix("output-overflow");
15
+ export const INPUT_AREA_WRAPPER_ID = addPapyrosPrefix("code-input-area-wrapper");
16
+ export const INPUT_TA_ID = addPapyrosPrefix("code-input-area");
17
+ export const USER_INPUT_WRAPPER_ID = addPapyrosPrefix("user-input-wrapper");
18
+ export const EDITOR_WRAPPER_ID = addPapyrosPrefix("code-area");
19
+ export const PANEL_WRAPPER_ID = addPapyrosPrefix("code-status-panel");
20
+ export const STATE_SPINNER_ID = addPapyrosPrefix("state-spinner");
21
+ export const APPLICATION_STATE_TEXT_ID = addPapyrosPrefix("application-state-text");
22
+ export const CODE_BUTTONS_WRAPPER_ID = addPapyrosPrefix("code-buttons");
23
+ export const RUN_BTN_ID = addPapyrosPrefix("run-code-btn");
24
+ export const STOP_BTN_ID = addPapyrosPrefix("stop-btn");
25
+ export const SEND_INPUT_BTN_ID = addPapyrosPrefix("send-input-btn");
26
+ export const SWITCH_INPUT_MODE_A_ID = addPapyrosPrefix("switch-input-mode");
27
+ export const EXAMPLE_SELECT_ID = addPapyrosPrefix("example-select");
28
+ export const LOCALE_SELECT_ID = addPapyrosPrefix("locale-select");
29
+ export const PROGRAMMING_LANGUAGE_SELECT_ID = addPapyrosPrefix("programming-language-select");
30
+ export const DARK_MODE_TOGGLE_ID = addPapyrosPrefix("toggle-dark-mode");
31
+ /* Default values for various properties */
32
+ export const DEFAULT_PROGRAMMING_LANGUAGE = ProgrammingLanguage.Python;
33
+ export const DEFAULT_LOCALE = "nl";
34
+ export const DEFAULT_SERVICE_WORKER = "InputServiceWorker.js";
35
+ export const DEFAULT_EDITOR_DELAY = 750; // milliseconds
36
+ //# sourceMappingURL=Constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACtC,OAAO,aAAa,CAAC,EAAE,CAAC;AAC5B,CAAC;AACD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;AACnF,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,8BAA8B,GAAG,gBAAgB,CAAC,6BAA6B,CAAC,CAAC;AAC9F,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;AACxE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,4BAA4B,GAAG,mBAAmB,CAAC,MAAM,CAAC;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAC9D,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC,CAAC,eAAe"}
File without changes
@@ -0,0 +1,102 @@
1
+ import { t } from "i18n-js";
2
+ import { SWITCH_INPUT_MODE_A_ID, USER_INPUT_WRAPPER_ID } from "./Constants";
3
+ import { BackendEventType } from "./BackendEvent";
4
+ import { addListener, getElement, } from "./util/Util";
5
+ import { InteractiveInputHandler } from "./input/InteractiveInputHandler";
6
+ import { BatchInputHandler } from "./input/BatchInputHandler";
7
+ import { BackendManager } from "./BackendManager";
8
+ import { Renderable, renderWithOptions } from "./util/Rendering";
9
+ export var InputMode;
10
+ (function (InputMode) {
11
+ InputMode["Interactive"] = "interactive";
12
+ InputMode["Batch"] = "batch";
13
+ })(InputMode || (InputMode = {}));
14
+ export const INPUT_MODES = [InputMode.Batch, InputMode.Interactive];
15
+ export class InputManager extends Renderable {
16
+ constructor(sendInput, inputMode) {
17
+ super();
18
+ this.onUserInput = this.onUserInput.bind(this);
19
+ this.inputHandlers = this.buildInputHandlerMap();
20
+ this.inputMode = inputMode;
21
+ this.sendInput = sendInput;
22
+ this.waiting = false;
23
+ this.prompt = "";
24
+ BackendManager.subscribe(BackendEventType.Start, () => this.onRunStart());
25
+ BackendManager.subscribe(BackendEventType.End, () => this.onRunEnd());
26
+ BackendManager.subscribe(BackendEventType.Input, e => this.onInputRequest(e));
27
+ }
28
+ buildInputHandlerMap() {
29
+ const interactiveInputHandler = new InteractiveInputHandler(this.onUserInput);
30
+ const batchInputHandler = new BatchInputHandler(this.onUserInput);
31
+ return new Map([
32
+ [InputMode.Interactive, interactiveInputHandler],
33
+ [InputMode.Batch, batchInputHandler]
34
+ ]);
35
+ }
36
+ getInputMode() {
37
+ return this.inputMode;
38
+ }
39
+ setInputMode(inputMode) {
40
+ this.inputHandler.toggle(false);
41
+ this.inputMode = inputMode;
42
+ this.render();
43
+ this.inputHandler.toggle(true);
44
+ }
45
+ getInputHandler(inputMode) {
46
+ return this.inputHandlers.get(inputMode);
47
+ }
48
+ get inputHandler() {
49
+ return this.getInputHandler(this.inputMode);
50
+ }
51
+ isWaiting() {
52
+ return this.waiting;
53
+ }
54
+ _render(options) {
55
+ let switchMode = "";
56
+ const otherMode = this.inputMode === InputMode.Interactive ?
57
+ InputMode.Batch : InputMode.Interactive;
58
+ switchMode = `<a id="${SWITCH_INPUT_MODE_A_ID}" data-value="${otherMode}"
59
+ class="_tw-flex _tw-flex-row-reverse hover:_tw-cursor-pointer _tw-text-blue-500">
60
+ ${t(`Papyros.switch_input_mode_to.${otherMode}`)}
61
+ </a>`;
62
+ renderWithOptions(options, `
63
+ <div id="${USER_INPUT_WRAPPER_ID}" class="_tw-my-1">
64
+ </div>
65
+ ${switchMode}`);
66
+ addListener(SWITCH_INPUT_MODE_A_ID, im => this.setInputMode(im), "click", "data-value");
67
+ this.inputHandler.render({
68
+ parentElementId: USER_INPUT_WRAPPER_ID,
69
+ darkMode: options.darkMode,
70
+ inputStyling: options.inputStyling
71
+ });
72
+ this.inputHandler.waitWithPrompt(this.waiting, this.prompt);
73
+ }
74
+ waitWithPrompt(waiting, prompt = "") {
75
+ this.waiting = waiting;
76
+ this.prompt = prompt;
77
+ this.inputHandler.waitWithPrompt(this.waiting, this.prompt);
78
+ }
79
+ onUserInput(line) {
80
+ this.sendInput(line);
81
+ this.waitWithPrompt(false);
82
+ }
83
+ /**
84
+ * Asynchronously handle an input request by prompting the user for input
85
+ * @param {BackendEvent} e Event containing the input data
86
+ */
87
+ onInputRequest(e) {
88
+ this.waitWithPrompt(true, e.data);
89
+ }
90
+ onRunStart() {
91
+ // Prevent switching input mode during runs
92
+ getElement(SWITCH_INPUT_MODE_A_ID).hidden = true;
93
+ this.waitWithPrompt(false);
94
+ this.inputHandler.onRunStart();
95
+ }
96
+ onRunEnd() {
97
+ getElement(SWITCH_INPUT_MODE_A_ID).hidden = false;
98
+ this.inputHandler.onRunEnd();
99
+ this.waitWithPrompt(false);
100
+ }
101
+ }
102
+ //# sourceMappingURL=InputManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputManager.js","sourceRoot":"","sources":["../src/InputManager.ts"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,37 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /**
11
+ * Default service worker to process user input using HTTP requests
12
+ */
13
+ // Import service worker provided by the Papyros-package
14
+ import { InputWorker } from "./workers/input/InputWorker";
15
+ // Strip away the filename of the script to obtain the scope
16
+ // let domain = location.href;
17
+ // domain = domain.slice(0, domain.lastIndexOf("/") + 1);
18
+ const domain = ""; // Disable SharedArrayBuffers to use same environment as Dodona
19
+ const inputHandler = new InputWorker(domain);
20
+ addEventListener("fetch", function (event) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ if (!(yield inputHandler.handleInputRequest(event))) {
23
+ // Not a Papyros-specific request
24
+ // Fetch as we would handle a normal request
25
+ // Default action is to let browser handle it by not responding here
26
+ return;
27
+ }
28
+ });
29
+ });
30
+ // Prevent needing to reload page to have working input
31
+ addEventListener("install", function (event) {
32
+ event.waitUntil(skipWaiting());
33
+ });
34
+ addEventListener("activate", function (event) {
35
+ event.waitUntil(clients.claim());
36
+ });
37
+ //# sourceMappingURL=InputServiceWorker.js.map
@@ -0,0 +1 @@
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/Library.d.ts CHANGED
@@ -6,7 +6,7 @@ import { Papyros, PapyrosConfig, PapyrosRenderOptions } from "./Papyros";
6
6
  import { CodeRunner, RunState } from "./CodeRunner";
7
7
  import { BackendManager } from "./BackendManager";
8
8
  import { ProgrammingLanguage } from "./ProgrammingLanguage";
9
- import { WorkerAutocompleteContext, WorkerDiagnostic } from "./Backend";
9
+ import { WorkerDiagnostic } from "./Backend";
10
10
  import { ButtonOptions, RenderOptions } from "./util/Rendering";
11
- export type { BackendEvent, FriendlyError, WorkerAutocompleteContext, WorkerDiagnostic, PapyrosConfig, PapyrosRenderOptions, RenderOptions, ButtonOptions };
11
+ export type { BackendEvent, FriendlyError, WorkerDiagnostic, PapyrosConfig, PapyrosRenderOptions, RenderOptions, ButtonOptions };
12
12
  export { Papyros, ProgrammingLanguage, BackendManager, CodeEditor, CodeRunner, RunState, InputManager, InputMode, OutputManager };