mirror of
https://github.com/xoofx/markdig.git
synced 2026-02-06 21:36:15 +00:00
Reduce casts when rendering
This commit is contained in:
@@ -20,7 +20,7 @@ namespace Markdig.Renderers.Html
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="CodeBlockRenderer"/> class.
|
||||
/// </summary>
|
||||
public CodeBlockRenderer() { }
|
||||
public CodeBlockRenderer() => IsInternalRenderer = GetType() == typeof(CodeBlockRenderer);
|
||||
|
||||
public bool OutputAttributesOnPre { get; set; }
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ namespace Markdig.Renderers.Html
|
||||
"h6",
|
||||
};
|
||||
|
||||
public HeadingRenderer() => IsInternalRenderer = GetType() == typeof(HeadingRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, HeadingBlock obj)
|
||||
{
|
||||
int index = obj.Level - 1;
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
|
||||
/// <seealso cref="HtmlObjectRenderer{HtmlBlock}" />
|
||||
public class HtmlBlockRenderer : HtmlObjectRenderer<HtmlBlock>
|
||||
{
|
||||
public HtmlBlockRenderer() => IsInternalRenderer = GetType() == typeof(HtmlBlockRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, HtmlBlock obj)
|
||||
{
|
||||
renderer.WriteLeafRawLines(obj, true, false);
|
||||
|
||||
@@ -13,6 +13,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{AutolinkInline}" />
|
||||
public class AutolinkInlineRenderer : HtmlObjectRenderer<AutolinkInline>
|
||||
{
|
||||
public AutolinkInlineRenderer() => IsInternalRenderer = GetType() == typeof(AutolinkInlineRenderer);
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to always add rel="nofollow" for links or not.
|
||||
/// </summary>
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{CodeInline}" />
|
||||
public class CodeInlineRenderer : HtmlObjectRenderer<CodeInline>
|
||||
{
|
||||
public CodeInlineRenderer() => IsInternalRenderer = GetType() == typeof(CodeInlineRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, CodeInline obj)
|
||||
{
|
||||
if (renderer.EnableHtmlForInline)
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{DelimiterInline}" />
|
||||
public class DelimiterInlineRenderer : HtmlObjectRenderer<DelimiterInline>
|
||||
{
|
||||
public DelimiterInlineRenderer() => IsInternalRenderer = GetType() == typeof(DelimiterInlineRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, DelimiterInline obj)
|
||||
{
|
||||
renderer.WriteEscape(obj.ToLiteral());
|
||||
|
||||
@@ -26,6 +26,7 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
public EmphasisInlineRenderer()
|
||||
{
|
||||
GetTag = GetDefaultTag;
|
||||
IsInternalRenderer = GetType() == typeof(EmphasisInlineRenderer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{HtmlEntityInline}" />
|
||||
public class HtmlEntityInlineRenderer : HtmlObjectRenderer<HtmlEntityInline>
|
||||
{
|
||||
public HtmlEntityInlineRenderer() => IsInternalRenderer = GetType() == typeof(HtmlEntityInlineRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, HtmlEntityInline obj)
|
||||
{
|
||||
if (renderer.EnableHtmlEscape)
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{HtmlInline}" />
|
||||
public class HtmlInlineRenderer : HtmlObjectRenderer<HtmlInline>
|
||||
{
|
||||
public HtmlInlineRenderer() => IsInternalRenderer = GetType() == typeof(HtmlInlineRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, HtmlInline obj)
|
||||
{
|
||||
if (renderer.EnableHtmlForInline)
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{LineBreakInline}" />
|
||||
public class LineBreakInlineRenderer : HtmlObjectRenderer<LineBreakInline>
|
||||
{
|
||||
public LineBreakInlineRenderer() => IsInternalRenderer = GetType() == typeof(LineBreakInlineRenderer);
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to render this softline break as a HTML hardline break tag (<br />)
|
||||
/// </summary>
|
||||
|
||||
@@ -13,6 +13,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{LinkInline}" />
|
||||
public class LinkInlineRenderer : HtmlObjectRenderer<LinkInline>
|
||||
{
|
||||
public LinkInlineRenderer() => IsInternalRenderer = GetType() == typeof(LinkInlineRenderer);
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to always add rel="nofollow" for links or not.
|
||||
/// </summary>
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html.Inlines
|
||||
/// <seealso cref="HtmlObjectRenderer{LiteralInline}" />
|
||||
public class LiteralInlineRenderer : HtmlObjectRenderer<LiteralInline>
|
||||
{
|
||||
public LiteralInlineRenderer() => IsInternalRenderer = GetType() == typeof(LiteralInlineRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, LiteralInline obj)
|
||||
{
|
||||
if (renderer.EnableHtmlEscape)
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
|
||||
/// <seealso cref="HtmlObjectRenderer{ListBlock}" />
|
||||
public class ListRenderer : HtmlObjectRenderer<ListBlock>
|
||||
{
|
||||
public ListRenderer() => IsInternalRenderer = GetType() == typeof(ListRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, ListBlock listBlock)
|
||||
{
|
||||
renderer.EnsureLine();
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
|
||||
/// <seealso cref="HtmlObjectRenderer{ParagraphBlock}" />
|
||||
public class ParagraphRenderer : HtmlObjectRenderer<ParagraphBlock>
|
||||
{
|
||||
public ParagraphRenderer() => IsInternalRenderer = GetType() == typeof(ParagraphRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, ParagraphBlock obj)
|
||||
{
|
||||
if (!renderer.ImplicitParagraph && renderer.EnableHtmlForBlock)
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
|
||||
/// <seealso cref="HtmlObjectRenderer{QuoteBlock}" />
|
||||
public class QuoteBlockRenderer : HtmlObjectRenderer<QuoteBlock>
|
||||
{
|
||||
public QuoteBlockRenderer() => IsInternalRenderer = GetType() == typeof(QuoteBlockRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, QuoteBlock obj)
|
||||
{
|
||||
renderer.EnsureLine();
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Markdig.Renderers.Html
|
||||
/// <seealso cref="HtmlObjectRenderer{ThematicBreakBlock}" />
|
||||
public class ThematicBreakRenderer : HtmlObjectRenderer<ThematicBreakBlock>
|
||||
{
|
||||
public ThematicBreakRenderer() => IsInternalRenderer = GetType() == typeof(ThematicBreakRenderer);
|
||||
|
||||
protected override void Write(HtmlRenderer renderer, ThematicBreakBlock obj)
|
||||
{
|
||||
if (renderer.EnableHtmlForBlock)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
using Markdig.Helpers;
|
||||
using Markdig.Syntax;
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace Markdig.Renderers
|
||||
{
|
||||
@@ -18,6 +19,9 @@ namespace Markdig.Renderers
|
||||
{
|
||||
private OrderedList<TryWriteDelegate>? _tryWriters;
|
||||
|
||||
// Indicates whether it's safe to skip type checks during Write
|
||||
private protected bool IsInternalRenderer;
|
||||
|
||||
protected MarkdownObjectRenderer() { }
|
||||
|
||||
public delegate bool TryWriteDelegate(TRenderer renderer, TObject obj);
|
||||
@@ -29,15 +33,26 @@ namespace Markdig.Renderers
|
||||
|
||||
public virtual void Write(RendererBase renderer, MarkdownObject obj)
|
||||
{
|
||||
var htmlRenderer = (TRenderer)renderer;
|
||||
var typedObj = (TObject)obj;
|
||||
TRenderer typedRenderer;
|
||||
TObject typedObj;
|
||||
|
||||
if (_tryWriters is not null && TryWrite(htmlRenderer, typedObj))
|
||||
if (IsInternalRenderer)
|
||||
{
|
||||
typedRenderer = Unsafe.As<TRenderer>(renderer);
|
||||
typedObj = Unsafe.As<TObject>(obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
typedRenderer = (TRenderer)renderer;
|
||||
typedObj = (TObject)obj;
|
||||
}
|
||||
|
||||
if (_tryWriters is not null && TryWrite(typedRenderer, typedObj))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Write(htmlRenderer, typedObj);
|
||||
Write(typedRenderer, typedObj);
|
||||
}
|
||||
|
||||
private bool TryWrite(TRenderer renderer, TObject obj)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Markdig.Helpers;
|
||||
using Markdig.Syntax;
|
||||
using Markdig.Syntax.Inlines;
|
||||
@@ -149,13 +150,13 @@ namespace Markdig.Renderers
|
||||
{
|
||||
renderer.Write(this, obj);
|
||||
}
|
||||
else if (obj is ContainerInline containerInline)
|
||||
else if (obj.IsContainerInline)
|
||||
{
|
||||
WriteChildren(containerInline);
|
||||
WriteChildren(Unsafe.As<ContainerInline>(obj));
|
||||
}
|
||||
else if (obj is ContainerBlock containerBlock)
|
||||
else if (obj.IsContainerBlock)
|
||||
{
|
||||
WriteChildren(containerBlock);
|
||||
WriteChildren(Unsafe.As<ContainerBlock>(obj));
|
||||
}
|
||||
|
||||
// Calls after writing an object
|
||||
|
||||
Reference in New Issue
Block a user