From adda8c09ed9d72acd29d3ec6f5f125d07786a30d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=9D=E6=B3=BD=E5=BA=B7?= Date: Tue, 20 Aug 2024 15:38:44 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90#I9CNQW=E3=80=91=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E5=B8=A6=E6=9C=89=E9=A2=9C=E8=89=B2=E3=80=81?= =?UTF-8?q?=E4=B8=8B=E5=88=92=E7=BA=BF=E7=AD=89=E6=A0=B7=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?office=E6=AD=A3=E5=B8=B8=EF=BC=8C=E7=94=A8WPS=E6=89=93=E5=BC=80?= =?UTF-8?q?=E5=90=8E=E4=B8=8D=E5=8F=AF=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MiniWord/MiniWord.Implment.cs | 238 +++++++++++++++--------------- 1 file changed, 121 insertions(+), 117 deletions(-) diff --git a/src/MiniWord/MiniWord.Implment.cs b/src/MiniWord/MiniWord.Implment.cs index 3234eba..68040ef 100644 --- a/src/MiniWord/MiniWord.Implment.cs +++ b/src/MiniWord/MiniWord.Implment.cs @@ -84,9 +84,9 @@ private static void Generate(this OpenXmlElement xmlElement, WordprocessingDocum var dicKey = $"{listKey}.{e.Key}"; dic.Add(dicKey, e.Value); } - + ReplaceStatements(newTr, tags: dic); - + ReplaceText(newTr, docx, tags: dic); //Fix #47 The table should be inserted at the template tag position instead of the last row if (table.Contains(tr)) @@ -105,9 +105,9 @@ private static void Generate(this OpenXmlElement xmlElement, WordprocessingDocum } } } - + ReplaceStatements(xmlElement, tags); - + ReplaceText(xmlElement, docx, tags); } @@ -133,20 +133,20 @@ private static void AvoidSplitTagText(OpenXmlElement xmlElement) // TODO: check tag exist // TODO: record tag text if without tag then system need to clear them // TODO: every {{tag}} one for them and add text before first text and copy first one and remove {{, tagname, }} - + const string foreachTag = "{{foreach"; const string endForeachTag = "endforeach}}"; const string ifTag = "{{if"; const string endifTag = "endif}}"; const string tagStart = "{{"; const string tagEnd = "}}"; - - var foreachTagContains = s.Split(new []{foreachTag}, StringSplitOptions.None).Length - 1 == - s.Split(new []{endForeachTag}, StringSplitOptions.None).Length - 1; - var ifTagContains = s.Split(new []{ifTag}, StringSplitOptions.None).Length - 1 == - s.Split(new []{endifTag}, StringSplitOptions.None).Length - 1; + + var foreachTagContains = s.Split(new[] { foreachTag }, StringSplitOptions.None).Length - 1 == + s.Split(new[] { endForeachTag }, StringSplitOptions.None).Length - 1; + var ifTagContains = s.Split(new[] { ifTag }, StringSplitOptions.None).Length - 1 == + s.Split(new[] { endifTag }, StringSplitOptions.None).Length - 1; var tagContains = s.StartsWith(tagStart) && s.Contains(tagEnd); - + if (foreachTagContains && ifTagContains && tagContains) { if (sb.Length <= 1000) // avoid too big tag @@ -219,91 +219,91 @@ private static bool EvaluateStatement(string tagValue, string comparisonOperator var checkStatement = false; var tagValueEvaluation = EvaluateValue(tagValue); - + switch (tagValueEvaluation) - { - case double dtg when double.TryParse(value, out var doubleNumber): - switch (comparisonOperator) - { - case "==": - checkStatement = dtg.Equals(doubleNumber); - break; - case "!=": - checkStatement = !dtg.Equals(doubleNumber); - break; - case ">": - checkStatement = dtg > doubleNumber; - break; - case "<": - checkStatement = dtg < doubleNumber; - break; - case ">=": - checkStatement = dtg >= doubleNumber; - break; - case "<=": - checkStatement = dtg <= doubleNumber; - break; - } + { + case double dtg when double.TryParse(value, out var doubleNumber): + switch (comparisonOperator) + { + case "==": + checkStatement = dtg.Equals(doubleNumber); + break; + case "!=": + checkStatement = !dtg.Equals(doubleNumber); + break; + case ">": + checkStatement = dtg > doubleNumber; + break; + case "<": + checkStatement = dtg < doubleNumber; + break; + case ">=": + checkStatement = dtg >= doubleNumber; + break; + case "<=": + checkStatement = dtg <= doubleNumber; + break; + } - break; - case int itg when int.TryParse(value, out var intNumber): - switch (comparisonOperator) - { - case "==": - checkStatement = itg.Equals(intNumber); - break; - case "!=": - checkStatement = !itg.Equals(intNumber); - break; - case ">": - checkStatement = itg > intNumber; - break; - case "<": - checkStatement = itg < intNumber; - break; - case ">=": - checkStatement = itg >= intNumber; - break; - case "<=": - checkStatement = itg <= intNumber; - break; - } + break; + case int itg when int.TryParse(value, out var intNumber): + switch (comparisonOperator) + { + case "==": + checkStatement = itg.Equals(intNumber); + break; + case "!=": + checkStatement = !itg.Equals(intNumber); + break; + case ">": + checkStatement = itg > intNumber; + break; + case "<": + checkStatement = itg < intNumber; + break; + case ">=": + checkStatement = itg >= intNumber; + break; + case "<=": + checkStatement = itg <= intNumber; + break; + } - break; - case DateTime dttg when DateTime.TryParse(value, out var date): - switch (comparisonOperator) - { - case "==": - checkStatement = dttg.Equals(date); - break; - case "!=": - checkStatement = !dttg.Equals(date); - break; - case ">": - checkStatement = dttg > date; - break; - case "<": - checkStatement = dttg < date; - break; - case ">=": - checkStatement = dttg >= date; - break; - case "<=": - checkStatement = dttg <= date; - break; - } + break; + case DateTime dttg when DateTime.TryParse(value, out var date): + switch (comparisonOperator) + { + case "==": + checkStatement = dttg.Equals(date); + break; + case "!=": + checkStatement = !dttg.Equals(date); + break; + case ">": + checkStatement = dttg > date; + break; + case "<": + checkStatement = dttg < date; + break; + case ">=": + checkStatement = dttg >= date; + break; + case "<=": + checkStatement = dttg <= date; + break; + } - break; - case string stg: - switch (comparisonOperator) - { - case "==": - checkStatement = stg == value; - break; - case "!=": - checkStatement = stg != value; - break; - } + break; + case string stg: + switch (comparisonOperator) + { + case "==": + checkStatement = stg == value; + break; + case "!=": + checkStatement = stg != value; + break; + } break; case bool btg when bool.TryParse(value, out var boolean): switch (comparisonOperator) @@ -330,7 +330,7 @@ private static object EvaluateValue(string value) return intNumber; else if (DateTime.TryParse(value, out var date)) return date; - + return value; } @@ -355,10 +355,10 @@ private static void ReplaceText(OpenXmlElement xmlElement, WordprocessingDocumen if (!isMatch && tag.Value is List forTags) { if (forTags.Any(forTag => forTag.Value.Keys.Any(dictKey => - { - var innerTag = "{{" + tag.Key + "." + dictKey + "}}"; - return t.Text.Contains(innerTag); - }))) + { + var innerTag = "{{" + tag.Key + "." + dictKey + "}}"; + return t.Text.Contains(innerTag); + }))) { isMatch = true; } @@ -390,7 +390,7 @@ private static void ReplaceText(OpenXmlElement xmlElement, WordprocessingDocumen var currentT = t; var generatedText = new Text(); currentT.Text = currentT.Text.Replace(@"{{foreach", "").Replace(@"endforeach}}", ""); - + var newTexts = new Dictionary(); for (var i = 0; i < vs.Count; i++) { @@ -400,10 +400,10 @@ private static void ReplaceText(OpenXmlElement xmlElement, WordprocessingDocumen { newT.Text = newT.Text.Replace("{{" + tag.Key + "." + vv.Key + "}}", vv.Value.ToString()); } - + newT.Text = EvaluateIfStatement(newT.Text); - - if(!string.IsNullOrEmpty(newT.Text)) + + if (!string.IsNullOrEmpty(newT.Text)) newTexts.Add(i, newT.Text); } @@ -411,7 +411,7 @@ private static void ReplaceText(OpenXmlElement xmlElement, WordprocessingDocumen { var dict = newTexts.ElementAt(i); generatedText.Text += dict.Value; - + if (i != newTexts.Count - 1) { generatedText.Text += vs[dict.Key].Separator; @@ -452,10 +452,14 @@ private static void ReplaceText(OpenXmlElement xmlElement, WordprocessingDocumen } else if (tag.Value is MiniWordColorText || tag.Value is MiniWordColorText[]) { - var colorText = tag.Value is MiniWordColorText - ? AddColorText(new[] { (MiniWordColorText)tag.Value }) - : AddColorText((MiniWordColorText[])tag.Value); - run.Append(colorText); + if (tag.Value is MiniWordColorText) + { + AddColorText(run, new[] { (MiniWordColorText)tag.Value }); + } + else + { + AddColorText(run, (MiniWordColorText[])tag.Value); + } t.Remove(); } else @@ -469,7 +473,7 @@ private static void ReplaceText(OpenXmlElement xmlElement, WordprocessingDocumen { newText = tag.Value?.ToString(); } - + t.Text = t.Text.Replace($"{{{{{tag.Key}}}}}", newText); } } @@ -503,7 +507,7 @@ private static void ReplaceText(OpenXmlElement xmlElement, WordprocessingDocumen } } } - + private static void ReplaceStatements(OpenXmlElement xmlElement, Dictionary tags) { var paragraphs = xmlElement.Descendants().ToList(); @@ -539,14 +543,14 @@ private static string EvaluateIfStatement(string text) const string ifStartTag = "{{if("; const string ifEndTag = ")if"; const string endIfTag = "endif}}"; - - while (text.Contains(ifStartTag)) + + while (text.Contains(ifStartTag)) { var ifIndex = text.IndexOf(ifStartTag, StringComparison.Ordinal); var ifEndIndex = text.IndexOf(")if", ifIndex, StringComparison.Ordinal); - + var statement = text.Substring(ifIndex + ifStartTag.Length, ifEndIndex - (ifIndex + ifStartTag.Length)).Split(','); - + var checkStatement = EvaluateStatement(statement[0], statement[1], statement[2]); if (checkStatement) @@ -609,20 +613,20 @@ private static Hyperlink GetHyperLink(MainDocumentPart mainPart, MiniWordHyperLi }; return xmlHyperLink; } - private static RunProperties AddColorText(MiniWordColorText[] miniWordColorTextArray) + private static void AddColorText(Run run, MiniWordColorText[] miniWordColorTextArray) { - RunProperties runPro = new RunProperties(); + RunProperties runPro = null; foreach (var miniWordColorText in miniWordColorTextArray) { + runPro = new RunProperties(); Text text = new Text(miniWordColorText.Text); Color color = new Color() { Val = miniWordColorText.FontColor?.Replace("#", "") }; Shading shading = new Shading() { Fill = miniWordColorText.HighlightColor?.Replace("#", "") }; runPro.Append(shading); runPro.Append(color); - runPro.Append(text); + run.Append(runPro); + run.Append(text); } - - return runPro; } private static void AddPicture(OpenXmlElement appendElement, string relationshipId, MiniWordPicture pic) { -- Gitee