UNPKG

lesslint

Version:
142 lines (121 loc) 10.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.check = undefined; var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk); var _postcss = require('postcss'); var _postcss2 = _interopRequireDefault(_postcss); var _less = require('less'); var _less2 = _interopRequireDefault(_less); var _util = require('../util'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @file 颜色检验 * 颜色定义必须(MUST)使用 #RRGGBB 格式定义,并在可能时尽量(SHOULD)缩写为 #RGB 形式,且避免直接使用颜色名称与 rgb() 表达式。 * https://github.com/ecomfe/spec/blob/master/less-code-style.md#%E9%A2%9C%E8%89%B2 * @author ielgnaw(wuji0223@gmail.com) */ 'use strict'; /** * 规则名称 * * @const * @type {string} */ var RULENAME = 'hex-color'; /** * Less 中的所有颜色值 * * @const * @type {Object} */ var LESS_COLORS = _less2.default.data.colors; /** * 对 Less 中的所有颜色值做处理,便于之后正则 * * @const * @return {string} 字符串 */ // const namedColors = (function () { // let ret = ''; // for (let key of Object.keys(LESS_COLORS)) { // ret += key + '|'; // } // return ret.slice(0, -1); // 去掉最后一个 | // })(); /** * 匹配颜色名的正则 * * @const * @type {RegExp} */ // const PATTERN_NAMED_COLOR_EXP = new RegExp('\\b\\s?:\\s*(' + namedColors + ')', 'g'); // console.log(PATTERN_NAMED_COLOR_EXP); // console.log(); /** * 匹配 rgb, hsl 颜色表达式的正则 * * @const * @type {RegExp} */ var PATTERN_COLOR_EXP = /(\brgb\b|\bhsl\b)/gi; /** * 错误信息 * * @const * @type {string} */ var MSG = '' + 'Color value must use the hexadecimal mark forms such as `#RRGGBB`.' + ' Don\'t use RGB、HSL expression'; /** * 添加报错信息 * * @param {Object} node decl 对象 * @param {Object} result postcss 转换的结果对象 */ var addWarn = function addWarn(decl, result) { var source = decl.source, prop = decl.prop, raws = decl.raws; var line = source.start.line; var lineContent = (0, _util.getLineContent)(line, source.input.css, true); var col = source.start.column + prop.length + raws.between.length; result.warn(RULENAME, { node: decl, ruleName: RULENAME, line: line, col: col, message: MSG, colorMessage: '`' + (0, _util.changeColorByStartAndEndIndex)(lineContent, col, source.end.column) + '` ' + _chalk2.default.grey(MSG) }); }; /** * 具体的检测逻辑 * * @param {Object} opts 参数 * @param {*} opts.ruleVal 当前规则具体配置的值 * @param {string} opts.fileContent 文件内容 * @param {string} opts.filePath 文件路径 */ var check = exports.check = _postcss2.default.plugin(RULENAME, function (opts) { return function (css, result) { if (!opts.ruleVal) { return; } css.walkDecls(function (decl) { var value = decl.value; if (LESS_COLORS[value]) { addWarn(decl, result); } else { var match = null; /* eslint-disable no-extra-boolean-cast */ while (!!(match = PATTERN_COLOR_EXP.exec(value))) { addWarn(decl, result); } /* eslint-enable no-extra-boolean-cast */ } }); }; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlL2hleC1jb2xvci5qcyJdLCJuYW1lcyI6WyJSVUxFTkFNRSIsIkxFU1NfQ09MT1JTIiwibGVzcyIsImRhdGEiLCJjb2xvcnMiLCJQQVRURVJOX0NPTE9SX0VYUCIsIk1TRyIsImFkZFdhcm4iLCJkZWNsIiwicmVzdWx0Iiwic291cmNlIiwicHJvcCIsInJhd3MiLCJsaW5lIiwic3RhcnQiLCJsaW5lQ29udGVudCIsImlucHV0IiwiY3NzIiwiY29sIiwiY29sdW1uIiwibGVuZ3RoIiwiYmV0d2VlbiIsIndhcm4iLCJub2RlIiwicnVsZU5hbWUiLCJtZXNzYWdlIiwiY29sb3JNZXNzYWdlIiwiZW5kIiwiY2hhbGsiLCJncmV5IiwiY2hlY2siLCJwb3N0Y3NzIiwicGx1Z2luIiwib3B0cyIsInJ1bGVWYWwiLCJ3YWxrRGVjbHMiLCJ2YWx1ZSIsIm1hdGNoIiwiZXhlYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9BOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBVkE7Ozs7Ozs7QUFZQTs7QUFFQTs7Ozs7O0FBTUEsSUFBTUEsV0FBVyxXQUFqQjs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsY0FBY0MsZUFBS0MsSUFBTCxDQUFVQyxNQUE5Qjs7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsb0JBQW9CLHFCQUExQjs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsTUFBTSxLQUNOLG9FQURNLEdBRU4sZ0NBRk47O0FBSUE7Ozs7OztBQU1BLElBQU1DLFVBQVUsU0FBVkEsT0FBVSxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBa0I7QUFBQSxRQUN2QkMsTUFEdUIsR0FDREYsSUFEQyxDQUN2QkUsTUFEdUI7QUFBQSxRQUNmQyxJQURlLEdBQ0RILElBREMsQ0FDZkcsSUFEZTtBQUFBLFFBQ1RDLElBRFMsR0FDREosSUFEQyxDQUNUSSxJQURTOztBQUU5QixRQUFNQyxPQUFPSCxPQUFPSSxLQUFQLENBQWFELElBQTFCO0FBQ0EsUUFBTUUsY0FBYywwQkFBZUYsSUFBZixFQUFxQkgsT0FBT00sS0FBUCxDQUFhQyxHQUFsQyxFQUF1QyxJQUF2QyxDQUFwQjtBQUNBLFFBQU1DLE1BQU1SLE9BQU9JLEtBQVAsQ0FBYUssTUFBYixHQUFzQlIsS0FBS1MsTUFBM0IsR0FBb0NSLEtBQUtTLE9BQUwsQ0FBYUQsTUFBN0Q7QUFDQVgsV0FBT2EsSUFBUCxDQUFZdEIsUUFBWixFQUFzQjtBQUNsQnVCLGNBQU1mLElBRFk7QUFFbEJnQixrQkFBVXhCLFFBRlE7QUFHbEJhLGNBQU1BLElBSFk7QUFJbEJLLGFBQUtBLEdBSmE7QUFLbEJPLGlCQUFTbkIsR0FMUztBQU1sQm9CLHNCQUFjLE1BQ1IseUNBQ0VYLFdBREYsRUFDZUcsR0FEZixFQUNvQlIsT0FBT2lCLEdBQVAsQ0FBV1IsTUFEL0IsQ0FEUSxHQUlSLElBSlEsR0FLUlMsZ0JBQU1DLElBQU4sQ0FBV3ZCLEdBQVg7QUFYWSxLQUF0QjtBQWFILENBbEJEOztBQW9CQTs7Ozs7Ozs7QUFRTyxJQUFNd0Isd0JBQVFDLGtCQUFRQyxNQUFSLENBQWVoQyxRQUFmLEVBQXlCO0FBQUEsV0FDMUMsVUFBQ2lCLEdBQUQsRUFBTVIsTUFBTixFQUFpQjtBQUNiLFlBQUksQ0FBQ3dCLEtBQUtDLE9BQVYsRUFBbUI7QUFDZjtBQUNIOztBQUVEakIsWUFBSWtCLFNBQUosQ0FBYyxnQkFBUTtBQUNsQixnQkFBTUMsUUFBUTVCLEtBQUs0QixLQUFuQjtBQUNBLGdCQUFJbkMsWUFBWW1DLEtBQVosQ0FBSixFQUF3QjtBQUNwQjdCLHdCQUFRQyxJQUFSLEVBQWNDLE1BQWQ7QUFDSCxhQUZELE1BR0s7QUFDRCxvQkFBSTRCLFFBQVEsSUFBWjtBQUNBO0FBQ0EsdUJBQU8sQ0FBQyxFQUFFQSxRQUFRaEMsa0JBQWtCaUMsSUFBbEIsQ0FBdUJGLEtBQXZCLENBQVYsQ0FBUixFQUFrRDtBQUM5QzdCLDRCQUFRQyxJQUFSLEVBQWNDLE1BQWQ7QUFDSDtBQUNEO0FBQ0g7QUFDSixTQWJEO0FBY0gsS0FwQnlDO0FBQUEsQ0FBekIsQ0FBZCIsImZpbGUiOiJoZXgtY29sb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIOminOiJsuajgOmqjFxuICogICAgICAg6aKc6Imy5a6a5LmJ5b+F6aG777yITVVTVO+8ieS9v+eUqCAjUlJHR0JCIOagvOW8j+WumuS5ie+8jOW5tuWcqOWPr+iDveaXtuWwvemHj++8iFNIT1VMRO+8iee8qeWGmeS4uiAjUkdCIOW9ouW8j++8jOS4lOmBv+WFjeebtOaOpeS9v+eUqOminOiJsuWQjeensOS4jiByZ2IoKSDooajovr7lvI/jgIJcbiAqICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9lY29tZmUvc3BlYy9ibG9iL21hc3Rlci9sZXNzLWNvZGUtc3R5bGUubWQjJUU5JUEyJTlDJUU4JTg5JUIyXG4gKiBAYXV0aG9yIGllbGduYXcod3VqaTAyMjNAZ21haWwuY29tKVxuICovXG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbmltcG9ydCBsZXNzIGZyb20gJ2xlc3MnO1xuaW1wb3J0IHtnZXRMaW5lQ29udGVudCwgY2hhbmdlQ29sb3JCeVN0YXJ0QW5kRW5kSW5kZXh9IGZyb20gJy4uL3V0aWwnO1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICog6KeE5YiZ5ZCN56ewXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBSVUxFTkFNRSA9ICdoZXgtY29sb3InO1xuXG4vKipcbiAqIExlc3Mg5Lit55qE5omA5pyJ6aKc6Imy5YC8XG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5jb25zdCBMRVNTX0NPTE9SUyA9IGxlc3MuZGF0YS5jb2xvcnM7XG5cbi8qKlxuICog5a+5IExlc3Mg5Lit55qE5omA5pyJ6aKc6Imy5YC85YGa5aSE55CG77yM5L6/5LqO5LmL5ZCO5q2j5YiZXG4gKlxuICogQGNvbnN0XG4gKiBAcmV0dXJuIHtzdHJpbmd9IOWtl+espuS4slxuICovXG4vLyBjb25zdCBuYW1lZENvbG9ycyA9IChmdW5jdGlvbiAoKSB7XG4vLyAgICAgbGV0IHJldCA9ICcnO1xuLy8gICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhMRVNTX0NPTE9SUykpIHtcbi8vICAgICAgICAgcmV0ICs9IGtleSArICd8Jztcbi8vICAgICB9XG4vLyAgICAgcmV0dXJuIHJldC5zbGljZSgwLCAtMSk7IC8vIOWOu+aOieacgOWQjuS4gOS4qiB8XG4vLyB9KSgpO1xuXG4vKipcbiAqIOWMuemFjeminOiJsuWQjeeahOato+WImVxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuLy8gY29uc3QgUEFUVEVSTl9OQU1FRF9DT0xPUl9FWFAgPSBuZXcgUmVnRXhwKCdcXFxcYlxcXFxzPzpcXFxccyooJyArIG5hbWVkQ29sb3JzICsgJyknLCAnZycpO1xuLy8gY29uc29sZS5sb2coUEFUVEVSTl9OQU1FRF9DT0xPUl9FWFApO1xuLy8gY29uc29sZS5sb2coKTtcblxuLyoqXG4gKiDljLnphY0gcmdiLCBoc2wg6aKc6Imy6KGo6L6+5byP55qE5q2j5YiZXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCBQQVRURVJOX0NPTE9SX0VYUCA9IC8oXFxicmdiXFxifFxcYmhzbFxcYikvZ2k7XG5cbi8qKlxuICog6ZSZ6K+v5L+h5oGvXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBNU0cgPSAnJ1xuICAgICsgJ0NvbG9yIHZhbHVlIG11c3QgdXNlIHRoZSBoZXhhZGVjaW1hbCBtYXJrIGZvcm1zIHN1Y2ggYXMgYCNSUkdHQkJgLidcbiAgICArICcgRG9uXFwndCB1c2UgUkdC44CBSFNMIGV4cHJlc3Npb24nO1xuXG4vKipcbiAqIOa3u+WKoOaKpemUmeS/oeaBr1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIGRlY2wg5a+56LGhXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0IHBvc3Rjc3Mg6L2s5o2i55qE57uT5p6c5a+56LGhXG4gKi9cbmNvbnN0IGFkZFdhcm4gPSAoZGVjbCwgcmVzdWx0KSA9PiB7XG4gICAgY29uc3Qge3NvdXJjZSwgcHJvcCwgcmF3c30gPSBkZWNsO1xuICAgIGNvbnN0IGxpbmUgPSBzb3VyY2Uuc3RhcnQubGluZTtcbiAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldExpbmVDb250ZW50KGxpbmUsIHNvdXJjZS5pbnB1dC5jc3MsIHRydWUpO1xuICAgIGNvbnN0IGNvbCA9IHNvdXJjZS5zdGFydC5jb2x1bW4gKyBwcm9wLmxlbmd0aCArIHJhd3MuYmV0d2Vlbi5sZW5ndGg7XG4gICAgcmVzdWx0Lndhcm4oUlVMRU5BTUUsIHtcbiAgICAgICAgbm9kZTogZGVjbCxcbiAgICAgICAgcnVsZU5hbWU6IFJVTEVOQU1FLFxuICAgICAgICBsaW5lOiBsaW5lLFxuICAgICAgICBjb2w6IGNvbCxcbiAgICAgICAgbWVzc2FnZTogTVNHLFxuICAgICAgICBjb2xvck1lc3NhZ2U6ICdgJ1xuICAgICAgICAgICAgKyBjaGFuZ2VDb2xvckJ5U3RhcnRBbmRFbmRJbmRleChcbiAgICAgICAgICAgICAgICBsaW5lQ29udGVudCwgY29sLCBzb3VyY2UuZW5kLmNvbHVtblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgKyAnYCAnXG4gICAgICAgICAgICArIGNoYWxrLmdyZXkoTVNHKVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiDlhbfkvZPnmoTmo4DmtYvpgLvovpFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyDlj4LmlbBcbiAqIEBwYXJhbSB7Kn0gb3B0cy5ydWxlVmFsIOW9k+WJjeinhOWImeWFt+S9k+mFjee9rueahOWAvFxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZmlsZUNvbnRlbnQg5paH5Lu25YaF5a65XG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5maWxlUGF0aCDmlofku7bot6/lvoRcbiAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrID0gcG9zdGNzcy5wbHVnaW4oUlVMRU5BTUUsIG9wdHMgPT5cbiAgICAoY3NzLCByZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKCFvcHRzLnJ1bGVWYWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNzcy53YWxrRGVjbHMoZGVjbCA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlY2wudmFsdWU7XG4gICAgICAgICAgICBpZiAoTEVTU19DT0xPUlNbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgYWRkV2FybihkZWNsLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1leHRyYS1ib29sZWFuLWNhc3QgKi9cbiAgICAgICAgICAgICAgICB3aGlsZSAoISEobWF0Y2ggPSBQQVRURVJOX0NPTE9SX0VYUC5leGVjKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkV2FybihkZWNsLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWV4dHJhLWJvb2xlYW4tY2FzdCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4pO1xuIl19