diff --git a/src/MiniWord/MiniWord.Implment.cs b/src/MiniWord/MiniWord.Implment.cs
index 3234ebaa6c3cac0f183b2b2400e8a86f00bce4df..68040efab3493148d8672dafeab79f38dc7d6af4 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)
{