public void TestMakeHtmlContentProcessedInnerTableCell()
        {
            const string HtmlContent       = @"<p>Html test</p>";
            const string HtmlEscapedString = @"
                        <html>
                        <head/>
                        <body>
                        <p>Html test</p>
                        </body>
                        </html>
                        ";
            var          tablecell         = new XElement(WordMl.TableCellName, new XElement(WordMl.ParagraphName, "//test/path"));
            var          htmlContentTag    = new XElement(
                WordMl.SdtName,
                new XElement(
                    WordMl.SdtPrName, new XElement(
                        WordMl.TagName,
                        new XAttribute(WordMl.ValAttributeName, "htmlcontent"))),
                new XElement(
                    WordMl.SdtContentName, tablecell));
            var document = new XElement(WordMl.BodyName, htmlContentTag);
            var actualProcessedElement = HtmlContentProcessor.MakeHtmlContentProcessed(htmlContentTag, HtmlEscapedString);

            Assert.AreEqual(tablecell.Name, actualProcessedElement.Name);
            Assert.IsNotNull(actualProcessedElement.Element(WordMl.SdtName));
            Assert.AreEqual(HtmlContentProcessor.ProcessedHtmlContentTagName,
                            actualProcessedElement.Element(WordMl.SdtName)
                            .Element(WordMl.SdtPrName)
                            .Element(WordMl.TagName)
                            .Attribute(WordMl.ValAttributeName)
                            .Value);
            Assert.AreEqual(HttpUtility.HtmlDecode(HtmlEscapedString), actualProcessedElement.Element(WordMl.SdtName).Element(WordMl.SdtContentName).Value);
        }
        public void TestMakeHtmlContentProcessed()
        {
            const string HtmlContent       = @"<p>Html test</p>";
            const string HtmlEscapedString = @"
                        <html>
                        <head/>
                        <body>
                        <p>Html test</p>
                        </body>
                        </html>
                        ";
            var          htmlContentTag    = new XElement(
                WordMl.SdtName,
                new XElement(
                    WordMl.SdtPrName, new XElement(
                        WordMl.TagName,
                        new XAttribute(WordMl.ValAttributeName, "htmlcontent"))),
                new XElement(
                    WordMl.SdtContentName, HtmlEscapedString));
            var body = new XElement(WordMl.BodyName, htmlContentTag);
            var actualProcessedElement = HtmlContentProcessor.MakeHtmlContentProcessed(htmlContentTag, htmlContentTag.GetExpression());

            Assert.IsNotNull(actualProcessedElement);
            Assert.AreEqual(HtmlContentProcessor.ProcessedHtmlContentTagName,
                            actualProcessedElement.Element(WordMl.SdtPrName)
                            .Element(WordMl.TagName)
                            .Attribute(WordMl.ValAttributeName)
                            .Value);
            Assert.AreEqual(HtmlEscapedString, HtmlEscapedString);
        }
