2fd531e253
* Add: implement new linter system * Refactor: pull out editor worker * Switch to new linter and worker * Enable eslint cache * Fix: undefined error * Windows compatibility * Fix: refresh linter if the editor.linter changes * Add: stylelint * Add: getStylelintRules, getCsslintRules * Fix: logic to get correct linter * WIP: linter-report * Fix: toggle hidden state * Add: matain the order of lint report for section editor * Add: unhook event * Add: gotoLintIssue * Fix: shouldn't delete rule.init * Add: linter-help-dialog * Drop linterConfig * Add: linter-config-dialog, cacheFn * Add: use cacheFn * Drop lint.js * Add: refresh. Fix report order * Fix: hide empty table * Add: updateCount. Fix table caption * Switch to new linter/worker * Fix: remove unneeded comment * Fix: cacheFn -> cacheFirstCall * Fix: use cacheFirstCall * Fix: cache metaIndex * Fix: i < trs.length * Fix: drop isEmpty * Fix: expose some simple states to global * Fix: return object code style * Fix: use proxy to reflect API * Fix: eslint-disable-line -> eslint-disable-next-line * Fix: requestId -> id * Fix: one-liner * Fix: one-liner * Fix: move dom event block to top * Fix: pending -> pendingResponse * Fix: onSuccess -> onUpdated * Fix: optimize row removing when i === 0 * Fix: hook/unhook -> enableForEditor/disableForEditor * Fix: linter.refresh -> linter.run * Fix: some shadowing * Fix: simplify getAnnotations * Fix: cacheFirstCall -> memoize * Fix: table.update -> table.updateCaption * Fix: unneeded reassign * Fix: callbacks -> listeners * Fix: don't compose but extend * Refactor: replace linter modules with linter-defaults and linter-engines * Fix: implement linter fallbacks * Fix: linter.onChange -> linter.onLintingUpdated * Fix: cms -> tables * Fix: parseMozFormat is not called correctly * Move csslint-loader to background * Fix: watch config changes * Fix: switch to LINTER_DEFAULTS * Fix: csslint-loader -> parserlib-loader
48 lines
1.1 KiB
JavaScript
48 lines
1.1 KiB
JavaScript
/* global linter */
|
|
'use strict';
|
|
|
|
function createMetaCompiler(cm) {
|
|
const updateListeners = [];
|
|
let meta = null;
|
|
let metaIndex = null;
|
|
let cache = [];
|
|
|
|
linter.register((text, options, _cm) => {
|
|
if (_cm !== cm) {
|
|
return;
|
|
}
|
|
const match = text.match(/\/\*\s*==userstyle==[\s\S]*?==\/userstyle==\s*\*\//i);
|
|
if (!match) {
|
|
return [];
|
|
}
|
|
if (match[0] === meta && match.index === metaIndex) {
|
|
return cache;
|
|
}
|
|
return API.parseUsercss({sourceCode: match[0], metaOnly: true})
|
|
.then(result => result.usercssData)
|
|
.then(result => {
|
|
for (const cb of updateListeners) {
|
|
cb(result);
|
|
}
|
|
meta = match[0];
|
|
metaIndex = match.index;
|
|
cache = [];
|
|
return cache;
|
|
}, err => {
|
|
meta = match[0];
|
|
metaIndex = match.index;
|
|
cache = [{
|
|
from: cm.posFromIndex((err.index || 0) + match.index),
|
|
to: cm.posFromIndex((err.index || 0) + match.index),
|
|
message: err.message,
|
|
severity: 'error'
|
|
}];
|
|
return cache;
|
|
});
|
|
});
|
|
|
|
return {
|
|
onUpdated: cb => updateListeners.push(cb)
|
|
};
|
|
}
|