Комментарии 14
Спасибо за статью!
Не могли бы вы рассказать как писать плагины для soy компилятора и как их спользовать? — в документации об этом написано очень мало… Например, я бы хотел в soy шаблоне делать так:
или так:
Здесь myFormatDateFunction — это некая функция форматирования даты.
Не могли бы вы рассказать как писать плагины для soy компилятора и как их спользовать? — в документации об этом написано очень мало… Например, я бы хотел в soy шаблоне делать так:
/**
* @param date Some date.
*/
{template .showDate}
<span>{$date |myFormatDateFunction}</span>
{/template}
или так:
/**
* @param date Some date.
*/
{template .showDate}
<span>{myFormatDateFunction($date)}</span>
{/template}
Здесь myFormatDateFunction — это некая функция форматирования даты.
themes/default/templates/example/ui/test1.soy пример для библеотеки moment
Создаёте DateTimeFormaterFunction.java
implements SoyJsSrcFunction
…
Ну и биндить нужно еще всё это
MyprojectPluginModule.java
/**
Время вида Дата: DD MMM YYYY
@param? cssClass
@param date
**/
{template .dateShort}
{if $date}
<span class="{css nowrap}{sp}{if $cssClass}{$cssClass|id}{/if}">
{let $dFormat}{msg desc="time"}DD MMM YYYY{/msg}{/let}
{dateTimeFormat($date,$dFormat)|id}
</span>
{else}-{/if}
{/template}
Создаёте DateTimeFormaterFunction.java
implements SoyJsSrcFunction
…
@Override
public JsExpr computeForJsSrc(List<JsExpr> args) {
JsExpr timestampArg = args.get(0);
JsExpr formatArg = args.get(1);
if (args.size() == 2) {
return new JsExpr("moment(" + timestampArg.getText()
+ ").format(" + formatArg.getText() + ")",
Integer.MAX_VALUE);
} else {
JsExpr deltaArg = args.get(2);
return new JsExpr("moment(" + timestampArg.getText() + "+("
+ deltaArg.getText() + ")\").format("
+ formatArg.getText() + ")", Integer.MAX_VALUE);
}
}
Ну и биндить нужно еще всё это
MyprojectPluginModule.java
public class MyprojectPluginModule extends AbstractModule
{
@Override public void configure() {
Multibinder<SoyFunction> soyFunctionsSetBinder =
Multibinder.newSetBinder(binder(), SoyFunction.class);
soyFunctionsSetBinder.addBinding().to(DateTimeFormaterFunction.class);
//...
soyFunctionsSetBinder.addBinding().to(FormatNumberFunction.class);
soyFunctionsSetBinder.addBinding().to(SubstringFunction.class);
soyFunctionsSetBinder.addBinding().to(ToFixedFunction.class);
soyFunctionsSetBinder.addBinding().to(ReplaceRegularExpressionFunction.class);
soyFunctionsSetBinder.addBinding().to(RandomFloatFunction.class);
soyFunctionsSetBinder.addBinding().to(RandomIntFunction.class);
}
}
А как затем использовать эти два класса при компиляции шаблонов в js? Должен ли я самостоятельно скомпилировать SoyToJsSrcCompiler.jar вместе с этими классами? Или есть возможность использовать стандартный, но с какими-то дополнительными флагами?
Стандартный.
tools/compile.templates.sh
Параметер
--pluginModules closure.plugins.MyprojectPluginModule
Но запускать надо вот так
иначе компилятор не подхватит ваш плагин.
tools/compile.templates.sh
Параметер
--pluginModules closure.plugins.MyprojectPluginModule
Но запускать надо вот так
java -cp ./cl-templates/js/SoyToJsSrcCompiler.jar:./cl-templates/plugins/cl-t-plugin.jar com.google.template.soy.SoyToJsSrcCompiler --pluginModules closure.plugins.MyprojectPluginModule <еще параметры>
иначе компилятор не подхватит ваш плагин.
получать имя класса исключительно через их апи, которое потом может быть статически проанализировано лишь их инструментом (а там ведь не простая регулярка?) — достаточно кривое решение. лучше всего гугловцам было бы воспользоваться концепцией атомов (http://habrahabr.ru/post/97670/) тогда можно достаточно легко связывать имена из разных типов файлов и сжимать их синхронно. собственно я у себя это и реализовал. правда особой пользы от этого не было так как все ресурсы грузятся лишь один раз, да её и по зипованному каналу, уменьшение объёма не такое уж и значительное. так что читабельность на мой взгляд куда важнее.
На своем опыте полный переход на GCL избавил от множества проблем. Если писать код правильно и не стараться избавится от всех ограничений в виде непонятных хаков над SOY и прочим как это описано в статье. Получается продукт весьма легко саппортабельный с минимальным временем вхождения для нового человека.
Написание SinglePage app превращается в нечто естественное и простое.
У гугла правда интеграция компонентов еще лучше чем можно себе предствить и описано в статье. К примеру у них еще есть своя система спрайтов. Скрипты автоматического поиска транзитивных зависимостей и автоматическое удаление/добавление goog.require — что упрощает жизнь очень сильно.
Хотя в домашних условиях написать все скрипты которые делают все описанное заняло не более половины дня.
Написание SinglePage app превращается в нечто естественное и простое.
У гугла правда интеграция компонентов еще лучше чем можно себе предствить и описано в статье. К примеру у них еще есть своя система спрайтов. Скрипты автоматического поиска транзитивных зависимостей и автоматическое удаление/добавление goog.require — что упрощает жизнь очень сильно.
Хотя в домашних условиях написать все скрипты которые делают все описанное заняло не более половины дня.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Closure Platform. Костыли для Google Closure Library