Add: linter-help-dialog

This commit is contained in:
eight 2018-09-01 15:52:30 +08:00
parent d8c9bc8379
commit 259f1d784b
3 changed files with 79 additions and 6 deletions

View File

@ -93,6 +93,7 @@
<script src="edit/linter-csslint.js"></script>
<script src="edit/linter-stylelint.js"></script>
<script src="edit/linter-meta.js"></script>
<script src="edit/linter-help-dialog.js"></script>
<script src="edit/linter-report.js"></script>
<script src="edit/editor-worker.js"></script>

View File

@ -0,0 +1,56 @@
/* global showHelp editorWorker */
'use strict';
function createLinterHelpDialog(getIssues) {
let csslintRules;
let preparing;
return {show};
function show() {
// FIXME: implement a linterChooser?
const linter = $('#editor.linter').value;
const baseUrl = linter === 'stylelint'
? 'https://stylelint.io/user-guide/rules/'
// some CSSLint rules do not have a url
: 'https://github.com/CSSLint/csslint/issues/535';
let headerLink, template;
if (linter === 'csslint') {
headerLink = $createLink('https://github.com/CSSLint/csslint/wiki/Rules', 'CSSLint');
template = ({rule: ruleID}) => {
const rule = csslintRules.find(rule => rule.id === ruleID);
return rule &&
$create('li', [
$create('b', $createLink(rule.url || baseUrl, rule.name)),
$create('br'),
rule.desc,
]);
};
} else {
headerLink = $createLink(baseUrl, 'stylelint');
template = ({rule}) =>
$create('li',
rule === 'CssSyntaxError' ? rule : $createLink(baseUrl + rule, rule));
}
const header = t('linterIssuesHelp', '\x01').split('\x01');
const activeRules = getIssues();
Promise.resolve(linter === 'csslint' && prepareCsslintRules())
.then(() =>
showHelp(t('linterIssues'),
$create([
header[0], headerLink, header[1],
$create('ul.rules', [...activeRules.values()].map(template)),
])
)
);
}
function prepareCsslintRules() {
if (!preparing) {
preparing = editorWorker.getCsslintRules()
.then(rules => {
csslintRules = rules;
});
}
return preparing;
}
}

View File

@ -1,8 +1,9 @@
/* global linter editors clipString */
/* global linter editors clipString createLinterHelpDialog makeSectionVisible */
'use strict';
var linterReport = (() => { // eslint-disable-line no-var
const cms = new Map();
const helpDialog = createLinterHelpDialog(getIssues);
linter.onChange((annotationsNotSorted, annotations, cm) => {
let table = cms.get(cm);
@ -31,12 +32,22 @@ var linterReport = (() => { // eslint-disable-line no-var
});
document.addEventListener('DOMContentLoaded', () => {
$('#lint-help').addEventListener('click', showLintHelp);
$('#lint-help').addEventListener('click', helpDialog.show);
$('#linter-settings').addEventListener('click', showLintConfig);
}, {once: true});
return {refresh};
function getIssues() {
const issues = new Set();
for (const table of cms.values()) {
for (const tr of table.trs) {
issues.add(tr.getAnnotation());
}
}
return issues;
}
function findNextSibling(cms, cm) {
let i = editors.indexOf(cm) + 1;
while (i < editors.length) {
@ -55,7 +66,13 @@ var linterReport = (() => { // eslint-disable-line no-var
const table = $create('table', [caption, tbody]);
const trs = [];
let empty = true;
return {updateAnnotations, update, isEmpty, element: table};
return {
element: table,
trs,
updateAnnotations,
update,
isEmpty
};
function isEmpty() {
return empty;
@ -112,7 +129,8 @@ var linterReport = (() => { // eslint-disable-line no-var
]);
return {
element: trElement,
update
update,
getAnnotation: () => anno
};
function update(_anno) {
@ -135,7 +153,5 @@ var linterReport = (() => { // eslint-disable-line no-var
cm.setSelection(anno.from);
}
function showLintHelp() {}
function showLintConfig() {}
})();