diff options
Diffstat (limited to 'www/index.js')
m--------- | www | 0 | ||||
-rw-r--r-- | www/index.js | 49 |
2 files changed, 49 insertions, 0 deletions
diff --git a/www b/www deleted file mode 160000 | |||
Subproject 9ac3dff9ebea4675e5c478bcdcbc0fd547d1529 | |||
diff --git a/www/index.js b/www/index.js new file mode 100644 index 0000000..2665873 --- /dev/null +++ b/www/index.js | |||
@@ -0,0 +1,49 @@ | |||
1 | import {SynNode, put_cst} from "cstea"; | ||
2 | import {EditorState, EditorView, basicSetup} from "@codemirror/basic-setup" | ||
3 | import {rust} from "@codemirror/lang-rust" | ||
4 | |||
5 | let cst = document.getElementById('cst'); | ||
6 | let view = new EditorView({ | ||
7 | state: EditorState.create({ | ||
8 | extensions: [ | ||
9 | basicSetup, | ||
10 | rust(), | ||
11 | EditorView.updateListener.of((v) => { | ||
12 | if (v.docChanged) { | ||
13 | doRender() | ||
14 | } | ||
15 | }) | ||
16 | ] | ||
17 | }), | ||
18 | parent: document.getElementById('source-code') | ||
19 | }) | ||
20 | |||
21 | function render_cst(synRoot) { | ||
22 | cst.innerText += "\n" + synRoot.to_string(); | ||
23 | if (!synRoot.is_token()) { | ||
24 | synRoot.children().forEach(node => { | ||
25 | render_cst(node); | ||
26 | return; | ||
27 | }); | ||
28 | } else { | ||
29 | return; | ||
30 | } | ||
31 | } | ||
32 | |||
33 | function render_err(errorList) { | ||
34 | cst.innerText = ""; | ||
35 | errorList.forEach(err => { | ||
36 | cst.innerText += "\n" + err.to_string(); | ||
37 | }); | ||
38 | } | ||
39 | |||
40 | function doRender() { | ||
41 | let sourceFile = view.state.doc.toString();; | ||
42 | cst.innerText = ""; | ||
43 | try { | ||
44 | var synRoot = SynNode.from_str(sourceFile); | ||
45 | render_cst(synRoot); | ||
46 | } catch (synError) { | ||
47 | render_err(synError) | ||
48 | } | ||
49 | } | ||