Speed up FencedCodeBlock rendering

This commit is contained in:
Miha Zupan
2025-03-16 18:02:56 +01:00
parent 8cfa0cf0ae
commit 7a9c192d7d
2 changed files with 30 additions and 1 deletions

View File

@@ -22,4 +22,17 @@ internal static class FrozenDictionaryExtensions
}
}
internal sealed class FrozenSet<T> : HashSet<T>
{
public FrozenSet(HashSet<T> set, IEqualityComparer<T> comparer) : base(set, comparer) { }
}
internal static class FrozenSetExtensions
{
public static FrozenSet<T> ToFrozenSet<T>(this HashSet<T> set, IEqualityComparer<T> comparer)
{
return new FrozenSet<T>(set, comparer);
}
}
#endif

View File

@@ -31,11 +31,27 @@ public class CodeBlockRenderer : HtmlObjectRenderer<CodeBlock>
/// </summary>
public Dictionary<string, string> BlockMapping { get; } = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
private FrozenSet<string>? _specialBlockMapping;
private FrozenSet<string> SpecialBlockMapping
{
get
{
return _specialBlockMapping ?? CreateNew();
FrozenSet<string> CreateNew()
{
HashSet<string> set = [.. BlocksAsDiv, .. BlockMapping.Keys];
return _specialBlockMapping = set.ToFrozenSet(StringComparer.OrdinalIgnoreCase);
}
}
}
protected override void Write(HtmlRenderer renderer, CodeBlock obj)
{
renderer.EnsureLine();
if ((obj as FencedCodeBlock)?.Info is string info && (BlocksAsDiv.Contains(info) || BlockMapping.ContainsKey(info)))
if ((obj as FencedCodeBlock)?.Info is string info && SpecialBlockMapping.Contains(info))
{
var infoPrefix = (obj.Parser as FencedCodeBlockParser)?.InfoPrefix ??
FencedCodeBlockParser.DefaultInfoPrefix;