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