private static void ParseStructuredElement(RepeaterElement repeaterElement, string startTag, string endTag) { repeaterElement.EndTag = FindEndTag(repeaterElement.StartTag, startTag, endTag); repeaterElement.TagElements = TraverseUtils.SecondElementsBetween(repeaterElement.StartTag, repeaterElement.EndTag) .Select(MakeElementCallback); }
private bool CheckNestedElementForContinue(ItemRepeaterElement firstItemRepeaterElement, ItemRepeaterElement currentItemRepeaterElement, XElement nestedRepeaterEndElement) { if (nestedRepeaterEndElement != null) { return (TraverseUtils.SecondElementsBetween(firstItemRepeaterElement.XElement, nestedRepeaterEndElement) .Contains(currentItemRepeaterElement.XElement)); } return(false); }
public TableTag Parse(XElement startElement, XElement endTableTag) { var itemsSource = startElement.Value; if (string.IsNullOrEmpty(itemsSource)) { throw new Exception(string.Format(MessageStrings.TagNotFoundOrEmpty, "Items")); } var tag = new TableTag { TagTable = startElement, TagEndTable = endTableTag, ItemsSource = itemsSource, }; tag.MakeTableElementCallback = MakeTableElementCallback; int?dynamicRow = null; var rowCount = 1; //var between = TraverseUtils.SecondElementsBetween(startElement, endTableTag); var tableElement = startElement.NextSdt(WordMl.TableName).FirstOrDefault(element => element.IsBefore(endTableTag)); var rows = TraverseUtils.SecondElementsBetween(startElement, endTableTag).Descendants(WordMl.TableRowName).Where(tr => tr.Parent.Equals(tableElement)); //var tableElement = startElement.NextSdt(WordMl.TableName).FirstOrDefault(element => element.IsBefore(endTableTag)); // TODO Extend sdt names in loop foreach (var tableRow in rows) { if ( tableRow.Descendants() .Any( el => el.IsTag(ItemIndexTagName) || el.IsTag(ItemTextTagName) || el.IsTag(ItemIfTagName) || el.IsTag(ItemHtmlContentTagName) || el.IsTag(ItemRepeaterTagName))) { if (dynamicRow != null) { throw new Exception("Invalid template! Found several dynamic rows. (Or none dynamic rows)"); } dynamicRow = rowCount; } rowCount++; } if (tableElement != null) { tag.Table = tableElement; } tag.DynamicRow = dynamicRow; return(tag); }
public XElement Generate(ItemRepeaterTag tag, IEnumerable <DataReader> dataReaders, XElement previous = null, XElement parent = null, bool forcedElementSave = false) { var startElement = tag.StartItemRepeater; var endElement = tag.EndItemRepeater; var inlineWrapping = CheckInlineWrappingMode(startElement, endElement); var itemRepeaterElements = TraverseUtils.SecondElementsBetween(startElement, endElement).Select(MakeElementCallback).ToList(); var flgCleanUpElements = previous == null; XElement current; if (inlineWrapping && flgCleanUpElements) { current = startElement; } else { if (previous == null) { current = startElement.Parent.Name.Equals(WordMl.ParagraphName) ? startElement.Parent : startElement; } else { current = previous; } } for (var index = 1; index <= dataReaders.Count(); index++) { XElement nestedRepeaterEndElementTmp = null; XElement endIfElementTmp = null; current = this.ProcessElements( itemRepeaterElements, dataReaders.ElementAt(index - 1), current, (inlineWrapping && (parent != null)) ? parent : null, index, ref nestedRepeaterEndElementTmp, ref endIfElementTmp, inlineWrapping && (parent != null) ); } if (flgCleanUpElements && !forcedElementSave) { foreach (var itemRepeaterElement in itemRepeaterElements) { itemRepeaterElement.XElement.Remove(); } startElement.Remove(); endElement.Remove(); } return(current); }
public static XElement ProcessItemTableElement(XElement startTableElement, XElement endTableElement, DataReader dataReader) { var tableElement = TraverseUtils.SecondElementsBetween(startTableElement, endTableElement) .SingleOrDefault(re => re.Name.Equals(WordMl.TableName)); var tableContainer = new XElement("TempContainerElement"); tableContainer.Add(startTableElement); tableContainer.Add(tableElement); tableContainer.Add(endTableElement); var itemTableGenerator = new ItemTableGenerator(); itemTableGenerator.Generate(tableContainer.Elements().First(), tableContainer.Elements().Last(), dataReader); return(new XElement(tableContainer.Elements().SingleOrDefault())); }