Как стать автором
Обновить

Комментарии 14

Спасибо за статью!
Не могли бы вы рассказать как писать плагины для 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
/**
Время вида Дата: 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

Но запускать надо вот так
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 — что упрощает жизнь очень сильно.

Хотя в домашних условиях написать все скрипты которые делают все описанное заняло не более половины дня.
зы. Не мало открытых инструментов доступно уже, которые сильно облегчат процесс автоматизации рутинных работ в целом.
так, может тоже статью напишите? Была бы польза миру, а так пока просто похвала. Ни про что…
Не напишу, из меня писатель хреновый.
Но исходники могу опубликовать.
было бы здорово увидеть )
Смотри личку.
А можно по подробнее про систему спрайтов гугла?
Там нет ничего необычного, просто все автоматизировано по возможности.
Используя доступные инструменты легко собрать нечто подобное.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории