lesslint
Version:
lint your less code
151 lines (129 loc) • 16 kB
JavaScript
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 _util = require('../util');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
;
/**
* 规则名称
*
* @const
* @type {string}
*/
/**
* @file
* `:` : 1. 属性名后的冒号(:)与属性值之间必须(MUST)保留一个空格,冒号前不得(MUST NOT)保留空格。
* 2. 定义变量时冒号(:)与变量值之间必须(MUST)保留一个空格,冒号前不得(MUST NOT)保留空格。
* `,` : 1. 在用逗号(,)分隔的列表(Less 函数参数列表、以 , 分隔的属性值等)中,逗号后必须(MUST)保留一个空格,
* 逗号前不得(MUST NOT)保留空格。
* 2. 在给 mixin 传递参数时,在参数分隔符(, / ;)后必须(MUST)保留一个空格
*
* 逗号暂时不太好实现
*
* https://github.com/ecomfe/spec/blob/master/less-code-style.md#%E5%B1%9E%E6%80%A7%E5%8F%98%E9%87%8F
* @author ielgnaw(wuji0223@gmail.com)
*/
var RULENAME = 'require-after-space';
/**
* 冒号
*
* @const
* @type {string}
*/
var COLON = ':';
/**
* 逗号
*
* @const
* @type {string}
*/
var COMMA = ',';
/**
* 匹配 css 属性值的 url(...);
*
* @const
* @type {RegExp}
*/
var PATTERN_URI = /url\(["']?([^\)"']+)["']?\)/i;
/**
* 冒号的错误信息
*
* @const
* @type {string}
*/
var COLON_MSG = '' + 'Disallow contain spaces between the `attr-name` and `:`, ' + 'Must contain spaces between `:` and `attr-value`';
/**
* 逗号的错误信息
*
* @const
* @type {string}
*/
var COMMA_MSG = 'Must contain spaces after `,` in `attr-value`';
/**
* 具体的检测逻辑
*
* @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) {
var ruleVal = opts.ruleVal;
var realRuleVal = [];
Array.prototype.push[Array.isArray(ruleVal) ? 'apply' : 'call'](realRuleVal, ruleVal);
if (realRuleVal.length) {
css.walkDecls(function (decl) {
var source = decl.source;
var line = source.start.line;
var lineContent = (0, _util.getLineContent)(line, source.input.css) || '';
if (realRuleVal.indexOf(COLON) !== -1) {
var between = decl.raws.between;
if (between.slice(0, 1) !== ':' // `属性名` 与之后的 `:` 之间包含空格了
|| between.slice(-1) === ':' // `:` 与 `属性值` 之间不包含空格
) {
var colorStr = decl.prop + decl.raws.between + decl.value;
result.warn(RULENAME, {
node: decl,
ruleName: RULENAME,
line: line,
message: COLON_MSG,
colorMessage: '`' + lineContent.replace(colorStr, _chalk2.default.magenta(colorStr)) + '` ' + _chalk2.default.grey(COLON_MSG)
});
}
}
if (realRuleVal.indexOf(COMMA) !== -1) {
var value = decl.value;
// 排除掉 uri 的情况,例如
// background-image: url(data:image/gif;base64,R0lGODlhCAAHAIABAGZmZv...);
// background-image: 2px 2px url(data:image/gif;base64,R0lGODlhCAAHAIABAGZmZv...);
// background-image: url(data:image/gif;base64,R0lGODlhCAAHAIABAGZmZv...) 2px 2px;
if (!PATTERN_URI.test(value)) {
var items = lineContent.split(';');
for (var j = 0, jLen = items.length; j < jLen; j++) {
var s = items[j];
if (s.indexOf(',') > -1 && /.*,(?!\s)/.test(s) && s.length !== lineContent.length // s.length === lineContent.length 的情况表示当前行结束了
) {
result.warn(RULENAME, {
node: decl,
ruleName: RULENAME,
errorChar: COMMA,
line: line,
message: COMMA_MSG,
colorMessage: '`' + lineContent.replace(value, _chalk2.default.magenta(value)) + '` ' + _chalk2.default.grey(COMMA_MSG)
});
}
}
}
}
});
}
};
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlL3JlcXVpcmUtYWZ0ZXItc3BhY2UuanMiXSwibmFtZXMiOlsiUlVMRU5BTUUiLCJDT0xPTiIsIkNPTU1BIiwiUEFUVEVSTl9VUkkiLCJDT0xPTl9NU0ciLCJDT01NQV9NU0ciLCJjaGVjayIsInBvc3Rjc3MiLCJwbHVnaW4iLCJjc3MiLCJyZXN1bHQiLCJydWxlVmFsIiwib3B0cyIsInJlYWxSdWxlVmFsIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJwdXNoIiwiaXNBcnJheSIsImxlbmd0aCIsIndhbGtEZWNscyIsInNvdXJjZSIsImRlY2wiLCJsaW5lIiwic3RhcnQiLCJsaW5lQ29udGVudCIsImlucHV0IiwiaW5kZXhPZiIsImJldHdlZW4iLCJyYXdzIiwic2xpY2UiLCJjb2xvclN0ciIsInByb3AiLCJ2YWx1ZSIsIndhcm4iLCJub2RlIiwicnVsZU5hbWUiLCJtZXNzYWdlIiwiY29sb3JNZXNzYWdlIiwicmVwbGFjZSIsImNoYWxrIiwibWFnZW50YSIsImdyZXkiLCJ0ZXN0IiwiaXRlbXMiLCJzcGxpdCIsImoiLCJqTGVuIiwicyIsImVycm9yQ2hhciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQWNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOztBQUVBOzs7Ozs7QUFwQkE7Ozs7Ozs7Ozs7Ozs7O0FBMEJBLElBQU1BLFdBQVcscUJBQWpCOztBQUVBOzs7Ozs7QUFNQSxJQUFNQyxRQUFRLEdBQWQ7O0FBRUE7Ozs7OztBQU1BLElBQU1DLFFBQVEsR0FBZDs7QUFFQTs7Ozs7O0FBTUEsSUFBTUMsY0FBYyw4QkFBcEI7O0FBRUE7Ozs7OztBQU1BLElBQU1DLFlBQVksS0FDWiwyREFEWSxHQUVaLGtEQUZOOztBQUlBOzs7Ozs7QUFNQSxJQUFNQyxZQUFZLCtDQUFsQjs7QUFFQTs7Ozs7Ozs7QUFRTyxJQUFNQyx3QkFBUUMsa0JBQVFDLE1BQVIsQ0FBZVIsUUFBZixFQUF5QjtBQUFBLFdBQzFDLFVBQUNTLEdBQUQsRUFBTUMsTUFBTixFQUFp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ZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqIGA6YCA6IDEuIOWxnuaAp+WQjeWQjueahOWGkuWPt++8iDrvvInkuI7lsZ7mgKflgLzkuYvpl7Tlv4XpobvvvIhNVVNU77yJ5L+d55WZ5LiA5Liq56m65qC877yM5YaS5Y+35YmN5LiN5b6X77yITVVTVCBOT1TvvInkv53nlZnnqbrmoLzjgIJcbiAqICAgICAgIDIuIOWumuS5ieWPmOmHj+aXtuWGkuWPt++8iDrvvInkuI7lj5jph4/lgLzkuYvpl7Tlv4XpobvvvIhNVVNU77yJ5L+d55WZ5LiA5Liq56m65qC877yM5YaS5Y+35YmN5LiN5b6X77yITVVTVCBOT1TvvInkv53nlZnnqbrmoLzjgIJcbiAqIGAsYCA6IDEuIOWcqOeUqOmAl+WPt++8iCzvvInliIbpmpTnmoTliJfooajvvIhMZXNzIOWHveaVsOWPguaVsOWIl+ihqOOAgeS7pSAsIOWIhumalOeahOWxnuaAp+WAvOetie+8ieS4re+8jOmAl+WPt+WQjuW/hemhu++8iE1VU1TvvInkv53nlZnkuIDkuKrnqbrmoLzvvIxcbiAqICAgICAg6YCX5Y+35YmN5LiN5b6X77yITVVTVCBOT1TvvInkv53nlZnnqbrmoLzjgIJcbiAqICAgICAgIDIuIOWcqOe7mSBtaXhpbiDkvKDpgJLlj4LmlbDml7bvvIzlnKjlj4LmlbDliIbpmpTnrKbvvIgsIC8gO++8ieWQjuW/hemhu++8iE1VU1TvvInkv53nlZnkuIDkuKrnqbrmoLxcbiAqXG4gKiDpgJflj7fmmoLml7bkuI3lpKrlpb3lrp7njrBcbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZWNvbWZlL3NwZWMvYmxvYi9tYXN0ZXIvbGVzcy1jb2RlLXN0eWxlLm1kIyVFNSVCMSU5RSVFNiU4MCVBNyVFNSU4RiU5OCVFOSU4NyU4RlxuICogQGF1dGhvciBpZWxnbmF3KHd1amkwMjIzQGdtYWlsLmNvbSlcbiAqL1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQge2dldExpbmVDb250ZW50fSBmcm9tICcuLi91dGlsJztcblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIOinhOWImeWQjeensFxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgUlVMRU5BTUUgPSAncmVxdWlyZS1hZnRlci1zcGFjZSc7XG5cbi8qKlxuICog5YaS5Y+3XG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBDT0xPTiA9ICc6JztcblxuLyoqXG4gKiDpgJflj7dcbiAqXG4gKiBAY29uc3RcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IENPTU1BID0gJywnO1xuXG4vKipcbiAqIOWMuemFjSBjc3Mg5bGe5oCn5YC855qEIHVybCguLi4pO1xuICpcbiAqIEBjb25zdFxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3QgUEFUVEVSTl9VUkkgPSAvdXJsXFwoW1wiJ10/KFteXFwpXCInXSspW1wiJ10/XFwpL2k7XG5cbi8qKlxuICog5YaS5Y+355qE6ZSZ6K+v5L+h5oGvXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBDT0xPTl9NU0cgPSAnJ1xuICAgICsgJ0Rpc2FsbG93IGNvbnRhaW4gc3BhY2VzIGJldHdlZW4gdGhlIGBhdHRyLW5hbWVgIGFuZCBgOmAsICdcbiAgICArICdNdXN0IGNvbnRhaW4gc3BhY2VzIGJldHdlZW4gYDpgIGFuZCBgYXR0ci12YWx1ZWAnO1xuXG4vKipcbiAqIOmAl+WPt+eahOmUmeivr+S/oeaBr1xuICpcbiAqIEBjb25zdFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgQ09NTUFfTVNHID0gJ011c3QgY29udGFpbiBzcGFjZXMgYWZ0ZXIgYCxgIGluIGBhdHRyLXZhbHVlYCc7XG5cbi8qKlxuICog5YW35L2T55qE5qOA5rWL6YC76L6RXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMg5Y+C5pWwXG4gKiBAcGFyYW0geyp9IG9wdHMucnVsZVZhbCDlvZPliY3op4TliJnlhbfkvZPphY3nva7nmoTlgLxcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZpbGVDb250ZW50IOaWh+S7tuWGheWuuVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZmlsZVBhdGgg5paH5Lu26Lev5b6EXG4gKi9cbmV4cG9ydCBjb25zdCBjaGVjayA9IHBvc3Rjc3MucGx1Z2luKFJVTEVOQU1FLCBvcHRzID0+XG4gICAgKGNzcywgcmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVWYWwgPSBvcHRzLnJ1bGVWYWw7XG4gICAgICAgIGNvbnN0IHJlYWxSdWxlVmFsID0gW107XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoW0FycmF5LmlzQXJyYXkocnVsZVZhbCkgPyAnYXBwbHknIDogJ2NhbGwnXShyZWFsUnVsZVZhbCwgcnVsZVZhbCk7XG5cbiAgICAgICAgaWYgKHJlYWxSdWxlVmFsLmxlbmd0aCkge1xuXG4gICAgICAgICAgICBjc3Mud2Fsa0RlY2xzKGRlY2wgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGRlY2wuc291cmNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBzb3VyY2Uuc3RhcnQubGluZTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldExpbmVDb250ZW50KGxpbmUsIHNvdXJjZS5pbnB1dC5jc3MpIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlYWxSdWxlVmFsLmluZGV4T2YoQ09MT04pICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZXR3ZWVuID0gZGVjbC5yYXdzLmJldHdlZW47XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJldHdlZW4uc2xpY2UoMCwgMSkgIT09ICc6JyAvLyBg5bGe5oCn5ZCNYCDkuI7kuYvlkI7nmoQgYDpgIOS5i+mXtOWMheWQq+epuuagvOS6hlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgYmV0d2Vlbi5zbGljZSgtMSkgPT09ICc6JyAvLyBgOmAg5LiOIGDlsZ7mgKflgLxgIOS5i+mXtOS4jeWMheWQq+epuuagvFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yU3RyID0gZGVjbC5wcm9wICsgZGVjbC5yYXdzLmJldHdlZW4gKyBkZWNsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lndhcm4oUlVMRU5BTUUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBkZWNsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lOiBSVUxFTkFNRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENPTE9OX01TRyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1lc3NhZ2U6ICdgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpbmVDb250ZW50LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxrLm1hZ2VudGEoY29sb3JTdHIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnYCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhbGsuZ3JleShDT0xPTl9NU0cpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZWFsUnVsZVZhbC5pbmRleE9mKENPTU1BKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNsLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIOaOkumZpOaOiSB1cmkg55qE5oOF5Ya177yM5L6L5aaCXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDQUFIQUlBQkFHWm1adi4uLik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQtaW1hZ2U6IDJweCAycHggdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaENBQUhBSUFCQUdabVp2Li4uKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaENBQUhBSUFCQUdabVp2Li4uKSAycHggMnB4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVBBVFRFUk5fVVJJLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IGxpbmVDb250ZW50LnNwbGl0KCc7Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgakxlbiA9IGl0ZW1zLmxlbmd0aDsgaiA8IGpMZW47IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpdGVtc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pbmRleE9mKCcsJykgPiAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAvLiosKD8hXFxzKS8udGVzdChzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzLmxlbmd0aCAhPT0gbGluZUNvbnRlbnQubGVuZ3RoIC8vIHMubGVuZ3RoID09PSBsaW5lQ29udGVudC5sZW5ndGgg55qE5oOF5Ya16KGo56S65b2T5YmN6KGM57uT5p2f5LqGXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC53YXJuKFJVTEVOQU1FLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBkZWNsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU5hbWU6IFJVTEVOQU1FLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDaGFyOiBDT01NQSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBDT01NQV9NU0csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1lc3NhZ2U6ICdgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluZUNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxrLm1hZ2VudGEodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ2AgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhbGsuZ3JleShDT01NQV9NU0cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4pO1xuIl19
;