| "use strict"; |
| |
| const isStandardSyntaxRule = require("../utils/isStandardSyntaxRule"); |
| const parseSelector = require("../utils/parseSelector"); |
| const report = require("../utils/report"); |
| const styleSearch = require("style-search"); |
| |
| module.exports = function(options) { |
| options.root.walkRules(rule => { |
| if (!isStandardSyntaxRule(rule)) { |
| return; |
| } |
| |
| if ( |
| rule.selector.indexOf("[") === -1 || |
| rule.selector.indexOf("=") === -1 |
| ) { |
| return; |
| } |
| |
| let hasFixed = false; |
| const selector = rule.raws.selector |
| ? rule.raws.selector.raw |
| : rule.selector; |
| |
| const fixedSelector = parseSelector( |
| selector, |
| options.result, |
| rule, |
| selectorTree => { |
| selectorTree.walkAttributes(attributeNode => { |
| const operator = attributeNode.operator; |
| |
| if (!operator) { |
| return; |
| } |
| |
| const attributeNodeString = attributeNode.toString(); |
| |
| styleSearch( |
| { source: attributeNodeString, target: operator }, |
| match => { |
| const index = options.checkBeforeOperator |
| ? match.startIndex |
| : match.endIndex - 1; |
| |
| checkOperator( |
| attributeNodeString, |
| index, |
| rule, |
| attributeNode, |
| operator |
| ); |
| } |
| ); |
| }); |
| } |
| ); |
| |
| if (hasFixed) { |
| if (!rule.raws.selector) { |
| rule.selector = fixedSelector; |
| } else { |
| rule.raws.selector.raw = fixedSelector; |
| } |
| } |
| |
| function checkOperator(source, index, node, attributeNode, operator) { |
| options.locationChecker({ |
| source, |
| index, |
| err: m => { |
| if (options.fix && options.fix(attributeNode)) { |
| hasFixed = true; |
| |
| return; |
| } |
| |
| report({ |
| message: m.replace( |
| options.checkBeforeOperator |
| ? operator[0] |
| : operator[operator.length - 1], |
| operator |
| ), |
| node, |
| index: attributeNode.sourceIndex + index, |
| result: options.result, |
| ruleName: options.checkedRuleName |
| }); |
| } |
| }); |
| } |
| }); |
| }; |