| 'use strict'; |
| |
| const balancedMatch = require('balanced-match'); |
| const styleSearch = require('style-search'); |
| |
| /** |
| * Search a CSS string for functions by name. |
| * For every match, invoke the callback, passing the function's |
| * "argument(s) string" (whatever is inside the parentheses) |
| * as an argument. |
| * |
| * Callback will be called once for every matching function found, |
| * with the function's "argument(s) string" and its starting index |
| * as the arguments. |
| * |
| * @param {string} source |
| * @param {string} functionName |
| * @param {(expression: string, expressionIndex: number) => void} callback |
| */ |
| module.exports = function functionArgumentsSearch(source, functionName, callback) { |
| styleSearch( |
| { |
| source, |
| target: functionName, |
| functionNames: 'check', |
| }, |
| (match) => { |
| if (source[match.endIndex] !== '(') { |
| return; |
| } |
| |
| const parensMatch = balancedMatch('(', ')', source.substr(match.startIndex)); |
| |
| if (!parensMatch) { |
| throw new Error(`No parens match: "${source}"`); |
| } |
| |
| callback(parensMatch.body, match.endIndex + 1); |
| }, |
| ); |
| }; |