'use strict' const balanced = require('balanced-match') module.exports = function(content, opts) { var result = '' var reStart = new RegExp(opts.prefix + '[ ]*' + opts.name + '\\(') var reEnd = new RegExp('^[ ]*' + opts.suffix) var matchStart var matchArg var matchEnd var safeStart var before var replacement while (matchStart = reStart.exec(content)) { // eslint-disable-line safeStart = matchStart.index + matchStart[0].length - 1 matchArg = balanced('(', ')', content.slice(safeStart)) if (matchArg && matchArg.start === 0) { if (opts.suffix) { matchEnd = reEnd.exec(matchArg.post) } matchEnd = matchEnd ? matchEnd.index + matchEnd[0].length : 0 if (!opts.suffix || matchEnd) { before = content.slice(0, matchStart.index) replacement = opts.handler({ before: before, args: matchArg.body, sourceFile: opts.sourceFile }) if (replacement !== undefined) { result += before + replacement.toString() content = content.slice(safeStart + matchArg.end + 1 + matchEnd) continue } } } result += content.slice(0, safeStart) content = content.slice(safeStart) } result += content return result }