diff --git a/source/Handlebars.Test/InlinePartialTests.cs b/source/Handlebars.Test/InlinePartialTests.cs index 7d4a019f..569e862f 100644 --- a/source/Handlebars.Test/InlinePartialTests.cs +++ b/source/Handlebars.Test/InlinePartialTests.cs @@ -264,6 +264,18 @@ public void BasicBlockInlinePartial() var result2 = template(data); Assert.Equal("Hello, Pete Jones!", result2); + + source = "Hello, {{#>personInline}}{{/personInline}}!"; + template = Handlebars.Compile(source); + + var result3 = template(data); + Assert.Equal("Hello, !", result3); + + source = "{{#*inline \"personInline\"}}{{firstName}} {{lastName}}{{/inline}}" + source; + template = Handlebars.Compile(source); + + var result4 = template(data); + Assert.Equal("Hello, Pete Jones!", result4); } [Fact] @@ -413,6 +425,42 @@ public void RecursionBoundedAboveLimitInlinePartial() ex = Assert.IsType(ex.InnerException); Assert.Equal("Runtime error while rendering partial 'list', exceeded recursion depth limit of 100", ex.Message); } + + [Fact] + public void BlockInlinePartialWithInlinePartials() + { + string partialSource = "{{#*inline \"greeting\"}}{{#>salutation}}Dear{{/salutation}} {{#>name}}{{firstName}} {{lastName}}{{/name}}{{/inline}}"; + + var data = new + { + firstName = "Pete", + lastName = "Jones" + }; + + string source = partialSource + "{{#>greeting}}{{/greeting}}"; + var template = Handlebars.Compile(source); + + var result1 = template(data); + Assert.Equal("Dear Pete Jones", result1); + + source = partialSource + "{{#>greeting}}{{#*inline \"salutation\"}}Hello{{/inline}}{{/greeting}}"; + template = Handlebars.Compile(source); + + var result2 = template(data); + Assert.Equal("Hello Pete Jones", result2); + + source = partialSource + "{{#>greeting}}{{#*inline \"name\"}}Mr. {{lastName}}{{/inline}}{{/greeting}}"; + template = Handlebars.Compile(source); + + var result3 = template(data); + Assert.Equal("Dear Mr. Jones", result3); + + source = partialSource + "{{#>greeting}}{{#*inline \"salutation\"}}Hello{{/inline}}{{#*inline \"name\"}}{{firstName}}{{/inline}}{{/greeting}}"; + template = Handlebars.Compile(source); + + var result4 = template(data); + Assert.Equal("Hello Pete", result4); + } } } diff --git a/source/Handlebars/Compiler/Lexer/Converter/BlockAccumulators/PartialBlockAccumulatorContext.cs b/source/Handlebars/Compiler/Lexer/Converter/BlockAccumulators/PartialBlockAccumulatorContext.cs index d0f92a3c..f58c1503 100644 --- a/source/Handlebars/Compiler/Lexer/Converter/BlockAccumulators/PartialBlockAccumulatorContext.cs +++ b/source/Handlebars/Compiler/Lexer/Converter/BlockAccumulators/PartialBlockAccumulatorContext.cs @@ -27,7 +27,12 @@ public override Expression GetAccumulatedBlock() return HandlebarsExpression.Partial( _startingNode.PartialName, _startingNode.Argument, - _body.Count > 1 ? Expression.Block(_body) : _body.First()); + _body.Count switch + { + 0 => Expression.Empty(), + 1 => _body[0], + _ => Expression.Block(_body) + }); } public override bool IsClosingElement(Expression item)