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
3 changes: 0 additions & 3 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,6 @@ dotnet_diagnostic.CA1707.severity = none
# CS8618: Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
dotnet_diagnostic.CS8618.severity = none

# IDE0290: Use primary constructor
dotnet_diagnostic.IDE0290.severity = none

# IDE0301: Simplify collection initialization
dotnet_diagnostic.IDE0301.severity = none

Expand Down
4 changes: 0 additions & 4 deletions Mjml.Net/Components/RootComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,10 @@ private static void RenderHead(IHtmlRenderer renderer, GlobalContext context)
{
// Already formatted properly.
renderer.Plain(head.Buffer);
renderer.ReturnStringBuilder(head.Buffer);
}
}

renderer.RenderHelpers(HelperTarget.HeadEnd);

renderer.EndElement("head");
}

Expand All @@ -86,12 +84,10 @@ private static void RenderBody(IHtmlRenderer renderer, GlobalContext context)
{
// Already formatted properly.
renderer.Plain(body.Buffer);
renderer.ReturnStringBuilder(body.Buffer);
}
}

renderer.RenderHelpers(HelperTarget.BodyEnd);

renderer.EndElement("body");
}
}
8 changes: 3 additions & 5 deletions Mjml.Net/Components/RootData.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
using System.Text;

#pragma warning disable SA1313 // Parameter names should begin with lower-case letter
#pragma warning disable SA1313 // Parameter names should begin with lower-case letter

namespace Mjml.Net.Components;

public sealed record BodyBuffer(StringBuilder? Buffer) : GlobalData;
public sealed record BodyBuffer(IBuffer? Buffer) : GlobalData;

public sealed record Background(string Color) : GlobalData;

public sealed record HeadBuffer(StringBuilder? Buffer) : GlobalData;
public sealed record HeadBuffer(IBuffer? Buffer) : GlobalData;

public sealed record Language(string Value) : GlobalData;

Expand Down
12 changes: 12 additions & 0 deletions Mjml.Net/IBuffer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text;

namespace Mjml.Net;

public interface IBuffer : IDisposable
{
bool IsEmpty { get; }

int AppendTo(StringBuilder sb);

string ToText();
}
10 changes: 2 additions & 8 deletions Mjml.Net/IHtmlRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,6 @@ public interface IHtmlRenderer
/// </returns>
IHtmlAttrRenderer StartElement(string elementName, bool close = false);

/// <summary>
/// Returns a string builder back to the pool.
/// </summary>
/// <param name="stringBuilder">The string builder to return.</param>
void ReturnStringBuilder(StringBuilder stringBuilder);

/// <summary>
/// Ends an element.
/// </summary>
Expand Down Expand Up @@ -59,7 +53,7 @@ public interface IHtmlRenderer
/// Renders a text.
/// </summary>
/// <param name="value">The value to render.</param>
void Plain(StringBuilder value);
void Plain(IBuffer value);

/// <summary>
/// Renders a text.
Expand Down Expand Up @@ -94,7 +88,7 @@ public interface IHtmlRenderer
/// Removes the buffer from the stack and returns the content.
/// </summary>
/// <returns>The buffer content.</returns>
StringBuilder? EndBuffer();
IBuffer EndBuffer();

internal StringBuilder StringBuilder { get; }

