From abf0be18c7701d8114fdbe6d897084c273a0ada4 Mon Sep 17 00:00:00 2001 From: anseki Date: Thu, 9 Jul 2015 22:57:36 +0900 Subject: [PATCH] Parse the @exec string parameters correctly. --- lib/preprocess.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/preprocess.js b/lib/preprocess.js index 1d10bd7..65c7b6b 100644 --- a/lib/preprocess.js +++ b/lib/preprocess.js @@ -187,20 +187,17 @@ function preprocessor(src, context, opts, noRestoreEol) { }); rv = replace(rv, opts.type.exec, function (match, name, value) { - name = (name || '').trim(); - value = value || ''; + var reToken = new RegExp(/^\s*(?:("|')(.*?)(?:\1\s*,?|$)|([^,]*?)\s*(?:,|$))/), + params = []; - var params = value.split(','); - var stringRegex = /^['"](.*)['"]$/; + function token2param(s, q, str, prop) { + params.push(typeof str !== 'undefined' ? str : getDeepPropFromObj(context, prop)); + return ''; + } - params = params.map(function(param){ - param = param.trim(); - if (stringRegex.test(param)) { // handle string parameter - return param.replace(stringRegex, '$1'); - } else { // handle variable parameter - return getDeepPropFromObj(context, param); - } - }); + name = (name || '').trim(); + value = value == null ? ' ' : value + ' '; // space for end of comma + while (value.length) { value = value.replace(reToken, token2param); } var fn = getDeepPropFromObj(context, name); if (!fn || typeof fn !== 'function') return '';