private bool GoDeeper(ITagProcessor parentProcessor, XElement element) { var endReached = false; do { if (element.IsSdt()) { switch (this.GetTagName(element).ToLower()) { case "endrepeater": return(true); case "itemrepeater": case "itemtable": case "itemtext": case "itemif": case "endif": case "enditemtable": case "itemhtmlcontent": case "itemindex": break; default: if (!ItemRepeaterGenerator.IsItemRepeaterElement(element)) { element = this.ParseSdt(parentProcessor, element); } break; } } else if (element.HasElements) { endReached = this.GoDeeper(parentProcessor, element.Elements().First()); } element = element.NextElement(); }while (element != null && !endReached); return(endReached); }
private XElement ProcessElements(IEnumerable<ItemRepeaterElement> elements, DataReader dataReader, XElement start, XElement parent, int index, ref XElement nestedRepeaterEndElement, ref XElement endIfElement, bool nestedElement = false) { XElement result = null; XElement previous = start; foreach (var itemRepeaterElement in elements) { var flgStucturedElementProcessed = this.CheckAndProcessStartIfElementForContinue(itemRepeaterElement, dataReader, ref endIfElement) || this.CheckAndProcessEndIfElementForContinue(itemRepeaterElement, ref endIfElement) || this.CheckAndProcessEndItemRepeaterElementForContinue( itemRepeaterElement, ref nestedRepeaterEndElement) || this.CheckTableElementForContinue(itemRepeaterElement); if (!flgStucturedElementProcessed) { var flgNestedElementCheckedForContinue = this.CheckNestedConditionElementForContinue( itemRepeaterElement, endIfElement) || this.CheckNestedElementForContinue(elements.First(), itemRepeaterElement, nestedRepeaterEndElement); if (!flgNestedElementCheckedForContinue) { if (itemRepeaterElement.IsItemHtmlContent) { result = HtmlContentProcessor.MakeHtmlContentProcessed(itemRepeaterElement.XElement, dataReader.ReadText( itemRepeaterElement.Expression), true); } else if (itemRepeaterElement.IsItemRepeater) { var itemRepeaterTag = new ItemRepeaterTag() { StartItemRepeater = itemRepeaterElement.StartTag, EndItemRepeater = itemRepeaterElement.EndTag, Source = itemRepeaterElement.Expression }; var itemRepeaterGenerator = new ItemRepeaterGenerator(); previous = itemRepeaterGenerator.Generate(itemRepeaterTag, dataReader.GetReaders(itemRepeaterTag.Source), previous, parent); nestedRepeaterEndElement = itemRepeaterTag.EndItemRepeater; result = null; } else if (itemRepeaterElement.IsIndex) { result = DocxHelper.CreateTextElement(itemRepeaterElement.XElement, itemRepeaterElement.XElement.Parent, index.ToString(CultureInfo.CurrentCulture), !nestedElement); } else if (itemRepeaterElement.IsItem) { result = DocxHelper.CreateTextElement(itemRepeaterElement.XElement, itemRepeaterElement.XElement.Parent, dataReader.ReadText(itemRepeaterElement.Expression), dataReader.ReadAttribute(itemRepeaterElement.Expression, "style"), !nestedElement); } else if (itemRepeaterElement.IsItemTable) { result = ItemTableGenerator.ProcessItemTableElement(itemRepeaterElement.StartTag, itemRepeaterElement.EndTag, dataReader); if (nestedElement) { previous.AddAfterSelf(result); previous = result; result = null; } } else { var element = new XElement(itemRepeaterElement.XElement); element.RemoveNodes(); result = element; if (itemRepeaterElement.HasElements) { var parsedLastElement = this.ProcessElements(itemRepeaterElement.Elements, dataReader, previous, result, index, ref nestedRepeaterEndElement, ref endIfElement, true); if (itemRepeaterElement.Elements.Any(ire => ire.XElement.IsSdt()) && DocxHelper.IsEmptyParagraph(result)) { result = null; } if (itemRepeaterElement.Elements.Any(ire => ire.IsItemTable) || itemRepeaterElement.Elements.Any( ire => ire.IsItemRepeater && !CheckInlineWrappingMode(ire.StartTag, ire.EndTag))) { previous = parsedLastElement; } } else { element.Value = itemRepeaterElement.XElement.Value; } } if (result != null) { if (!nestedElement) { previous.AddAfterSelf(result); previous = result; } else { parent.Add(result); } } } else { result = null; } } else { result = null; } } return result ?? previous; }
private XElement ProcessElements(IEnumerable <ItemRepeaterElement> elements, DataReader dataReader, XElement start, XElement parent, int index, ref XElement nestedRepeaterEndElement, ref XElement endIfElement, bool nestedElement = false) { XElement result = null; XElement previous = start; foreach (var itemRepeaterElement in elements) { var flgStucturedElementProcessed = this.CheckAndProcessStartIfElementForContinue(itemRepeaterElement, dataReader, ref endIfElement) || this.CheckAndProcessEndIfElementForContinue(itemRepeaterElement, ref endIfElement) || this.CheckAndProcessEndItemRepeaterElementForContinue( itemRepeaterElement, ref nestedRepeaterEndElement) || this.CheckTableElementForContinue(itemRepeaterElement); if (!flgStucturedElementProcessed) { var flgNestedElementCheckedForContinue = this.CheckNestedConditionElementForContinue( itemRepeaterElement, endIfElement) || this.CheckNestedElementForContinue(elements.First(), itemRepeaterElement, nestedRepeaterEndElement); if (!flgNestedElementCheckedForContinue) { if (itemRepeaterElement.IsItemHtmlContent) { result = HtmlContentProcessor.MakeHtmlContentProcessed(itemRepeaterElement.XElement, dataReader.ReadText( itemRepeaterElement.Expression), true); } else if (itemRepeaterElement.IsItemRepeater) { var itemRepeaterTag = new ItemRepeaterTag() { StartItemRepeater = itemRepeaterElement.StartTag, EndItemRepeater = itemRepeaterElement.EndTag, Source = itemRepeaterElement.Expression }; var itemRepeaterGenerator = new ItemRepeaterGenerator(); previous = itemRepeaterGenerator.Generate(itemRepeaterTag, dataReader.GetReaders(itemRepeaterTag.Source), previous, parent); nestedRepeaterEndElement = itemRepeaterTag.EndItemRepeater; result = null; } else if (itemRepeaterElement.IsIndex) { result = DocxHelper.CreateTextElement(itemRepeaterElement.XElement, itemRepeaterElement.XElement.Parent, index.ToString(CultureInfo.CurrentCulture), !nestedElement); } else if (itemRepeaterElement.IsItem) { result = DocxHelper.CreateTextElement(itemRepeaterElement.XElement, itemRepeaterElement.XElement.Parent, dataReader.ReadText(itemRepeaterElement.Expression), dataReader.ReadAttribute(itemRepeaterElement.Expression, "style"), !nestedElement); } else if (itemRepeaterElement.IsItemTable) { result = ItemTableGenerator.ProcessItemTableElement(itemRepeaterElement.StartTag, itemRepeaterElement.EndTag, dataReader); if (nestedElement) { previous.AddAfterSelf(result); previous = result; result = null; } } else { var element = new XElement(itemRepeaterElement.XElement); element.RemoveNodes(); result = element; if (itemRepeaterElement.HasElements) { var parsedLastElement = this.ProcessElements(itemRepeaterElement.Elements, dataReader, previous, result, index, ref nestedRepeaterEndElement, ref endIfElement, true); if (itemRepeaterElement.Elements.Any(ire => ire.XElement.IsSdt()) && DocxHelper.IsEmptyParagraph(result)) { result = null; } if (itemRepeaterElement.Elements.Any(ire => ire.IsItemTable) || itemRepeaterElement.Elements.Any( ire => ire.IsItemRepeater && !CheckInlineWrappingMode(ire.StartTag, ire.EndTag))) { previous = parsedLastElement; } } else { element.Value = itemRepeaterElement.XElement.Value; } } if (result != null) { if (!nestedElement) { previous.AddAfterSelf(result); previous = result; } else { parent.Add(result); } } } else { result = null; } } else { result = null; } } return(result ?? previous); }