Cache HtmlRenderer on Pipeline for ToHtml(string, Pipeline)

This commit is contained in:
MihaZupan
2019-10-13 18:03:13 +02:00
parent 606556b692
commit afe4308e91
2 changed files with 50 additions and 4 deletions

View File

@@ -73,9 +73,18 @@ namespace Markdig
public static string ToHtml(string markdown, MarkdownPipeline pipeline = null)
{
if (markdown == null) throw new ArgumentNullException(nameof(markdown));
var writer = new StringWriter();
ToHtml(markdown, writer, pipeline);
return writer.ToString();
pipeline = pipeline ?? new MarkdownPipelineBuilder().Build();
pipeline = CheckForSelfPipeline(pipeline, markdown);
var renderer = pipeline.GetCacheableHtmlRenderer();
var document = Parse(markdown, pipeline);
renderer.Render(document);
renderer.Writer.Flush();
string html = renderer.Writer.ToString();
pipeline.ReleaseCacheableHtmlRenderer(renderer);
return html;
}
/// <summary>

View File

@@ -1,4 +1,4 @@
// Copyright (c) Alexandre Mutel. All rights reserved.
// Copyright (c) Alexandre Mutel. All rights reserved.
// This file is licensed under the BSD-Clause 2 license.
// See the license.txt file in the project root for more information.
using System;
@@ -63,5 +63,42 @@ namespace Markdig
extension.Setup(this, renderer);
}
}
private HtmlRendererCache _rendererCache = null;
internal HtmlRenderer GetCacheableHtmlRenderer()
{
if (_rendererCache is null)
{
_rendererCache = new HtmlRendererCache
{
OnNewInstanceCreated = Setup
};
}
return _rendererCache.Get();
}
internal void ReleaseCacheableHtmlRenderer(HtmlRenderer renderer)
{
_rendererCache.Release(renderer);
}
private class HtmlRendererCache : ObjectCache<HtmlRenderer>
{
public Action<HtmlRenderer> OnNewInstanceCreated;
protected override HtmlRenderer NewInstance()
{
var writer = new StringWriter();
var renderer = new HtmlRenderer(writer);
OnNewInstanceCreated(renderer);
return renderer;
}
protected override void Reset(HtmlRenderer instance)
{
instance.Reset();
}
}
}
}