aboutsummaryrefslogtreecommitdiff
path: root/www/index.js
blob: 2665873dd17a75a2a3d4425d459d9526cdb5a57f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import {SynNode, put_cst} from "cstea";
import {EditorState, EditorView, basicSetup} from "@codemirror/basic-setup"
import {rust} from "@codemirror/lang-rust"

let cst = document.getElementById('cst');
let view = new EditorView({
  state: EditorState.create({
    extensions: [
      basicSetup,
      rust(),
      EditorView.updateListener.of((v) => {
        if (v.docChanged) {
          doRender()
        }
      })
    ]
  }),
  parent: document.getElementById('source-code')
})

function render_cst(synRoot) {
  cst.innerText += "\n" + synRoot.to_string();
  if (!synRoot.is_token()) {
    synRoot.children().forEach(node => {
      render_cst(node);
      return;
    });
  } else {
    return;
  }
}

function render_err(errorList) {
  cst.innerText = "";
  errorList.forEach(err => {
    cst.innerText += "\n" + err.to_string();
  });
}

function doRender() {
  let sourceFile = view.state.doc.toString();;
  cst.innerText = "";
  try {
    var synRoot = SynNode.from_str(sourceFile);
    render_cst(synRoot);
  } catch (synError) {
    render_err(synError)
  }
}