Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions Fluid.Tests/ParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1122,6 +1122,87 @@ echo i
Assert.DoesNotContain("45", rendered);
}

[Fact]
public void LiquidTagShouldSupportHashComments()
{
var source = @"{% liquid
assign name = 'John'
# very important information
assign name = 'Jenna'
echo name
%}";

var parser = new FluidParser(new FluidParserOptions { AllowLiquidTag = true });
Assert.True(parser.TryParse(source, out var template, out var errors), errors);
var rendered = template.Render();
Assert.Equal("Jenna", rendered.Trim());
}

[Fact]
public void LiquidTagShouldSupportMultipleHashComments()
{
var source = @"{% liquid
# required args:
assign product = 'MyProduct'

# optional args:
assign should_show_border = true
assign should_show_cursor = true

echo product
%}";

var parser = new FluidParser(new FluidParserOptions { AllowLiquidTag = true });
Assert.True(parser.TryParse(source, out var template, out var errors), errors);
var rendered = template.Render();
Assert.Equal("MyProduct", rendered.Trim());
}

[Fact]
public void LiquidTagShouldSupportEmptyHashComment()
{
var source = @"{% liquid
#
assign name = 'Charlie'
echo name
%}";

var parser = new FluidParser(new FluidParserOptions { AllowLiquidTag = true });
Assert.True(parser.TryParse(source, out var template, out var errors), errors);
var rendered = template.Render();
Assert.Equal("Charlie", rendered.Trim());
}

[Fact]
public void LiquidTagShouldSupportHashCommentAtBeginning()
{
var source = @"{% liquid
# This is a comment at the beginning
assign name = 'Alice'
echo name
%}";

var parser = new FluidParser(new FluidParserOptions { AllowLiquidTag = true });
Assert.True(parser.TryParse(source, out var template, out var errors), errors);
var rendered = template.Render();
Assert.Equal("Alice", rendered.Trim());
}

[Fact]
public void LiquidTagShouldSupportHashCommentAtEnd()
{
var source = @"{% liquid
assign name = 'Bob'
echo name
# This is a comment at the end
%}";

var parser = new FluidParser(new FluidParserOptions { AllowLiquidTag = true });
Assert.True(parser.TryParse(source, out var template, out var errors), errors);
var rendered = template.Render();
Assert.Equal("Bob", rendered.Trim());
}


[Fact]
public void ShouldParseFunctionCall()
Expand Down
5 changes: 4 additions & 1 deletion Fluid/FluidParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,10 @@ public FluidParser(FluidParserOptions parserOptions)

var LiquidTag = Literals.WhiteSpace(true) // {% liquid %} can start with new lines
.Then((context, x) => { ((FluidParseContext)context).InsideLiquidTag = true; return x; })
.SkipAnd(OneOrMany(Identifier.Switch((context, previous) =>
.SkipAnd(OneOrMany(OneOf(
Terms.Char('#').Then(x => "#"),
Identifier
).Switch((context, previous) =>
{
// Because tags like 'else' are not listed, they won't count in TagsList, and will stop being processed
// as inner tags in blocks like {% if %} TagsList {% endif $}
Expand Down