Expand Down
8 changes: 1 addition & 7 deletions Mjml.Net/InMemoryFileLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,9 @@ namespace Tests.Internal;
/// <remarks>
/// Useful for preloading.
/// </remarks>
public sealed class InMemoryFileLoader : IFileLoader
public sealed class InMemoryFileLoader(IReadOnlyDictionary<string, string> content) : IFileLoader
{
private readonly Stack<string> pathStack = new Stack<string>();
private readonly IReadOnlyDictionary<string, string> content;

public InMemoryFileLoader(IReadOnlyDictionary<string, string> content)
{
this.content = content;
}

/// <inheritdoc />
public string? LoadText(string path)
Expand Down
2 changes: 1 addition & 1 deletion Mjml.Net/InnerTextOrHtml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public InnerTextOrHtml(int capacity = 10)

public InnerTextOrHtml(string input)
{
parts = new List<string>(1) { input };
parts = [input];
}

public void Add(string part)
Expand Down
5 changes: 1 addition & 4 deletions Mjml.Net/Internal/Binder.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System.Runtime.Intrinsics.X86;
using System.Xml.Linq;

namespace Mjml.Net.Internal;
namespace Mjml.Net.Internal;

internal sealed class Binder : IBinder
{
Expand Down
10 changes: 1 addition & 9 deletions Mjml.Net/Internal/SubtreeReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Mjml.Net.Internal;

internal sealed class SubtreeReader : HtmlReaderWrapper
internal sealed class SubtreeReader(HtmlReaderWrapper inner) : HtmlReaderWrapper(inner.Impl)
{
private static readonly HashSet<string> VoidTags = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
Expand All @@ -21,16 +21,8 @@ internal sealed class SubtreeReader : HtmlReaderWrapper
"track",
"wbr",
};

private readonly HtmlReaderWrapper inner;
private int depth = 1;

public SubtreeReader(HtmlReaderWrapper inner)
: base(inner.Impl)
{
this.inner = inner;
}

public override bool Read()
{
if (depth == 0)
Expand Down
32 changes: 13 additions & 19 deletions Mjml.Net/MjmlRenderContext.Rendering.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,33 +22,19 @@ public StringBuilder StringBuilder
private void ClearRenderData()
{
analyzedFonts.Clear();

// Some buffers might get lost.
buffers.Clear();
}

public void ReturnStringBuilder(StringBuilder stringBuilder)
{
DefaultPools.StringBuilders.Return(stringBuilder);
}

public void StartBuffer()
{
buffers.Push(new RenderBuffer(DefaultPools.StringBuilders.Get(), mjmlOptions.Beautify));
buffers.Push(new RenderBuffer(mjmlOptions.Beautify));
}

public StringBuilder? EndBuffer()
public IBuffer EndBuffer()
{
Buffer.FlushAll();

return buffers.Pop()?.StringBuilder;
}

public void RenderHelpers(HelperTarget target)
{
foreach (var helper in mjmlRenderer.Helpers)
{
helper.Render(this, target, context);
}
return buffers.Pop()!;
}

public IHtmlAttrRenderer StartElement(string elementName, bool close = false)
Expand Down Expand Up @@ -142,7 +128,7 @@ public void StartText()
Buffer.StartText();
}

public void Plain(StringBuilder? value)
public void Plain(IBuffer value)
{
Buffer.Plain(value);
}
Expand Down Expand Up @@ -201,4 +187,12 @@ private void DetectFontFamily(string name, string? value)
}
}
}

public void RenderHelpers(HelperTarget target)
{
foreach (var helper in mjmlRenderer.Helpers)
{
helper.Render(this, target, context);
}
}
}
18 changes: 4 additions & 14 deletions Mjml.Net/MjmlRenderer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Text;
using Mjml.Net.Components;
using Mjml.Net.Components;
using Mjml.Net.Components.Body;
using Mjml.Net.Components.Head;
using Mjml.Net.Helpers;
Expand Down Expand Up @@ -136,7 +135,7 @@ public async ValueTask<RenderResult> RenderAsync(Stream mjml, MjmlOptions? optio
public async ValueTask<RenderResult> RenderAsync(TextReader mjml, MjmlOptions? options = null,
CancellationToken ct = default)
{
#if NET8_0_OR_GREATER
#if NET7_0_OR_GREATER
return await RenderCoreAsync(await mjml.ReadToEndAsync(ct), options, ct);
#else
return await RenderCoreAsync(await mjml.ReadToEndAsync(), options, ct);
Expand Down Expand Up @@ -170,25 +169,16 @@ private async ValueTask<RenderResult> RenderCoreAsync(string mjml, MjmlOptions?
options ??= new MjmlOptions();

var reader = new HtmlReaderWrapper(mjml);

var context = DefaultPools.RenderContexts.Get();
try
{
context.Setup(this, isAsync, options);
context.StartBuffer();
context.Read(reader, null, null);

StringBuilder? buffer = null;
try
{
buffer = context.EndBuffer()!;
using var buffer = context.EndBuffer();

return (new RenderResult(buffer.ToString()!, context.Validate()), options);
}
finally
{
DefaultPools.StringBuilders.Return(buffer!);
}
return (new RenderResult(buffer.ToText(), context.Validate()), options);
}
finally
{
Expand Down
Loading
Loading