public override void Process() { base.Process(); ProcessDynamicContent(); if (TableTag == null) { throw new NullReferenceException(); } var tableRows = TableTag.Table.Elements(WordMl.TableRowName); var dynamicRow = TableTag.DynamicRow.HasValue ? tableRows.ElementAt(TableTag.DynamicRow.Value - 1) : tableRows.Last(); ReplaceValues(dynamicRow); if (this.CreateDynamicContentTags) { var innerElements = TraverseUtils.ElementsBetween(this.TableTag.TagTable, this.TableTag.TagEndTable).ToList(); innerElements.Remove(); this.TableTag.TagTable.AddBeforeSelf(DocxHelper.CreateDynamicContentElement(innerElements, this.TableTag.TagTable, this.DynamicContentLockingType)); this.CleanUp(this.TableTag.TagTable, this.TableTag.TagEndTable); } else { RemoveTags(); } }
public override void Process() { base.Process(); var element = TextTag.TagNode; var text = DataReader.ReadText(TextTag.Expression); XElement parent = element.Parent; if (parent.Name == WordMl.TableRowName) { parent = element.Element(WordMl.SdtContentName).Element(WordMl.TableCellName); } var textElement = DocxHelper.CreateTextElement(element, parent, text); var result = this.CreateDynamicContentTags ? DocxHelper.CreateDynamicContentElement(new[] { textElement }, this.TextTag.TagNode, this.DynamicContentLockingType) : textElement; if (element.Parent.Name != WordMl.TableRowName) { element.AddBeforeSelf(result); } else { var cell = new XElement(WordMl.TableCellName, result); cell.AddFirst(element.Descendants(WordMl.TableCellPropertiesName)); element.AddBeforeSelf(cell); } element.Remove(); }
public override void Process() { base.Process(); this.ProcessDynamicContent(); bool truthful; try { truthful = bool.Parse(this.DataReader.ReadText(this.Tag.Conidition)); } catch (System.FormatException) { truthful = false; } catch (System.Xml.XPath.XPathException) { truthful = false; } if (!truthful) { if (this.CreateDynamicContentTags) { this.Tag.StartIf.AddBeforeSelf(DocxHelper.CreateDynamicContentElement(Enumerable.Empty <XElement>(), this.Tag.StartIf, this.DynamicContentLockingType)); } this.CleanUp(this.Tag.StartIf, this.Tag.EndIf); } else { if (this.CreateDynamicContentTags) { var innerElements = TraverseUtils.ElementsBetween(this.Tag.StartIf, this.Tag.EndIf).ToList(); innerElements.Remove(); this.Tag.StartIf.AddBeforeSelf(DocxHelper.CreateDynamicContentElement(innerElements, this.Tag.StartIf, this.DynamicContentLockingType)); this.CleanUp(this.Tag.StartIf, this.Tag.EndIf); } else { this.Tag.StartIf.Remove(); this.Tag.EndIf.Remove(); } } }
public override void Process() { base.Process(); this.ProcessDynamicContent(); var current = RepeaterTag.StartRepeater; var dataReaders = DataReader.GetReaders(RepeaterTag.Source).ToList(); var repeaterElements = TraverseUtils.SecondElementsBetween(RepeaterTag.StartRepeater, RepeaterTag.EndRepeater) .Select(RepeaterTag.MakeElementCallback).ToList(); for (var index = 0; index < dataReaders.Count; index++) { XElement endIfElementTmp = null; XElement endRepeaterElementTmp = null; XElement endItemTableElement = null; current = this.ProcessElements(repeaterElements, dataReaders[index], current, null, index + 1, ref endIfElementTmp, ref endRepeaterElementTmp, ref endItemTableElement); } foreach (var repeaterElement in repeaterElements) { repeaterElement.XElement.Remove(); } if (this.CreateDynamicContentTags) { var innerElements = TraverseUtils.ElementsBetween(this.RepeaterTag.StartRepeater, this.RepeaterTag.EndRepeater).ToList(); innerElements.Remove(); this.RepeaterTag.StartRepeater.AddBeforeSelf( DocxHelper.CreateDynamicContentElement( innerElements, this.RepeaterTag.StartRepeater, this.DynamicContentLockingType)); this.CleanUp(this.RepeaterTag.StartRepeater, this.RepeaterTag.EndRepeater); } else { this.RepeaterTag.StartRepeater.Remove(); this.RepeaterTag.EndRepeater.Remove(); } }
private XElement ProcessCell(TableElement tableElement, XElement previous, string text) { var isInnerCell = tableElement.HasCell(); var currentCell = this.CurrentCell(tableElement); previous = this.ProcessStaticCells(tableElement, previous); var parent = isInnerCell ? currentCell: tableElement.StartTag.Parent; var result = DocxHelper.CreateTextElement( tableElement.StartTag, parent, text); if (!isInnerCell) { tableElement.StartTag.AddAfterSelf(result); } else { if (currentCell.Elements(WordMl.ParagraphName).Any()) { currentCell.Elements(WordMl.ParagraphName).Remove(); } currentCell.Add(result); } if (previous != null && !previous.Equals(currentCell)) { currentCell.Remove(); previous.AddAfterSelf(currentCell); } else if (previous == null) { var parentRow = isInnerCell ? tableElement.StartTag.Parent : currentCell.Parent; currentCell.Remove(); parentRow.Add(currentCell); } return(currentCell); }
public static IList <string> GenerateAltChunks(XElement root) { var htmlTags = root.Descendants() .Where(el => el.IsTag(ProcessedHtmlContentTagName)) .ToList(); var htmlChunks = new List <string>(); foreach (var htmlTag in htmlTags) { var htmlString = htmlTag.GetExpression(); var htmlChunkIndex = htmlChunks.FindIndex(html => html.Equals(htmlString)); if (htmlChunkIndex == -1) { htmlChunks.Add(htmlString); htmlChunkIndex = htmlChunks.Count - 1; } var parent = htmlTag.Parent; var altChunkElement = DocxHelper.CreateAltChunkElement(htmlChunkIndex + 1); if (!parent.Name.Equals(WordMl.ParagraphName)) { htmlTag.AddAfterSelf(altChunkElement); } else { parent.AddAfterSelf(altChunkElement); if (parent.Elements().Count(el => !el.Name.Equals(WordMl.ParagraphPropertiesName)) == 1) { parent.Remove(); } } if (altChunkElement.Parent.Name.Equals(WordMl.TableCellName) && (altChunkElement.NextElement() == null)) { DocxHelper.AddEmptyParagraphInTableCell(altChunkElement); } htmlTag.Remove(); } return(htmlChunks); }
private XElement ProcessElements(IEnumerable <RepeaterElement> elements, DataReader dataReader, XElement start, XElement parent, int index, ref XElement endIfElement, ref XElement nestedRepeaterEndElement, ref XElement currentEndItemTable, bool nested = false) { XElement result = null; XElement previous = start; //if ((parent != null) && (!parent.Name.Equals(WordMl.TableCellName))) //{ elements = elements.Where(el => !this.IsItemRepeaterElement(el.XElement)).ToList(); //} foreach (var repeaterElement in elements) //elements.Where(el => !this.IsItemRepeaterElement(el.XElement)).ToList()) { if (nestedRepeaterEndElement != null) { if (repeaterElement.XElement.Equals(nestedRepeaterEndElement)) { nestedRepeaterEndElement = null; } continue; } if (currentEndItemTable != null) { if (repeaterElement.XElement.Equals(currentEndItemTable)) { currentEndItemTable = null; } continue; } if (repeaterElement.IsEndItemIf /*&& repeaterElement.XElement.Equals(endIfElement)*/) { //endIfElement = null; if (repeaterElement.XElement.Equals(endIfElement)) { endIfElement = null; } continue; } if ((endIfElement != null) && !repeaterElement.XElement.Name.Equals(WordMl.ParagraphName)) { continue; } if (repeaterElement.IsItemIf) { this.ProcessItemIfElement(repeaterElement, dataReader, ref endIfElement); continue; } if (repeaterElement.IsItemTable) { /*currentEndItemTable = RepeaterParser.FindEndTag(repeaterElement.XElement, "itemtable", * "enditemtable");*/ currentEndItemTable = repeaterElement.EndTag; } /* * if (repeaterElement.IsEndItemTable /*|| (repeaterElement.XElement.Name.Equals(WordMl.TableName) && repeaterElement.XElement.Descendants().Any(el => el.IsSdt()))) * { * continue; * }*/ if (repeaterElement.IsItemHtmlContent) { result = HtmlContentProcessor.MakeHtmlContentProcessed(repeaterElement.XElement, dataReader.ReadText(repeaterElement.Expression), true); } else if (repeaterElement.IsItemTable) { result = ItemTableGenerator.ProcessItemTableElement(repeaterElement.StartTag, repeaterElement.EndTag, dataReader); if (nested) { previous.AddAfterSelf(result); previous = result; result = null; } } else if (repeaterElement.IsItemRepeater) { var itemRepeaterTag = new ItemRepeaterTag() { StartItemRepeater = repeaterElement.StartTag, EndItemRepeater = repeaterElement.EndTag, Source = repeaterElement.Expression }; var itemRepeaterGenerator = new ItemRepeaterGenerator(); previous = itemRepeaterGenerator.Generate(itemRepeaterTag, dataReader.GetReaders(repeaterElement.Expression), previous, parent, true); result = null; nestedRepeaterEndElement = repeaterElement.EndTag; } else if (repeaterElement.IsIndex) { result = DocxHelper.CreateTextElement(repeaterElement.XElement, repeaterElement.XElement.Parent, index.ToString(CultureInfo.CurrentCulture)); } else if (repeaterElement.IsItem && repeaterElement.HasExpression) { result = DocxHelper.CreateTextElement(repeaterElement.XElement, repeaterElement.XElement.Parent, dataReader.ReadText(repeaterElement.Expression), dataReader.ReadAttribute(repeaterElement.Expression, "style")); } else { var element = new XElement(repeaterElement.XElement); element.RemoveNodes(); result = element; if (repeaterElement.HasElements) { var parsedLastElement = this.ProcessElements(repeaterElement.Elements, dataReader, previous, result, index, ref endIfElement, ref nestedRepeaterEndElement, ref currentEndItemTable, true); if (repeaterElement.Elements.Any(re => re.IsItemTable) || repeaterElement.Elements.Any(re => re.IsItemRepeater && !ItemRepeaterGenerator.CheckInlineWrappingMode(re.StartTag, re.EndTag))) { previous = parsedLastElement; result = null; } } else { element.Value = repeaterElement.XElement.Value; } } if (result != null) { if (!nested) { previous.AddAfterSelf(result); previous = result; } else { parent.Add(result); } } } return(result ?? previous); }