diff --git a/src/Markdig/Polyfills/FrozenCollections.cs b/src/Markdig/Polyfills/FrozenCollections.cs index ab07f756..0f0dfbe9 100644 --- a/src/Markdig/Polyfills/FrozenCollections.cs +++ b/src/Markdig/Polyfills/FrozenCollections.cs @@ -22,4 +22,17 @@ internal static class FrozenDictionaryExtensions } } +internal sealed class FrozenSet : HashSet +{ + public FrozenSet(HashSet set, IEqualityComparer comparer) : base(set, comparer) { } +} + +internal static class FrozenSetExtensions +{ + public static FrozenSet ToFrozenSet(this HashSet set, IEqualityComparer comparer) + { + return new FrozenSet(set, comparer); + } +} + #endif \ No newline at end of file diff --git a/src/Markdig/Renderers/Html/CodeBlockRenderer.cs b/src/Markdig/Renderers/Html/CodeBlockRenderer.cs index b4fb0cae..be268003 100644 --- a/src/Markdig/Renderers/Html/CodeBlockRenderer.cs +++ b/src/Markdig/Renderers/Html/CodeBlockRenderer.cs @@ -31,11 +31,27 @@ public class CodeBlockRenderer : HtmlObjectRenderer /// public Dictionary BlockMapping { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + private FrozenSet? _specialBlockMapping; + + private FrozenSet SpecialBlockMapping + { + get + { + return _specialBlockMapping ?? CreateNew(); + + FrozenSet CreateNew() + { + HashSet 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;