From 4b5348c53a0ced33986b70bd92d98227fc29baa6 Mon Sep 17 00:00:00 2001 From: Thom Lamb Date: Wed, 27 May 2026 16:24:51 -0500 Subject: [PATCH] refactor(dedup): share TruncateText across Markdown generators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `TruncateText` was copy-pasted verbatim in three Markdown generators (`SqlServer.QueryBreakdownGenerator`, `SqlServer.SqlStatementGenerator`, `Expressions.ExpressionGenerator`). Pulled out to a new `Strata.SqlTools.Markdown.Internal.MarkdownTextHelpers` static class (internal — no public-API change). Each call site keeps its own one-line private wrapper for source readability so existing `TruncateText(...)` calls in the generators need no edits. Deliberately *not* unified across the same three files: - `EscapeMermaidText` (QueryBreakdownGenerator) vs `EscapeMermaidText` (SqlStatementGenerator) — the QBG version intentionally escapes `[]{}()` for Mermaid node syntax; the SSG version only escapes quotes/newlines because it writes into `Note right of DB: ...` contexts where brackets render fine. - `EscapeMarkdown` (ExpressionGenerator) — a different escape set again, targeting Markdown rather than Mermaid. Also deliberately *not* refactored: `SqlServer.UpdateBreakdown.TryParse` ≡ `SqlServer.ProcedureBreakdown.TryParse` prelude (empty-check + parser + prefix regex + extract setup/finish clauses). The 30-line duplication is real, but every extraction shape (tuple return, `out`-flavored helper, context type) is measurably worse than the duplicated original. Leaving it. All 1180 tests stay green. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Expressions/ExpressionGenerator.cs | 8 +------ .../Internal/MarkdownTextHelpers.cs | 21 +++++++++++++++++++ .../SqlServer/QueryBreakdownGenerator.cs | 12 +---------- .../SqlServer/SqlStatementGenerator.cs | 12 +---------- 4 files changed, 24 insertions(+), 29 deletions(-) create mode 100644 src/Strata.SqlTools.Markdown/Internal/MarkdownTextHelpers.cs diff --git a/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs b/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs index 99b384a..67f4de5 100644 --- a/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs +++ b/src/Strata.SqlTools.Markdown/Expressions/ExpressionGenerator.cs @@ -361,13 +361,7 @@ public class ExpressionGenerator : IVisitor } private static string TruncateText(string text, int maxLength) - { - if (string.IsNullOrWhiteSpace(text) || text.Length <= maxLength) - { - return text; - } - return string.Concat(text.AsSpan(0, maxLength), "..."); - } + => Internal.MarkdownTextHelpers.TruncateText(text, maxLength); #region IVisitor Implementation diff --git a/src/Strata.SqlTools.Markdown/Internal/MarkdownTextHelpers.cs b/src/Strata.SqlTools.Markdown/Internal/MarkdownTextHelpers.cs new file mode 100644 index 0000000..f6f97b1 --- /dev/null +++ b/src/Strata.SqlTools.Markdown/Internal/MarkdownTextHelpers.cs @@ -0,0 +1,21 @@ +namespace Strata.SqlTools.Markdown.Internal; + +/// +/// Small text utilities shared by the Markdown generators. +/// Kept internal so they don't widen the public surface of this assembly. +/// +internal static class MarkdownTextHelpers +{ + /// + /// Truncates a string to characters, appending an ellipsis when truncated. + /// Returns the input unchanged when null/whitespace or already short enough. + /// + public static string TruncateText(string text, int maxLength) + { + if (string.IsNullOrWhiteSpace(text) || text.Length <= maxLength) + { + return text; + } + return string.Concat(text.AsSpan(0, maxLength), "..."); + } +} diff --git a/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs b/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs index 051cc8a..dcb44a6 100644 --- a/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs +++ b/src/Strata.SqlTools.Markdown/SqlServer/QueryBreakdownGenerator.cs @@ -191,17 +191,7 @@ public static class QueryBreakdownGenerator .Replace(">", ">"); } - /// - /// Truncates text to a maximum length and adds ellipsis if needed. - /// private static string TruncateText(string text, int maxLength) - { - if (string.IsNullOrWhiteSpace(text) || text.Length <= maxLength) - { - return text; - } - - return string.Concat(text.AsSpan(0, maxLength), "..."); - } + => Internal.MarkdownTextHelpers.TruncateText(text, maxLength); } diff --git a/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs b/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs index 49bc4da..f3dc210 100644 --- a/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs +++ b/src/Strata.SqlTools.Markdown/SqlServer/SqlStatementGenerator.cs @@ -112,18 +112,8 @@ public static class SqlStatementGenerator .Replace("\r", ""); } - /// - /// Truncates text to a maximum length. - /// private static string TruncateText(string text, int maxLength) - { - if (string.IsNullOrWhiteSpace(text) || text.Length <= maxLength) - { - return text; - } - - return string.Concat(text.AsSpan(0, maxLength), "..."); - } + => Internal.MarkdownTextHelpers.TruncateText(text, maxLength); /// /// Cleans table name for use in Mermaid diagrams.