У меня есть метод с именем render_something, который может создавать много пробелов, например:
<a href="#">#render_something('xxx')</a>
Результат может быть:
<a href="#">
something that generate from redner_something
</a>
Что я действительно хочу это должно быть так:
<a href="#">something that generate from redner_something</a>
Есть ли у скорости что-то подобное?
#trim(#render_something('xxx'))
Некоторое время я изо всех сил пытался найти простое решение для сгущения пустого пространства, так что вот то, что я наконец-то придумал. Он вдохновлен ответом Вадима и этой страницы http://wiki.apache.org/velocity/StructuredGlobbingResourceLoader
StructuredGlobbingResourceLoader, который мы можем найти на сайте, имеет сложное поведение и не t избавиться от любого вида пробелов, поэтому я изменил его, чтобы получить простое поведение: «Удалите все пробелы в начале строк и добавьте комментарий в конце каждой строки» (что предотвращает оценку разрыва строки). Фильтр применяется к входному потоку во время загрузки.
Этот тип шаблона скорости
#if($value)
the value is $value
#end
преобразуется в
#if($value)##
the value is $value##
#end##
Тогда, если вы хотите иметь разрывы строк или начало пробелов, вы должны будете поставить ($ br, "\ n") и вставьте ($ sp, "") в ваш контекст, как объяснил Вадим, и явно используйте их в своем шаблоне. Этот способ позволит вам сохранить шаблоны с отступом, с максимальным контролем.
Возьмите класс с этой страницы. http://wiki.apache.org/velocity/StructuredGlobbingResourceLoader измените расширенный класс на тот тип загрузчика, который вам нужен (в этом используется загрузчик webapp), замените чтение () метод с кодом, который я предоставляю, использует класс в качестве загрузчика ресурсов в ваших свойствах. Пример для загрузчика webapp: webapp.resource.loader.class = ... StructuredGlobbingResourceLoader
public int read() throws IOException {
int ch;
switch(state){
case bol: //beginning of line, read until non-indentation character
while(true){
ch = in.read();
if (ch!=(int)' ' && ch!=(int)'\t'){
state = State.content;
return processChar(ch);
}
}
case content:
ch = in.read();
return processChar(ch);
//eol states replace all "\n" by "##\n"
case eol1:
state = State.eol2;
return (int)'#';
case eol2:
state = State.bol;
return (int)'\n';
case eof:
return -1;
}
return -1;
}
//Return the normal character if not end of file or \n
private int processChar(int ch){
switch(ch){
case -1:
state = State.eof;
return -1;
case (int)'\n':
state = State.eol1;
return (int)'#';
default:
return ch;
}
}
Любые отзывы о моей реализации приветствуются