7

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

这是关于该主题的讨论:将CSS 作为内联样式“编译”成 HTML

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

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

这是一个例子。对于我使用Grails 邮件插件发送的 html 邮件,我有以下 GSP 模板。

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

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

4

2 回答 2

1

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

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

http://premailer.dialect.ca/

于 2013-10-17T20:05:42.580 回答
-3

您可以在您的 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>"
                + "body{background:#FFC} \n p{background:red}"
                + "body, p{font-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.
}
}
于 2013-10-18T05:45:58.667 回答