Skip to content

Commit 246d7d5

Browse files
committed
refactor: Dedupe some logic in LlmBlockRenderers
1 parent d1b66f5 commit 246d7d5

File tree

1 file changed

+84
-46
lines changed

1 file changed

+84
-46
lines changed

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

Lines changed: 84 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,55 @@ namespace Elastic.Markdown.Myst.Renderers.LlmMarkdown;
2121

2222
public 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

375413
public class LlmDirectiveRenderer : MarkdownObjectRenderer<LlmMarkdownRenderer, DirectiveBlock>

0 commit comments

Comments
 (0)