Как я могу обрезать пустые места Velocity - PullRequest
17 голосов
/ 21 декабря 2011

У меня есть метод 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'))

Ответы [ 7 ]

12 голосов
/ 23 декабря 2011

Я только что прочитал эту статью о Скоростном гоблинге пробелов , который предлагает несколько обходных путей, включая Скоростные пробелы, усеченные комментарием к строке .

Это в основном предполагает комментированиеразрывы строк, помещая комментарии в конце каждой строки.Также предлагается не делать отступы кода в ваших макросах, чтобы не допустить появления лишних (одно из моих любимых слов) пробелов.

TBH - это не лучшее решение, но может удовлетворить ваши потребности.Просто поместите ## в конце каждой строки в вашем макросе, и это сделает все немного лучше ... вроде

7 голосов
/ 27 февраля 2013

Кажется, просто работает Java native trim ().

$someValue.trim() у меня работает

2 голосов
/ 14 мая 2015

Я некоторое время пытался найти простое решение для пустого пространства, так что вот то, что я наконец-то придумал. Он вдохновлен и ответом Вадима и этой страницей http://wiki.apache.org/velocity/StructuredGlobbingResourceLoader

StructuredGlobbingResourceLoader, который мы можем найти на сайте, имеет сложное поведение и не избавляется от каких-либо пробелов, поэтому я изменил его, чтобы получить простое поведение: «Удалите все пробелы в начале строк и добавьте комментарий в конце каждой строки »(что препятствует оценке переноса строки). Фильтр применяется к входному потоку во время загрузки.

Этот шаблон скорости

#if($value)
    the value is $value
#end

преобразуется в

#if($value)##
the value is $value##
#end##

Тогда, если вы хотите иметь разрывы строк или начало пробелов, вы должны поместить ($ br, "\ n") и поместить ($ sp, "") в ваш контекст, как объяснил Вадзим, и явно использовать их в вашем шаблоне. Этот способ позволит вам сохранить шаблоны с отступом с максимальным контролем.

взять урок с этой страницы http://wiki.apache.org/velocity/StructuredGlobbingResourceLoader измените расширенный класс на тот тип загрузчика, который вам нужен (этот использует загрузчик webapp) замените метод read () на код, который я предоставляю используйте класс в качестве загрузчика ресурсов в ваших свойствах. Пример загрузчика 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 голосов
/ 23 декабря 2011

Решение

В классе, в котором вы создаете VelocityEngine, добавьте метод следующим образом

public String trim(String str) {
    return str.trim()/*.replace("\n", "").replace("\r", "")*/;
}

, затем добавьте следующее в создаваемый VelocityContext:

    context.put("trimmer", this);

и, наконец, в шаблоне скорости выполните следующее

<a href="#">$trimmer.trim("#render_something('xxx')")</a>

Почему это работает?

Хотя поведение скорости четко определено, может быть немного сложно понять, какэто работает иногда.Отдельный метод trim () необходим для получения последовательности символов из шаблона в метод Java, где вы можете вызвать фактический trim () для String.Насколько я знаю, в Velocity нет обрезки, но вы всегда можете вызвать обратно Java с такими хитростями.

Двойные кавычки необходимы, потому что #render_something - это просто макрос, а не функцияcall, это означает, что результаты операторов в макросе дословно помещаются в точку, где макрос «выполняется».

1 голос
/ 27 мая 2015

В некоторых случаях мне приходилось существенно сворачивать мой скрипт, как если бы я был js или css.Это работает хорошо, хотя людям не так легко читать.Еще один вариант устранения лишнего пространства:

<ul class="tabs">#foreach($par in $bodypars)#set( $parLen = ${_MathTool.toInteger($bodypars.size())} )#set( $parLn = $parLen - 1 )#set( $thClass = 'tb'+${parLn} )#set( $thaClass = '' )#if( $foreach.index == 1 )#set( $thClass = ${thClass}+' selected' )#set( $thaClass = ' selected' )#end#if($foreach.index != 0 && $parLen <= $maxTabs)#set ( $btitle = $_XPathTool.selectSingleNode($par,'item-subtitle') )<li class="${thClass}">#if($!btitle && $btitle != '')<a href="#" class="#cleanString($btitle.value.toLowerCase())${thaClass}">$_SerializerTool.serialize($btitle, true)</a>#end</li>#end#end</ul>
1 голос
/ 18 сентября 2012

Вот мое альтернативное решение для скоростного гашения пробелов , которое позволяет использовать структуру шаблона с вкладками.

Каждый текст шаблона предварительно обрабатывается при первой загрузке в пользовательском ResourceLoader:

private String enhanceTemplate(String body) {
    if (!body.startsWith("##preserveWhitespace")) {
        body = body.replaceAll("(##.*)?[ \\t\\r]*\\n+[ \\t\\r]*", Matcher.quoteReplacement("##\n"));
        body = body.trim();
    }
    return body;
}

Это заменяет все новые строки и настраиваемые пробелы только одним комментарием новой строки .

Разрывы строк и хвостовые пробелы могут быть вставлены явно с переменными $ br и $ sp из контекста по умолчанию:

private static final VelocityContext DEFAULT_CONTEXT = new VelocityContext(new HashMap<String, String>() {{
    put("sp", " ");
    put("br", "\n");
}});
0 голосов
/ 09 августа 2018

Вдохновленный Скоростные пробелы, усеченные комментарием к строке можно использовать блочные комментарии вместо комментариев к строкам для лучшего результата:

#foreach( $record in $records )#**
    *##if( $record.id == 0 )#**
    *##end
#end

С приличным синтаксисом, подчеркивающим комментарии, нет 't очень навязчивый.

...