@@ -21,6 +21,55 @@ namespace Elastic.Markdown.Myst.Renderers.LlmMarkdown;
2121
2222public static class LlmRenderingHelpers
2323{
24+ < << << << Updated upstream
25+ == == == =
26+ /// <summary>
27+ /// Renders content with indentation using a flexible indentation strategy
28+ /// </summary>
29+ /// <param name="renderer">The markdown renderer</param>
30+ /// <param name="markdownObject">The markdown object to render</param>
31+ /// <param name="baseIndent">Base indentation to apply</param>
32+ /// <param name="lineIndentSelector">Optional function to customize indentation per line (lineIndex, lineContent) => indent</param>
33+ /// <param name="preserveCodeBlockIndentation">Whether to preserve original indentation for code blocks</param>
34+ public static void RenderContentWithIndentation(
35+ LlmMarkdownRenderer renderer ,
36+ MarkdownObject markdownObject ,
37+ string baseIndent = " " ,
38+ Func < int , string , string > ? lineIndentSelector = null ,
39+ bool preserveCodeBlockIndentation = false )
40+ {
41+ var output = DocumentationObjectPoolProvider . UseLlmMarkdownRenderer ( renderer . BuildContext , markdownObject , static ( tmpRenderer , obj ) =>
42+ {
43+ _ = tmpRenderer . Render ( obj ) ;
44+ } ) ;
45+
46+ if ( string . IsNullOrEmpty ( output ) )
47+ return ;
48+
49+ var lines = output . Split ( '\n ' ) ;
50+ for ( var i = 0 ; i < lines . Length ; i ++ )
51+ {
52+ var line = lines [ i ] ;
53+ var indent = lineIndentSelector ? . Invoke ( i , line ) ?? baseIndent ;
54+
55+ if ( i == 0 )
56+ renderer . Write ( line ) ;
57+ else if ( ! string . IsNullOrWhiteSpace ( line ) )
58+ {
59+ renderer . WriteLine ( ) ;
60+ renderer . Write ( indent ) ;
61+ var lineToWrite = preserveCodeBlockIndentation ? line : line . TrimStart ( ) ;
62+ renderer . Write ( lineToWrite ) ;
63+ }
64+ else if ( i < lines . Length - 1 )
65+ renderer . WriteLine ( ) ;
66+ }
67+ }
68+
69+ /// <summary>
70+ /// Backwards compatibility method that preserves the original simple behavior
71+ /// </summary>
72+ >>> >>> > Stashed changes
2473 public static void RenderBlockWithIndentation ( LlmMarkdownRenderer renderer , MarkdownObject block , string indentation = " " )
2574 {
2675 var content = DocumentationObjectPoolProvider . UseLlmMarkdownRenderer ( renderer . BuildContext , block , static ( tmpRenderer , obj ) =>
@@ -279,25 +328,7 @@ protected override void Write(LlmMarkdownRenderer renderer, Table table)
279328 // Render table header
280329 if ( table . Count > 0 && table [ 0 ] is TableRow headerRow )
281330 {
282- renderer . Writer . Write ( "|" ) ;
283- var cellIndex = 0 ;
284- foreach ( var cell in headerRow . Cast < TableCell > ( ) )
285- {
286- renderer . Writer . Write ( " " ) ;
287-
288- // Capture cell content
289- var content = DocumentationObjectPoolProvider . UseLlmMarkdownRenderer ( renderer . BuildContext , cell . Descendants ( ) . OfType < Inline > ( ) , static ( tmpRenderer , obj ) =>
290- {
291- foreach ( var inline in obj )
292- tmpRenderer . Write ( inline ) ;
293- } ) ;
294- // Write padded content
295- renderer . Writer . Write ( content . PadRight ( columnWidths [ cellIndex ] ) ) ;
296- renderer . Writer . Write ( " |" ) ;
297- cellIndex ++ ;
298- }
299-
300- renderer . WriteLine ( ) ;
331+ RenderTableRowCells ( renderer , headerRow , columnWidths ) ;
301332
302333 // Render separator row with proper alignment
303334 renderer . Writer . Write ( "|" ) ;
@@ -313,27 +344,26 @@ protected override void Write(LlmMarkdownRenderer renderer, Table table)
313344 // Render table body with aligned columns
314345 foreach ( var row in table . Skip ( 1 ) . Cast < TableRow > ( ) )
315346 {
316- renderer . Writer . Write ( "|" ) ;
317- var cellIndex = 0 ;
318- foreach ( var cell in row . Cast < TableCell > ( ) )
319- {
320- renderer . Writer . Write ( " " ) ;
321-
322- // Capture cell content
323- var content = DocumentationObjectPoolProvider . UseLlmMarkdownRenderer ( renderer . BuildContext , cell . Descendants ( ) . OfType < Inline > ( ) , static ( tmpRenderer , obj ) =>
324- {
325- foreach ( var inline in obj )
326- tmpRenderer . Write ( inline ) ;
327- } ) ;
328-
329- // Write padded content
330- renderer . Writer . Write ( content . PadRight ( columnWidths [ cellIndex ] ) ) ;
331- renderer . Writer . Write ( " |" ) ;
332- cellIndex ++ ;
333- }
347+ RenderTableRowCells ( renderer , row , columnWidths ) ;
348+ }
349+ }
334350
335- renderer . WriteLine ( ) ;
351+ /// <summary>
352+ /// Renders a table row with proper cell alignment and padding
353+ /// </summary>
354+ private static void RenderTableRowCells ( LlmMarkdownRenderer renderer , TableRow row , int [ ] columnWidths )
355+ {
356+ renderer . Writer . Write ( "|" ) ;
357+ var cellIndex = 0 ;
358+ foreach ( var cell in row . Cast < TableCell > ( ) )
359+ {
360+ renderer . Writer . Write ( " " ) ;
361+ var content = RenderTableCellContent ( renderer , cell ) ;
362+ renderer . Writer . Write ( content . PadRight ( columnWidths [ cellIndex ] ) ) ;
363+ renderer . Writer . Write ( " |" ) ;
364+ cellIndex ++ ;
336365 }
366+ renderer . WriteLine ( ) ;
337367 }
338368
339369 /// <summary>
@@ -352,24 +382,32 @@ private static int[] CalculateColumnWidths(LlmMarkdownRenderer renderer, Table t
352382 // Process all rows to find maximum width for each column
353383 foreach ( var row in table . Cast < TableRow > ( ) )
354384 {
355- var cellIndex = 0 ;
356- foreach ( var cell in row . Cast < TableCell > ( ) )
385+ for ( var cellIndex = 0 ; cellIndex < row . Count ; cellIndex ++ )
357386 {
387+ var cell = row [ cellIndex ] as TableCell ;
358388 // Capture cell content
359- var content = DocumentationObjectPoolProvider . UseLlmMarkdownRenderer ( renderer . BuildContext , cell . Descendants ( ) . OfType < Inline > ( ) , static ( tmpRenderer , obj ) =>
360- {
361- foreach ( var inline in obj )
362- tmpRenderer . Write ( inline ) ;
363- } ) ;
389+ var content = RenderTableCellContent ( renderer , cell ! ) ;
364390
365391 // Update width if this cell is wider
366392 widths [ cellIndex ] = Math . Max ( widths [ cellIndex ] , content . Length ) ;
367- cellIndex ++ ;
368393 }
369394 }
370395
371396 return widths ;
372397 }
398+
399+ /// <summary>
400+ /// Renders the inline content of a table cell to plain text
401+ /// </summary>
402+ private static string RenderTableCellContent ( LlmMarkdownRenderer renderer , TableCell cell ) =>
403+ DocumentationObjectPoolProvider . UseLlmMarkdownRenderer (
404+ renderer . BuildContext ,
405+ cell . Descendants ( ) . OfType < Inline > ( ) ,
406+ static ( tmpRenderer , obj ) =>
407+ {
408+ foreach ( var inline in obj )
409+ tmpRenderer . Write ( inline ) ;
410+ } ) ;
373411}
374412
375413public class LlmDirectiveRenderer : MarkdownObjectRenderer < LlmMarkdownRenderer , DirectiveBlock >
0 commit comments