@dodona/papyros 1.0.1 → 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.
- package/LICENSE +0 -0
- package/README.md +0 -0
- package/dist/App.d.ts +1 -1
- package/dist/App.js +73 -0
- package/dist/App.js.map +1 -0
- package/dist/Backend.d.ts +0 -48
- package/dist/Backend.js +76 -0
- package/dist/Backend.js.map +1 -0
- package/dist/BackendEvent.d.ts +0 -0
- package/dist/BackendEvent.js +24 -0
- package/dist/BackendEvent.js.map +1 -0
- package/dist/BackendEventQueue.d.ts +0 -0
- package/dist/BackendEventQueue.js +135 -0
- package/dist/BackendEventQueue.js.map +1 -0
- package/dist/BackendManager.d.ts +1 -1
- package/dist/BackendManager.js +94 -0
- package/dist/BackendManager.js.map +1 -0
- package/dist/CodeRunner.d.ts +0 -0
- package/dist/CodeRunner.js +372 -0
- package/dist/CodeRunner.js.map +1 -0
- package/dist/Constants.d.ts +0 -0
- package/dist/Constants.js +36 -0
- package/dist/Constants.js.map +1 -0
- package/dist/InputManager.d.ts +0 -0
- package/dist/InputManager.js +102 -0
- package/dist/InputManager.js.map +1 -0
- package/dist/InputServiceWorker.d.ts +0 -0
- package/dist/InputServiceWorker.js +37 -0
- package/dist/InputServiceWorker.js.map +1 -0
- package/dist/Library.d.ts +2 -2
- package/dist/Library.js +9 -1
- package/dist/Library.js.map +1 -0
- package/dist/OutputManager.d.ts +0 -0
- package/dist/OutputManager.js +161 -0
- package/dist/OutputManager.js.map +1 -0
- package/dist/Papyros.css +563 -0
- package/dist/Papyros.d.ts +0 -1
- package/dist/Papyros.js +268 -0
- package/dist/Papyros.js.map +1 -0
- package/dist/ProgrammingLanguage.d.ts +0 -0
- package/dist/ProgrammingLanguage.js +9 -0
- package/dist/ProgrammingLanguage.js.map +1 -0
- package/dist/Translations.d.ts +74 -74
- package/dist/Translations.js +164 -0
- package/dist/Translations.js.map +1 -0
- package/dist/editor/BatchInputEditor.d.ts +0 -0
- package/dist/editor/BatchInputEditor.js +71 -0
- package/dist/editor/BatchInputEditor.js.map +1 -0
- package/dist/editor/CodeEditor.d.ts +0 -5
- package/dist/editor/CodeEditor.js +180 -0
- package/dist/editor/CodeEditor.js.map +1 -0
- package/dist/editor/CodeMirrorEditor.d.ts +0 -0
- package/dist/editor/CodeMirrorEditor.js +168 -0
- package/dist/editor/CodeMirrorEditor.js.map +1 -0
- package/dist/editor/DarkTheme.d.ts +0 -0
- package/dist/editor/DarkTheme.js +73 -0
- package/dist/editor/DarkTheme.js.map +1 -0
- package/dist/editor/Gutters.d.ts +0 -0
- package/dist/editor/Gutters.js +162 -0
- package/dist/editor/Gutters.js.map +1 -0
- package/dist/examples/Examples.d.ts +0 -0
- package/dist/examples/Examples.js +23 -0
- package/dist/examples/Examples.js.map +1 -0
- package/dist/examples/JavaScriptExamples.d.ts +0 -0
- package/dist/examples/JavaScriptExamples.js +16 -0
- package/dist/examples/JavaScriptExamples.js.map +1 -0
- package/dist/examples/PythonExamples.d.ts +0 -0
- package/dist/examples/PythonExamples.js +163 -0
- package/dist/examples/PythonExamples.js.map +1 -0
- package/dist/input/BatchInputHandler.d.ts +0 -0
- package/dist/input/BatchInputHandler.js +112 -0
- package/dist/input/BatchInputHandler.js.map +1 -0
- package/dist/input/InteractiveInputHandler.d.ts +0 -0
- package/dist/input/InteractiveInputHandler.js +90 -0
- package/dist/input/InteractiveInputHandler.js.map +1 -0
- package/dist/input/UserInputHandler.d.ts +0 -0
- package/dist/input/UserInputHandler.js +40 -0
- package/dist/input/UserInputHandler.js.map +1 -0
- package/dist/util/HTMLShapes.d.ts +0 -0
- package/dist/util/HTMLShapes.js +25 -0
- package/dist/util/HTMLShapes.js.map +1 -0
- package/dist/util/Logging.d.ts +0 -0
- package/dist/util/Logging.js +30 -0
- package/dist/util/Logging.js.map +1 -0
- package/dist/util/Rendering.d.ts +0 -0
- package/dist/util/Rendering.js +139 -0
- package/dist/util/Rendering.js.map +1 -0
- package/dist/util/Util.d.ts +1 -1
- package/dist/util/Util.js +148 -0
- package/dist/util/Util.js.map +1 -0
- package/dist/workers/input/InputWorker.d.ts +0 -0
- package/dist/workers/input/InputWorker.js +63 -1
- package/dist/workers/input/InputWorker.js.map +1 -0
- package/dist/workers/javascript/JavaScriptWorker.d.ts +39 -0
- package/dist/workers/javascript/JavaScriptWorker.js +148 -0
- package/dist/workers/javascript/JavaScriptWorker.js.map +1 -0
- package/dist/workers/javascript/worker.d.ts +1 -0
- package/dist/workers/javascript/worker.js +5 -0
- package/dist/workers/javascript/worker.js.map +1 -0
- package/dist/workers/python/PythonWorker.d.ts +31 -0
- package/dist/workers/python/PythonWorker.js +106 -0
- package/dist/workers/python/PythonWorker.js.map +1 -0
- package/dist/workers/python/python_package.tar.gz +0 -0
- package/dist/workers/python/worker.d.ts +1 -0
- package/dist/workers/python/worker.js +5 -0
- package/dist/workers/python/worker.js.map +1 -0
- package/package.json +45 -42
- package/dist/workers/javascript/JavaScriptWorker.worker.d.ts +0 -2
- package/dist/workers/python/PythonWorker.worker.d.ts +0 -2
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable max-len */
|
|
3
|
+
// Empty strings are considered missing by i18n-extract
|
|
4
|
+
// Therefore the ready-key is an explicit space now, which is still invisible
|
|
5
|
+
const ENGLISH_TRANSLATION = {
|
|
6
|
+
"Papyros": "Papyros",
|
|
7
|
+
"code": "Code",
|
|
8
|
+
"code_placeholder": "Write your %{programmingLanguage} code here and click 'Run' to execute...",
|
|
9
|
+
"input": "Input",
|
|
10
|
+
"input_placeholder": {
|
|
11
|
+
"interactive": "Provide input and press enter to send",
|
|
12
|
+
"batch": "Provide all input required by your code here.\n" +
|
|
13
|
+
"You can enter multiple lines by pressing enter."
|
|
14
|
+
},
|
|
15
|
+
"input_disabled": "You can only provide input when your code requires it in interactive mode",
|
|
16
|
+
"output": "Output",
|
|
17
|
+
"output_placeholder": "The output of your code will appear here.",
|
|
18
|
+
"run": "Run",
|
|
19
|
+
"stop": "Stop",
|
|
20
|
+
"finished": "Code executed in %{time} s",
|
|
21
|
+
"interrupted": "Code interrupted after %{time} s",
|
|
22
|
+
"states": {
|
|
23
|
+
"running": "Running",
|
|
24
|
+
"stopping": "Stopping",
|
|
25
|
+
"loading": "Loading",
|
|
26
|
+
"awaiting_input": "Awaiting input",
|
|
27
|
+
"ready": " ",
|
|
28
|
+
},
|
|
29
|
+
"programming_language": "Programming language",
|
|
30
|
+
"programming_languages": {
|
|
31
|
+
"Python": "Python",
|
|
32
|
+
"JavaScript": "JavaScript"
|
|
33
|
+
},
|
|
34
|
+
"locales": {
|
|
35
|
+
"en": "English",
|
|
36
|
+
"nl": "Nederlands"
|
|
37
|
+
},
|
|
38
|
+
"switch_input_mode_to": {
|
|
39
|
+
"interactive": "Switch to interactive mode",
|
|
40
|
+
"batch": "Switch to batch input"
|
|
41
|
+
},
|
|
42
|
+
"enter": "Enter",
|
|
43
|
+
"examples": "Examples",
|
|
44
|
+
"dark_mode": "Dark mode",
|
|
45
|
+
"output_overflow": "Output truncated. No more results will be shown.",
|
|
46
|
+
"output_overflow_download": "Click here to download the results.",
|
|
47
|
+
"no_output": "The code did not produce any output.",
|
|
48
|
+
"service_worker_error": "The service worker failed to load.",
|
|
49
|
+
"launch_error": "Papyros failed to load. Do you want to reload?",
|
|
50
|
+
"loading": "Loading %{packages}.",
|
|
51
|
+
"run_modes": {
|
|
52
|
+
"doctest": "Run doctests"
|
|
53
|
+
},
|
|
54
|
+
"used_input": "This line has already been used as input.",
|
|
55
|
+
"used_input_with_prompt": "This line was used as input for the following prompt: %{prompt}"
|
|
56
|
+
};
|
|
57
|
+
const DUTCH_TRANSLATION = {
|
|
58
|
+
"Papyros": "Papyros",
|
|
59
|
+
"code": "Code",
|
|
60
|
+
"code_placeholder": "Schrijf hier je %{programmingLanguage} code en klik op 'Run' om uit te voeren...",
|
|
61
|
+
"input": "Invoer",
|
|
62
|
+
"input_placeholder": {
|
|
63
|
+
"interactive": "Geef invoer in en druk op enter",
|
|
64
|
+
"batch": "Geef hier alle invoer die je code nodig heeft vooraf in.\n" +
|
|
65
|
+
"Je kan verschillende lijnen ingeven door op enter te drukken."
|
|
66
|
+
},
|
|
67
|
+
"input_disabled": "Je kan enkel invoer invullen als je code erom vraagt in interactieve modus",
|
|
68
|
+
"output": "Uitvoer",
|
|
69
|
+
"output_placeholder": "Hier komt de uitvoer van je code.",
|
|
70
|
+
"run": "Run",
|
|
71
|
+
"stop": "Stop",
|
|
72
|
+
"states": {
|
|
73
|
+
"running": "Aan het uitvoeren",
|
|
74
|
+
"stopping": "Aan het stoppen",
|
|
75
|
+
"loading": "Aan het laden",
|
|
76
|
+
"awaiting_input": "Aan het wachten op invoer",
|
|
77
|
+
"ready": " ",
|
|
78
|
+
},
|
|
79
|
+
"finished": "Code uitgevoerd in %{time} s",
|
|
80
|
+
"interrupted": "Code onderbroken na %{time} s",
|
|
81
|
+
"programming_language": "Programmeertaal",
|
|
82
|
+
"programming_languages": {
|
|
83
|
+
"Python": "Python",
|
|
84
|
+
"JavaScript": "JavaScript"
|
|
85
|
+
},
|
|
86
|
+
"locales": {
|
|
87
|
+
"en": "English",
|
|
88
|
+
"nl": "Nederlands"
|
|
89
|
+
},
|
|
90
|
+
"switch_input_mode_to": {
|
|
91
|
+
"interactive": "Wisselen naar interactieve invoer",
|
|
92
|
+
"batch": "Geef invoer vooraf in"
|
|
93
|
+
},
|
|
94
|
+
"enter": "Enter",
|
|
95
|
+
"examples": "Voorbeelden",
|
|
96
|
+
"dark_mode": "Donkere modus",
|
|
97
|
+
"output_overflow": "Uitvoer ingekort. Er zullen geen nieuwe resultaten getoond worden.",
|
|
98
|
+
"output_overflow_download": "Klik hier om de resultaten te downloaden.",
|
|
99
|
+
"no_output": "De code produceerde geen uitvoer.",
|
|
100
|
+
"service_worker_error": "Er liep iets fout bij het laden van de service worker.",
|
|
101
|
+
"launch_error": "Er liep iets fout bij het laden van Papyros. Wil je herladen?",
|
|
102
|
+
"loading": "Bezig met het installeren van %{packages}.",
|
|
103
|
+
"run_modes": {
|
|
104
|
+
"doctest": "Run doctests"
|
|
105
|
+
},
|
|
106
|
+
"used_input": "Deze regel werd al gebruikt als invoer.",
|
|
107
|
+
"used_input_with_prompt": "Deze regel werd gebruikt als invoer voor de volgende vraag: %{prompt}"
|
|
108
|
+
};
|
|
109
|
+
// Override some default English phrases to also use capitalized text
|
|
110
|
+
const ENGLISH_PHRASES = {
|
|
111
|
+
// @codemirror/search
|
|
112
|
+
"Go to line": "Go to line",
|
|
113
|
+
"go": "OK",
|
|
114
|
+
"Find": "Find",
|
|
115
|
+
"Replace": "Replace",
|
|
116
|
+
"next": "Next",
|
|
117
|
+
"previous": "Previous",
|
|
118
|
+
"all": "All",
|
|
119
|
+
"match case": "match case",
|
|
120
|
+
"replace": "Replace",
|
|
121
|
+
"replace all": "Replace all",
|
|
122
|
+
"close": "Sluiten",
|
|
123
|
+
};
|
|
124
|
+
const DUTCH_PHRASES = {
|
|
125
|
+
// @codemirror/view
|
|
126
|
+
"Control character": "Controlekarakter",
|
|
127
|
+
// @codemirror/fold
|
|
128
|
+
"Folded lines": "Ingeklapte regels",
|
|
129
|
+
"Unfolded lines": "Uitgeklapte regels",
|
|
130
|
+
"to": "tot",
|
|
131
|
+
"folded code": "ingeklapte code",
|
|
132
|
+
"unfold": "uitklappen",
|
|
133
|
+
"Fold line": "Regel inklappen",
|
|
134
|
+
"Unfold line": "Regel uitklappen",
|
|
135
|
+
// @codemirror/search
|
|
136
|
+
"Go to line": "Spring naar regel",
|
|
137
|
+
"go": "OK",
|
|
138
|
+
"Find": "Zoeken",
|
|
139
|
+
"Replace": "Vervangen",
|
|
140
|
+
"next": "Volgende",
|
|
141
|
+
"previous": "Vorige",
|
|
142
|
+
"all": "Alle",
|
|
143
|
+
"match case": "hoofdlettergevoelig",
|
|
144
|
+
"replace": "Vervangen",
|
|
145
|
+
"replace all": "Alles vervangen",
|
|
146
|
+
"close": "Sluiten",
|
|
147
|
+
"current match": "huidige overeenkomst",
|
|
148
|
+
"on line": "op regel",
|
|
149
|
+
// @codemirror/lint
|
|
150
|
+
"Diagnostics": "Problemen",
|
|
151
|
+
"No diagnostics": "Geen problemen",
|
|
152
|
+
};
|
|
153
|
+
const TRANSLATIONS = {
|
|
154
|
+
en: { "Papyros": ENGLISH_TRANSLATION },
|
|
155
|
+
nl: { "Papyros": DUTCH_TRANSLATION }
|
|
156
|
+
};
|
|
157
|
+
const CODE_MIRROR_TRANSLATIONS = {
|
|
158
|
+
en: ENGLISH_PHRASES,
|
|
159
|
+
nl: DUTCH_PHRASES
|
|
160
|
+
};
|
|
161
|
+
// JS exports to allow use in TS and JS files
|
|
162
|
+
module.exports.TRANSLATIONS = TRANSLATIONS;
|
|
163
|
+
module.exports.CODE_MIRROR_TRANSLATIONS = CODE_MIRROR_TRANSLATIONS;
|
|
164
|
+
//# sourceMappingURL=Translations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Translations.js","sourceRoot":"","sources":["../src/Translations.js"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { CodeMirrorEditor } from "./CodeMirrorEditor";
|
|
2
|
+
import { UsedInputGutters } from "./Gutters";
|
|
3
|
+
/**
|
|
4
|
+
* Editor to handle and highlight user input
|
|
5
|
+
*/
|
|
6
|
+
export class BatchInputEditor extends CodeMirrorEditor {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(new Set([CodeMirrorEditor.PLACEHOLDER, CodeMirrorEditor.STYLE]), {
|
|
9
|
+
classes: ["papyros-input-editor", "_tw-overflow-auto",
|
|
10
|
+
"_tw-border-solid", "_tw-border-gray-200", "_tw-border-2", "_tw-rounded-lg",
|
|
11
|
+
"dark:_tw-bg-dark-mode-bg", "dark:_tw-border-dark-mode-content",
|
|
12
|
+
"focus:_tw-outline-none", "focus:_tw-ring-1", "focus:_tw-ring-blue-500"],
|
|
13
|
+
minHeight: "10vh",
|
|
14
|
+
maxHeight: "20vh",
|
|
15
|
+
theme: {}
|
|
16
|
+
});
|
|
17
|
+
this.usedInputGutters = new UsedInputGutters();
|
|
18
|
+
this.addExtension(this.usedInputGutters.toExtension());
|
|
19
|
+
}
|
|
20
|
+
getLastHighlightArgs() {
|
|
21
|
+
return this.lastHighlightArgs || {
|
|
22
|
+
running: false,
|
|
23
|
+
getInfo: lineNr => {
|
|
24
|
+
return {
|
|
25
|
+
lineNr,
|
|
26
|
+
on: false,
|
|
27
|
+
title: ""
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
onViewUpdate(v) {
|
|
33
|
+
super.onViewUpdate(v);
|
|
34
|
+
// Ensure that highlighting occurs after CodeMirrors internal update
|
|
35
|
+
// so that the style classes are not overwritten
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
this.highlight(this.getLastHighlightArgs());
|
|
38
|
+
}, 10);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Apply highlighting to the lines in the Editor
|
|
42
|
+
* @param {HightlightArgs} args Arguments for highlighting
|
|
43
|
+
* @param {Array<string>} highlightClasses HTML classes to use for consumed lines
|
|
44
|
+
*/
|
|
45
|
+
highlight(args, highlightClasses = ["_tw-bg-slate-200", "dark:_tw-bg-slate-500"]) {
|
|
46
|
+
this.lastHighlightArgs = args;
|
|
47
|
+
const { running, getInfo } = args;
|
|
48
|
+
let nextLineToUse = 0;
|
|
49
|
+
this.editorView.dom.querySelectorAll(".cm-line").forEach((line, i) => {
|
|
50
|
+
const info = getInfo(i + 1);
|
|
51
|
+
if (info.on) {
|
|
52
|
+
nextLineToUse += 1;
|
|
53
|
+
}
|
|
54
|
+
line.classList.toggle("cm-activeLine", running && i === nextLineToUse);
|
|
55
|
+
highlightClasses.forEach(className => {
|
|
56
|
+
line.classList.toggle(className, i !== nextLineToUse && info.on);
|
|
57
|
+
});
|
|
58
|
+
line.setAttribute("contenteditable", "" + (!running || !info.on));
|
|
59
|
+
this.usedInputGutters.setMarker(this.editorView, info);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @return {Array<string>} Array of valid user input
|
|
64
|
+
* Data in the last line that is not terminated by a newline is omitted
|
|
65
|
+
*/
|
|
66
|
+
getLines() {
|
|
67
|
+
const lines = this.editorView.state.doc.toString().split("\n");
|
|
68
|
+
return lines.slice(0, lines.length - 1);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=BatchInputEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchInputEditor.js","sourceRoot":"","sources":["../../src/editor/BatchInputEditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ProgrammingLanguage } from "../ProgrammingLanguage";
|
|
2
|
-
import { CompletionSource } from "@codemirror/autocomplete";
|
|
3
2
|
import { EditorView } from "@codemirror/view";
|
|
4
3
|
import { Diagnostic } from "@codemirror/lint";
|
|
5
4
|
import { CodeMirrorEditor } from "./CodeMirrorEditor";
|
|
@@ -24,10 +23,6 @@ export declare class CodeEditor extends CodeMirrorEditor {
|
|
|
24
23
|
* @param {ProgrammingLanguage} language The language to use
|
|
25
24
|
*/
|
|
26
25
|
setProgrammingLanguage(language: ProgrammingLanguage): void;
|
|
27
|
-
/**
|
|
28
|
-
* @param {CompletionSource} completionSource Function to obtain autocomplete results
|
|
29
|
-
*/
|
|
30
|
-
setCompletionSource(completionSource: CompletionSource): void;
|
|
31
26
|
/**
|
|
32
27
|
* @param {LintSource} lintSource Function to obtain linting results
|
|
33
28
|
*/
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/* eslint-disable valid-jsdoc */
|
|
2
|
+
import { ProgrammingLanguage } from "../ProgrammingLanguage";
|
|
3
|
+
import { t } from "../util/Util";
|
|
4
|
+
import { autocompletion, closeBrackets, closeBracketsKeymap, completionKeymap } from "@codemirror/autocomplete";
|
|
5
|
+
import { defaultKeymap, historyKeymap, indentWithTab, history, insertBlankLine } from "@codemirror/commands";
|
|
6
|
+
import { javascript } from "@codemirror/lang-javascript";
|
|
7
|
+
import { python } from "@codemirror/lang-python";
|
|
8
|
+
import { defaultHighlightStyle, indentUnit, foldGutter, indentOnInput, bracketMatching, foldKeymap, syntaxHighlighting } from "@codemirror/language";
|
|
9
|
+
import { highlightSelectionMatches, searchKeymap } from "@codemirror/search";
|
|
10
|
+
import { EditorState } from "@codemirror/state";
|
|
11
|
+
import { oneDarkHighlightStyle } from "@codemirror/theme-one-dark";
|
|
12
|
+
import { showPanel, lineNumbers, highlightActiveLineGutter, highlightSpecialChars, drawSelection, rectangularSelection, highlightActiveLine, keymap } from "@codemirror/view";
|
|
13
|
+
import { linter, lintGutter, lintKeymap } from "@codemirror/lint";
|
|
14
|
+
import { CodeMirrorEditor } from "./CodeMirrorEditor";
|
|
15
|
+
import { darkTheme } from "./DarkTheme";
|
|
16
|
+
/**
|
|
17
|
+
* Component that provides useful features to users writing code
|
|
18
|
+
*/
|
|
19
|
+
export class CodeEditor extends CodeMirrorEditor {
|
|
20
|
+
/**
|
|
21
|
+
* Construct a new CodeEditor
|
|
22
|
+
* @param {Function} onRunRequest Callback for when the user wants to run the code
|
|
23
|
+
* @param {string} initialCode The initial code to display
|
|
24
|
+
* @param {number} indentLength The length in spaces for the indent unit
|
|
25
|
+
*/
|
|
26
|
+
constructor(onRunRequest, initialCode = "", indentLength = 4) {
|
|
27
|
+
super(new Set([
|
|
28
|
+
CodeEditor.PROGRAMMING_LANGUAGE, CodeEditor.INDENTATION,
|
|
29
|
+
CodeEditor.PANEL, CodeEditor.AUTOCOMPLETION, CodeEditor.LINTING
|
|
30
|
+
]), {
|
|
31
|
+
classes: ["papyros-code-editor", "_tw-overflow-auto",
|
|
32
|
+
"_tw-border-solid", "_tw-border-gray-200", "_tw-border-2",
|
|
33
|
+
"_tw-rounded-lg", "dark:_tw-border-dark-mode-content"],
|
|
34
|
+
minHeight: "20vh",
|
|
35
|
+
maxHeight: "72vh",
|
|
36
|
+
theme: {}
|
|
37
|
+
});
|
|
38
|
+
this.addExtension([
|
|
39
|
+
keymap.of([
|
|
40
|
+
{
|
|
41
|
+
key: "Mod-Enter", run: () => {
|
|
42
|
+
onRunRequest();
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
// The original Ctrl-Enter keybind gets assigned to Shift-Enter
|
|
47
|
+
{
|
|
48
|
+
key: "Shift-Enter", run: insertBlankLine
|
|
49
|
+
}
|
|
50
|
+
]),
|
|
51
|
+
...CodeEditor.getExtensions()
|
|
52
|
+
]);
|
|
53
|
+
this.setText(initialCode);
|
|
54
|
+
this.setIndentLength(indentLength);
|
|
55
|
+
}
|
|
56
|
+
setDarkMode(darkMode) {
|
|
57
|
+
let styleExtensions = [];
|
|
58
|
+
if (darkMode) {
|
|
59
|
+
styleExtensions = [darkTheme, syntaxHighlighting(oneDarkHighlightStyle)];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
styleExtensions = syntaxHighlighting(defaultHighlightStyle);
|
|
63
|
+
}
|
|
64
|
+
this.reconfigure([CodeMirrorEditor.STYLE, styleExtensions]);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* @param {ProgrammingLanguage} language The language to use
|
|
68
|
+
*/
|
|
69
|
+
setProgrammingLanguage(language) {
|
|
70
|
+
this.reconfigure([CodeEditor.PROGRAMMING_LANGUAGE, CodeEditor.getLanguageSupport(language)]);
|
|
71
|
+
this.setPlaceholder(t("Papyros.code_placeholder", { programmingLanguage: language }));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @param {LintSource} lintSource Function to obtain linting results
|
|
75
|
+
*/
|
|
76
|
+
setLintingSource(lintSource) {
|
|
77
|
+
this.reconfigure([
|
|
78
|
+
CodeEditor.LINTING,
|
|
79
|
+
linter(lintSource)
|
|
80
|
+
]);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* @param {number} indentLength The number of spaces to use for indentation
|
|
84
|
+
*/
|
|
85
|
+
setIndentLength(indentLength) {
|
|
86
|
+
this.reconfigure([CodeEditor.INDENTATION, indentUnit.of(CodeEditor.getIndentUnit(indentLength))]);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* @param {HTMLElement} panel The panel to display at the bottom of the editor
|
|
90
|
+
*/
|
|
91
|
+
setPanel(panel) {
|
|
92
|
+
this.reconfigure([CodeEditor.PANEL, showPanel.of(() => {
|
|
93
|
+
return { dom: panel };
|
|
94
|
+
})]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* @param {number} indentLength The amount of spaces to use
|
|
98
|
+
* @return {string} The indentation unit to be used by CodeMirror
|
|
99
|
+
*/
|
|
100
|
+
static getIndentUnit(indentLength) {
|
|
101
|
+
return new Array(indentLength).fill(" ").join("");
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* @param {ProgrammingLanguage} language The language to support
|
|
105
|
+
* @return {LanguageSupport} CodeMirror LanguageSupport for the language
|
|
106
|
+
*/
|
|
107
|
+
static getLanguageSupport(language) {
|
|
108
|
+
switch (language) {
|
|
109
|
+
case ProgrammingLanguage.Python: {
|
|
110
|
+
return python();
|
|
111
|
+
}
|
|
112
|
+
case ProgrammingLanguage.JavaScript: {
|
|
113
|
+
return javascript();
|
|
114
|
+
}
|
|
115
|
+
default: {
|
|
116
|
+
throw new Error(`${language} is not yet supported.`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* - line numbers
|
|
122
|
+
* - special character highlighting
|
|
123
|
+
* - the undo history
|
|
124
|
+
* - a fold gutter
|
|
125
|
+
* - custom selection drawing
|
|
126
|
+
* - multiple selections
|
|
127
|
+
* - reindentation on input
|
|
128
|
+
* - bracket matching
|
|
129
|
+
* - bracket closing
|
|
130
|
+
* - autocompletion
|
|
131
|
+
* - rectangular selection
|
|
132
|
+
* - active line highlighting
|
|
133
|
+
* - active line gutter highlighting
|
|
134
|
+
* - selection match highlighting
|
|
135
|
+
* - gutter for linting
|
|
136
|
+
* Keymaps:
|
|
137
|
+
* - the default command bindings
|
|
138
|
+
* - bracket closing
|
|
139
|
+
* - searching
|
|
140
|
+
* - linting
|
|
141
|
+
* - completion
|
|
142
|
+
* - indenting with tab
|
|
143
|
+
* @return {Array<Extension} Default extensions to use
|
|
144
|
+
*/
|
|
145
|
+
static getExtensions() {
|
|
146
|
+
return [
|
|
147
|
+
lintGutter(),
|
|
148
|
+
lineNumbers(),
|
|
149
|
+
highlightSpecialChars(),
|
|
150
|
+
history(),
|
|
151
|
+
foldGutter(),
|
|
152
|
+
drawSelection(),
|
|
153
|
+
EditorState.allowMultipleSelections.of(true),
|
|
154
|
+
indentOnInput(),
|
|
155
|
+
bracketMatching(),
|
|
156
|
+
closeBrackets(),
|
|
157
|
+
autocompletion(),
|
|
158
|
+
rectangularSelection(),
|
|
159
|
+
highlightActiveLine(),
|
|
160
|
+
highlightActiveLineGutter(),
|
|
161
|
+
highlightSelectionMatches(),
|
|
162
|
+
keymap.of([
|
|
163
|
+
...closeBracketsKeymap,
|
|
164
|
+
...defaultKeymap,
|
|
165
|
+
...searchKeymap,
|
|
166
|
+
...historyKeymap,
|
|
167
|
+
...foldKeymap,
|
|
168
|
+
...completionKeymap,
|
|
169
|
+
...lintKeymap,
|
|
170
|
+
indentWithTab
|
|
171
|
+
]),
|
|
172
|
+
];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
CodeEditor.PROGRAMMING_LANGUAGE = "programming_language";
|
|
176
|
+
CodeEditor.INDENTATION = "indentation";
|
|
177
|
+
CodeEditor.PANEL = "panel";
|
|
178
|
+
CodeEditor.AUTOCOMPLETION = "autocompletion";
|
|
179
|
+
CodeEditor.LINTING = "linting";
|
|
180
|
+
//# sourceMappingURL=CodeEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeEditor.js","sourceRoot":"","sources":["../../src/editor/CodeEditor.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { Compartment, EditorState, StateEffect } from "@codemirror/state";
|
|
2
|
+
import { EditorView, placeholder } from "@codemirror/view";
|
|
3
|
+
import { Renderable, renderWithOptions } from "../util/Rendering";
|
|
4
|
+
import { darkTheme } from "./DarkTheme";
|
|
5
|
+
import { CODE_MIRROR_TRANSLATIONS } from "../Translations";
|
|
6
|
+
import I18n from "i18n-js";
|
|
7
|
+
import { cursorDocEnd } from "@codemirror/commands";
|
|
8
|
+
/**
|
|
9
|
+
* Base class for Editors implemented using CodeMirror 6
|
|
10
|
+
* https://codemirror.net/6/
|
|
11
|
+
*/
|
|
12
|
+
export class CodeMirrorEditor extends Renderable {
|
|
13
|
+
/**
|
|
14
|
+
* @param {Set<string>} compartments Identifiers for configurable extensions
|
|
15
|
+
* @param {EditorStyling} styling Data to style this editor
|
|
16
|
+
*/
|
|
17
|
+
constructor(compartments, styling) {
|
|
18
|
+
super();
|
|
19
|
+
this.styling = styling;
|
|
20
|
+
this.listenerTimeouts = new Map();
|
|
21
|
+
// Ensure default compartments are present
|
|
22
|
+
compartments.add(CodeMirrorEditor.STYLE);
|
|
23
|
+
compartments.add(CodeMirrorEditor.PLACEHOLDER);
|
|
24
|
+
compartments.add(CodeMirrorEditor.THEME);
|
|
25
|
+
compartments.add(CodeMirrorEditor.LANGUAGE);
|
|
26
|
+
this.compartments = new Map();
|
|
27
|
+
const configurableExtensions = [];
|
|
28
|
+
compartments.forEach(opt => {
|
|
29
|
+
const compartment = new Compartment();
|
|
30
|
+
this.compartments.set(opt, compartment);
|
|
31
|
+
configurableExtensions.push(compartment.of([]));
|
|
32
|
+
});
|
|
33
|
+
this.editorView = new EditorView({
|
|
34
|
+
state: EditorState.create({
|
|
35
|
+
extensions: [
|
|
36
|
+
configurableExtensions,
|
|
37
|
+
EditorView.updateListener.of(this.onViewUpdate.bind(this))
|
|
38
|
+
]
|
|
39
|
+
})
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
onViewUpdate(v) {
|
|
43
|
+
if (v.docChanged) {
|
|
44
|
+
this.handleChange();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* @param {Extension} extension The extension to add to the Editor
|
|
49
|
+
*/
|
|
50
|
+
addExtension(extension) {
|
|
51
|
+
this.editorView.dispatch({
|
|
52
|
+
effects: StateEffect.appendConfig.of(extension)
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @return {string} The text within the editor
|
|
57
|
+
*/
|
|
58
|
+
getText() {
|
|
59
|
+
return this.editorView.state.doc.toString();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @param {string} text The new value to be shown in the editor
|
|
63
|
+
*/
|
|
64
|
+
setText(text) {
|
|
65
|
+
this.editorView.dispatch({ changes: { from: 0, to: this.getText().length, insert: text } });
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Helper method to dispatch configuration changes at runtime
|
|
69
|
+
* @param {Array<[Option, Extension]>} items Array of items to reconfigure
|
|
70
|
+
* The option indicates the relevant compartment
|
|
71
|
+
* The extension indicates the new configuration
|
|
72
|
+
*/
|
|
73
|
+
reconfigure(...items) {
|
|
74
|
+
this.editorView.dispatch({
|
|
75
|
+
effects: items.map(([opt, ext]) => this.compartments.get(opt).reconfigure(ext))
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Apply focus to the Editor
|
|
80
|
+
*/
|
|
81
|
+
focus() {
|
|
82
|
+
this.editorView.focus();
|
|
83
|
+
cursorDocEnd(this.editorView);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @param {string} placeholderValue The contents of the placeholder
|
|
87
|
+
*/
|
|
88
|
+
setPlaceholder(placeholderValue) {
|
|
89
|
+
this.reconfigure([
|
|
90
|
+
CodeMirrorEditor.PLACEHOLDER,
|
|
91
|
+
placeholder(placeholderValue)
|
|
92
|
+
]);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @param {boolean} darkMode Whether to use dark mode
|
|
96
|
+
*/
|
|
97
|
+
setDarkMode(darkMode) {
|
|
98
|
+
let styleExtensions = [];
|
|
99
|
+
if (darkMode) {
|
|
100
|
+
styleExtensions = [darkTheme];
|
|
101
|
+
}
|
|
102
|
+
this.reconfigure([CodeMirrorEditor.STYLE, styleExtensions]);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Override the style used by this Editor
|
|
106
|
+
* @param {Partial<EditorStyling>} styling Object with keys of EditorStyling to override styles
|
|
107
|
+
*/
|
|
108
|
+
setStyling(styling) {
|
|
109
|
+
Object.assign(this.styling, styling);
|
|
110
|
+
this.reconfigure([
|
|
111
|
+
CodeMirrorEditor.THEME,
|
|
112
|
+
EditorView.theme(Object.assign({ ".cm-scroller": { overflow: "auto" }, "&": {
|
|
113
|
+
"maxHeight": this.styling.maxHeight, "height": "100%",
|
|
114
|
+
"font-size": "14px" // use proper size to align gutters with editor
|
|
115
|
+
}, ".cm-gutter,.cm-content": { minHeight: this.styling.minHeight }, ".cm-button": {
|
|
116
|
+
"background-color": "#455A64",
|
|
117
|
+
"color": "white", "background-image": "none"
|
|
118
|
+
} }, (this.styling.theme || {})))
|
|
119
|
+
]);
|
|
120
|
+
}
|
|
121
|
+
_render(options) {
|
|
122
|
+
this.setStyling(this.styling);
|
|
123
|
+
this.setDarkMode(options.darkMode || false);
|
|
124
|
+
this.reconfigure([
|
|
125
|
+
CodeMirrorEditor.LANGUAGE,
|
|
126
|
+
EditorState.phrases.of(CODE_MIRROR_TRANSLATIONS[I18n.locale])
|
|
127
|
+
]);
|
|
128
|
+
const wrappingDiv = document.createElement("div");
|
|
129
|
+
wrappingDiv.classList.add(...this.styling.classes);
|
|
130
|
+
wrappingDiv.replaceChildren(this.editorView.dom);
|
|
131
|
+
renderWithOptions(options, wrappingDiv);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Process the changes by informing the listeners of the new contents
|
|
135
|
+
*/
|
|
136
|
+
handleChange() {
|
|
137
|
+
const currentDoc = this.getText();
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
this.listenerTimeouts.forEach((timeoutData, listener) => {
|
|
140
|
+
// Clear existing scheduled calls
|
|
141
|
+
if (timeoutData.timeout !== null) {
|
|
142
|
+
clearTimeout(timeoutData.timeout);
|
|
143
|
+
}
|
|
144
|
+
timeoutData.lastCalled = now;
|
|
145
|
+
if (listener.delay && listener.delay > 0) {
|
|
146
|
+
timeoutData.timeout = setTimeout(() => {
|
|
147
|
+
timeoutData.timeout = null;
|
|
148
|
+
listener.onChange(currentDoc);
|
|
149
|
+
}, listener.delay);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
listener.onChange(currentDoc);
|
|
153
|
+
}
|
|
154
|
+
timeoutData.lastCalled = now;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* @param {DocChangeListener} changeListener Listener that performs actions on the new contents
|
|
159
|
+
*/
|
|
160
|
+
onChange(changeListener) {
|
|
161
|
+
this.listenerTimeouts.set(changeListener, { timeout: null, lastCalled: 0 });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
CodeMirrorEditor.STYLE = "style";
|
|
165
|
+
CodeMirrorEditor.PLACEHOLDER = "placeholder";
|
|
166
|
+
CodeMirrorEditor.THEME = "theme";
|
|
167
|
+
CodeMirrorEditor.LANGUAGE = "language";
|
|
168
|
+
//# sourceMappingURL=CodeMirrorEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeMirrorEditor.js","sourceRoot":"","sources":["../../src/editor/CodeMirrorEditor.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|