92 lines
3.1 KiB
JavaScript
92 lines
3.1 KiB
JavaScript
|
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||
|
|
||
|
// Depends on csslint.js from https://github.com/stubbornella/csslint
|
||
|
|
||
|
// declare global: CSSLint
|
||
|
|
||
|
(function(mod) {
|
||
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||
|
mod(require("../../lib/codemirror"));
|
||
|
else if (typeof define == "function" && define.amd) // AMD
|
||
|
define(["../../lib/codemirror"], mod);
|
||
|
else // Plain browser env
|
||
|
mod(CodeMirror);
|
||
|
})(function(CodeMirror) {
|
||
|
"use strict";
|
||
|
|
||
|
CodeMirror.registerHelper("lint", "css", function(text) {
|
||
|
let found = [];
|
||
|
const linter = prefs.get('editor.linter');
|
||
|
if (linter === 'csslint' && window.CSSLint) {
|
||
|
|
||
|
/* STYLISH: hack start (part 1) */
|
||
|
var rules = CSSLint.getRules();
|
||
|
var allowedRules = ["display-property-grouping", "duplicate-properties", "empty-rules", "errors", "known-properties"];
|
||
|
CSSLint.clearRules();
|
||
|
rules.forEach(function(rule) {
|
||
|
if (allowedRules.indexOf(rule.id) >= 0) {
|
||
|
CSSLint.addRule(rule);
|
||
|
}
|
||
|
});
|
||
|
/* STYLISH: hack end */
|
||
|
|
||
|
var results = CSSLint.verify(text), messages = results.messages, message = null;
|
||
|
for ( var i = 0; i < messages.length; i++) {
|
||
|
message = messages[i];
|
||
|
|
||
|
/* STYLISH: hack start (part 2) */
|
||
|
if (message.type === 'warning') {
|
||
|
// @font-face {font-family: 'Ampersand'; unicode-range: U+26;}
|
||
|
if (message.message.indexOf('unicode-range') !== -1) {
|
||
|
continue;
|
||
|
}
|
||
|
else if ( // color: hsl(210, 100%, 2.2%); or color: hsla(210, 100%, 2.2%, 0.3);
|
||
|
message.message.startsWith('Expected (<color>) but found \'hsl') &&
|
||
|
/hsla?\(\s*(-?\d+)%?\s*,\s*(-?\d+)%\s*,\s*(-?\d+|-?\d*.\d+)%(\s*,\s*(-?\d+|-?\d*.\d+))?\s*\)/.test(message.message)
|
||
|
) {
|
||
|
continue;
|
||
|
}
|
||
|
//
|
||
|
}
|
||
|
/* STYLISH: hack end */
|
||
|
|
||
|
var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col;
|
||
|
found.push({
|
||
|
from: CodeMirror.Pos(startLine, startCol),
|
||
|
to: CodeMirror.Pos(endLine, endCol),
|
||
|
message: message.message,
|
||
|
severity : message.type
|
||
|
});
|
||
|
}
|
||
|
} else if (linter === 'stylelint') {
|
||
|
const stylelint = require('stylelint').lint;
|
||
|
if (stylelint) {
|
||
|
return stylelint({
|
||
|
code: text,
|
||
|
// stylelintConfig stored in stylelint-config.js & loaded by edit.html
|
||
|
config: stylelintConfig
|
||
|
}).then(output => {
|
||
|
const warnings = output.results.length ? output.results[0].warnings : [],
|
||
|
len = warnings.length;
|
||
|
let i, warning;
|
||
|
if (len) {
|
||
|
for (i = 0; i < len; i++) {
|
||
|
warning = warnings[i];
|
||
|
found.push({
|
||
|
from: CodeMirror.Pos(warning.line - 1, warning.column - 1),
|
||
|
to: CodeMirror.Pos(warning.line - 1, warning.column),
|
||
|
message: warning.text,
|
||
|
severity : warning.severity
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
return found;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
return found;
|
||
|
});
|
||
|
|
||
|
});
|