2013-10-15 4 views
7

Я хочу сгенерировать шаблоны GSP для html-писем. Для поддержки большего количества почтовых клиентов рекомендуется использовать встроенные CSS-элементы в стиле html.Скомпилировать CSS в HTML как встроенный стиль в Grails?

Вот обсуждение по этой теме: "Compile" CSS into HTML as inline styles

Есть ли плагин альбомов, где я могу указать определенные GSP файлов, для которых CSS должна быть скомпилирована в качестве встраиваемого?

Если плагин отсутствует, как я могу указать файлы GSP, для которых css должен выполняться в строке?

Вот пример. У меня есть следующие шаблоны GSP для моих html-писем, которые я отправляю с Grails mail plugin.

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

Каждый файл GSP содержит файл style.css. Это должно быть скомпилировано.

ответ

-2

Вы можете приспособить следующий Java-код в приложении Grails.

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. 
} 
} 
+1

Можете ли вы объяснить свой код и что он делает? – confile

+0

Взгляните на jsoup lib (http://jsoup.org) и попробуйте отладить для получения более подробной информации;) – emilan

+2

@emilan, пожалуйста, сообщите подробности о том, как он используется? –

1

Мы делаем это с помощью бесплатного метода в API Mailchimp. Вы также можете использовать Premailer.

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

http://premailer.dialect.ca/

+0

Как я могу включить это в Grails? – confile

+0

Оба являются внешними веб-службами, которые вы можете вызвать из grails: http://grails.org/Calling+External+WebServices Мы делаем это в .NET, но подход тот же. Мы вызываем страницу .aspx с шаблоном электронной почты в адресе loopback localhost, чтобы получить его html - вы бы назвали вашу страницу .gsp. Затем мы отправляем этот html в веб-службу css inliner. – Jamey

+0

Можете ли вы предоставить какой-то код, как он используется? – confile

Смежные вопросы