Skip to content

Commit b6d8419

Browse files
committed
Use DocumentationObjectPoolProvider for StringWriters
1 parent 4f1eb44 commit b6d8419

File tree

5 files changed

+49
-37
lines changed

5 files changed

+49
-37
lines changed

src/Elastic.Documentation/Extensions/ReusableStringWriter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public sealed class ReusableStringWriter : TextWriter
1818

1919
public void Reset() => _sb = null;
2020

21+
public override string ToString() => _sb?.ToString() ?? string.Empty;
22+
2123
public override void Write(char value) => _sb?.Append(value);
2224

2325
public override void Write(char[] buffer, int index, int count)

src/Elastic.Markdown/DocumentationGenerator.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Elastic.Documentation.Site.Navigation;
1414
using Elastic.Documentation.State;
1515
using Elastic.Markdown.Exporters;
16+
using Elastic.Markdown.Helpers;
1617
using Elastic.Markdown.IO;
1718
using Elastic.Markdown.Links.CrossLinks;
1819
using Elastic.Markdown.Myst.Renderers;
@@ -346,13 +347,15 @@ public async Task<string> RenderLlmMarkdown(MarkdownFile markdown, Cancel ctx)
346347
{
347348
await DocumentationSet.Tree.Resolve(ctx);
348349
var document = await markdown.ParseFullAsync(ctx);
349-
await using var writer = new StringWriter();
350-
var renderer = new LlmMarkdownRenderer(writer)
350+
var stringBuilder = DocumentationObjectPoolProvider.StringBuilderPool.Get();
351+
await using var stringWriter = DocumentationObjectPoolProvider.StringWriterPool.Get();
352+
stringWriter.SetStringBuilder(stringBuilder);
353+
var renderer = new LlmMarkdownRenderer(stringWriter)
351354
{
352355
BuildContext = DocumentationSet.Context
353356
};
354357
_ = renderer.Render(document);
355-
return writer.ToString().Trim();
358+
return stringBuilder.ToString().Trim();
356359
}
357360

358361
public async Task<RenderResult> RenderLayout(MarkdownFile markdown, Cancel ctx)

