Cache HtmlRenderers in AutoIdentifier Extension

This commit is contained in:
MihaZupan
2019-10-13 15:17:33 +02:00
parent c818670919
commit 253be5c362
2 changed files with 39 additions and 9 deletions

View File

@@ -22,6 +22,7 @@ namespace Markdig.Extensions.AutoIdentifiers
{
private const string AutoIdentifierKey = "AutoIdentifier";
private readonly AutoIdentifierOptions options;
private readonly StripRendererCache rendererCache = new StripRendererCache();
/// <summary>
/// Initializes a new instance of the <see cref="AutoIdentifierExtension"/> class.
@@ -159,17 +160,11 @@ namespace Markdig.Extensions.AutoIdentifiers
}
// Use internally a HtmlRenderer to strip links from a heading
var headingWriter = new StringWriter();
var stripRenderer = new HtmlRenderer(headingWriter)
{
// Set to false both to avoid having any HTML tags in the output
EnableHtmlForInline = false,
EnableHtmlEscape = false
};
var stripRenderer = rendererCache.Get();
stripRenderer.Render(headingBlock.Inline);
var headingText = headingWriter.ToString();
headingWriter.GetStringBuilder().Length = 0;
var headingText = stripRenderer.Writer.ToString();
rendererCache.Release(stripRenderer);
// Urilize the link
headingText = (options & AutoIdentifierOptions.GitHub) != 0
@@ -195,5 +190,25 @@ namespace Markdig.Extensions.AutoIdentifiers
attributes.Id = headingId;
}
private class StripRendererCache : ObjectCache<HtmlRenderer>
{
protected override HtmlRenderer NewInstance()
{
var headingWriter = new StringWriter();
var stripRenderer = new HtmlRenderer(headingWriter)
{
// Set to false both to avoid having any HTML tags in the output
EnableHtmlForInline = false,
EnableHtmlEscape = false
};
return stripRenderer;
}
protected override void Reset(HtmlRenderer instance)
{
instance.Reset();
}
}
}
}

View File

@@ -85,6 +85,21 @@ namespace Markdig.Renderers
indents = new List<string>();
}
internal void Reset()
{
if (Writer is StringWriter stringWriter)
{
stringWriter.GetStringBuilder().Length = 0;
}
else
{
throw new InvalidOperationException("Cannot reset this TextWriter instance");
}
previousWasLine = true;
indents.Clear();
}
/// <summary>
/// Ensures a newline.
/// </summary>