From 1f3cf5962f441a2c2940ac9d1ecf26d70ac39e67 Mon Sep 17 00:00:00 2001 From: Kris Vandermotten Date: Mon, 9 Mar 2020 15:30:53 +0100 Subject: [PATCH] Optimized RendererBase --- src/Markdig/Renderers/RendererBase.cs | 76 +++++++++++++-------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/src/Markdig/Renderers/RendererBase.cs b/src/Markdig/Renderers/RendererBase.cs index 857fe8c1..e191ed44 100644 --- a/src/Markdig/Renderers/RendererBase.cs +++ b/src/Markdig/Renderers/RendererBase.cs @@ -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; } /// @@ -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; } /// /// Writes the specified Markdown object. /// - /// A MarkdownObject type /// The Markdown object to write to this renderer. - public void Write(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); } } } \ No newline at end of file