Как обрезать пробелы с помощью скорости

У меня есть метод с именем 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'))
20
задан Vadzim 25 June 2015 в 14:43
поделиться

1 ответ

Некоторое время я изо всех сил пытался найти простое решение для сгущения пустого пространства, так что вот то, что я наконец-то придумал. Он вдохновлен ответом Вадима и этой страницы 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;
    }
}

Любые отзывы о моей реализации приветствуются

2
ответ дан 30 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: