2019-02-09 06:00:30 +00:00
|
|
|
// Setup editros
|
|
|
|
const grammar = ace.edit("grammar-editor");
|
|
|
|
grammar.setShowPrintMargin(false);
|
2019-02-27 14:04:58 +00:00
|
|
|
grammar.setValue(localStorage.getItem('grammarText') || '');
|
2019-02-09 06:00:30 +00:00
|
|
|
grammar.moveCursorTo(0, 0);
|
|
|
|
|
|
|
|
const code = ace.edit("code-editor");
|
|
|
|
code.setShowPrintMargin(false);
|
2019-02-27 14:04:58 +00:00
|
|
|
code.setValue(localStorage.getItem('codeText') || '');
|
2019-02-09 06:00:30 +00:00
|
|
|
code.moveCursorTo(0, 0);
|
|
|
|
|
|
|
|
const codeAst = ace.edit("code-ast");
|
|
|
|
codeAst.setShowPrintMargin(false);
|
|
|
|
codeAst.setOptions({
|
|
|
|
readOnly: true,
|
|
|
|
highlightActiveLine: false,
|
|
|
|
highlightGutterLine: false
|
|
|
|
})
|
|
|
|
codeAst.renderer.$cursorLayer.element.style.opacity=0;
|
|
|
|
|
|
|
|
const codeAstOptimized = ace.edit("code-ast-optimized");
|
|
|
|
codeAstOptimized.setShowPrintMargin(false);
|
|
|
|
codeAstOptimized.setOptions({
|
|
|
|
readOnly: true,
|
|
|
|
highlightActiveLine: false,
|
|
|
|
highlightGutterLine: false
|
|
|
|
})
|
|
|
|
codeAstOptimized.renderer.$cursorLayer.element.style.opacity=0;
|
|
|
|
|
2020-05-26 22:30:19 +00:00
|
|
|
$('#opt_mode').val(localStorage.getItem('optimazationMode') || 'all');
|
2020-05-25 21:31:22 +00:00
|
|
|
$('#opt_rules').val(localStorage.getItem('optimazationRules'));
|
2020-05-25 02:14:43 +00:00
|
|
|
|
2019-02-09 06:00:30 +00:00
|
|
|
function generateErrorListHTML(errors) {
|
|
|
|
let html = '<ul>';
|
|
|
|
|
|
|
|
html += $.map(errors, function (x) {
|
|
|
|
return '<li data-ln="' + x.ln + '" data-col="' + x.col + '"><span>' + x.ln + ':' + x.col + '</span> <span>' + x.msg + '</span></li>';
|
|
|
|
}).join('');
|
|
|
|
|
|
|
|
html += '<ul>';
|
|
|
|
|
|
|
|
return html;
|
|
|
|
}
|
|
|
|
|
|
|
|
function parse() {
|
|
|
|
const $grammarValidation = $('#grammar-validation');
|
|
|
|
const $grammarInfo = $('#grammar-info');
|
|
|
|
const grammarText = grammar.getValue();
|
|
|
|
|
|
|
|
const $codeValidation = $('#code-validation');
|
|
|
|
const $codeInfo = $('#code-info');
|
|
|
|
const codeText = code.getValue();
|
|
|
|
|
2020-05-25 21:31:22 +00:00
|
|
|
const optimazationMode = $('#opt_mode').val();
|
|
|
|
const optimazationRules = $('#opt_rules').val();
|
2020-05-25 02:14:43 +00:00
|
|
|
|
2019-02-09 06:00:30 +00:00
|
|
|
localStorage.setItem('grammarText', grammarText);
|
|
|
|
localStorage.setItem('codeText', codeText);
|
2020-05-25 21:31:22 +00:00
|
|
|
localStorage.setItem('optimazationMode', optimazationMode);
|
|
|
|
localStorage.setItem('optimazationRules', optimazationRules);
|
2019-02-09 06:00:30 +00:00
|
|
|
|
|
|
|
$grammarInfo.html('');
|
|
|
|
$grammarValidation.hide();
|
|
|
|
$codeInfo.html('');
|
|
|
|
$codeValidation.hide();
|
|
|
|
codeAst.setValue('');
|
|
|
|
codeAstOptimized.setValue('');
|
|
|
|
|
|
|
|
if (grammarText.length === 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-05-25 21:31:22 +00:00
|
|
|
const mode = optimazationMode == 'all';
|
|
|
|
const data = JSON.parse(Module.lint(grammarText, codeText, mode, optimazationRules));
|
2019-02-09 06:00:30 +00:00
|
|
|
|
|
|
|
const isValid = data.grammar.length === 0;
|
|
|
|
if (isValid) {
|
|
|
|
$grammarValidation.removeClass('editor-validation-invalid').text('Valid').show();
|
|
|
|
|
|
|
|
const isValid = data.code.length === 0;
|
|
|
|
if (isValid) {
|
|
|
|
codeAst.insert(data.ast);
|
|
|
|
codeAstOptimized.insert(data.astOptimized);
|
|
|
|
$codeValidation.removeClass('editor-validation-invalid').text('Valid').show();
|
|
|
|
} else {
|
|
|
|
const html = generateErrorListHTML(data.code);
|
|
|
|
$codeInfo.html(html);
|
|
|
|
$codeValidation.addClass('editor-validation-invalid').text('Invalid').show();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
const html = generateErrorListHTML(data.grammar);
|
|
|
|
$grammarInfo.html(html);
|
|
|
|
$grammarValidation.addClass('editor-validation-invalid').text('Invalid').show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Event handing for text editiing
|
|
|
|
let timer;
|
|
|
|
function setupTimer() {
|
|
|
|
clearTimeout(timer);
|
|
|
|
timer = setTimeout(parse, 750);
|
|
|
|
};
|
|
|
|
grammar.getSession().on('change', setupTimer);
|
|
|
|
code.getSession().on('change', setupTimer);
|
|
|
|
|
|
|
|
// Event handing in the info area
|
|
|
|
function makeOnClickInInfo(editor) {
|
|
|
|
return function () {
|
|
|
|
const el = $(this);
|
|
|
|
editor.navigateTo(el.data('ln') - 1, el.data('col') - 1);
|
|
|
|
editor.focus();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
$('#grammar-info').on('click', 'li', makeOnClickInInfo(grammar));
|
|
|
|
$('#code-info').on('click', 'li', makeOnClickInInfo(code));
|
|
|
|
|
2020-05-25 02:14:43 +00:00
|
|
|
// Event handing in the AST optimazation
|
2020-05-25 21:31:22 +00:00
|
|
|
$('#opt_mode').on('change', setupTimer);
|
|
|
|
$('#opt_rules').on('keyup', setupTimer);
|
2020-05-25 02:14:43 +00:00
|
|
|
|
2019-02-09 06:00:30 +00:00
|
|
|
// Show page
|
|
|
|
$('#main').css({
|
|
|
|
'display': 'flex',
|
|
|
|
});
|
|
|
|
|
|
|
|
// WebAssembly
|
|
|
|
var Module = {
|
|
|
|
onRuntimeInitialized: function() {
|
|
|
|
// Initial parse
|
|
|
|
parse();
|
|
|
|
}
|
|
|
|
};
|