mirror of
https://codeberg.org/uzu/strudel
synced 2026-10-15 20:36:29 -04:00
44 lines
1.1 KiB
JavaScript
44 lines
1.1 KiB
JavaScript
import Parser from 'web-tree-sitter';
|
|
import treeSitterWasm from 'web-tree-sitter/tree-sitter.wasm?url';
|
|
import grammarWasm from 'tree-sitter-haskell/tree-sitter-haskell.wasm?url';
|
|
|
|
let base;
|
|
export function setBase(path) {
|
|
base = path;
|
|
}
|
|
|
|
let isReady = false,
|
|
parser;
|
|
async function _loadParser() {
|
|
await Parser.init({
|
|
locateFile(scriptName, scriptDirectory) {
|
|
if (base) {
|
|
return `${base}${scriptName}`;
|
|
}
|
|
return treeSitterWasm;
|
|
},
|
|
});
|
|
parser = new Parser();
|
|
let grammarUrl = base ? `${base}tree-sitter-haskell.wasm` : grammarWasm;
|
|
const Lang = await Parser.Language.load(grammarUrl);
|
|
parser.setLanguage(Lang);
|
|
isReady = true;
|
|
return parser;
|
|
}
|
|
|
|
let parserLoaded;
|
|
export function loadParser() {
|
|
if (!parserLoaded) {
|
|
parserLoaded = _loadParser();
|
|
}
|
|
return parserLoaded;
|
|
}
|
|
|
|
export function parse(code) {
|
|
if (!isReady) {
|
|
throw new Error('hs2js not ready. await loadParser before calling evaluate or parse functions');
|
|
}
|
|
// for some reason, the parser doesn't like new lines..
|
|
return parser.parse(code.replaceAll('\n\n', '~~~~').replaceAll('\n', ' ').replaceAll('~~~~', ' \n'));
|
|
}
|