public override void Process()
        {
            base.Process();
            ProcessDynamicContent();

            if (TableTag == null)
            {
                throw new NullReferenceException();
            }

            var tableRows  = TableTag.Table.Elements(WordMl.TableRowName);
            var dynamicRow = TableTag.DynamicRow.HasValue ? tableRows.ElementAt(TableTag.DynamicRow.Value - 1) : tableRows.Last();

            ReplaceValues(dynamicRow);

            if (this.CreateDynamicContentTags)
            {
                var innerElements = TraverseUtils.ElementsBetween(this.TableTag.TagTable, this.TableTag.TagEndTable).ToList();
                innerElements.Remove();
                this.TableTag.TagTable.AddBeforeSelf(DocxHelper.CreateDynamicContentElement(innerElements, this.TableTag.TagTable, this.DynamicContentLockingType));
                this.CleanUp(this.TableTag.TagTable, this.TableTag.TagEndTable);
            }
            else
            {
                RemoveTags();
            }
        }
        public override void Process()
        {
            base.Process();
            var      element = TextTag.TagNode;
            var      text    = DataReader.ReadText(TextTag.Expression);
            XElement parent  = element.Parent;

            if (parent.Name == WordMl.TableRowName)
            {
                parent = element.Element(WordMl.SdtContentName).Element(WordMl.TableCellName);
            }
            var textElement = DocxHelper.CreateTextElement(element, parent, text);
            var result      = this.CreateDynamicContentTags
                             ? DocxHelper.CreateDynamicContentElement(new[] { textElement }, this.TextTag.TagNode, this.DynamicContentLockingType)
                             : textElement;

            if (element.Parent.Name != WordMl.TableRowName)
            {
                element.AddBeforeSelf(result);
            }
            else
            {
                var cell = new XElement(WordMl.TableCellName, result);
                cell.AddFirst(element.Descendants(WordMl.TableCellPropertiesName));
                element.AddBeforeSelf(cell);
            }
            element.Remove();
        }
