diff options
author | Kevin Decker <kpdecker@gmail.com> | 2014-11-08 17:49:14 -0600 |
---|---|---|
committer | Kevin Decker <kpdecker@gmail.com> | 2014-11-08 17:49:14 -0600 |
commit | ea6b0be910d3fb0178d8e2d1fcc54c17b8d3a94f (patch) | |
tree | 5ba7d55fb42ab6f134075b5c5d75dbbb4670896d /lib/handlebars/compiler/helpers.js | |
parent | e779ecf12dade0aba530610b37dc28a57d946c9d (diff) | |
parent | 4282668d47b90da0d00cf4c4a86977f18fc8cde4 (diff) | |
download | handlebars.js-ea6b0be910d3fb0178d8e2d1fcc54c17b8d3a94f.zip handlebars.js-ea6b0be910d3fb0178d8e2d1fcc54c17b8d3a94f.tar.gz handlebars.js-ea6b0be910d3fb0178d8e2d1fcc54c17b8d3a94f.tar.bz2 |
Merge pull request #892 from wycats/else-if
Implement parser for else chaining of helpers
Diffstat (limited to 'lib/handlebars/compiler/helpers.js')
-rw-r--r-- | lib/handlebars/compiler/helpers.js | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/lib/handlebars/compiler/helpers.js b/lib/handlebars/compiler/helpers.js index 5aa0f2c..d236f7f 100644 --- a/lib/handlebars/compiler/helpers.js +++ b/lib/handlebars/compiler/helpers.js @@ -15,11 +15,29 @@ export function stripComment(comment) { export function prepareBlock(mustache, program, inverseAndProgram, close, inverted, locInfo) { /*jshint -W040 */ - if (mustache.sexpr.id.original !== close.path.original) { + // When we are chaining inverse calls, we will not have a close path + if (close && close.path && (mustache.sexpr.id.original !== close.path.original)) { throw new Exception(mustache.sexpr.id.original + ' doesn\'t match ' + close.path.original, mustache); } - var inverse = inverseAndProgram && inverseAndProgram.program; + // Safely handle a chained inverse that does not have a non-conditional inverse + // (i.e. both inverseAndProgram AND close are undefined) + if (!close) { + close = {strip: {}}; + } + + // Find the inverse program that is involed with whitespace stripping. + var inverse = inverseAndProgram && inverseAndProgram.program, + firstInverse = inverse, + lastInverse = inverse; + if (inverse && inverse.inverse) { + firstInverse = inverse.statements[0].program; + + // Walk the inverse chain to find the last inverse that is actually in the chain. + while (lastInverse.inverse) { + lastInverse = lastInverse.statements[lastInverse.statements.length-1].program; + } + } var strip = { left: mustache.strip.left, @@ -28,7 +46,7 @@ export function prepareBlock(mustache, program, inverseAndProgram, close, invert // Determine the standalone candiacy. Basically flag our content as being possibly standalone // so our parent can determine if we actually are standalone openStandalone: isNextWhitespace(program.statements), - closeStandalone: isPrevWhitespace((inverse || program).statements) + closeStandalone: isPrevWhitespace((firstInverse || program).statements) }; if (mustache.strip.right) { @@ -41,19 +59,20 @@ export function prepareBlock(mustache, program, inverseAndProgram, close, invert if (inverseStrip.left) { omitLeft(program.statements, null, true); } + if (inverseStrip.right) { - omitRight(inverse.statements, null, true); + omitRight(firstInverse.statements, null, true); } if (close.strip.left) { - omitLeft(inverse.statements, null, true); + omitLeft(lastInverse.statements, null, true); } // Find standalone else statments if (isPrevWhitespace(program.statements) - && isNextWhitespace(inverse.statements)) { + && isNextWhitespace(firstInverse.statements)) { omitLeft(program.statements); - omitRight(inverse.statements); + omitRight(firstInverse.statements); } } else { if (close.strip.left) { |