@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.
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,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