3 const _ = require("lodash");
4 const isStandardSyntaxRule = require("../../utils/isStandardSyntaxRule");
5 const keywordSets = require("../../reference/keywordSets");
6 const report = require("../../utils/report");
7 const ruleMessages = require("../../utils/ruleMessages");
8 const styleSearch = require("style-search");
9 const validateOptions = require("../../utils/validateOptions");
11 const ruleName = "selector-pseudo-element-colon-notation";
13 const messages = ruleMessages(ruleName, {
14 expected: q => `Expected ${q} colon pseudo-element notation`
17 const rule = function(expectation) {
18 return (root, result) => {
19 const validOptions = validateOptions(result, ruleName, {
21 possible: ["single", "double"]
27 root.walkRules(rule => {
28 if (!isStandardSyntaxRule(rule)) {
31 const selector = rule.selector;
33 // get out early if no pseudo elements or classes
34 if (selector.indexOf(":") === -1) {
38 // match only level 1 and 2 pseudo elements
39 const pseudoElementsWithColons = _.toArray(
40 keywordSets.levelOneAndTwoPseudoElements
43 { source: selector.toLowerCase(), target: pseudoElementsWithColons },
45 const prevCharIsColon = selector[match.startIndex - 1] === ":";
47 if (expectation === "single" && !prevCharIsColon) {
50 if (expectation === "double" && prevCharIsColon) {
55 message: messages.expected(expectation),
57 index: match.startIndex,
67 rule.ruleName = ruleName;
68 rule.messages = messages;
69 module.exports = rule;