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