From 246d7d568b246ef075ece576216c993f748de3f2 Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Fri, 18 Jul 2025 14:06:44 +0200 Subject: [PATCH 1/3] refactor: Dedupe some logic in LlmBlockRenderers --- .../LlmMarkdown/LlmBlockRenderers.cs | 130 +++++++++++------- 1 file changed, 84 insertions(+), 46 deletions(-) diff --git a/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs b/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs index a5210f24a..944e08e25 100644 --- a/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs +++ b/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs @@ -21,6 +21,55 @@ namespace Elastic.Markdown.Myst.Renderers.LlmMarkdown; public static class LlmRenderingHelpers { +<<<<<<< Updated upstream +======= + /// + /// Renders content with indentation using a flexible indentation strategy + /// + /// The markdown renderer + /// The markdown object to render + /// Base indentation to apply + /// Optional function to customize indentation per line (lineIndex, lineContent) => indent + /// Whether to preserve original indentation for code blocks + public static void RenderContentWithIndentation( + LlmMarkdownRenderer renderer, + MarkdownObject markdownObject, + string baseIndent = " ", + Func? lineIndentSelector = null, + bool preserveCodeBlockIndentation = false) + { + var output = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, markdownObject, static (tmpRenderer, obj) => + { + _ = tmpRenderer.Render(obj); + }); + + if (string.IsNullOrEmpty(output)) + return; + + var lines = output.Split('\n'); + for (var i = 0; i < lines.Length; i++) + { + var line = lines[i]; + var indent = lineIndentSelector?.Invoke(i, line) ?? baseIndent; + + if (i == 0) + renderer.Write(line); + else if (!string.IsNullOrWhiteSpace(line)) + { + renderer.WriteLine(); + renderer.Write(indent); + var lineToWrite = preserveCodeBlockIndentation ? line : line.TrimStart(); + renderer.Write(lineToWrite); + } + else if (i < lines.Length - 1) + renderer.WriteLine(); + } + } + + /// + /// Backwards compatibility method that preserves the original simple behavior + /// +>>>>>>> Stashed changes public static void RenderBlockWithIndentation(LlmMarkdownRenderer renderer, MarkdownObject block, string indentation = " ") { var content = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, block, static (tmpRenderer, obj) => @@ -279,25 +328,7 @@ protected override void Write(LlmMarkdownRenderer renderer, Table table) // Render table header if (table.Count > 0 && table[0] is TableRow headerRow) { - renderer.Writer.Write("|"); - var cellIndex = 0; - foreach (var cell in headerRow.Cast()) - { - renderer.Writer.Write(" "); - - // Capture cell content - var content = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, cell.Descendants().OfType(), static (tmpRenderer, obj) => - { - foreach (var inline in obj) - tmpRenderer.Write(inline); - }); - // Write padded content - renderer.Writer.Write(content.PadRight(columnWidths[cellIndex])); - renderer.Writer.Write(" |"); - cellIndex++; - } - - renderer.WriteLine(); + RenderTableRowCells(renderer, headerRow, columnWidths); // Render separator row with proper alignment renderer.Writer.Write("|"); @@ -313,27 +344,26 @@ protected override void Write(LlmMarkdownRenderer renderer, Table table) // Render table body with aligned columns foreach (var row in table.Skip(1).Cast()) { - renderer.Writer.Write("|"); - var cellIndex = 0; - foreach (var cell in row.Cast()) - { - renderer.Writer.Write(" "); - - // Capture cell content - var content = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, cell.Descendants().OfType(), static (tmpRenderer, obj) => - { - foreach (var inline in obj) - tmpRenderer.Write(inline); - }); - - // Write padded content - renderer.Writer.Write(content.PadRight(columnWidths[cellIndex])); - renderer.Writer.Write(" |"); - cellIndex++; - } + RenderTableRowCells(renderer, row, columnWidths); + } + } - renderer.WriteLine(); + /// + /// Renders a table row with proper cell alignment and padding + /// + private static void RenderTableRowCells(LlmMarkdownRenderer renderer, TableRow row, int[] columnWidths) + { + renderer.Writer.Write("|"); + var cellIndex = 0; + foreach (var cell in row.Cast()) + { + renderer.Writer.Write(" "); + var content = RenderTableCellContent(renderer, cell); + renderer.Writer.Write(content.PadRight(columnWidths[cellIndex])); + renderer.Writer.Write(" |"); + cellIndex++; } + renderer.WriteLine(); } /// @@ -352,24 +382,32 @@ private static int[] CalculateColumnWidths(LlmMarkdownRenderer renderer, Table t // Process all rows to find maximum width for each column foreach (var row in table.Cast()) { - var cellIndex = 0; - foreach (var cell in row.Cast()) + for (var cellIndex = 0; cellIndex < row.Count; cellIndex++) { + var cell = row[cellIndex] as TableCell; // Capture cell content - var content = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, cell.Descendants().OfType(), static (tmpRenderer, obj) => - { - foreach (var inline in obj) - tmpRenderer.Write(inline); - }); + var content = RenderTableCellContent(renderer, cell!); // Update width if this cell is wider widths[cellIndex] = Math.Max(widths[cellIndex], content.Length); - cellIndex++; } } return widths; } + + /// + /// Renders the inline content of a table cell to plain text + /// + private static string RenderTableCellContent(LlmMarkdownRenderer renderer, TableCell cell) => + DocumentationObjectPoolProvider.UseLlmMarkdownRenderer( + renderer.BuildContext, + cell.Descendants().OfType(), + static (tmpRenderer, obj) => + { + foreach (var inline in obj) + tmpRenderer.Write(inline); + }); } public class LlmDirectiveRenderer : MarkdownObjectRenderer From 0f5976f4854f7c4dadaa3ab7fce86a36971f7252 Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Fri, 18 Jul 2025 14:08:31 +0200 Subject: [PATCH 2/3] Cleanup --- .../Helpers/DocumentationObjectPoolProvider.cs | 1 - .../Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs | 6 ------ 2 files changed, 7 deletions(-) diff --git a/src/Elastic.Markdown/Helpers/DocumentationObjectPoolProvider.cs b/src/Elastic.Markdown/Helpers/DocumentationObjectPoolProvider.cs index af823e89b..8a25e7c2c 100644 --- a/src/Elastic.Markdown/Helpers/DocumentationObjectPoolProvider.cs +++ b/src/Elastic.Markdown/Helpers/DocumentationObjectPoolProvider.cs @@ -8,7 +8,6 @@ using Elastic.Markdown.Myst; using Elastic.Markdown.Myst.Renderers.LlmMarkdown; using Markdig.Renderers; -using Markdig.Syntax; using Microsoft.Extensions.ObjectPool; namespace Elastic.Markdown.Helpers; diff --git a/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs b/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs index 944e08e25..4e1ee1f13 100644 --- a/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs +++ b/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs @@ -21,8 +21,6 @@ namespace Elastic.Markdown.Myst.Renderers.LlmMarkdown; public static class LlmRenderingHelpers { -<<<<<<< Updated upstream -======= /// /// Renders content with indentation using a flexible indentation strategy /// @@ -66,10 +64,6 @@ public static void RenderContentWithIndentation( } } - /// - /// Backwards compatibility method that preserves the original simple behavior - /// ->>>>>>> Stashed changes public static void RenderBlockWithIndentation(LlmMarkdownRenderer renderer, MarkdownObject block, string indentation = " ") { var content = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, block, static (tmpRenderer, obj) => From 5acae05beff10dd9e0791e50e10d9c6ae65cfbcf Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Fri, 18 Jul 2025 16:06:30 +0200 Subject: [PATCH 3/3] Cleanup --- .../LlmMarkdown/LlmBlockRenderers.cs | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs b/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs index 4e1ee1f13..2fca4e4b7 100644 --- a/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs +++ b/src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmBlockRenderers.cs @@ -21,49 +21,6 @@ namespace Elastic.Markdown.Myst.Renderers.LlmMarkdown; public static class LlmRenderingHelpers { - /// - /// Renders content with indentation using a flexible indentation strategy - /// - /// The markdown renderer - /// The markdown object to render - /// Base indentation to apply - /// Optional function to customize indentation per line (lineIndex, lineContent) => indent - /// Whether to preserve original indentation for code blocks - public static void RenderContentWithIndentation( - LlmMarkdownRenderer renderer, - MarkdownObject markdownObject, - string baseIndent = " ", - Func? lineIndentSelector = null, - bool preserveCodeBlockIndentation = false) - { - var output = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, markdownObject, static (tmpRenderer, obj) => - { - _ = tmpRenderer.Render(obj); - }); - - if (string.IsNullOrEmpty(output)) - return; - - var lines = output.Split('\n'); - for (var i = 0; i < lines.Length; i++) - { - var line = lines[i]; - var indent = lineIndentSelector?.Invoke(i, line) ?? baseIndent; - - if (i == 0) - renderer.Write(line); - else if (!string.IsNullOrWhiteSpace(line)) - { - renderer.WriteLine(); - renderer.Write(indent); - var lineToWrite = preserveCodeBlockIndentation ? line : line.TrimStart(); - renderer.Write(lineToWrite); - } - else if (i < lines.Length - 1) - renderer.WriteLine(); - } - } - public static void RenderBlockWithIndentation(LlmMarkdownRenderer renderer, MarkdownObject block, string indentation = " ") { var content = DocumentationObjectPoolProvider.UseLlmMarkdownRenderer(renderer.BuildContext, block, static (tmpRenderer, obj) =>