UNPKG

lesslint

Version:
151 lines (129 loc) 16 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 _util = require('../util'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 'use strict'; /** * 规则名称 * * @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