Skip to content

Commit 16490ec

Browse files
Html attributes (#202)
* Fix strictness. * Improve rendering in non-async context
1 parent b8a4ea3 commit 16490ec

File tree

10 files changed

+46
-19
lines changed

10 files changed

+46
-19
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@
1212
<RepositoryUrl>https://github.com/SebastianStehle/mjml-net.git</RepositoryUrl>
1313
<RepositoryType>git</RepositoryType>
1414
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
15-
<Version>4.0.0</Version>
15+
<Version>4.1.0</Version>
1616
</PropertyGroup>
1717
</Project>

Mjml.Net.PostProcessors/Components/AttributeSelectorComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public partial class SelectorComponent : Component
1818

1919
public override void Render(IHtmlRenderer renderer, GlobalContext context)
2020
{
21-
if (!context.Options.HasProcessor<AttributesPostProcessor>())
21+
if (!context.Async || !context.Options.HasProcessor<AttributesPostProcessor>())
2222
{
2323
return;
2424
}

Mjml.Net.PostProcessors/Components/HtmlAttributeComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public partial class HtmlAttributeComponent : Component
2121

2222
public override void Render(IHtmlRenderer renderer, GlobalContext context)
2323
{
24-
if (!context.Options.HasProcessor<AttributesPostProcessor>())
24+
if (!context.Async || !context.Options.HasProcessor<AttributesPostProcessor>())
2525
{
2626
return;
2727
}

Mjml.Net.PostProcessors/Components/HtmlAttributesComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public partial class HtmlAttributesComponent : Component
1515

1616
public override void Render(IHtmlRenderer renderer, GlobalContext context)
1717
{
18-
if (!context.Options.HasProcessor<AttributesPostProcessor>())
18+
if (!context.Async || !context.Options.HasProcessor<AttributesPostProcessor>())
1919
{
2020
return;
2121
}

Mjml.Net/GlobalContext.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,15 @@ public sealed class GlobalContext
1414

1515
public Dictionary<string, Dictionary<string, string>> AttributesByName => attributesByName;
1616

17-
public MjmlOptions Options { get; private set; }
17+
public MjmlOptions Options { get; set; }
18+
19+
public bool Async { get; set; }
1820

1921
public IFileLoader? FileLoader
2022
{
2123
get => fileLoader ??= Options?.FileLoader?.Invoke();
2224
}
2325

24-
public void SetOptions(MjmlOptions options)
25-
{
26-
Options = options;
27-
}
28-
2926
public void Clear()
3027
{
3128
GlobalData.Clear();

Mjml.Net/MjmlRenderContext.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ public ValidationErrors Validate()
1919
return new ValidationErrors(errors);
2020
}
2121

22-
public void Setup(MjmlRenderer mjmlRenderer, MjmlOptions? mjmlOptions)
22+
public void Setup(MjmlRenderer mjmlRenderer, bool isAsync, MjmlOptions? mjmlOptions)
2323
{
2424
this.mjmlRenderer = mjmlRenderer;
2525
this.mjmlOptions = mjmlOptions ??= new MjmlOptions();
2626

2727
// Reuse the context and therefore do not set them over the constructor.
28-
context.SetOptions(mjmlOptions);
28+
context.Options = mjmlOptions;
29+
context.Async = isAsync;
2930

3031
validationContext.Options = mjmlOptions;
3132
}

Mjml.Net/MjmlRenderer.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public IMjmlRenderer ClearHelpers()
106106
/// <inheritdoc />
107107
public RenderResult Render(string mjml, MjmlOptions? options = null)
108108
{
109-
return RenderCore(mjml, options).Result;
109+
return RenderCore(mjml, false, options).Result;
110110
}
111111

112112
/// <inheritdoc />
@@ -118,7 +118,7 @@ public RenderResult Render(Stream mjml, MjmlOptions? options = null)
118118
/// <inheritdoc />
119119
public RenderResult Render(TextReader mjml, MjmlOptions? options = null)
120120
{
121-
return RenderCore(mjml.ReadToEnd(), options).Result;
121+
return RenderCore(mjml.ReadToEnd(), false, options).Result;
122122
}
123123

124124
public async ValueTask<RenderResult> RenderAsync(string mjml, MjmlOptions? options = null,
@@ -147,7 +147,7 @@ private async ValueTask<RenderResult> RenderCoreAsync(string mjml, MjmlOptions?
147147
CancellationToken ct)
148148
{
149149
#pragma warning disable MA0042 // Do not use blocking calls in an async method
150-
var (result, actualOptions) = RenderCore(mjml, options);
150+
var (result, actualOptions) = RenderCore(mjml, true, options);
151151
#pragma warning restore MA0042 // Do not use blocking calls in an async method
152152

153153
if (actualOptions?.PostProcessors?.Length > 0 && !string.IsNullOrWhiteSpace(result.Html))
@@ -165,7 +165,7 @@ private async ValueTask<RenderResult> RenderCoreAsync(string mjml, MjmlOptions?
165165
return result;
166166
}
167167

168-
private (RenderResult Result, MjmlOptions Options) RenderCore(string mjml, MjmlOptions? options)
168+
private (RenderResult Result, MjmlOptions Options) RenderCore(string mjml, bool isAsync, MjmlOptions? options)
169169
{
170170
options ??= new MjmlOptions();
171171

@@ -174,7 +174,7 @@ private async ValueTask<RenderResult> RenderCoreAsync(string mjml, MjmlOptions?
174174
var context = DefaultPools.RenderContexts.Get();
175175
try
176176
{
177-
context.Setup(this, options);
177+
context.Setup(this, isAsync, options);
178178
context.StartBuffer();
179179
context.Read(reader, null, null);
180180

Tests/Components/HtmlAttributesTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,35 @@ public async Task Should_render_attributes()
3434

3535
AssertHelpers.HtmlFileAssert("Components.Outputs.HtmlAttributes.html", result);
3636
}
37+
[Fact]
38+
public void Should_not_render_attributes_in_sync_context()
39+
{
40+
var source = @"
41+
<mjml-test>
42+
<mj-head>
43+
<mj-html-attributes>
44+
<mj-selector path="".custom div"">
45+
<mj-html-attribute name=""data-id"">42</mj-html-attribute>
46+
</mj-selector>
47+
</mj-html-attributes>
48+
</mj-head>
49+
<mj-body>
50+
<mj-raw>
51+
<div class=""custom"">
52+
<div></div>
53+
</div>
54+
</mj-raw>
55+
</mj-body>
56+
</mjml-test>
57+
";
58+
59+
var (result, _) = TestHelper.Render(source, new MjmlOptions
60+
{
61+
PostProcessors = [AngleSharpPostProcessor.Default]
62+
}, helpers: []);
63+
64+
AssertHelpers.HtmlFileAssert("Components.Outputs.HtmlAttributeInvalid.html", result);
65+
}
3766

3867
[Fact]
3968
public async Task Should_render_selector_only()

Tests/HtmlExtensionsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public HtmlExtensionsTests()
1515
Beautify = true
1616
};
1717

18-
sut.Setup(new MjmlRenderer(), options);
18+
sut.Setup(new MjmlRenderer(), false, options);
1919
sut.StartBuffer();
2020
}
2121

Tests/HtmlRenderTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public HtmlRenderTests()
1616
Beautify = true
1717
};
1818

19-
sut.Setup(new MjmlRenderer(), options);
19+
sut.Setup(new MjmlRenderer(), false, options);
2020
sut.StartBuffer();
2121
}
2222

0 commit comments

Comments
 (0)