--- /dev/null
+"use strict";
+
+const _ = require("lodash");
+const declarationValueIndex = require("../utils/declarationValueIndex");
+const isStandardSyntaxFunction = require("../utils/isStandardSyntaxFunction");
+const report = require("../utils/report");
+const styleSearch = require("style-search");
+const valueParser = require("postcss-value-parser");
+
+module.exports = function(opts) {
+ opts.root.walkDecls(decl => {
+ const declValue = _.get(decl, "raws.value.raw", decl.value);
+
+ valueParser(declValue).walk(valueNode => {
+ if (valueNode.type !== "function") {
+ return;
+ }
+
+ if (!isStandardSyntaxFunction(valueNode)) {
+ return;
+ }
+
+ // Ignore `url()` arguments, which may contain data URIs or other funky stuff
+ if (valueNode.value.toLowerCase() === "url") {
+ return;
+ }
+
+ const functionArguments = (() => {
+ let result = valueParser.stringify(valueNode);
+ // Remove function name and opening paren
+ result = result.slice(valueNode.value.length + 1);
+ // Remove closing paren
+ result = result.slice(0, result.length - 1);
+ // 1. Remove comments including preceeding whitespace (when only succeeded by whitespace)
+ // 2. Remove all other comments, but leave adjacent whitespace intact
+ result = result.replace(
+ /( *\/(\*.*\*\/(?!\S)|\/.*)|(\/(\*.*\*\/|\/.*)))/,
+ ""
+ );
+ return result;
+ })();
+
+ styleSearch(
+ {
+ source: functionArguments,
+ target: ",",
+ functionArguments: "skip"
+ },
+ match => {
+ opts.locationChecker({
+ source: functionArguments,
+ index: match.startIndex,
+ err: message => {
+ const index =
+ declarationValueIndex(decl) +
+ valueNode.value.length +
+ 1 +
+ valueNode.sourceIndex +
+ match.startIndex;
+ report({
+ index,
+ message,
+ node: decl,
+ result: opts.result,
+ ruleName: opts.checkedRuleName
+ });
+ }
+ });
+ }
+ );
+ });
+ });
+};