2013-10-15 40 views
7

Chcę generować szablony GSP dla wiadomości e-mail w formacie HTML. Aby obsłużyć więcej klientów pocztowych, zaleca się używanie wbudowanych css w elementach w stylu HTML.Skompiluj CSS do HTML w stylu Inline w Grails?

Oto dyskusja na ten temat: "Compile" CSS into HTML as inline styles

Czy istnieje plugin Grails gdzie mogę podać pewne pliki GSP dla których CSS powinny być skompilowane jako inline?

Jeśli nie ma wtyczki, w jaki sposób mogę określić pliki GSP, dla których css powinien być zgodny z liniami wewnętrznymi?

Oto przykład. Mam następujące szablony GSP dla moich wiadomości HTML, które wysyłam wraz z Grails mail plugin.

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

Każdy plik GSP zawiera plik style.css. To powinno być skompilowane inline.

Odpowiedz

-2

można zmieścić następujący kod Java w aplikacji 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

Czy możesz wyjaśnić swój kod i co on robi? – confile

+0

Spójrz na jsoup lib (http://jsoup.org) i spróbuj debugować, aby uzyskać więcej szczegółów;) – emilan

+2

@ emilan proszę podać szczegóły mote, w jaki sposób jest używany? –

1

Robimy to za pomocą bezpłatnej metody na Mailchimp API. Możesz także użyć Premailera.

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

http://premailer.dialect.ca/

+0

Jak mogę uwzględnić to w Grails? – confile

+0

Obie są zewnętrznymi usługami sieciowymi, które można wywołać z grails: http://grails.org/Calling+Eternational+WebServices Robimy to w .NET, ale podejście jest takie samo. Stronę .aspx wywołujemy za pomocą szablonu wiadomości e-mail na adres sprzężenia zwrotnego localhost, aby uzyskać kod HTML - można by się było połączyć z tą stroną .gsp. Następnie przesyłamy ten html do usługi sieciowej inline CSI. – Jamey

+0

Czy możesz podać kod, w jaki sposób jest używany? – confile