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 ;
56using Elastic . Markdown . Helpers ;
67using Elastic . Markdown . Myst . CodeBlocks ;
78using Elastic . Markdown . Myst . Directives ;
@@ -20,15 +21,23 @@ namespace Elastic.Markdown.Myst.Renderers.LlmMarkdown;
2021
2122public 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