From fb926fbf737ce278ab9fec58dd5aa416792df2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20H=C3=A4kli?= Date: Wed, 29 Nov 2023 04:08:33 +0200 Subject: [PATCH] feat: allow configuring Liquid parser (#18) --- .../FluentEmail.Liquid/LiquidRenderer.cs | 1 + .../LiquidRendererOptions.cs | 5 +++ test/FluentEmail.Liquid.Tests/LiquidTests.cs | 34 ++++++++++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Renderers/FluentEmail.Liquid/LiquidRenderer.cs b/src/Renderers/FluentEmail.Liquid/LiquidRenderer.cs index fe53645a..1d7d2725 100644 --- a/src/Renderers/FluentEmail.Liquid/LiquidRenderer.cs +++ b/src/Renderers/FluentEmail.Liquid/LiquidRenderer.cs @@ -19,6 +19,7 @@ public LiquidRenderer(IOptions options) { _options = options; _parser = new LiquidParser(); + _options.Value.ConfigureParser?.Invoke(_parser); } public string Parse(string template, T model, bool isHtml = true) diff --git a/src/Renderers/FluentEmail.Liquid/LiquidRendererOptions.cs b/src/Renderers/FluentEmail.Liquid/LiquidRendererOptions.cs index f1debd78..ad477118 100644 --- a/src/Renderers/FluentEmail.Liquid/LiquidRendererOptions.cs +++ b/src/Renderers/FluentEmail.Liquid/LiquidRendererOptions.cs @@ -30,5 +30,10 @@ public class LiquidRendererOptions /// Set custom Template Options for Fluid /// public TemplateOptions TemplateOptions { get; set; } = new TemplateOptions(); + + /// + /// Allows configuring parser + /// + public Action? ConfigureParser { get; set; } } } diff --git a/test/FluentEmail.Liquid.Tests/LiquidTests.cs b/test/FluentEmail.Liquid.Tests/LiquidTests.cs index 2d53e3b9..7300f200 100644 --- a/test/FluentEmail.Liquid.Tests/LiquidTests.cs +++ b/test/FluentEmail.Liquid.Tests/LiquidTests.cs @@ -1,9 +1,13 @@ using System; using System.IO; using System.Reflection; +using System.Text.Encodings.Web; +using System.Threading.Tasks; + using FluentEmail.Core; using Fluid; +using Fluid.Ast; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Options; @@ -27,12 +31,14 @@ public void SetUp() private static void SetupRenderer( IFileProvider fileProvider = null, - Action configureTemplateContext = null) + Action configureTemplateContext = null, + Action configureParser = null) { var options = new LiquidRendererOptions { FileProvider = fileProvider, ConfigureTemplateContext = configureTemplateContext, + ConfigureParser = configureParser }; Email.DefaultRenderer = new LiquidRenderer(Options.Create(options)); } @@ -181,6 +187,32 @@ public void Should_be_able_to_use_embedded_layout() Assert.AreEqual($"

Hello!

{Environment.NewLine}
{Environment.NewLine}sup LUKE here is a list 123
", email.Data.Body); } + [Test] + public void Should_be_able_to_configure_parser() + { + SetupRenderer( + new EmbeddedFileProvider(typeof(LiquidTests).Assembly, "FluentEmail.Liquid.Tests.EmailTemplates"), + configureParser: parser => parser.RegisterExpressionTag("testTag", TestTag) + ); + + const string template = "sup {{ Name }} here is a custom tag: {% testTag 'test' %}"; + + var email = Email + .From(FromEmail) + .To(ToEmail) + .Subject(Subject) + .UsingTemplate(template, new ViewModel { Name = "LUKE" }); + + Assert.AreEqual("sup LUKE here is a custom tag: Hello from custom tag test", email.Data.Body); + + static async ValueTask TestTag(Expression pathExpression, TextWriter writer, TextEncoder encoder, TemplateContext context) + { + var tagParameterValue = await pathExpression.EvaluateAsync(context); + await writer.WriteAsync($"Hello from custom tag {tagParameterValue.ToStringValue()}"); + return Completion.Normal; + } + } + private class ViewModel { public string Name { get; set; }