public override XElement Parse(ITagProcessor parentProcessor, XElement startElement) { this.ValidateStartTag(startElement, StartTagName); var startTag = startElement; if (string.IsNullOrEmpty(startTag.Value)) { throw new Exception(string.Format(MessageStrings.TagNotFoundOrEmpty, "If")); } var endTag = this.FindEndTag(startTag); var content = TraverseUtils.ElementsBetween(startTag, endTag).ToList(); var expression = startTag.GetExpression(); var ifTag = new IfTag { Conidition = expression, EndIf = endTag, IfContent = content, StartIf = startTag, }; var ifProcessor = new IfProcessor { Tag = ifTag }; if (content.Any()) { this.GoDeeper(ifProcessor, content.First(), endTag); } parentProcessor.AddProcessor(ifProcessor); return(endTag); }
public override XElement Parse(ITagProcessor parentProcessor, XElement startElement) { this.ValidateStartTag(startElement, TagName); var endRepeater = TryGetRequiredTag(startElement, EndTagName); var itemsSource = startElement.GetExpression(); if (string.IsNullOrEmpty(itemsSource)) { throw new Exception(MessageStrings.ItemsAreEmpty); } IEnumerable <XElement> elementsBetween = TraverseUtils.ElementsBetween(startElement, endRepeater).ToList(); var repeaterTag = new RepeaterTag { Source = itemsSource, StartRepeater = startElement, EndRepeater = endRepeater, MakeElementCallback = MakeElementCallback }; var repeaterProcessor = new RepeaterProcessor { RepeaterTag = repeaterTag, }; if (elementsBetween.Any()) { this.GoDeeper(repeaterProcessor, elementsBetween.First()); } parentProcessor.AddProcessor(repeaterProcessor); return(endRepeater); }
public XElement Parse(ItemRepeaterTag tag, IList <DataReader> dataReaders, XElement current = null) { var startElement = tag.StartItemRepeater; var endElement = tag.EndItemRepeater; List <ItemRepeaterElement> itemRepeaterElements; itemRepeaterElements = this.MarkLastElements( TraverseUtils.ElementsBetween(startElement, endElement).Select(MakeElementCallback).ToList()) .ToList(); var nestedRepeaters = this.MarkNotSeparatedRepeaters(this.GetAllNestedRepeaters(tag), itemRepeaterElements); if (startElement.Parent.Name == WordMl.ParagraphName) { startElement = startElement.Parent; } var flgDeleteStartEnd = current == null; current = current ?? startElement; var repeaterElements = this.GetSiblingElements(itemRepeaterElements.ToList(), nestedRepeaters.ToList()).Where(sel => !(sel.XElement.IsTag("enditemrepeater") || sel.XElement.IsTag("itemrepeater"))); XElement currentNested; for (var index = 1; index <= dataReaders.Count(); index++) { this.SetRepeaterElementsVisible(repeaterElements.ToList()); ICollection <XElement> bisectElements; var ifCount = 1; var flg = false; repeaterElements = this.MarkInvisibleElements(repeaterElements, dataReaders[index - 1], ref ifCount, ref flg, index == dataReaders.Count); if (ifCount != 1) { throw new Exception("ItemIf error. Check REndIf count."); } current = this.ProcessElements(repeaterElements, dataReaders[index - 1], current, null, index, out bisectElements); currentNested = this.ProcessNestedRepeaters(tag, dataReaders[index - 1], (!bisectElements.Any()) ? new List <XElement>() { current } : bisectElements); if ((currentNested != null) && repeaterElements.Last().IsBeforeNestedRepeater) { current = currentNested; } } if (flgDeleteStartEnd) { foreach (var itemRepeaterElement in itemRepeaterElements) { itemRepeaterElement.XElement.Remove(); } startElement.Remove(); endElement.Remove(); } return(current); }
/// <summary> /// Do parsing /// </summary> public override XElement Parse(ITagProcessor parentProcessor, XElement startElement) { this.ValidateStartTag(startElement, "Table"); if (parentProcessor == null) { throw new ArgumentNullException(); } var endTableTag = this.TryGetRequiredTags(startElement, "EndTable").First(); var coreParser = new CoreTableParser(false); var tag = coreParser.Parse(startElement, endTableTag); var processor = new TableProcessor { TableTag = tag }; if (TraverseUtils.ElementsBetween(startElement, endTableTag).Any()) { this.GoDeeper(processor, TraverseUtils.ElementsBetween(startElement, endTableTag).First()); } parentProcessor.AddProcessor(processor); return(endTableTag); }
private IEnumerable <ItemRepeaterElement> GetSiblingElements( IEnumerable <ItemRepeaterElement> itemRepeaterElements, IEnumerable <ItemRepeaterTag> nestedRepeaters) { var repeaterElements = new List <ItemRepeaterElement>(); int i = 0; if (!nestedRepeaters.Any()) { repeaterElements.AddRange(itemRepeaterElements); } else { foreach (var itemRepeaterElement in itemRepeaterElements) { var flagAdd = nestedRepeaters.All(nr => { var elementsBetween = TraverseUtils.ElementsBetween(nr.StartItemRepeater, nr.EndItemRepeater.Parent != null && (nr.EndItemRepeater.Parent.Name == WordMl.ParagraphName) ? nr.EndItemRepeater.Parent : nr.EndItemRepeater); return(!elementsBetween.Any(element => element.Equals(itemRepeaterElement.XElement))); }); if (flagAdd) { if (itemRepeaterElement.HasElements && (itemRepeaterElement.Elements.Any(ire => ire.IsItemRepeater) || itemRepeaterElement.Elements.Any(ire => ire.IsEndItemRepeater)) && itemRepeaterElement.XElement.Name.Equals(WordMl.ParagraphName)) { var nestedElements = itemRepeaterElement.Elements.ToList(); var element = new XElement(itemRepeaterElement.XElement.Name); var dicBisect = new Dictionary <XElement, ItemRepeaterElement>(); if (!nestedElements.Any(ne => ne.IsEndItemRepeater)) { foreach (var nestedElement in nestedElements) { element.Add(nestedElement.XElement); if (nestedElement.IsBeforeNestedRepeater) { dicBisect.Add(nestedElement.XElement, new ItemRepeaterElement() { XElement = nestedElement.NextNestedRepeater.XElement }); break; } } } else { var end = nestedElements.First(ne => ne.IsEndItemRepeater); var next = end.XElement; while ((next = next.NextElement()) != null) { element.Add(next); } } var newItemRepeaterElement = MakeElementCallback(element); var elements = newItemRepeaterElement.Elements.ToList(); foreach (var kv in dicBisect) { foreach (var repeaterElement in elements.Where(repeaterElement => XNode.DeepEquals(repeaterElement.XElement, kv.Key))) { var val = new ItemRepeaterElement { XElement = new XElement(kv.Value.XElement) }; repeaterElement.NextNestedRepeater = val; } } newItemRepeaterElement.Elements = elements; if (element.HasElements) { repeaterElements.Add(newItemRepeaterElement); } } else { repeaterElements.Add(itemRepeaterElement); } } } } return(repeaterElements); }
private XElement RenderDataReaders(ItemRepeaterTag tag, DataReader dataReader, XElement current) { var elements = TraverseUtils.ElementsBetween(tag.StartItemRepeater, ((tag.EndItemRepeater.Parent.Name == WordMl.ParagraphName) && (!tag.EndItemRepeater.Parent.Elements().Contains(tag.StartItemRepeater)) && (tag.StartItemRepeater.Parent.Elements().Any(el => el.IsSdt() && !el.IsTag("itemrepeater"))) ) ? tag.EndItemRepeater.Parent : tag.EndItemRepeater) .Select(MakeElementCallback) .ToList(); var processedElements = new List <ItemRepeaterElement>(); if (elements.Count > 1) { processedElements.AddRange(this.CreateParagraphForInlineElements(elements)); } else { processedElements.Add(elements[0]); } processedElements = this.SetRepeaterElementsVisible(processedElements.ToList()).ToList(); var flgWrapInline = false; if (processedElements.Count == 1) { var rootContainer = processedElements.FirstOrDefault(); if ((rootContainer != null) && rootContainer.XElement.Name.Equals(WordMl.ParagraphName)) { var originalContainer = elements[0].XElement.Parent; var endItemRepeater = originalContainer.Elements().FirstOrDefault(el => el.IsTag("enditemrepeater")); if (endItemRepeater != null) { flgWrapInline = elements.All(e => e.XElement.Parent.Elements().Contains(endItemRepeater)); } } } var dataReaders = dataReader.GetReaders(tag.Source).ToList(); for (var index = 1; index <= dataReaders.Count; index++) { ICollection <XElement> bisectElements; var ifCount = 1; var flg = false; processedElements = this.MarkInvisibleElements(processedElements, dataReaders[index - 1], ref ifCount, ref flg, index == dataReaders.Count).ToList(); if (ifCount != 1) { throw new Exception("RItemIf error. Check REndIf count."); } var inlineWrapping = (index > 1) && flgWrapInline; if (inlineWrapping) { current = current.Elements().Last(); } current = this.ProcessElements( inlineWrapping ? processedElements.First().Elements.ToList() : processedElements, dataReaders[index - 1], inlineWrapping ? null : current, inlineWrapping ? current.Parent : null, index, out bisectElements, (index > 1) && flgWrapInline); } return(current); }