22

たくさんの空白を作成できる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'))
4

8 に答える 8

16

Velocity Whitespace Gobblingに関するこの記事を読んだところです。これは、 Velocity Whitespace Truncated ByLineCommentを含むいくつかの回避策を提案しています。

これは基本的に、各行の最後にコメントを付けて改行をコメントアウトすることを提案します。また、余分な(私のお気に入りの単語の1つ)スペースの発生を防ぐために、マクロ内のコードをインデントしないことをお勧めします。

TBHは優れたソリューションではありませんが、ニーズに合う可能性があります。マクロの各行の最後に置くだけ##で、物事が少し良くなります...一種の

于 2011-12-23T11:49:39.613 に答える
8

Javaネイティブのtrim()が機能しているようです。

$someValue.trim()私のために働く

于 2013-02-27T12:10:06.300 に答える
2

解決

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>

なぜそれが機能するのですか?

Velocityの動作は明確に定義されていますが、それがどのように機能するかを確認するのは少し難しい場合があります。テンプレートからcharシーケンスをJavaメソッドに取得するには、個別のtrim()メソッドが必要です。このメソッドでは、Stringで実際のtrim()を呼び出すことができます。私の知る限り、Velocity内にはトリムはありませんが、このようなトリックでいつでもJavaにコールバックできます。

#render_somethingは単なるマクロであり、関数呼び出しではないため、二重引用符が必要です。これは、マクロ内のステートメントの結果が、マクロが「実行」されるポイントに逐語的に配置されることを意味します。

于 2011-12-23T00:34:04.607 に答える
2

私は空白のゴブリングに対する簡単な解決策を見つけるのにしばらく苦労したので、ここで私がついに思いついたものです。これは、Vadzimの回答とこのページhttp://wiki.apache.org/velocity/StructuredGlobbingResourceLoaderから着想を得ています。

Webサイトで見つけることができるStructuredGlobbingResourceLoaderは複雑な動作をしており、空白を削除しないため、単純な動作になるように変更しました。「行の先頭にある空白を削除し、でコメントを追加します。各行の終わり」(これにより、改行の評価が妨げられます)。フィルタは、ロード時に入力ストリームに適用されます。

この種の速度テンプレート

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

に変換されます

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

次に、改行または行の先頭の空白が必要な場合は、Vadzimの説明のように、コンテキストにput($ br、 "\ n")とput($ 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;
    }
}

私の実装に関するフィードバックは大歓迎です

于 2015-05-14T02:47:13.187 に答える
2

行コメントで切り捨てられたVelocity空白に触発されて、行コメントの代わりにブロックコメントを使用して、見栄えの良い結果を得ることができます。

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

適切な構文を強調することで、コメントはそれほど目立たなくなります。

于 2018-08-09T08:14:43.730 に答える
1

これは、タブテンプレート構造を可能にする速度空白ゴブリングの代替ソリューションです。

各テンプレートテキストは、カスタムでの最初のロード時に前処理されます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;
}

これにより、すべての新しい行と調整スペースが1つのコメント付き改行に置き換えられます。

改行と末尾のスペースは、デフォルトのコンテキストから$br変数と$sp変数を使用して明示的に挿入できます。

private static final VelocityContext DEFAULT_CONTEXT = new VelocityContext(new HashMap<String, String>() {{
    put("sp", " ");
    put("br", "\n");
}});
于 2012-09-18T16:33:01.733 に答える
1

場合によっては、jsやcssのように、基本的にスクリプトを最小化する必要がありました。人間が読むのはそれほど簡単ではありませんが、それはうまく機能します。余分なスペースを排除するためのもう1つのオプション:

<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>
于 2015-05-27T13:48:24.547 に答える
0

文字列ではなくオブジェクトの場合は変数に注意して、標準のJavaトリムを使用できます。

$string.trim()  //work fine
$object.trim()  //exception

良い一日を過ごしてください!

于 2020-09-02T13:51:14.053 に答える