Exemple #3
0
        public virtual void ReplaceAltChunks()
        {
            var document   = PartXml.Document;
            var htmlChunks = HtmlContentProcessor.GenerateAltChunks(document.Root);

            using (var package = Package.Open(this.docxStream, FileMode.Open, FileAccess.ReadWrite))
            {
                for (var i = 1; i <= htmlChunks.Count; i++)
                {
                    DocxPartResolver.CreateAfChunkPart(package, i, htmlChunks[i - 1]);
                }
            }
        }
        public override XElement Parse(ITagProcessor parentProcessor, XElement startElement)
        {
            this.ValidateStartTag(startElement, "HtmlContent");
            var tag = new HtmlContentTag()
            {
                Expression = startElement.Value, TagNode = startElement
            };
            var processor = new HtmlContentProcessor()
            {
                HtmlTag = tag
            };

            parentProcessor.AddProcessor(processor);
            return(startElement);
        }
        public void TestGenerateAltChunksDeletingParagraph()
        {
            const string ExpectedHtmlString   = "<html>altchunks test</html>";
            var          htmlProcessedElement = new XElement(WordMl.SdtName,
                                                             new XElement(WordMl.SdtPrName,
                                                                          new XElement(WordMl.TagName,
                                                                                       new XAttribute(WordMl.ValAttributeName,
                                                                                                      HtmlContentProcessor
                                                                                                      .ProcessedHtmlContentTagName))),
                                                             new XElement(WordMl.SdtContentName, ExpectedHtmlString));
            var paragraph             = new XElement(WordMl.ParagraphName, htmlProcessedElement);
            var root                  = new XElement(WordMl.BodyName, paragraph);
            var actualGeneratedChunks = HtmlContentProcessor.GenerateAltChunks(root);

            Assert.IsNotNull(actualGeneratedChunks);
            Assert.AreEqual(ExpectedHtmlString, actualGeneratedChunks[0]);
            Assert.AreEqual(1, actualGeneratedChunks.Count);
            Assert.IsFalse(root.Descendants().Any(el => el.IsSdt()));
            Assert.IsFalse(root.Descendants().Any(el => el.Name.Equals(WordMl.ParagraphName)));
        }
        public void TestProcess()
        {
            const string HtmlEscapedString = @"
                        &lt;html&gt;
                        &lt;head/&gt;
                        &lt;body&gt;
                        &lt;p&gt;Html test&lt;/p&gt;
                        &lt;/body&gt;
                        &lt;/html&gt;
                        ";
            const string path           = "//test/htmlcontent";
            var          data           = new XElement("test", new XElement("htmlcontent", HtmlEscapedString));
            var          htmlContentTag = new XElement(
                WordMl.SdtName,
                new XElement(
                    WordMl.SdtPrName, new XElement(
                        WordMl.TagName,
                        new XAttribute(WordMl.ValAttributeName, "htmlcontent"))),
                new XElement(
                    WordMl.SdtContentName, path));
            var document  = new XElement("body", htmlContentTag);
            var processor = new HtmlContentProcessor()
            {
                DataReader = new DataReader(data),
                HtmlTag    = new HtmlContentTag()
                {
                    Expression = path,
                    TagNode    = htmlContentTag
                }
            };

            processor.Process();
            Assert.AreEqual(HtmlContentProcessor.ProcessedHtmlContentTagName,
                            htmlContentTag.Element(WordMl.SdtPrName)
                            .Element(WordMl.TagName)
                            .Attribute(WordMl.ValAttributeName)
                            .Value);
            Assert.AreNotEqual(path, htmlContentTag.Element(WordMl.SdtContentName).Value);
        }
        public void TestGenerateAltChunksAddingEmptyParagraphInTableCell()
        {
            const string ExpectedHtmlString = "<html>altchunks table cell test</html>";
            const string rsidR = "00FFFFFF";
            var          htmlProcessedElement = new XElement(WordMl.SdtName,
                                                             new XElement(WordMl.SdtPrName,
                                                                          new XElement(WordMl.TagName,
                                                                                       new XAttribute(WordMl.ValAttributeName,
                                                                                                      HtmlContentProcessor
                                                                                                      .ProcessedHtmlContentTagName))),
                                                             new XElement(WordMl.SdtContentName, ExpectedHtmlString));
            var tableCell             = new XElement(WordMl.TableCellName, htmlProcessedElement);
            var tableRow              = new XElement(WordMl.TableRowName, new XAttribute(WordMl.RsidRPropertiesName, rsidR), tableCell);
            var root                  = new XElement(WordMl.BodyName, new XElement(WordMl.TableName, tableRow));
            var actualGeneratedChunks = HtmlContentProcessor.GenerateAltChunks(root);
            var actualAltChunkElement =
                root.Element(WordMl.TableName)
                .Element(WordMl.TableRowName)
                .Element(WordMl.TableCellName)
                .Elements()
                .SingleOrDefault(el => el.Name.Equals(WordMl.AltChunkName));

            Assert.IsNotNull(actualAltChunkElement);
            Assert.IsNotNull(actualGeneratedChunks);
            Assert.AreEqual(ExpectedHtmlString, actualGeneratedChunks[0]);
            Assert.AreEqual(1, actualGeneratedChunks.Count);
            Assert.IsFalse(root.Descendants().Any(el => el.IsSdt()));
            var actualLastElement =
                root.Element(WordMl.TableName)
                .Element(WordMl.TableRowName)
                .Element(WordMl.TableCellName)
                .Elements()
                .Last();

            Assert.IsNotNull(actualLastElement);
            Assert.AreEqual(WordMl.ParagraphName, actualLastElement.Name);
        }
Exemple #8
0
        private XElement ProcessElements(IEnumerable <ItemRepeaterElement> itemRepeaterElements, DataReader dataReader, XElement start, XElement parent, int index, out ICollection <XElement> elementsBeforeNestedRepeaters, bool nested = false)
        {
            XElement result   = null;
            XElement previous = start;
            ICollection <XElement> tempElementsBeforeItemRepeaters = new List <XElement>();

            foreach (var itemRepeaterElement in itemRepeaterElements)
            {
                if (!itemRepeaterElement.IsVisible || itemRepeaterElement.IsItemIf || itemRepeaterElement.IsEndItemIf)
                {
                    continue;
                }
                if (itemRepeaterElement.IsItemHtmlContent)
                {
                    result = HtmlContentProcessor.MakeHtmlContentProcessed(itemRepeaterElement.XElement, dataReader.ReadText(itemRepeaterElement.Expression), true);
                }
                else if (itemRepeaterElement.IsIndex)
                {
                    result = DocxHelper.CreateTextElement(itemRepeaterElement.XElement,
                                                          itemRepeaterElement.XElement.Parent,
                                                          index.ToString(CultureInfo.CurrentCulture),
                                                          !nested
                                                          );
                }
                else if (itemRepeaterElement.IsItem && itemRepeaterElement.HasExpression)
                {
                    result = DocxHelper.CreateTextElement(itemRepeaterElement.XElement,
                                                          itemRepeaterElement.XElement.Parent,
                                                          dataReader.ReadText(itemRepeaterElement.Expression),
                                                          !nested
                                                          );
                }
                else
                {
                    var element = new XElement(itemRepeaterElement.XElement);
                    element.RemoveNodes();
                    result = element;
                    if (itemRepeaterElement.HasElements)
                    {
                        ICollection <XElement> bisectNestedElements = new List <XElement>();
                        this.ProcessElements(itemRepeaterElement.Elements, dataReader, null, result, index, out bisectNestedElements, true);
                        if (bisectNestedElements.Count != 0)
                        {
                            tempElementsBeforeItemRepeaters.Add(bisectNestedElements.ElementAt(0));
                        }
                    }
                    else
                    {
                        element.Value = itemRepeaterElement.XElement.Value;
                    }
                }

                if (previous != null)
                {
                    previous.AddAfterSelf(result);
                    previous = result;
                }
                else
                {
                    parent.Add(result);
                }
                if (itemRepeaterElement.IsBeforeNestedRepeater)
                {
                    tempElementsBeforeItemRepeaters.Add(result);
                }
            }
            elementsBeforeNestedRepeaters = tempElementsBeforeItemRepeaters;
            return(result);
        }
Exemple #9
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);
        }