src/Elastic.Markdown/Exporters/LlmMarkdownExporter.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,16 @@ await fileContext.SourceFile.SourceFile.FileSystem.File.WriteAllTextAsync(
6666

6767
public static string ConvertToLlmMarkdown(MarkdownDocument document, MarkdownExportFileContext context)
6868
{
69-
using var writer = new StringWriter();
70-
var renderer = new LlmMarkdownRenderer(writer)
69+
var stringBuilder = DocumentationObjectPoolProvider.StringBuilderPool.Get();
70+
using var stringWriter = DocumentationObjectPoolProvider.StringWriterPool.Get();
71+
stringWriter.SetStringBuilder(stringBuilder);
72+
73+
var renderer = new LlmMarkdownRenderer(stringWriter)
7174
{
7275
BuildContext = context.BuildContext
7376
};
7477
_ = renderer.Render(document);
75-
return writer.ToString();
78+
return stringBuilder.ToString();
7679
}
7780

7881
private static IFileInfo GetLlmOutputFile(MarkdownExportFileContext fileContext)
@@ -107,7 +110,7 @@ private static IFileInfo GetLlmOutputFile(MarkdownExportFileContext fileContext)
107110
private string CreateLlmContentWithMetadata(MarkdownExportFileContext context, string llmMarkdown)
108111
{
109112
var sourceFile = context.SourceFile;
110-
var metadata = new StringBuilder();
113+
var metadata = DocumentationObjectPoolProvider.StringBuilderPool.Get();
111114

112115
_ = metadata.AppendLine("---");
113116
_ = metadata.AppendLine($"title: {sourceFile.Title}");

src/Elastic.Markdown/Helpers/DocumentationObjectPoolProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Text;
66
using Elastic.Documentation.Extensions;
77
using Elastic.Markdown.Myst;
8+
using Elastic.Markdown.Myst.Renderers.LlmMarkdown;
89
using Markdig.Renderers;
910
using Microsoft.Extensions.ObjectPool;
1011

src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5+
using Elastic.Documentation.Extensions;
56
using Elastic.Markdown.Helpers;
67
using Elastic.Markdown.Myst.CodeBlocks;
78
using Elastic.Markdown.Myst.Directives;
@@ -20,15 +21,23 @@ namespace Elastic.Markdown.Myst.Renderers.LlmMarkdown;
2021

2122
public static class LlmRenderingHelpers
2223
{
24+
public static ReusableStringWriter CreateTempWriter()
25+
{
26+
var stringBuilder = DocumentationObjectPoolProvider.StringBuilderPool.Get();
27+
var sw = DocumentationObjectPoolProvider.StringWriterPool.Get();
28+
sw.SetStringBuilder(stringBuilder);
29+
return sw;
30+
}
31+
2332
public static void RenderBlockWithIndentation(LlmMarkdownRenderer renderer, MarkdownObject block, string indentation = " ")
2433
{
25-
using var tempWriter = new StringWriter();
26-
var tempRenderer = new LlmMarkdownRenderer(tempWriter)
34+
using var sw = CreateTempWriter();
35+
var tempRenderer = new LlmMarkdownRenderer(sw)
2736
{
28-
BuildContext = renderer.BuildContext // Copy BuildContext for URL transformation
37+
BuildContext = renderer.BuildContext
2938
};
3039
_ = tempRenderer.Render(block);
31-
var content = tempWriter.ToString().TrimEnd();
40+
var content = sw.ToString();
3241
if (string.IsNullOrEmpty(content))
3342
return;
3443
var lines = content.Split(['\n', '\r'], StringSplitOptions.RemoveEmptyEntries);
@@ -191,13 +200,13 @@ private static string GetContinuationIndent(string baseIndent, bool isOrdered) =
191200

192201
private static void RenderBlockWithIndentation(LlmMarkdownRenderer renderer, Block block, string baseIndent, bool isOrdered)
193202
{
194-
using var tempWriter = new StringWriter();
195-
var tempRenderer = new LlmMarkdownRenderer(tempWriter)
203+
using var sw = LlmRenderingHelpers.CreateTempWriter();
204+
var tempRenderer = new LlmMarkdownRenderer(sw)
196205
{
197206
BuildContext = renderer.BuildContext
198207
};
199208
_ = tempRenderer.Render(block);
200-
var blockOutput = tempWriter.ToString();
209+
var blockOutput = sw.ToString();
201210

202211
var continuationIndent = GetContinuationIndent(baseIndent, isOrdered);
203212
var lines = blockOutput.Split('\n');
@@ -291,20 +300,17 @@ protected override void Write(LlmMarkdownRenderer renderer, Table table)
291300
renderer.Writer.Write(" ");
292301

293302
// Capture cell content
294-
var cellContent = new StringWriter();
295-
var tempRenderer = new LlmMarkdownRenderer(cellContent)
303+
using var sw = LlmRenderingHelpers.CreateTempWriter();
304+
var tempRenderer = new LlmMarkdownRenderer(sw)
296305
{
297-
BuildContext = renderer.BuildContext // Copy BuildContext for URL transformation
306+
BuildContext = renderer.BuildContext
298307
};
299-
300308
// Render cell content to temporary writer
301309
foreach (var inline in cell.Descendants().OfType<Markdig.Syntax.Inlines.Inline>())
302-
{
303310
tempRenderer.Write(inline);
304-
}
305311

306312
// Write padded content
307-
var content = cellContent.ToString();
313+
var content = sw.ToString();
308314
renderer.Writer.Write(content.PadRight(columnWidths[cellIndex]));
309315
renderer.Writer.Write(" |");
310316
cellIndex++;
@@ -333,20 +339,17 @@ protected override void Write(LlmMarkdownRenderer renderer, Table table)
333339
renderer.Writer.Write(" ");
334340

335341
// Capture cell content
336-
var cellContent = new StringWriter();
337-
var tempRenderer = new LlmMarkdownRenderer(cellContent)
342+
using var sw = LlmRenderingHelpers.CreateTempWriter();
343+
var tempRenderer = new LlmMarkdownRenderer(sw)
338344
{
339-
BuildContext = renderer.BuildContext // Copy BuildContext for URL transformation
345+
BuildContext = renderer.BuildContext
340346
};
341-
342347
// Render cell content to temporary writer
343348
foreach (var inline in cell.Descendants().OfType<Markdig.Syntax.Inlines.Inline>())
344-
{
345349
tempRenderer.Write(inline);
346-
}
347350

348351
// Write padded content
349-
var content = cellContent.ToString();
352+
var content = sw.ToString();
350353
renderer.Writer.Write(content.PadRight(columnWidths[cellIndex]));
351354
renderer.Writer.Write(" |");
352355
cellIndex++;
@@ -376,20 +379,19 @@ private static int[] CalculateColumnWidths(LlmMarkdownRenderer renderer, Table t
376379
foreach (var cell in row.Cast<TableCell>())
377380
{
378381
// Capture cell content
379-
var cellContent = new StringWriter();
380-
var tempRenderer = new LlmMarkdownRenderer(cellContent)
382+
using var sw = LlmRenderingHelpers.CreateTempWriter();
383+
var tempRenderer = new LlmMarkdownRenderer(sw)
381384
{
382-
BuildContext = renderer.BuildContext // Copy BuildContext for URL transformation
385+
BuildContext = renderer.BuildContext
383386
};
384-
385387
// Render cell content to temporary writer
386388
foreach (var inline in cell.Descendants().OfType<Markdig.Syntax.Inlines.Inline>())
387389
{
388390
tempRenderer.Write(inline);
389391
}
390392

391393
// Update width if this cell is wider
392-
var content = cellContent.ToString();
394+
var content = sw.ToString();
393395
widths[cellIndex] = Math.Max(widths[cellIndex], content.Length);
394396
cellIndex++;
395397
}
@@ -510,7 +512,8 @@ private void WriteIncludeBlock(LlmMarkdownRenderer renderer, IncludeBlock block)
510512
private static void WriteChildrenWithIndentation(LlmMarkdownRenderer renderer, Block container, string indent)
511513
{
512514
// Capture output and manually add indentation
513-
using var sw = new StringWriter();
515+
using var sw = LlmRenderingHelpers.CreateTempWriter();
516+
514517
var originalWriter = renderer.Writer;
515518
renderer.Writer = sw;
516519
try
@@ -561,10 +564,10 @@ protected override void Write(LlmMarkdownRenderer renderer, DefinitionItem obj)
561564

562565
private static string GetPlainTextFromLeafBlock(LlmMarkdownRenderer renderer, LeafBlock leafBlock)
563566
{
564-
using var tempWriter = new StringWriter();
565-
var tempRenderer = new LlmMarkdownRenderer(tempWriter) { BuildContext = renderer.BuildContext };
567+
using var sw = LlmRenderingHelpers.CreateTempWriter();
568+
var tempRenderer = new LlmMarkdownRenderer(sw) { BuildContext = renderer.BuildContext };
566569
tempRenderer.WriteLeafInline(leafBlock);
567-
var markdownText = tempWriter.ToString();
570+
var markdownText = sw.ToString();
568571
return markdownText.StripMarkdown();
569572
}
570573
}

0 commit comments

Comments
 (0)