namespace QWERTYkez.WordProcessor; /// /// Динамическая замена параграфа, содержащего "$key|param$", на таблицу. /// Логика построения и подмены — 1:1 копия из , /// плюс извлечение параметра. /// internal static class DynamicReplaceToTableExt { /// /// Заменяет все параграфы, содержащие шаблон "$key|...$", на таблицы. /// /// Делегат (param, tableBuilder) — параметр из "$key|param$" и билдер таблицы. internal static void ReplaceParagraphsContainingTextToTableDynamic( Body body, string oldValue, Action buildTable, FontProps? baseFont = null) { if (body is null || string.IsNullOrEmpty(oldValue) || buildTable is null) return; DynamicReplaceExt.ParsePattern(oldValue, out var prefix, out var suffix); var paragraphs = body.Elements().ToList(); if (paragraphs.Count == 0) return; for (int i = paragraphs.Count - 1; i >= 0; i--) { var paragraph = paragraphs[i]; if (paragraph is null) continue; var paraText = paragraph.InnerText; if (string.IsNullOrEmpty(paraText)) continue; int pStart = paraText.IndexOf(prefix, StringComparison.OrdinalIgnoreCase); if (pStart < 0) continue; int paramStart = pStart + prefix.Length; int pEnd = string.IsNullOrEmpty(suffix) ? paraText.Length : paraText.IndexOf(suffix, paramStart, StringComparison.OrdinalIgnoreCase); if (pEnd < 0) continue; string param = paraText.Substring(paramStart, pEnd - paramStart); string matchedText = paraText.Substring(pStart, pEnd + suffix.Length - pStart); // Извлекаем свойства шрифта из Run-а, содержащего совпадение var fontProps = paragraph.ExtractFontProps(matchedText); if (fontProps is { } props) fontProps = props.Override(baseFont); else if (baseFont is not null) fontProps = baseFont; ReplaceToTableExt.ReplaceWithTableBuilder(paragraph, builder => buildTable(param, builder), fontProps); } } }