Code Monkey home page Code Monkey logo

Comments (4)

martinnormark avatar martinnormark commented on June 5, 2024

Just need to be 100% on the same page here. You expect the CSS block to remain, and only ignore the <!-- and --> - but PreMailer is stripping out the style block as well as the comment tokens?

from premailer.net.

richcocks avatar richcocks commented on June 5, 2024

Yes, that's what I expect based on how browsers handle a static test page implemented as just the above. I would then expect the style block to be removed once the css was moved inline.

I would expect the final result to be something like the following if class stripping was also turned on.

<html>
    <head>
    </head>
    <body>
        <div>
            <p style="font-weight:bold;">Hello World!</p>
        </div>
    </body>
</html>

I'm not sure on the current PreMailer behaviour in all modes, I first encountered this when I was running with the removeComments parameter set to true but even with that disabled I still did not get the inline styles.

from premailer.net.

richcocks avatar richcocks commented on June 5, 2024

To be clear, both the following unit tests should pass since the output should be the same in both cases. Currently the first test passes and the second fails, but the only change is a change which the HTML parser (technically the CSS parser) should ignore, since inside style isn't a comment, (/* */ is css syntax).

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace PreMailerTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            const string html = @"
            <html>
                <head>
                    <style>
                    p.custom {
                    font-weight: bold;
                    }
                    <!---->
                    </style>
                </head>
                <body>
                    <div>
                        <p class=""custom"">Hello World!</p>
                    </div>
                </body>
            </html >
            ";

            var result = PreMailer.Net.PreMailer.MoveCssInline(html, true, null, null, true, false);


            CollectionAssert.AreEqual(result.Warnings,new List<string>());
            Assert.AreEqual("<html><head>\n\t\t            \n\t            </head>\n\t            <body>\n\t\t            <div>\n\t\t\t            <p style=\"font-weight: bold\">Hello World!</p>\n\t\t            </div>\n\t            \n            \n            </body></html>",result.Html);
        }
        [TestMethod]
        public void TestMethod2()
        {
            const string html = @"
            <html>
                <head>
                    <style>
                    <!--
                    p.custom {
                    font-weight: bold;
                    }
                    -->
                    </style>
                </head>
                <body>
                    <div>
                        <p class=""custom"">Hello World!</p>
                    </div>
                </body>
            </html >
            ";

            var result = PreMailer.Net.PreMailer.MoveCssInline(html, true, null, null, true, false);


            CollectionAssert.AreEqual(result.Warnings, new List<string>());
            Assert.AreEqual("<html><head>\n\t\t            \n\t            </head>\n\t            <body>\n\t\t            <div>\n\t\t\t            <p style=\"font-weight: bold\">Hello World!</p>\n\t\t            </div>\n\t            \n            \n            </body></html>", result.Html);
        }
    }
}

from premailer.net.

richcocks avatar richcocks commented on June 5, 2024

More succinct test that I've added to my private copy of the solution:

        [TestMethod]
        public void MoveCssInLine_StripHTMLComments()
        {
            const string html = @"<html><head><style><!--p.custom {font-weight: bold;}--></style></head><body><div><p class=""custom"">Hello World!</p></div></body></html>";
            var result = PreMailer.MoveCssInline(html, true, null, null, true, false);
            Assert.AreEqual(@"<html><head></head><body><div><p style=""font-weight: bold"">Hello World!</p></div></body></html>", result.Html);
        }

I got this to pass for my own use by adding the following code to PreMailer.Net.CssParser.CleanUp but this is a hack and I look forward to seeing a better solution. (For instance it should probably process all match groups rather than assuming a single match (although this is already after having been tokenised by '}'), etc.)

All the other unit tests pass with this code in place.

private static Regex HTMLCommentRegex = new Regex(@"<!--(.*)-->");

 private string CleanUp(string s)
        {
         /* ... */
         var commentedBlock = HTMLCommentRegex.Match(temp);
            if (commentedBlock.Success)
            {
                temp = commentedBlock.Groups[1].Captures[0].Value;
            }

from premailer.net.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.