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
4 changes: 2 additions & 2 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
<PackageVersion Include="Microsoft.Extensions.FileProviders.Abstractions" Version="$(MicrosoftExtensionsFileProvidersAbstractionsPackageVersion)" />

<!-- Only used with netstandard2.0 -->
<PackageVersion Include="System.Text.Json" Version="$(SystemTextJsonPackageVersion)" />
<PackageVersion Include="System.Text.Json" Version="9.0.3" />
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
<PackageVersion Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />

<!-- Common to all TFMs -->
<PackageVersion Include="Parlot" Version="1.3.3" />
<PackageVersion Include="Parlot" Version="1.3.5" />
<PackageVersion Include="TimeZoneConverter" Version="7.0.0" />

<!-- Benchmarks -->
Expand Down
14 changes: 8 additions & 6 deletions Fluid.Tests/ParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -987,7 +987,8 @@ public void ShouldParseLiquidTag()
| upcase
%}";

Assert.True(_parser.TryParse(source, out var template, out var errors), errors);
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.Contains("WELCOME TO THE LIQUID TAG", rendered);
}
Expand All @@ -1003,7 +1004,8 @@ public void ShouldParseLiquidTagWithBlocks()
%}
";

Assert.True(_parser.TryParse(source, out var template, out var errors), errors);
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.Contains("WELCOME TO THE LIQUID TAG", rendered);
}
Expand Down Expand Up @@ -1091,11 +1093,11 @@ public void ShouldParseLiquidTagWithDifferentSpaces(string spaces)
{% liquid
for c in (1..3)
echo c
endforSPACE%}SPACE{{chars}}SPACE
""".Replace("SPACE", spaces);
endfor[SPACE]%}[SPACE]{{chars}}[SPACE]
""".Replace("[SPACE]", spaces);

var _parser = new FluidParser();
Assert.True(_parser.TryParse(source, out var template, out var errors), errors);
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.Contains("123", rendered);
}
Expand Down
34 changes: 28 additions & 6 deletions Fluid/FluidParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,25 @@ public class FluidParser
protected readonly Deferred<IReadOnlyList<Statement>> KnownTagsList = Deferred<IReadOnlyList<Statement>>();
protected readonly Deferred<IReadOnlyList<Statement>> AnyTagsList = Deferred<IReadOnlyList<Statement>>();

protected static readonly Parser<TagResult> OutputStart = TagParsers.OutputTagStart();
protected static readonly Parser<TagResult> OutputEnd = TagParsers.OutputTagEnd(true);
protected static readonly Parser<TagResult> TagStart = TagParsers.TagStart();
protected static readonly Parser<TagResult> TagStartSpaced = TagParsers.TagStart(true);
protected static readonly Parser<TagResult> TagEnd = TagParsers.TagEnd(true);
internal const string WhiteSpaceChars = "\t\n\v\f\r \u0085             \u2028\u2029   ";

protected static readonly Parser<TagResult> InlineOutputStart = TagParsers.OutputTagStart();
protected static readonly Parser<TagResult> InlineOutputEnd = TagParsers.OutputTagEnd();
protected static readonly Parser<TagResult> InlineTagStart = TagParsers.TagStart();
protected static readonly Parser<TagResult> InlineTagEnd = TagParsers.TagEnd();

protected static readonly Parser<TagResult> NoInlineOutputStart = NonInlineLiquidTagParsers.OutputTagStart();
protected static readonly Parser<TagResult> NoInlineOutputEnd = Literals.AnyOf(WhiteSpaceChars, minSize: 0).SkipAnd(NonInlineLiquidTagParsers.OutputTagEnd());
protected static readonly Parser<TagResult> NoInlineTagStart = NonInlineLiquidTagParsers.TagStart();
protected static readonly Parser<TagResult> NoInlineTagEnd = Literals.AnyOf(WhiteSpaceChars, minSize: 0).SkipAnd(NonInlineLiquidTagParsers.TagEnd());

protected readonly Parser<TagResult> OutputStart = InlineOutputStart;
protected readonly Parser<TagResult> OutputEnd = InlineOutputEnd;
protected readonly Parser<TagResult> TagStart = InlineTagStart;
protected readonly Parser<TagResult> TagEnd = InlineTagEnd;

protected static readonly Parser<TagResult> RawOutputStart = NonInlineLiquidTagParsers.OutputTagStart();
protected static readonly Parser<TagResult> RawTagStart = NonInlineLiquidTagParsers.TagStart();

protected static readonly LiteralExpression EmptyKeyword = new LiteralExpression(EmptyValue.Instance);
protected static readonly LiteralExpression BlankKeyword = new LiteralExpression(BlankValue.Instance);
Expand All @@ -73,6 +87,14 @@ public FluidParser() : this(new())

public FluidParser(FluidParserOptions parserOptions)
{
if (!parserOptions.AllowLiquidTag)
{
OutputStart = NoInlineOutputStart;
OutputEnd = NoInlineOutputEnd;
TagStart = NoInlineTagStart;
TagEnd = NoInlineTagEnd;
}

String.Name = "String";
Number.Name = "Number";

Expand Down Expand Up @@ -574,7 +596,7 @@ public FluidParser(FluidParserOptions parserOptions)
Grammar = KnownTagsList;
}

public static Parser<string> CreateTag(string tagName) => TagStart.SkipAnd(Terms.Text(tagName)).AndSkip(TagEnd);
public Parser<string> CreateTag(string tagName) => TagStart.SkipAnd(Terms.Text(tagName)).AndSkip(TagEnd);

public void RegisterIdentifierTag(string tagName, Func<string, TextWriter, TextEncoder, TemplateContext, ValueTask<Completion>> render)
{
Expand Down
5 changes: 5 additions & 0 deletions Fluid/FluidParserOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,10 @@ public class FluidParserOptions
/// Gets whether parentheses are allowed in templates. Default is <c>false</c>.
/// </summary>
public bool AllowParentheses { get; set; }

/// <summary>
/// Gets whether the inline liquid tag is allowed in templates. Default is <c>false</c>.
/// </summary>
public bool AllowLiquidTag { get; set; }
}
}
Loading