Added the new Sieve parser as script validator

This commit is contained in:
the-djmaze 2022-03-11 13:41:13 +01:00
parent 9bae77bfa1
commit 42813b90dd
3 changed files with 19 additions and 5 deletions

View file

@ -168,7 +168,7 @@ export const parseScript = (script, name = 'script.sieve') => {
error = message => {
// throw new SyntaxError(message + ' at ' + regex.lastIndex + ' line ' + line, name, line)
throw new SyntaxError(message + ' on line ' + line
+ ' around: ' + script.substr(regex.lastIndex - 10, 20).replace(/\r\n/g, '\\r\\n'), name, line)
+ ' around:\n\n' + script.substr(regex.lastIndex - 20, 30), name, line)
},
pushArg = arg => {
command || error('Argument not part of command');

View file

@ -3,7 +3,7 @@ import { SieveScriptModel } from 'Sieve/Model/Script';
import { FilterPopupView } from 'Sieve/View/Filter';
//import { parseScript } from 'Sieve/Parser';
import { parseScript } from 'Sieve/Parser';
import {
capa,
@ -18,7 +18,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView {
this.addObservables({
saveError: false,
saveErrorText: '',
errorText: '',
rawActive: false,
allowToggle: false,
script: null
@ -30,6 +30,15 @@ export class SieveScriptPopupView extends rl.pluginPopupView {
this.filterForDeletion = ko.observable(null).askDeleteHelper();
}
validateScript() {
try {
this.errorText('');
parseScript(this.script().body());
} catch (e) {
this.errorText(e.message);
}
}
saveScript() {
let self = this,
script = self.script();
@ -45,6 +54,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView {
self.saving = true;
self.saveError(false);
self.errorText('');
if (self.allowToggle()) {
script.body(script.filtersToRaw());
@ -56,7 +66,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView {
if (iError) {
self.saveError(true);
self.saveErrorText((data && data.ErrorMessageAdditional) || getNotification(iError));
self.errorText((data && data.ErrorMessageAdditional) || getNotification(iError));
} else {
script.exists() || scripts.push(script);
script.exists(true);
@ -125,6 +135,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView {
this.rawActive(raw);
this.allowToggle(!raw);
this.saveError(false);
this.errorText('');
/*
// TODO: Sieve GUI

View file

@ -17,7 +17,7 @@
</div>
<div class="alert g-ui-user-select-none" data-bind="visible: hasChanges" data-icon="⚠" data-i18n="POPUPS_SIEVE_SCRIPT/CHANGES_NEED_TO_BE_SAVED_DESC"></div>
<div class="alert alert-error g-ui-user-select-none" data-bind="visible: $root.saveError, text: $root.saveErrorText" data-icon="⚠"></div>
<div class="alert alert-error g-ui-user-select-none" style="white-space:pre" data-bind="visible: $root.errorText, text: $root.errorText" data-icon="⚠"></div>
<div class="control-group" data-bind="visible: $root.rawActive">
<div>
@ -64,6 +64,9 @@
<a class="btn" data-bind="visible: $root.allowToggle, click: function() { $root.toggleFiltersRaw(); }, css: {'active': $root.rawActive }" data-i18n="[title]POPUPS_SIEVE_SCRIPT/BUTTON_RAW_SCRIPT">
<i class="icon-file-code"></i>
</a>
<a class="btn" data-bind="visible: $root.rawActive, click: function() { $root.validateScript(); }">
Validate
</a>
<a class="btn buttonSave" data-bind="visible: hasChanges, click: function() { $root.saveScript(); }, css: {'btn-danger': $root.saveError}">
<i class="fontastic" data-bind="css: {'icon-spinner': $root.saving}">💾</i>
<span data-i18n="GLOBAL/SAVE"></span>