mirror of
https://github.com/xoofx/markdig.git
synced 2026-10-08 14:48:32 +00:00
Merge pull request #410 from KrisVandermotten/RendererBase
Optimized RendererBase
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user