Merge pull request #410 from KrisVandermotten/RendererBase

Optimized RendererBase
This commit is contained in:
Alexandre Mutel
2020-03-23 20:48:54 +01:00
committed by GitHub

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;
@@ -56,19 +56,19 @@ namespace Markdig.Renderers
return;
}
bool saveIsFirstInContainer = IsFirstInContainer;
bool saveIsLastInContainer = IsLastInContainer;
var children = containerBlock;
for (int i = 0; i < children.Count; i++)
{
var saveIsFirstInContainer = IsFirstInContainer;
var saveIsLastInContainer = IsLastInContainer;
IsFirstInContainer = i == 0;
IsLastInContainer = i + 1 == children.Count;
Write(children[i]);
IsFirstInContainer = saveIsFirstInContainer;
IsLastInContainer = saveIsLastInContainer;
}
IsFirstInContainer = saveIsFirstInContainer;
IsLastInContainer = saveIsLastInContainer;
}
/// <summary>
@@ -82,46 +82,50 @@ namespace Markdig.Renderers
return;
}
bool saveIsFirstInContainer = IsFirstInContainer;
bool saveIsLastInContainer = IsLastInContainer;
bool isFirst = true;
var inline = containerInline.FirstChild;
while (inline != null)
{
var saveIsFirstInContainer = IsFirstInContainer;
var saveIsLastInContainer = IsLastInContainer;
IsFirstInContainer = isFirst;
IsLastInContainer = inline.NextSibling == null;
Write(inline);
inline = inline.NextSibling;
IsFirstInContainer = saveIsFirstInContainer;
IsLastInContainer = saveIsLastInContainer;
isFirst = false;
}
IsFirstInContainer = saveIsFirstInContainer;
IsLastInContainer = saveIsLastInContainer;
}
/// <summary>
/// Writes the specified Markdown object.
/// </summary>
/// <typeparam name="T">A MarkdownObject type</typeparam>
/// <param name="obj">The Markdown object to write to this renderer.</param>
public void Write<T>(T obj) where T : MarkdownObject
public void Write(MarkdownObject obj)
{
if (obj == null)
{
return;
}
// Calls before writing an object
ObjectWriteBefore?.Invoke(this, obj);
var objectType = obj.GetType();
// Calls before writing an object
var writeBefore = ObjectWriteBefore;
writeBefore?.Invoke(this, obj);
IMarkdownObjectRenderer renderer;
// Handle regular renderers
IMarkdownObjectRenderer renderer = previousObjectType == objectType ? previousRenderer : null;
if (renderer == null && !renderersPerType.TryGetValue(objectType, out renderer))
if (objectType == previousObjectType)
{
renderer = previousRenderer;
}
else if (!renderersPerType.TryGetValue(objectType, out renderer))
{
for (int i = 0; i < ObjectRenderers.Count; i++)
{
@@ -133,33 +137,25 @@ namespace Markdig.Renderers
}
}
}
if (renderer != null)
{
renderer.Write(this, obj);
}
else
{
var containerBlock = obj as ContainerBlock;
if (containerBlock != null)
{
WriteChildren(containerBlock);
}
else
{
var containerInline = obj as ContainerInline;
if (containerInline != null)
{
WriteChildren(containerInline);
}
}
}
previousObjectType = objectType;
previousRenderer = renderer;
previousObjectType = objectType;
previousRenderer = renderer;
}
else if (obj is ContainerBlock containerBlock)
{
WriteChildren(containerBlock);
}
else if (obj is ContainerInline containerInline)
{
WriteChildren(containerInline);
}
// Calls after writing an object
var writeAfter = ObjectWriteAfter;
writeAfter?.Invoke(this, obj);
ObjectWriteAfter?.Invoke(this, obj);
}
}
}