riot-tmpl
Advanced tools
Comparing version 2.3.21 to 2.3.22
# riot-tmpl Changes | ||
### v2.3.22 | ||
- It has changed the character used to hide quoted strings and regexes, maybe this fix [riot#1588](https://github.com/riot/riot/issues/1588) : Syntax Error: Invalid character `\0129` (riot+compiler.min). | ||
- Removed support for raw expressions. It is unlikely this feature will be implemented in v2.3.x | ||
- Update devDependencies | ||
### v2.3.21 | ||
@@ -4,0 +9,0 @@ - Refactorization, now `tmpl` and `brackets` are ~5% faster. |
/** | ||
* The riot template engine | ||
* @version v2.3.21 | ||
* @version v2.3.22 | ||
*/ | ||
@@ -103,3 +103,3 @@ | ||
while (match = re.exec(str)) { | ||
while ((match = re.exec(str))) { | ||
@@ -114,4 +114,5 @@ pos = match.index | ||
} | ||
if (!match[3]) | ||
if (!match[3]) { | ||
continue | ||
} | ||
} | ||
@@ -134,6 +135,7 @@ | ||
function unescapeStr (s) { | ||
if (tmpl || isexpr) | ||
if (tmpl || isexpr) { | ||
parts.push(s && s.replace(_bp[5], '$1')) | ||
else | ||
} else { | ||
parts.push(s) | ||
} | ||
} | ||
@@ -148,3 +150,3 @@ | ||
ix = 1 | ||
while (match = recch.exec(s)) { | ||
while ((match = recch.exec(s))) { | ||
if (match[1] && | ||
@@ -163,2 +165,3 @@ !(match[1] === ch ? ++ix : --ix)) break | ||
var m = expr.match(_cache[9]) | ||
return m | ||
@@ -169,6 +172,2 @@ ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] } | ||
_brackets.hasRaw = function (src) { | ||
return _cache[10].test(src) | ||
} | ||
_brackets.array = function array (pair) { | ||
@@ -183,3 +182,2 @@ return pair ? _create(pair) : _cache | ||
_cache[9] = _regex(_pairs[9]) | ||
_cache[10] = _regex(_pairs[10]) | ||
} | ||
@@ -191,2 +189,3 @@ cachedBrackets = pair | ||
var b | ||
o = o || {} | ||
@@ -260,12 +259,15 @@ b = o.brackets | ||
function _create (str) { | ||
var expr = _getTmpl(str) | ||
var expr = _getTmpl(str) | ||
if (expr.slice(0, 11) !== 'try{return ') expr = 'return ' + expr | ||
return new Function('E', expr + ';') | ||
return new Function('E', expr + ';') //eslint-disable-line no-new-func | ||
} | ||
var | ||
CH_IDEXPR = '\u2057', | ||
RE_CSNAME = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/, | ||
RE_QBLOCK = RegExp(brackets.S_QBLOCKS, 'g'), | ||
RE_QBMARK = /\x01(\d+)~/g | ||
RE_DQUOTE = /\u2057/g, | ||
RE_QBMARK = /\u2057(\d+)~/g | ||
@@ -276,3 +278,3 @@ function _getTmpl (str) { | ||
expr, | ||
parts = brackets.split(str.replace(/\u2057/g, '"'), 1) | ||
parts = brackets.split(str.replace(RE_DQUOTE, '"'), 1) | ||
@@ -286,7 +288,7 @@ if (parts.length > 2 || parts[0]) { | ||
if (expr && (expr = i & 1 ? | ||
if (expr && (expr = i & 1 | ||
_parseExpr(expr, 1, qstr) : | ||
? _parseExpr(expr, 1, qstr) | ||
'"' + expr | ||
: '"' + expr | ||
.replace(/\\/g, '\\\\') | ||
@@ -301,4 +303,4 @@ .replace(/\r\n?|\n/g, '\\n') | ||
expr = j < 2 ? list[0] : | ||
'[' + list.join(',') + '].join("")' | ||
expr = j < 2 ? list[0] | ||
: '[' + list.join(',') + '].join("")' | ||
@@ -310,3 +312,3 @@ } else { | ||
if (qstr[0]) | ||
if (qstr[0]) { | ||
expr = expr.replace(RE_QBMARK, function (_, pos) { | ||
@@ -317,3 +319,3 @@ return qstr[pos] | ||
}) | ||
} | ||
return expr | ||
@@ -327,12 +329,9 @@ } | ||
'{': /[{}]/g | ||
}, | ||
CS_IDENT = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\x01(\d+)~):/ | ||
} | ||
function _parseExpr (expr, asText, qstr) { | ||
if (expr[0] === '=') expr = expr.slice(1) | ||
expr = expr | ||
.replace(RE_QBLOCK, function (s, div) { | ||
return s.length > 2 && !div ? '\x01' + (qstr.push(s) - 1) + '~' : s | ||
return s.length > 2 && !div ? CH_IDEXPR + (qstr.push(s) - 1) + '~' : s | ||
}) | ||
@@ -349,3 +348,3 @@ .replace(/\s+/g, ' ').trim() | ||
while (expr && | ||
(match = expr.match(CS_IDENT)) && | ||
(match = expr.match(RE_CSNAME)) && | ||
!match.index | ||
@@ -369,4 +368,4 @@ ) { | ||
expr = !cnt ? _wrapExpr(expr, asText) : | ||
cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
expr = !cnt ? _wrapExpr(expr, asText) | ||
: cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
} | ||
@@ -391,3 +390,3 @@ return expr | ||
// istanbul ignore next: not both | ||
var | ||
var // eslint-disable-next-line max-len | ||
JS_CONTEXT = '"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').', | ||
@@ -420,4 +419,4 @@ JS_VARNAME = /[,{][$\w]+:|(^ *|[^$\w\.])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g, | ||
expr = (tb ? | ||
'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
expr = (tb | ||
? 'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
) + '?"' + key + '":""' | ||
@@ -427,4 +426,4 @@ | ||
expr = 'function(v){' + (tb ? | ||
expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
expr = 'function(v){' + (tb | ||
? expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
) + ';return v||v===0?v:""}.call(this)' | ||
@@ -439,3 +438,3 @@ } | ||
_tmpl.version = brackets.version = 'v2.3.21' | ||
_tmpl.version = brackets.version = 'v2.3.22' | ||
@@ -442,0 +441,0 @@ return _tmpl |
/** | ||
* The riot template engine | ||
* @version v2.3.21 | ||
* @version v2.3.22 | ||
*/ | ||
@@ -100,3 +100,3 @@ | ||
while (match = re.exec(str)) { | ||
while ((match = re.exec(str))) { | ||
@@ -111,4 +111,5 @@ pos = match.index | ||
} | ||
if (!match[3]) | ||
if (!match[3]) { | ||
continue | ||
} | ||
} | ||
@@ -131,6 +132,7 @@ | ||
function unescapeStr (s) { | ||
if (tmpl || isexpr) | ||
if (tmpl || isexpr) { | ||
parts.push(s && s.replace(_bp[5], '$1')) | ||
else | ||
} else { | ||
parts.push(s) | ||
} | ||
} | ||
@@ -145,3 +147,3 @@ | ||
ix = 1 | ||
while (match = recch.exec(s)) { | ||
while ((match = recch.exec(s))) { | ||
if (match[1] && | ||
@@ -160,2 +162,3 @@ !(match[1] === ch ? ++ix : --ix)) break | ||
var m = expr.match(_cache[9]) | ||
return m | ||
@@ -166,6 +169,2 @@ ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] } | ||
_brackets.hasRaw = function (src) { | ||
return _cache[10].test(src) | ||
} | ||
_brackets.array = function array (pair) { | ||
@@ -180,3 +179,2 @@ return pair ? _create(pair) : _cache | ||
_cache[9] = _regex(_pairs[9]) | ||
_cache[10] = _regex(_pairs[10]) | ||
} | ||
@@ -188,2 +186,3 @@ cachedBrackets = pair | ||
var b | ||
o = o || {} | ||
@@ -256,12 +255,15 @@ b = o.brackets | ||
function _create (str) { | ||
var expr = _getTmpl(str) | ||
var expr = _getTmpl(str) | ||
if (expr.slice(0, 11) !== 'try{return ') expr = 'return ' + expr | ||
return new Function('E', expr + ';') | ||
return new Function('E', expr + ';') //eslint-disable-line no-new-func | ||
} | ||
var | ||
CH_IDEXPR = '\u2057', | ||
RE_CSNAME = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/, | ||
RE_QBLOCK = RegExp(brackets.S_QBLOCKS, 'g'), | ||
RE_QBMARK = /\x01(\d+)~/g | ||
RE_DQUOTE = /\u2057/g, | ||
RE_QBMARK = /\u2057(\d+)~/g | ||
@@ -272,3 +274,3 @@ function _getTmpl (str) { | ||
expr, | ||
parts = brackets.split(str.replace(/\u2057/g, '"'), 1) | ||
parts = brackets.split(str.replace(RE_DQUOTE, '"'), 1) | ||
@@ -282,7 +284,7 @@ if (parts.length > 2 || parts[0]) { | ||
if (expr && (expr = i & 1 ? | ||
if (expr && (expr = i & 1 | ||
_parseExpr(expr, 1, qstr) : | ||
? _parseExpr(expr, 1, qstr) | ||
'"' + expr | ||
: '"' + expr | ||
.replace(/\\/g, '\\\\') | ||
@@ -297,4 +299,4 @@ .replace(/\r\n?|\n/g, '\\n') | ||
expr = j < 2 ? list[0] : | ||
'[' + list.join(',') + '].join("")' | ||
expr = j < 2 ? list[0] | ||
: '[' + list.join(',') + '].join("")' | ||
@@ -306,3 +308,3 @@ } else { | ||
if (qstr[0]) | ||
if (qstr[0]) { | ||
expr = expr.replace(RE_QBMARK, function (_, pos) { | ||
@@ -313,3 +315,3 @@ return qstr[pos] | ||
}) | ||
} | ||
return expr | ||
@@ -323,12 +325,9 @@ } | ||
'{': /[{}]/g | ||
}, | ||
CS_IDENT = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\x01(\d+)~):/ | ||
} | ||
function _parseExpr (expr, asText, qstr) { | ||
if (expr[0] === '=') expr = expr.slice(1) | ||
expr = expr | ||
.replace(RE_QBLOCK, function (s, div) { | ||
return s.length > 2 && !div ? '\x01' + (qstr.push(s) - 1) + '~' : s | ||
return s.length > 2 && !div ? CH_IDEXPR + (qstr.push(s) - 1) + '~' : s | ||
}) | ||
@@ -345,3 +344,3 @@ .replace(/\s+/g, ' ').trim() | ||
while (expr && | ||
(match = expr.match(CS_IDENT)) && | ||
(match = expr.match(RE_CSNAME)) && | ||
!match.index | ||
@@ -365,4 +364,4 @@ ) { | ||
expr = !cnt ? _wrapExpr(expr, asText) : | ||
cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
expr = !cnt ? _wrapExpr(expr, asText) | ||
: cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
} | ||
@@ -387,3 +386,3 @@ return expr | ||
// istanbul ignore next: not both | ||
var | ||
var // eslint-disable-next-line max-len | ||
JS_CONTEXT = '"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').', | ||
@@ -416,4 +415,4 @@ JS_VARNAME = /[,{][$\w]+:|(^ *|[^$\w\.])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g, | ||
expr = (tb ? | ||
'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
expr = (tb | ||
? 'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
) + '?"' + key + '":""' | ||
@@ -423,4 +422,4 @@ | ||
expr = 'function(v){' + (tb ? | ||
expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
expr = 'function(v){' + (tb | ||
? expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
) + ';return v||v===0?v:""}.call(this)' | ||
@@ -435,3 +434,3 @@ } | ||
_tmpl.version = brackets.version = 'v2.3.21' | ||
_tmpl.version = brackets.version = 'v2.3.22' | ||
@@ -438,0 +437,0 @@ return _tmpl |
@@ -1,5 +0,4 @@ | ||
/* riot-tmpl v2.3.21, @license MIT, (c) 2015 Muut Inc. + contributors */ | ||
/* riot-tmpl v2.3.22, @license MIT, (c) 2015 Muut Inc. + contributors */ | ||
;(function (window) { // eslint-disable-line no-extra-semi | ||
'use strict' | ||
/*eslint-env amd */ | ||
@@ -99,3 +98,3 @@ /** | ||
while (match = re.exec(str)) { | ||
while ((match = re.exec(str))) { | ||
@@ -110,4 +109,5 @@ pos = match.index | ||
} | ||
if (!match[3]) | ||
if (!match[3]) { | ||
continue | ||
} | ||
} | ||
@@ -130,6 +130,7 @@ | ||
function unescapeStr (s) { | ||
if (tmpl || isexpr) | ||
if (tmpl || isexpr) { | ||
parts.push(s && s.replace(_bp[5], '$1')) | ||
else | ||
} else { | ||
parts.push(s) | ||
} | ||
} | ||
@@ -144,3 +145,3 @@ | ||
ix = 1 | ||
while (match = recch.exec(s)) { | ||
while ((match = recch.exec(s))) { | ||
if (match[1] && | ||
@@ -159,2 +160,3 @@ !(match[1] === ch ? ++ix : --ix)) break | ||
var m = expr.match(_cache[9]) | ||
return m | ||
@@ -165,6 +167,2 @@ ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] } | ||
_brackets.hasRaw = function (src) { | ||
return _cache[10].test(src) | ||
} | ||
_brackets.array = function array (pair) { | ||
@@ -179,3 +177,2 @@ return pair ? _create(pair) : _cache | ||
_cache[9] = _regex(_pairs[9]) | ||
_cache[10] = _regex(_pairs[10]) | ||
} | ||
@@ -187,2 +184,3 @@ cachedBrackets = pair | ||
var b | ||
o = o || {} | ||
@@ -255,12 +253,15 @@ b = o.brackets | ||
function _create (str) { | ||
var expr = _getTmpl(str) | ||
var expr = _getTmpl(str) | ||
if (expr.slice(0, 11) !== 'try{return ') expr = 'return ' + expr | ||
return new Function('E', expr + ';') | ||
return new Function('E', expr + ';') //eslint-disable-line no-new-func | ||
} | ||
var | ||
CH_IDEXPR = '\u2057', | ||
RE_CSNAME = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/, | ||
RE_QBLOCK = RegExp(brackets.S_QBLOCKS, 'g'), | ||
RE_QBMARK = /\x01(\d+)~/g | ||
RE_DQUOTE = /\u2057/g, | ||
RE_QBMARK = /\u2057(\d+)~/g | ||
@@ -271,3 +272,3 @@ function _getTmpl (str) { | ||
expr, | ||
parts = brackets.split(str.replace(/\u2057/g, '"'), 1) | ||
parts = brackets.split(str.replace(RE_DQUOTE, '"'), 1) | ||
@@ -281,7 +282,7 @@ if (parts.length > 2 || parts[0]) { | ||
if (expr && (expr = i & 1 ? | ||
if (expr && (expr = i & 1 | ||
_parseExpr(expr, 1, qstr) : | ||
? _parseExpr(expr, 1, qstr) | ||
'"' + expr | ||
: '"' + expr | ||
.replace(/\\/g, '\\\\') | ||
@@ -296,4 +297,4 @@ .replace(/\r\n?|\n/g, '\\n') | ||
expr = j < 2 ? list[0] : | ||
'[' + list.join(',') + '].join("")' | ||
expr = j < 2 ? list[0] | ||
: '[' + list.join(',') + '].join("")' | ||
@@ -305,3 +306,3 @@ } else { | ||
if (qstr[0]) | ||
if (qstr[0]) { | ||
expr = expr.replace(RE_QBMARK, function (_, pos) { | ||
@@ -312,3 +313,3 @@ return qstr[pos] | ||
}) | ||
} | ||
return expr | ||
@@ -322,12 +323,9 @@ } | ||
'{': /[{}]/g | ||
}, | ||
CS_IDENT = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\x01(\d+)~):/ | ||
} | ||
function _parseExpr (expr, asText, qstr) { | ||
if (expr[0] === '=') expr = expr.slice(1) | ||
expr = expr | ||
.replace(RE_QBLOCK, function (s, div) { | ||
return s.length > 2 && !div ? '\x01' + (qstr.push(s) - 1) + '~' : s | ||
return s.length > 2 && !div ? CH_IDEXPR + (qstr.push(s) - 1) + '~' : s | ||
}) | ||
@@ -344,3 +342,3 @@ .replace(/\s+/g, ' ').trim() | ||
while (expr && | ||
(match = expr.match(CS_IDENT)) && | ||
(match = expr.match(RE_CSNAME)) && | ||
!match.index | ||
@@ -364,4 +362,4 @@ ) { | ||
expr = !cnt ? _wrapExpr(expr, asText) : | ||
cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
expr = !cnt ? _wrapExpr(expr, asText) | ||
: cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
} | ||
@@ -386,3 +384,3 @@ return expr | ||
// istanbul ignore next: not both | ||
var | ||
var // eslint-disable-next-line max-len | ||
JS_CONTEXT = '"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').', | ||
@@ -415,4 +413,4 @@ JS_VARNAME = /[,{][$\w]+:|(^ *|[^$\w\.])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g, | ||
expr = (tb ? | ||
'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
expr = (tb | ||
? 'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
) + '?"' + key + '":""' | ||
@@ -422,4 +420,4 @@ | ||
expr = 'function(v){' + (tb ? | ||
expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
expr = 'function(v){' + (tb | ||
? expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
) + ';return v||v===0?v:""}.call(this)' | ||
@@ -438,3 +436,3 @@ } | ||
tmpl.version = brackets.version = 'v2.3.21' | ||
tmpl.version = brackets.version = 'v2.3.22' | ||
@@ -444,3 +442,3 @@ /* istanbul ignore else */ | ||
module.exports = { | ||
'tmpl': tmpl, 'brackets': brackets | ||
tmpl: tmpl, brackets: brackets | ||
} | ||
@@ -450,3 +448,3 @@ } else if (typeof define === 'function' && typeof define.amd !== 'undefined') { | ||
return { | ||
'tmpl': tmpl, 'brackets': brackets | ||
tmpl: tmpl, brackets: brackets | ||
} | ||
@@ -459,2 +457,2 @@ }) | ||
})(typeof window === 'object' ? /* istanbul ignore next */ window : void 0) // eslint-disable-line | ||
})(typeof window === 'object' ? /* istanbul ignore next */ window : void 0) |
{ | ||
"name": "riot-tmpl", | ||
"version": "2.3.21", | ||
"version": "2.3.22", | ||
"description": "The riot template engine", | ||
@@ -31,14 +31,14 @@ "main": "dist/tmpl.js", | ||
"devDependencies": { | ||
"coveralls": "^2.11.6", | ||
"eslint": "^1.10.3", | ||
"coveralls": "^2.11.8", | ||
"eslint": "^2.3.0", | ||
"expect.js": "^0.3.1", | ||
"istanbul": "^0.4.2", | ||
"jspreproc": "^0.2.7", | ||
"karma": "^0.13.19", | ||
"karma": "^0.13.21", | ||
"karma-browserstack-launcher": "^0.1.6", | ||
"karma-coverage": "^0.5.3", | ||
"karma-mocha": "^0.2.1", | ||
"karma-phantomjs-launcher": "^0.2.3", | ||
"mocha": "^2.4.4", | ||
"phantomjs": "^2.1.2", | ||
"karma-coverage": "^0.5.5", | ||
"karma-mocha": "^0.2.2", | ||
"karma-phantomjs-launcher": "^1.0.0", | ||
"mocha": "^2.4.5", | ||
"phantomjs": "^2.1.3", | ||
"riot-bump": "^1.0.0" | ||
@@ -45,0 +45,0 @@ }, |
@@ -22,3 +22,20 @@ /** | ||
// -------------------------------------------------------------------------- | ||
// | ||
//#set $_RIX_TEST = 4 | ||
//#set $_RIX_ESC = 5 | ||
//#set $_RIX_OPEN = 6 | ||
//#set $_RIX_CLOSE = 7 | ||
//#set $_RIX_PAIR = 8 | ||
//#set $_RIX_LOOP = 9 | ||
//#ifndef $_RIX_TEST | ||
var | ||
$_RIX_TEST = 4, // DONT'T FORGET SYNC THE #set BLOCK!!! | ||
$_RIX_ESC = 5, | ||
$_RIX_OPEN = 6, | ||
$_RIX_CLOSE = 7, | ||
$_RIX_PAIR = 8, | ||
$_RIX_LOOP = 9 | ||
//#endif | ||
var | ||
REGLOB = 'g', | ||
@@ -82,20 +99,2 @@ | ||
//#set $_RIX_TEST = 4 | ||
//#set $_RIX_ESC = 5 | ||
//#set $_RIX_OPEN = 6 | ||
//#set $_RIX_CLOSE = 7 | ||
//#set $_RIX_PAIR = 8 | ||
//#set $_RIX_LOOP = 9 | ||
//#set $_RIX_RAW = 10 | ||
//#ifndef $_RIX_TEST | ||
var | ||
$_RIX_TEST = 4, // DONT'T FORGET SYNC THE #set BLOCK!!! | ||
$_RIX_ESC = 5, | ||
$_RIX_OPEN = 6, | ||
$_RIX_CLOSE = 7, | ||
$_RIX_PAIR = 8, | ||
$_RIX_LOOP = 9, | ||
$_RIX_RAW = 10 | ||
//#endif | ||
// pre-made string and regexes for the default brackets | ||
@@ -235,3 +234,3 @@ var _pairs = [ | ||
while (match = re.exec(str)) { | ||
while ((match = re.exec(str))) { | ||
@@ -250,4 +249,5 @@ pos = match.index | ||
} | ||
if (!match[3]) // if don't have a closing bracket | ||
if (!match[3]) { // if don't have a closing bracket | ||
continue // search again | ||
} | ||
} | ||
@@ -278,6 +278,7 @@ | ||
function unescapeStr (s) { | ||
if (tmpl || isexpr) | ||
if (tmpl || isexpr) { | ||
parts.push(s && s.replace(_bp[$_RIX_ESC], '$1')) | ||
else | ||
} else { | ||
parts.push(s) | ||
} | ||
} | ||
@@ -294,3 +295,3 @@ | ||
ix = 1 | ||
while (match = recch.exec(s)) { | ||
while ((match = recch.exec(s))) { | ||
if (match[1] && | ||
@@ -311,2 +312,3 @@ !(match[1] === ch ? ++ix : --ix)) break | ||
var m = expr.match(_cache[$_RIX_LOOP]) | ||
return m | ||
@@ -317,7 +319,2 @@ ? { key: m[1], pos: m[2], val: _cache[0] + m[3].trim() + _cache[1] } | ||
// exposed by riot.util.tmpl.haveRaw | ||
_brackets.hasRaw = function (src) { | ||
return _cache[$_RIX_RAW].test(src) | ||
} | ||
/** | ||
@@ -347,3 +344,2 @@ * Returns an array with brackets information, defaults to the current brackets. | ||
_cache[$_RIX_LOOP] = _regex(_pairs[$_RIX_LOOP]) | ||
_cache[$_RIX_RAW] = _regex(_pairs[$_RIX_RAW]) | ||
} | ||
@@ -360,2 +356,3 @@ cachedBrackets = pair // always set these | ||
var b | ||
o = o || {} | ||
@@ -362,0 +359,0 @@ b = o.brackets |
//#if 0 | ||
/*global tmpl, brackets */ | ||
/* global tmpl, brackets, window */ | ||
/* eslint-disable no-void */ | ||
/* eslint-env amd */ | ||
//#endif | ||
@@ -8,3 +10,2 @@ //#if NODE | ||
'use strict' | ||
/*eslint-env amd */ | ||
//#else | ||
@@ -22,3 +23,2 @@ | ||
//#if NODE | ||
@@ -31,3 +31,3 @@ tmpl.version = brackets.version = 'WIP' | ||
module.exports = { | ||
'tmpl': tmpl, 'brackets': brackets | ||
tmpl: tmpl, brackets: brackets | ||
} | ||
@@ -37,3 +37,3 @@ } else if (typeof define === 'function' && typeof define.amd !== 'undefined') { | ||
return { | ||
'tmpl': tmpl, 'brackets': brackets | ||
tmpl: tmpl, brackets: brackets | ||
} | ||
@@ -46,3 +46,3 @@ }) | ||
})(typeof window === 'object' ? /* istanbul ignore next */ window : void 0) // eslint-disable-line | ||
})(typeof window === 'object' ? /* istanbul ignore next */ window : void 0) | ||
//#endif |
@@ -45,4 +45,5 @@ /** | ||
_cache[str] = _create(str, 1) // request debug output | ||
var rs = typeof riot === 'undefined' ? | ||
'(riot undefined)' : JSON.stringify(riot.settings) | ||
var rs = typeof riot === 'undefined' | ||
? '(riot undefined)' : JSON.stringify(riot.settings) | ||
console.log('--- DEBUG' + | ||
@@ -139,9 +140,8 @@ '\n riot.settings: ' + rs + '\n data: ' + JSON.stringify(data)) | ||
function _create (str) { | ||
var expr = _getTmpl(str) | ||
var expr = _getTmpl(str) | ||
if (expr.slice(0, 11) !== 'try{return ') expr = 'return ' + expr | ||
//#if DEBUG | ||
if (arguments.length > 1) | ||
console.log('--- getter:\n `' + expr + '`\n---') | ||
if (arguments.length > 1) console.log('--- getter:\n `' + expr + '`\n---') | ||
//#elif LIST_GETTERS | ||
@@ -153,3 +153,3 @@ //console.log(' In: `%s`\nOUT: `%s`', str, expr) | ||
// The parameter `E` is the error handler for runtime only. | ||
return new Function('E', expr + ';') | ||
return new Function('E', expr + ';') //eslint-disable-line no-new-func | ||
} | ||
@@ -163,4 +163,7 @@ | ||
var | ||
CH_IDEXPR = '\u2057', | ||
RE_CSNAME = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\u2057(\d+)~):/, | ||
RE_QBLOCK = RegExp(brackets.S_QBLOCKS, 'g'), | ||
RE_QBMARK = /\x01(\d+)~/g // string or regex marker, $1: array index | ||
RE_DQUOTE = /\u2057/g, | ||
RE_QBMARK = /\u2057(\d+)~/g // string or regex marker, $1: array index | ||
@@ -179,3 +182,3 @@ /** | ||
expr, | ||
parts = brackets.split(str.replace(/\u2057/g, '"'), 1) // get text/expr parts | ||
parts = brackets.split(str.replace(RE_DQUOTE, '"'), 1) // get text/expr parts | ||
@@ -190,7 +193,7 @@ // We can have almost anything as expressions, except comments... hope | ||
if (expr && (expr = i & 1 ? // every odd element is an expression | ||
if (expr && (expr = i & 1 // every odd element is an expression | ||
_parseExpr(expr, 1, qstr) : // mode 1 convert falsy values to "", | ||
? _parseExpr(expr, 1, qstr) // mode 1 convert falsy values to "", | ||
// except zero | ||
'"' + expr // ttext: convert to js literal string | ||
: '"' + expr // ttext: convert to js literal string | ||
.replace(/\\/g, '\\\\') // this is html, preserve backslashes | ||
@@ -205,4 +208,4 @@ .replace(/\r\n?|\n/g, '\\n') // normalize eols | ||
expr = j < 2 ? list[0] : // optimize code for 0-1 parts | ||
'[' + list.join(',') + '].join("")' | ||
expr = j < 2 ? list[0] // optimize code for 0-1 parts | ||
: '[' + list.join(',') + '].join("")' | ||
@@ -215,3 +218,3 @@ } else { | ||
// Restore quoted strings and regexes | ||
if (qstr[0]) | ||
if (qstr[0]) { | ||
expr = expr.replace(RE_QBMARK, function (_, pos) { | ||
@@ -222,3 +225,3 @@ return qstr[pos] | ||
}) | ||
} | ||
return expr | ||
@@ -232,4 +235,3 @@ } | ||
'{': /[{}]/g | ||
}, | ||
CS_IDENT = /^(?:(-?[_A-Za-z\xA0-\xFF][-\w\xA0-\xFF]*)|\x01(\d+)~):/ | ||
} | ||
@@ -270,7 +272,5 @@ /** | ||
if (expr[0] === '=') expr = expr.slice(1) | ||
expr = expr | ||
.replace(RE_QBLOCK, function (s, div) { // hide strings & regexes | ||
return s.length > 2 && !div ? '\x01' + (qstr.push(s) - 1) + '~' : s | ||
return s.length > 2 && !div ? CH_IDEXPR + (qstr.push(s) - 1) + '~' : s | ||
}) | ||
@@ -288,3 +288,3 @@ .replace(/\s+/g, ' ').trim() | ||
while (expr && | ||
(match = expr.match(CS_IDENT)) && | ||
(match = expr.match(RE_CSNAME)) && | ||
!match.index // index > 0 means error | ||
@@ -313,4 +313,4 @@ ) { | ||
// For shorthands, the generated code returns an array with expression-name pairs | ||
expr = !cnt ? _wrapExpr(expr, asText) : | ||
cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
expr = !cnt ? _wrapExpr(expr, asText) | ||
: cnt > 1 ? '[' + list.join(',') + '].join(" ").trim()' : list[0] | ||
} | ||
@@ -337,3 +337,3 @@ return expr | ||
// istanbul ignore next: not both | ||
var | ||
var // eslint-disable-next-line max-len | ||
JS_CONTEXT = '"in this?this:' + (typeof window !== 'object' ? 'global' : 'window') + ').', | ||
@@ -384,4 +384,4 @@ JS_VARNAME = /[,{][$\w]+:|(^ *|[^$\w\.])(?!(?:typeof|true|false|null|undefined|in|instanceof|is(?:Finite|NaN)|void|NaN|new|Date|RegExp|Math)(?![$\w]))([$_A-Za-z][$\w]*)/g, | ||
// ==> 'return [' + expr_list.join(',') + '].join(" ").trim()' | ||
expr = (tb ? | ||
'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
expr = (tb | ||
? 'function(){' + expr + '}.call(this)' : '(' + expr + ')' | ||
) + '?"' + key + '":""' | ||
@@ -393,4 +393,4 @@ | ||
// ==> 'return [' + text_and_expr_list.join(',') + '].join("")' | ||
expr = 'function(v){' + (tb ? | ||
expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
expr = 'function(v){' + (tb | ||
? expr.replace('return ', 'v=') : 'v=(' + expr + ')' | ||
) + ';return v||v===0?v:""}.call(this)' | ||
@@ -397,0 +397,0 @@ } |
@@ -11,3 +11,3 @@ /*eslint-env mocha */ | ||
str: 'x', | ||
obj: {val: 2}, | ||
obj: { val: 2 }, | ||
arr: [2], | ||
@@ -260,3 +260,2 @@ x: 2, | ||
describe('whitespace', function () { | ||
@@ -304,2 +303,3 @@ | ||
var gw = typeof window === 'object' ? 'window' : 'global' | ||
expect(render('{ ' + gw + '.globalVar }')).to.be(5) | ||
@@ -313,5 +313,6 @@ data.Date = '{}' | ||
var i, a = ['isFinite', 'isNaN', 'Date', 'RegExp', 'Math'] | ||
for (i = 0; i < a.length; ++i) | ||
for (i = 0; i < a.length; ++i) { | ||
data[a[i]] = 0 | ||
} | ||
expect(render('{ Infinity }')).to.be.a('number') | ||
@@ -324,4 +325,5 @@ expect(render('{ isFinite(1) }')).to.be(true) | ||
for (i = 0; i < a.length; ++i) | ||
for (i = 0; i < a.length; ++i) { | ||
delete data[a[i]] | ||
} | ||
}) | ||
@@ -374,2 +376,3 @@ | ||
var err | ||
tmpl.errorHandler = function (e) { err = e } | ||
@@ -382,3 +385,3 @@ // je, tmpl({x}, NaN) does not generate error... bug or danling var? | ||
expect(err instanceof Error).to.be(true) | ||
expect(err.riotData).to.eql({tagName: undefined, _riot_id: undefined}) | ||
expect(err.riotData).to.eql({ tagName: undefined, _riot_id: undefined }) | ||
// undefined as parameter for Function.call(`this`) defaults to global | ||
@@ -388,3 +391,3 @@ err = 0 | ||
expect(err instanceof Error).to.be(true) | ||
expect(err.riotData).to.eql({tagName: undefined, _riot_id: undefined}) | ||
expect(err.riotData).to.eql({ tagName: undefined, _riot_id: undefined }) | ||
}) | ||
@@ -394,2 +397,3 @@ | ||
var err | ||
tmpl.errorHandler = function (e) { err = e } | ||
@@ -399,3 +403,3 @@ err = 0 | ||
expect(err instanceof Error).to.be(true) | ||
expect(err.riotData).to.eql({tagName: undefined, _riot_id: undefined}) | ||
expect(err.riotData).to.eql({ tagName: undefined, _riot_id: undefined }) | ||
}) | ||
@@ -407,3 +411,3 @@ | ||
tmpl.errorHandler = function (e) { err = e } | ||
data.root = {tagName: 'DIV'} | ||
data.root = { tagName: 'DIV' } | ||
data._riot_id = 1 | ||
@@ -416,3 +420,3 @@ result = render('{ undefinedVar.property }') // render as normal | ||
expect(err instanceof Error).to.be(true) | ||
expect(err.riotData).to.eql({tagName: 'DIV', _riot_id: 1}) | ||
expect(err.riotData).to.eql({ tagName: 'DIV', _riot_id: 1 }) | ||
}) | ||
@@ -448,12 +452,13 @@ | ||
atest = [ | ||
'{ studio in studios["Nearby Locations"] }', {key: 'studio', pos: undefined, val: '{studios["Nearby Locations"]}'}, | ||
'{k,i in item}', {key: 'k', pos: 'i', val: '{item}'}, | ||
'{ k in i }', {key: 'k', pos: undefined, val: '{i}'}, | ||
'{^ item in i }', {key: 'item', pos: undefined, val: '{i}'}, | ||
'{^item,idx in items } ', {key: 'item', pos: 'idx', val: '{items}'}, | ||
'{ item} ', {val: '{ item}'}, | ||
'{item', {val: '{item'}, // val is expected | ||
'{}', {val: '{}'}, | ||
'0', {val: '0'} | ||
'{ studio in studios["Nearby Locations"] }', { key: 'studio', pos: undefined, val: '{studios["Nearby Locations"]}' }, | ||
'{k,i in item}', { key: 'k', pos: 'i', val: '{item}' }, | ||
'{ k in i }', { key: 'k', pos: undefined, val: '{i}' }, | ||
'{^ item in i }', { key: 'item', pos: undefined, val: '{i}' }, | ||
'{^item,idx in items } ', { key: 'item', pos: 'idx', val: '{items}' }, | ||
'{ item} ', { val: '{ item}' }, | ||
'{item', { val: '{item' }, // val is expected | ||
'{}', { val: '{}' }, | ||
'0', { val: '0' } | ||
] | ||
for (i = 0; i < atest.length; i += 2) { | ||
@@ -468,11 +473,12 @@ expect(tmpl.loopKeys(atest[i])).to.eql(atest[i + 1]) | ||
atest = [ | ||
'{{k,i in item}}', {key: 'k', pos: 'i', val: '{{item}}'}, | ||
'{{ k in i }}', {key: 'k', pos: undefined, val: '{{i}}'}, | ||
'{{^ item in i }}', {key: 'item', pos: undefined, val: '{{i}}'}, | ||
'{{^item,idx in items }} ', {key: 'item', pos: 'idx', val: '{{items}}'}, | ||
'{{ item}} ', {val: '{{ item}}'}, | ||
'{{item', {val: '{{item'}, // val is expected | ||
'{{}}', {val: '{{}}'}, | ||
'0', {val: '0'} | ||
'{{k,i in item}}', { key: 'k', pos: 'i', val: '{{item}}' }, | ||
'{{ k in i }}', { key: 'k', pos: undefined, val: '{{i}}' }, | ||
'{{^ item in i }}', { key: 'item', pos: undefined, val: '{{i}}' }, | ||
'{{^item,idx in items }} ', { key: 'item', pos: 'idx', val: '{{items}}' }, | ||
'{{ item}} ', { val: '{{ item}}' }, | ||
'{{item', { val: '{{item' }, // val is expected | ||
'{{}}', { val: '{{}}' }, | ||
'0', { val: '0' } | ||
] | ||
for (i = 0; i < atest.length; i += 2) { | ||
@@ -495,16 +501,16 @@ expect(tmpl.loopKeys(atest[i])).to.eql(atest[i + 1]) | ||
it('tmpl.haveRaw: test for raw html flag in a template (v2.3.14)', function () { | ||
expect(tmpl.haveRaw('{' + RAW_FLAG + ' "<br>" }')).to.be(true) | ||
expect(tmpl.haveRaw('{ ' + RAW_FLAG + ' "<br>" }')).to.be(false) | ||
expect(tmpl.haveRaw('\\{= "<br>" } ')).to.be(false) | ||
expect(tmpl.haveRaw(' {' + RAW_FLAG + ' "<br>" }')).to.be(true) | ||
expect(tmpl.haveRaw(' { ' + RAW_FLAG + ' "<br>" }')).to.be(false) | ||
expect(tmpl.haveRaw(' \\{= "<br>" } ')).to.be(false) | ||
}) | ||
//it('tmpl.haveRaw: test for raw html flag in a template (v2.3.14)', function () { | ||
// expect(tmpl.haveRaw('{' + RAW_FLAG + ' "<br>" }')).to.be(true) | ||
// expect(tmpl.haveRaw('{ ' + RAW_FLAG + ' "<br>" }')).to.be(false) | ||
// expect(tmpl.haveRaw('\\{= "<br>" } ')).to.be(false) | ||
// expect(tmpl.haveRaw(' {' + RAW_FLAG + ' "<br>" }')).to.be(true) | ||
// expect(tmpl.haveRaw(' { ' + RAW_FLAG + ' "<br>" }')).to.be(false) | ||
// expect(tmpl.haveRaw(' \\{= "<br>" } ')).to.be(false) | ||
//}) | ||
it('the raw html is removed before evaluation (v2.3.14)', function () { | ||
expect(render('{' + RAW_FLAG + ' "<br>" }')).to.be('<br>') | ||
expect(render(' {' + RAW_FLAG + ' "<br>" }')).to.be(' <br>') | ||
expect(render('{' + RAW_FLAG + ' "<" + str + ">" }')).to.be('<x>') | ||
}) | ||
//it('the raw html is removed before evaluation (v2.3.14)', function () { | ||
// expect(render('{' + RAW_FLAG + ' "<br>" }')).to.be('<br>') | ||
// expect(render(' {' + RAW_FLAG + ' "<br>" }')).to.be(' <br>') | ||
// expect(render('{' + RAW_FLAG + ' "<" + str + ">" }')).to.be('<x>') | ||
//}) | ||
@@ -511,0 +517,0 @@ }) |
122886
2840