Skip to content

Commit 0446959

Browse files
committed
Add TextRendererBase.Write(char c, int count) method, and eliminate various string allocations
1 parent f52ecee commit 0446959

File tree

8 files changed

+57
-34
lines changed

8 files changed

+57
-34
lines changed

src/Markdig/Renderers/Normalize/CodeBlockRenderer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ protected override void Write(NormalizeRenderer renderer, CodeBlock obj)
1818
{
1919
if (obj is FencedCodeBlock fencedCodeBlock)
2020
{
21-
var fencedCharCount = Math.Min(fencedCodeBlock.OpeningFencedCharCount, fencedCodeBlock.ClosingFencedCharCount);
22-
var opening = new string(fencedCodeBlock.FencedChar, fencedCharCount);
23-
renderer.Write(opening);
21+
int fencedCharCount = Math.Min(fencedCodeBlock.OpeningFencedCharCount, fencedCodeBlock.ClosingFencedCharCount);
22+
23+
renderer.Write(fencedCodeBlock.FencedChar, fencedCharCount);
2424
if (fencedCodeBlock.Info != null)
2525
{
2626
renderer.Write(fencedCodeBlock.Info);
@@ -41,7 +41,7 @@ protected override void Write(NormalizeRenderer renderer, CodeBlock obj)
4141
renderer.WriteLine();
4242

4343
renderer.WriteLeafRawLines(obj, true);
44-
renderer.Write(opening);
44+
renderer.Write(fencedCodeBlock.FencedChar, fencedCharCount);
4545
}
4646
else
4747
{

src/Markdig/Renderers/Normalize/HeadingRenderer.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,27 @@ namespace Markdig.Renderers.Normalize;
1212
/// <seealso cref="NormalizeObjectRenderer{HeadingBlock}" />
1313
public class HeadingRenderer : NormalizeObjectRenderer<HeadingBlock>
1414
{
15-
private static readonly string[] HeadingTexts = {
15+
private static readonly string[] HeadingTexts = [
1616
"#",
1717
"##",
1818
"###",
1919
"####",
2020
"#####",
2121
"######",
22-
};
22+
];
2323

2424
protected override void Write(NormalizeRenderer renderer, HeadingBlock obj)
25-
{
26-
var headingText = obj.Level > 0 && obj.Level <= 6
27-
? HeadingTexts[obj.Level - 1]
28-
: new string('#', obj.Level);
25+
{
26+
if (obj.Level is > 0 and <= 6)
27+
{
28+
renderer.Write(HeadingTexts[obj.Level - 1]);
29+
}
30+
else
31+
{
32+
renderer.Write('#', obj.Level);
33+
}
2934

30-
renderer.Write(headingText).Write(' ');
35+
renderer.Write(' ');
3136
renderer.WriteLeafInline(obj);
3237

3338
renderer.FinishBlock(renderer.Options.EmptyLineAfterHeading);

src/Markdig/Renderers/Normalize/Inlines/EmphasisInlineRenderer.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ public class EmphasisInlineRenderer : NormalizeObjectRenderer<EmphasisInline>
1414
{
1515
protected override void Write(NormalizeRenderer renderer, EmphasisInline obj)
1616
{
17-
var emphasisText = new string(obj.DelimiterChar, obj.DelimiterCount);
18-
renderer.Write(emphasisText);
17+
renderer.Write(obj.DelimiterChar, obj.DelimiterCount);
1918
renderer.WriteChildren(obj);
20-
renderer.Write(emphasisText);
19+
renderer.Write(obj.DelimiterChar, obj.DelimiterCount);
2120
}
2221
}

src/Markdig/Renderers/Roundtrip/CodeBlockRenderer.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ protected override void Write(RoundtripRenderer renderer, CodeBlock obj)
1919
if (obj is FencedCodeBlock fencedCodeBlock)
2020
{
2121
renderer.Write(obj.TriviaBefore);
22-
var opening = new string(fencedCodeBlock.FencedChar, fencedCodeBlock.OpeningFencedCharCount);
23-
renderer.Write(opening);
22+
renderer.Write(fencedCodeBlock.FencedChar, fencedCodeBlock.OpeningFencedCharCount);
2423

2524
if (!fencedCodeBlock.TriviaAfterFencedChar.IsEmpty)
2625
{
@@ -56,9 +55,8 @@ protected override void Write(RoundtripRenderer renderer, CodeBlock obj)
5655
renderer.WriteLeafRawLines(obj);
5756

5857
renderer.Write(fencedCodeBlock.TriviaBeforeClosingFence);
59-
var closing = new string(fencedCodeBlock.FencedChar, fencedCodeBlock.ClosingFencedCharCount);
60-
renderer.Write(closing);
61-
if (!string.IsNullOrEmpty(closing))
58+
renderer.Write(fencedCodeBlock.FencedChar, fencedCodeBlock.ClosingFencedCharCount);
59+
if (fencedCodeBlock.ClosingFencedCharCount > 0)
6260
{
6361
// See example 207: "> ```\nfoo\n```"
6462
renderer.WriteLine(obj.NewLine);

src/Markdig/Renderers/Roundtrip/HeadingRenderer.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ namespace Markdig.Renderers.Roundtrip;
1212
/// <seealso cref="RoundtripObjectRenderer{HeadingBlock}" />
1313
public class HeadingRenderer : RoundtripObjectRenderer<HeadingBlock>
1414
{
15-
private static readonly string[] HeadingTexts = {
15+
private static readonly string[] HeadingTexts = [
1616
"#",
1717
"##",
1818
"###",
1919
"####",
2020
"#####",
2121
"######",
22-
};
22+
];
2323

2424
protected override void Write(RoundtripRenderer renderer, HeadingBlock obj)
2525
{
@@ -28,12 +28,11 @@ protected override void Write(RoundtripRenderer renderer, HeadingBlock obj)
2828
renderer.RenderLinesBefore(obj);
2929

3030
var headingChar = obj.Level == 1 ? '=' : '-';
31-
var line = new string(headingChar, obj.HeaderCharCount);
3231

3332
renderer.WriteLeafInline(obj);
3433
renderer.WriteLine(obj.SetextNewline);
3534
renderer.Write(obj.TriviaBefore);
36-
renderer.Write(line);
35+
renderer.Write(headingChar, obj.HeaderCharCount);
3736
renderer.WriteLine(obj.NewLine);
3837
renderer.Write(obj.TriviaAfter);
3938

@@ -43,12 +42,17 @@ protected override void Write(RoundtripRenderer renderer, HeadingBlock obj)
4342
{
4443
renderer.RenderLinesBefore(obj);
4544

46-
var headingText = obj.Level > 0 && obj.Level <= 6
47-
? HeadingTexts[obj.Level - 1]
48-
: new string('#', obj.Level);
49-
5045
renderer.Write(obj.TriviaBefore);
51-
renderer.Write(headingText);
46+
47+
if (obj.Level is > 0 and <= 6)
48+
{
49+
renderer.Write(HeadingTexts[obj.Level - 1]);
50+
}
51+
else
52+
{
53+
renderer.Write('#', obj.Level);
54+
}
55+
5256
renderer.Write(obj.TriviaAfterAtxHeaderChar);
5357
renderer.WriteLeafInline(obj);
5458
renderer.Write(obj.TriviaAfter);

src/Markdig/Renderers/Roundtrip/Inlines/CodeInlineRenderer.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ public class CodeInlineRenderer : RoundtripObjectRenderer<CodeInline>
1414
{
1515
protected override void Write(RoundtripRenderer renderer, CodeInline obj)
1616
{
17-
var delimiterRun = new string(obj.Delimiter, obj.DelimiterCount);
18-
renderer.Write(delimiterRun);
17+
renderer.Write(obj.Delimiter, obj.DelimiterCount);
1918
if (!obj.ContentSpan.IsEmpty)
2019
{
2120
renderer.Write(obj.ContentWithTrivia);
2221
}
23-
renderer.Write(delimiterRun);
22+
renderer.Write(obj.Delimiter, obj.DelimiterCount);
2423
}
2524
}

src/Markdig/Renderers/Roundtrip/Inlines/EmphasisInlineRenderer.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ public class EmphasisInlineRenderer : RoundtripObjectRenderer<EmphasisInline>
1414
{
1515
protected override void Write(RoundtripRenderer renderer, EmphasisInline obj)
1616
{
17-
var emphasisText = new string(obj.DelimiterChar, obj.DelimiterCount);
18-
renderer.Write(emphasisText);
17+
renderer.Write(obj.DelimiterChar, obj.DelimiterCount);
1918
renderer.WriteChildren(obj);
20-
renderer.Write(emphasisText);
19+
renderer.Write(obj.DelimiterChar, obj.DelimiterCount);
2120
}
2221
}

src/Markdig/Renderers/TextRendererBase.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,25 @@ public T Write(string? content)
211211
return (T)this;
212212
}
213213

214+
/// <summary>
215+
/// Writes the specified char repeated a specified number of times.
216+
/// </summary>
217+
/// <param name="c">The char to write.</param>
218+
/// <param name="count">The number of times to write the char.</param>
219+
/// <returns>This instance</returns>
220+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
221+
internal T Write(char c, int count)
222+
{
223+
WriteIndent();
224+
225+
for (int i = 0; i < count; i++)
226+
{
227+
Writer.Write(c);
228+
}
229+
230+
return (T)this;
231+
}
232+
214233
/// <summary>
215234
/// Writes the specified slice.
216235
/// </summary>

0 commit comments

Comments
 (0)