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());
 }
        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()));
        }
예제 #3
0
        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);
        }