Компилировать CSS в HTML как встроенный стиль в Grails?

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

Вот обсуждение этой темы: Скомпилировать CSS в HTML как встроенные стили

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

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

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

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

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


person confile    schedule 15.10.2013    source источник


Ответы (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.
}
}
person emilan    schedule 18.10.2013
comment
@emilan, пожалуйста, дайте подробную информацию, как это используется? - person ; 24.10.2013
comment
Меня просто интересует ваш вопрос, кажется, вы недостаточно хорошо знакомы с Java/Groovy. Интеграция зависит от вашего приложения, вы можете использовать этот фрагмент где угодно в своем собственном приложении, получая html-код из соответствующего файла gsp и передавая его функции анализа в качестве параметра. Также в коде есть комментарии, и я описал, что основной частью этого фрагмента является библиотека jsoup. Кажется, вы хотите, чтобы я написал код, специфичный для вашего приложения. :) Я думаю, что этот код с описанием достаточно хорош для интеграции с младшим разработчиком. - person emilan; 24.10.2013

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

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

http://premailer.dialect.ca/

person Jamey    schedule 17.10.2013
comment
Как включить это в Grails? - person confile; 18.10.2013
comment
Оба являются внешними веб-службами, которые вы можете вызывать из Grails: grails.org/Calling+External+WebServices Мы делаем это в .NET, но подход тот же. Мы вызываем страницу .aspx с шаблоном электронной почты на адрес обратной связи localhost, чтобы получить его html — вы бы назвали свою страницу .gsp. Затем мы отправляем этот HTML-код веб-службе встроенного CSS. - person Jamey; 18.10.2013
comment
Здесь это делается в Grails: github.com/happyinc/grails-mailchimp/blob/master/grails-app/ - person Jamey; 18.10.2013
comment
как я должен использовать ваш сервис? - person confile; 18.10.2013
comment
Мне не нужен ключ API? - person confile; 20.10.2013
comment
Mailchimp требует ключ API. Регистрация бесплатна. - person Jamey; 21.10.2013
comment
как я должен использовать ваш сервис? Не могли бы вы опубликовать код? - person confile; 22.10.2013
comment
Оболочка Grails для нужного вам метода API находится в строке 461 по адресу github.com/happyinc/grails-mailchimp/blob/master/grails-app/ - person Jamey; 22.10.2013
comment
Не могли бы вы опубликовать пример того, как я должен использовать этот код? Куда мне вводить ключ? Как я могу встроить определенный файл, скажем, /basePath/grails/views/mail/testmail.gsp? - person confile; 23.10.2013
comment
API-интерфейсы встроены в css в html, а не в Groovy Server Pages. Итак, сначала вам нужно получить html, который генерирует ваш .gsp. Что-то вроде: def myHtml = new URL('http://localhost/testmail.gsp').getText(). Затем передайте переменную myHtml выбранному вами встраивателю css. Если вы используете плагин, о котором я упоминал выше, вы помещаете ключ API в config.Groovy. На том же сайте есть инструкции по адресу github.com/happyinc/grails- mailchimp/blob/master/README.md - person Jamey; 23.10.2013
comment
@Jamey Не могли бы вы привести пример кодирования, как это применяется? - person ; 24.10.2013