示例#3
0
        public override void Process()
        {
            base.Process();
            this.ProcessDynamicContent();

            bool truthful;

            try
            {
                truthful = bool.Parse(this.DataReader.ReadText(this.Tag.Conidition));
            }
            catch (System.FormatException)
            {
                truthful = false;
            }
            catch (System.Xml.XPath.XPathException)
            {
                truthful = false;
            }
            if (!truthful)
            {
                if (this.CreateDynamicContentTags)
                {
                    this.Tag.StartIf.AddBeforeSelf(DocxHelper.CreateDynamicContentElement(Enumerable.Empty <XElement>(), this.Tag.StartIf, this.DynamicContentLockingType));
                }
                this.CleanUp(this.Tag.StartIf, this.Tag.EndIf);
            }
            else
            {
                if (this.CreateDynamicContentTags)
                {
                    var innerElements = TraverseUtils.ElementsBetween(this.Tag.StartIf, this.Tag.EndIf).ToList();
                    innerElements.Remove();
                    this.Tag.StartIf.AddBeforeSelf(DocxHelper.CreateDynamicContentElement(innerElements, this.Tag.StartIf, this.DynamicContentLockingType));
                    this.CleanUp(this.Tag.StartIf, this.Tag.EndIf);
                }
                else
                {
                    this.Tag.StartIf.Remove();
                    this.Tag.EndIf.Remove();
                }
            }
        }
        public override void Process()
        {
            base.Process();

            this.ProcessDynamicContent();

            var current          = RepeaterTag.StartRepeater;
            var dataReaders      = DataReader.GetReaders(RepeaterTag.Source).ToList();
            var repeaterElements =
                TraverseUtils.SecondElementsBetween(RepeaterTag.StartRepeater, RepeaterTag.EndRepeater)
                .Select(RepeaterTag.MakeElementCallback).ToList();

            for (var index = 0; index < dataReaders.Count; index++)
            {
                XElement endIfElementTmp       = null;
                XElement endRepeaterElementTmp = null;
                XElement endItemTableElement   = null;
                current = this.ProcessElements(repeaterElements, dataReaders[index], current, null, index + 1,
                                               ref endIfElementTmp, ref endRepeaterElementTmp, ref endItemTableElement);
            }
            foreach (var repeaterElement in repeaterElements)
            {
                repeaterElement.XElement.Remove();
            }

            if (this.CreateDynamicContentTags)
            {
                var innerElements =
                    TraverseUtils.ElementsBetween(this.RepeaterTag.StartRepeater, this.RepeaterTag.EndRepeater).ToList();
                innerElements.Remove();
                this.RepeaterTag.StartRepeater.AddBeforeSelf(
                    DocxHelper.CreateDynamicContentElement(
                        innerElements, this.RepeaterTag.StartRepeater, this.DynamicContentLockingType));
                this.CleanUp(this.RepeaterTag.StartRepeater, this.RepeaterTag.EndRepeater);
            }
            else
            {
                this.RepeaterTag.StartRepeater.Remove();

                this.RepeaterTag.EndRepeater.Remove();
            }
        }
        private XElement ProcessCell(TableElement tableElement, XElement previous, string text)
        {
            var isInnerCell = tableElement.HasCell();
            var currentCell = this.CurrentCell(tableElement);

            previous = this.ProcessStaticCells(tableElement, previous);

            var parent = isInnerCell ? currentCell: tableElement.StartTag.Parent;
            var result = DocxHelper.CreateTextElement(
                tableElement.StartTag,
                parent,
                text);

            if (!isInnerCell)
            {
                tableElement.StartTag.AddAfterSelf(result);
            }
            else
            {
                if (currentCell.Elements(WordMl.ParagraphName).Any())
                {
                    currentCell.Elements(WordMl.ParagraphName).Remove();
                }
                currentCell.Add(result);
            }

            if (previous != null && !previous.Equals(currentCell))
            {
                currentCell.Remove();
                previous.AddAfterSelf(currentCell);
            }
            else if (previous == null)
            {
                var parentRow = isInnerCell ? tableElement.StartTag.Parent : currentCell.Parent;
                currentCell.Remove();
                parentRow.Add(currentCell);
            }

            return(currentCell);
        }
        public static IList <string> GenerateAltChunks(XElement root)
        {
            var htmlTags = root.Descendants()
                           .Where(el => el.IsTag(ProcessedHtmlContentTagName))
                           .ToList();
            var htmlChunks = new List <string>();

            foreach (var htmlTag in htmlTags)
            {
                var htmlString     = htmlTag.GetExpression();
                var htmlChunkIndex = htmlChunks.FindIndex(html => html.Equals(htmlString));
                if (htmlChunkIndex == -1)
                {
                    htmlChunks.Add(htmlString);
                    htmlChunkIndex = htmlChunks.Count - 1;
                }
                var parent          = htmlTag.Parent;
                var altChunkElement = DocxHelper.CreateAltChunkElement(htmlChunkIndex + 1);
                if (!parent.Name.Equals(WordMl.ParagraphName))
                {
                    htmlTag.AddAfterSelf(altChunkElement);
                }
                else
                {
                    parent.AddAfterSelf(altChunkElement);
                    if (parent.Elements().Count(el => !el.Name.Equals(WordMl.ParagraphPropertiesName)) == 1)
                    {
                        parent.Remove();
                    }
                }
                if (altChunkElement.Parent.Name.Equals(WordMl.TableCellName) && (altChunkElement.NextElement() == null))
                {
                    DocxHelper.AddEmptyParagraphInTableCell(altChunkElement);
                }
                htmlTag.Remove();
            }
            return(htmlChunks);
        }
        private XElement ProcessElements(IEnumerable <RepeaterElement> elements, DataReader dataReader, XElement start, XElement parent, int index, ref XElement endIfElement, ref XElement nestedRepeaterEndElement, ref XElement currentEndItemTable, bool nested = false)
        {
            XElement result   = null;
            XElement previous = start;

            //if ((parent != null) && (!parent.Name.Equals(WordMl.TableCellName)))
            //{
            elements = elements.Where(el => !this.IsItemRepeaterElement(el.XElement)).ToList();
            //}
            foreach (var repeaterElement in elements) //elements.Where(el => !this.IsItemRepeaterElement(el.XElement)).ToList())
            {
                if (nestedRepeaterEndElement != null)
                {
                    if (repeaterElement.XElement.Equals(nestedRepeaterEndElement))
                    {
                        nestedRepeaterEndElement = null;
                    }
                    continue;
                }
                if (currentEndItemTable != null)
                {
                    if (repeaterElement.XElement.Equals(currentEndItemTable))
                    {
                        currentEndItemTable = null;
                    }
                    continue;
                }
                if (repeaterElement.IsEndItemIf /*&& repeaterElement.XElement.Equals(endIfElement)*/)
                {
                    //endIfElement = null;
                    if (repeaterElement.XElement.Equals(endIfElement))
                    {
                        endIfElement = null;
                    }
                    continue;
                }
                if ((endIfElement != null) && !repeaterElement.XElement.Name.Equals(WordMl.ParagraphName))
                {
                    continue;
                }
                if (repeaterElement.IsItemIf)
                {
                    this.ProcessItemIfElement(repeaterElement, dataReader, ref endIfElement);
                    continue;
                }

                if (repeaterElement.IsItemTable)
                {
                    /*currentEndItemTable = RepeaterParser.FindEndTag(repeaterElement.XElement, "itemtable",
                     *                                              "enditemtable");*/
                    currentEndItemTable = repeaterElement.EndTag;
                }

                /*
                 * if (repeaterElement.IsEndItemTable /*|| (repeaterElement.XElement.Name.Equals(WordMl.TableName) && repeaterElement.XElement.Descendants().Any(el => el.IsSdt())))
                 * {
                 *  continue;
                 * }*/
                if (repeaterElement.IsItemHtmlContent)
                {
                    result = HtmlContentProcessor.MakeHtmlContentProcessed(repeaterElement.XElement, dataReader.ReadText(repeaterElement.Expression), true);
                }
                else if (repeaterElement.IsItemTable)
                {
                    result = ItemTableGenerator.ProcessItemTableElement(repeaterElement.StartTag, repeaterElement.EndTag,
                                                                        dataReader);
                    if (nested)
                    {
                        previous.AddAfterSelf(result);
                        previous = result;
                        result   = null;
                    }
                }
                else if (repeaterElement.IsItemRepeater)
                {
                    var itemRepeaterTag = new ItemRepeaterTag()
                    {
                        StartItemRepeater = repeaterElement.StartTag,
                        EndItemRepeater   = repeaterElement.EndTag,
                        Source            = repeaterElement.Expression
                    };
                    var itemRepeaterGenerator = new ItemRepeaterGenerator();
                    previous = itemRepeaterGenerator.Generate(itemRepeaterTag,
                                                              dataReader.GetReaders(repeaterElement.Expression),
                                                              previous, parent, true);
                    result = null;
                    nestedRepeaterEndElement = repeaterElement.EndTag;
                }
                else if (repeaterElement.IsIndex)
                {
                    result = DocxHelper.CreateTextElement(repeaterElement.XElement, repeaterElement.XElement.Parent, index.ToString(CultureInfo.CurrentCulture));
                }
                else if (repeaterElement.IsItem && repeaterElement.HasExpression)
                {
                    result = DocxHelper.CreateTextElement(repeaterElement.XElement, repeaterElement.XElement.Parent, dataReader.ReadText(repeaterElement.Expression), dataReader.ReadAttribute(repeaterElement.Expression, "style"));
                }
                else
                {
                    var element = new XElement(repeaterElement.XElement);
                    element.RemoveNodes();
                    result = element;
                    if (repeaterElement.HasElements)
                    {
                        var parsedLastElement = this.ProcessElements(repeaterElement.Elements, dataReader, previous, result, index, ref endIfElement, ref nestedRepeaterEndElement, ref currentEndItemTable, true);
                        if (repeaterElement.Elements.Any(re => re.IsItemTable) || repeaterElement.Elements.Any(re => re.IsItemRepeater && !ItemRepeaterGenerator.CheckInlineWrappingMode(re.StartTag, re.EndTag)))
                        {
                            previous = parsedLastElement;
                            result   = null;
                        }
                    }
                    else
                    {
                        element.Value = repeaterElement.XElement.Value;
                    }
                }
                if (result != null)
                {
                    if (!nested)
                    {
                        previous.AddAfterSelf(result);
                        previous = result;
                    }
                    else
                    {
                        parent.Add(result);
                    }
                }
            }
            return(result ?? previous);
        }