在 Grails 中将 CSS 作为内联样式编译成 HTML?

Posted

技术标签:

【中文标题】在 Grails 中将 CSS 作为内联样式编译成 HTML?【英文标题】:Compile CSS into HTML as Inline Style in Grails? 【发布时间】:2013-10-23 07:22:40 【问题描述】:

我想为 html 电子邮件生成 GSP 模板。为了支持更多的邮件客户端,建议在 html 样式元素中使用内联 css。

这是关于该主题的讨论:"Compile" CSS into HTML as inline styles

是否有一个 Grails 插件,我可以在其中指定某些 GSP 文件,这些文件的 CSS 应该被编译为内联?

如果没有插件,我如何指定 GSP 文件应该内联编译 css?

这是一个例子。我使用Grails mail plugin 发送的 html 邮件有以下 GSP 模板。

/mail/signup_mail.gsp
/mail/welcome.gsp
/mail/newsletter.gsp

每个 GSP 文件都包含一个 style.css 文件。这应该是内联编译的。

【问题讨论】:

【参考方案1】:

我们使用 Mailchimp API 上的免费方法来做到这一点。您也可以使用 Premailer。

http://apidocs.mailchimp.com/api/1.2/inlinecss.func.php

http://premailer.dialect.ca/

【讨论】:

如何在 Grails 中包含它? 两者都是可以从 grails 调用的外部 Web 服务:grails.org/Calling+External+WebServices 我们在 .NET 中执行此操作,但方法相同。我们使用 localhost 环回地址上的电子邮件模板调用 .aspx 页面,以获取它的 html —— 你可以调用你的 .gsp 页面。然后我们将该 html 提交给 css 内联网络服务。 这里是在 grails 中完成的:github.com/happyinc/grails-mailchimp/blob/master/grails-app/… 我必须如何使用你们的服务? @Jamey 你能举一个编码例子吗?【参考方案2】:

您可以在您的 grails 应用程序中加入以下 Java 代码。

    import java.io.IOException;
    import java.util.StringTokenizer;

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;

    public class AutomaticCssInliner 

    public static void main(String[] args) throws IOException 
        final String style = "style";
        final String html = "<html>" + "<body> <style>"
                + "bodybackground:#FFC \n pbackground:red"
                + "body, pfont-weight:bold </style>"
                + "<p>...</p> </body> </html>";
        // Document doc = Jsoup.connect("http://mypage.com/inlineme.php").get();
        Document doc = Jsoup.parse(html);
        Elements els = doc.select(style);// to get all the style elements
        for (Element e : els) 
            String styleRules = e.getAllElements().get(0).data().replaceAll(
                    "\n", "").trim(), delims = "";
            StringTokenizer st = new StringTokenizer(styleRules, delims);
            while (st.countTokens() > 1) 
                String selector = st.nextToken(), properties = st.nextToken();
                Elements selectedElements = doc.select(selector);
                for (Element selElem : selectedElements) 
                    String oldProperties = selElem.attr(style);
                    selElem.attr(style,
                            oldProperties.length() > 0 ? concatenateProperties(
                                    oldProperties, properties) : properties);
                
            
            e.remove();
        
        System.out.println(doc);// now we have the result html without the
        // styles tags, and the inline css in each
        // element
    

private static String concatenateProperties(String oldProp, String newProp) 
    oldProp = oldProp.trim();
    if (!newProp.endsWith(";"))
       newProp += ";";
    return newProp + oldProp; // The existing (old) properties should take precedence.


【讨论】:

@emilan 请详细说明它是如何使用的? 我只是想知道您的问题,看来您对 Java/Groovy 不够熟悉。集成取决于您的应用程序,您可以在自己的应用程序中的任何位置使用此 sn-p,从相应的 gsp 文件中获取 html 代码并将其作为参数传递给解析函数。代码中还有 cmets,我描述了这个 sn-p 的核心部分是 jsoup lib。似乎您希望我编写特定于您的应用程序的代码。 :) 我认为这个带有描述的代码足以让初级开发人员进行集成。

以上是关于在 Grails 中将 CSS 作为内联样式编译成 HTML?的主要内容,如果未能解决你的问题,请参考以下文章

在 React 组件中使用 css/scss 变量作为内联样式

为啥 Jquery 在我的 html 中添加内联样式?

在 ASP.NET 中将 HTML 转换为 PDF 时保持 CSS 样式[关闭]

SVG:为啥外部 css 会覆盖文本的内联样式?

如何在 reactjs 中使用伪元素作为内联样式? [复制]

解决vue ssr css内联样式和link标签重复问题