<?xml version="1.0" encoding="Shift_JIS"?>

<document>

 <properties>
  <title>Velocity User Guide</title>
  <author email="jvanzyl@locus.apache.org">Velocity Documentation Team</author>
  <author email="jcastura@kw.igs.net">John Castura</author>
  <translator>熊坂祐二</translator>
  <original>user-guide</original>
 </properties>

<body>

<section name="Table of Contents">


<ol>
<li><a href="#About this Guide">このガイドについて</a></li>
<li><a href="#What is Velocity?">Velocityとは?</a></li>
<li><a href="#What can Velocity do for me?">Velocityは何ができるの?</a>
    <ol>
        <li><a href="#The Mud Store Example">The Mud Store のサンプル</a></li>
    </ol>
</li>
<li><a href="#Velocity Template Language (VTL): An Introduction">Velocity テンブレート言語 (VTL): はじめに</a></li>
<li><a href="#Hello Velocity World!">Hello Velocity World!</a></li>
<li><a href="#Comments">コメント</a></li>
<li><a href="#References">参照</a>
    <ol>
        <li><a href="#Variables">変数</a></li>
        <li><a href="#Properties">プロパティ</a></li>
        <li><a href="#Methods">メソッド</a></li>
    </ol>
</li>
<li><a href="#Formal Reference Notation">正式なリファレンス記法</a></li>
<li><a href="#Quiet Reference Notation">Quiet リファレンス記法</a></li>
<li><a href="#Getting literal">リテラルを得る</a>
    <ol>
        <li><a href="#Currency">通貨</a></li>
        <li><a href="#Escaping Valid VTL References">VTLリファレンスをエスケープする</a></li>
    </ol>
</li>
<li><a href="#Case Substitution">大文字小文字置換</a></li>
<li><a href="#Directives">指示子</a>
    <ol>
        <li><a href="#Set">Set</a></li>
        <li><a href="#String Literals">文字列リテラル</a></li>
        <li><a href="#Conditionals">If-Else 文</a>
            <ol>
                <li><a href="#Relational and Logical Operators">関連と論理演算子</a></li>
            </ol>
        </li>
        <li><a href="#Loops">Foreach ループ</a></li>
        <li><a href="#Include">Include</a></li>
        <li><a href="#Parse">Parse</a></li>
        <li><a href="#Stop">Stop</a></li>
        <li><a href="#Velocimacros">Velocimacros</a></li>
    </ol>
</li>
<li><a href="#Escaping VTL Directives">VTL 指示子をエスケープする</a></li>
<li><a href="#VTL: Formatting Issues">VTL: フォーマット問題</a></li>
<li><a href="#Other Features">その他の機能</a>
    <ol>
        <li><a href="#Math">Math</a></li>
        <li><a href="#Range Operator">範囲演算子</a></li>
        <li><a href="#Advanced Issues: Escaping and !">高度な問題: エスケープと !</a></li>
        <li><a href="#Velocimacro Miscellany">Velocimacro いろいろ</a></li>
    </ol>
</li>
<li><a href="#Feedback">フィードバック</a></li>
</ol>


</section>

<section name="About this Guide">

<p>
Velocity ユーザー・ガイドは、ページ・デザイナーおよび、コンテンツ･プロパイダーが、
単純だけれども、強力なスクリプト言語である Velocity とその Velocity テンプレート言語
(VTL) の構文を知るために役立つガイドにするつもりです。

このガイドは、Web サイトにおいて動的に内容を埋め込むために Velocity を使う
多くの例を扱っていますが、全ての VTL の例は同様に他のページやテンプレートに適用できます。
 </p>
<p>
    Velocity を選択してくれてありがとう!
 </p>
</section>

<section name="What is Velocity?">

<p>
Velocity は、Java ベースのテンプレートエンジンです。
それは Java コードで定義されたメソッドを参照することを
Web ページデザイナーに許します。
Model-View-Controller(MVC) モデルにより Web サイトを開発するので
Java プログラマと Web デザイナーが平行に作業することができるため
Web ページ・デザイナーはサイトの見栄えをつくることだけに集中し、
プログラマーが最高のコードを書くことだけに集中することができることを意味します。
Velocity は、Java コードを Web ページから切り離し、長い目で見れば、より保守しやすい
Web サイトを作成し、
<a href="http://java.sun.com/products/jsp/">Java Server Pages</a>(JSP) や <a href="http://www.php.net/">PHP</a> の実行可能な代案を提供します。
</p>

<p>
Velocity の可能性は、Web サイトの領域を越えて広がります;
例えば、テンプレートから SQL と PostScript と XML(XML変換の詳細は <a href="./anakia.html">Anakia</a> を参照のこと) を生成することができます。
また、独立したユーティリティとして、ソース・コードを生成したり、レポートを生成したり、
他のシステムとの統合をするためのコンポーネントとして使用することができます。
Velocityはまた、テンプレート・サービスを<a href="http://jakarta.apache.org/turbine/">Turbine</a> Web アプリケーション・フレームワークのために用意しています。
Velocity+Turbine は、本当の MVC モデルにより開発される Web アプリケーションを構築できるテンプレート・サービスを提供します。
</p>

</section>

<section name="What can Velocity do for me?">
<subsection name="The Mud Store Example">
<p>
あなたが泥を売ることを専門に扱うオンライン・ストアの
ページ・デザイナーであるとしましょう。
それを「オンライン泥ストア」としましょう。
ビジネスは、成功しています。
顧客の立場では、いろいろな種類の泥や量を発注します。
彼らは、あなたのサイトに自分の名前とパスワードを使用してログインし
発注したものを確認して見たり、さらに泥を購入することが出来ます。
現在、テラコッタ泥は発売中で、それはとても人気があります。
あなたの顧客の少数派は、定期的に明るい赤泥（それはまた、発売中です）を買います人気があり、そして、通常あなたのWebページのマージンに任せられる。
各々の顧客に関する情報はある日、問題が起こるように、あなたのデータベースにおいてたどられてす、泥のそれらのタイプに最も興味を持っている顧客に、泥の上で特別な処置を目標とするために Velocity を使いませんか？
</p>

<p>
Velocity は、あなたのオンライン訪問者に対してカスタマイズした
Web ページを簡単に作成することができます。
「The Mud Room」での Web サイト・デザイナーとして、あなたは顧客があなたのサイトに
ログイン後に見る Web ページを作りたいのです。
   </p>

  <p>
あなたはあなたの会社でソフトウェア・エンジニアに会います、そして、
誰でも <em>$customer</em> が現在ログインしている顧客に関係する情報を
保持し、<em>$mudsOnSpecial</em> が現在発売中の全てのタイプの泥の
情報を保持することに同意しました。
<em>$flogger</em> オブジェクトは、宣伝を手伝うメソッドを含みます。
当面の作業のために、これらの3つのリファレンスだけに注目しましょう。
覚えていてください、あなたはソフトウェア・エンジニアが必要な情報を
データベースから抜き取る方法について心配する必要がありません、
あなたはそれが働くということを知っている必要があるだけです。
これは、あなたは自分の仕事に取り掛かり、ソフトウェア・エンジニアには
彼らの仕事に取りかからせることになります。
   </p>

    <p>
あなたは、以下の VTL 文を Web ページに埋め込みます。
   </p>

<source><![CDATA[
<HTML>
<BODY>
Hello $customer.Name!
<table>
#foreach( $mud in $mudsOnSpecial )
   #if ( $customer.hasPurchased($mud) )
      <tr>
        <td>
          $flogger.getPromo( $mud )
        </td>
      </tr>
   #end
#end
</table>
]]></source>

    <p>
<em>foreach</em>文の正確な詳細は、簡素により素晴らしく深く記述されることになります;
重要なことは、この短いスクリプトをあなたの Web サイトに提供できるという衝撃です。
Bright Red Mud を好む顧客がログインして、Bright Red Mud がセール中であるときに、
この顧客は、特に目につくように表示されたものを見ることになります。
テラコッタ泥購入の長い歴史をもつ別の顧客がログインしたときには、
テラコッタ泥販売の通知は、正面の真中に表示されます。
Velocityの柔軟性は、たいへん強力なので、制限はあなたの創造力だけです。
   </p>

   <p>
集合的にあなたにあなたがあなたの Web サイトに Web <em>presence</em>を作るために必要とするパワーと柔軟性を与える多くの他の Velocity 要素は、VTLリファレンスにおいて文書化されます。
あなたがこれらの要素により精通しているようになるので、あなたは Velocity のパワーを発揮し始めることになります。
   </p>

 </subsection>

</section>

<section name="Velocity Template Language (VTL): An Introduction">

<p>
Velocityテンプレート言語(VTL) は、動的に内容をWebページに取り入れるために最も簡単で、最も単純で最もきれいな方法を提供するはずです。
ほとんどプログラミング経験のないWebページ開発者さえ、すぐに動的な内容をWebサイトに取り入れるために VTL を使うことができるはずです。
</p>

<p>
VTL は Web サイトにおいて動的な内容を埋め込むために<em>リファレンス</em>を使います、そして、変数はリファレンスの1つの型です。
変数は Java コードにおいて定義される何かを呼び出すことができるリファレンスの1つの型です、あるいは、それは Web ページにおいて VTL <em>文</em>からその値のためにそれ自体を得ることができます。
HTML 文書に埋め込むことができる VTL 文の例は、ここにあります：
</p>

<source><![CDATA[
#set( $a = "Velocity" )
]]></source>

<p>
全ての VTL 文と同様に、この VTL 文は、<em>#</em>文字から始まって、<em>set</em>指令を含みます。そのとき、オンライン訪問客があなたのWebページを要求したとき、Velocity テンプレート・エンジンが、あなたの Web ページを通して、それから全ての<em>#</em>文字を捜し、VTL 文の始めか、<em>#</em>文字がVTLに関係していないのかを決定します。
</p>

<p>
<em>#</em>文字は、指示（<em>set</em>）がつづきます。
<em>set</em>指示は、式（括弧で囲まれた）（<em>値</em>を<em>変数</em>に割り当てる式）を使います。
変数は、左側で、その値は右側になります。この2つは、<em>=</em> 文字によって区切られます。
</p>

<p>
上の例で、変数は <em>$a</em> です、そして、値は <em>Velocity</em> です。
全てのリファレンスの様に、この変数は、<em>$</em> 文字から始まります。
値は、常に引用符で囲まれます;
Velocity では、文字列（テキストに基づく情報）だけが変数に渡される
ので、データ型に対する混乱は発生しません。
</p>

<p>
以下の簡単なルールは、Velocity がどのように働くかについて理解しやすいでしょう。：
<strong>
リファレンスは、<em>$</em> から始まって、何かを得るために使われます。
指令は、<em>#</em> から始まって、何かを行うために使われます。</strong>
</p>

<p>
上の例では、<em>#set</em> は、値を変数に割り当てるために使われます。
変数（<em>$a</em>）は、「Velocity」のテンプレートで出力するのに使う
ことができます。
</p>

</section>

<section name="Hello Velocity World!">

<p>
一旦値が変数に割り当てられるならば、あなたはあなたの HTML 文書においてどこにでも変数を参照することができます。
下記の例では、値は <em>$foo</em> に割り当てられて、後で参照されます。
</p>

<source><![CDATA[
<html>
<body>
#set( $foo = "Velocity" )
Hello $foo World!
</body>
<html>
]]></source>

<p>
結果として Web ページは、"Hello Velocity World!"を表示します。
</p>

<p>
VTL 指令を含んだステートメントをより読みやくするために、個々の VTL 文は、
新しい行から開始することを推奨しますが、これはもちろん強制ではありません。
<em>set</em>指令は、後ほど更に詳細に説明します。
</p>

</section>

<section name="Comments">

<p>
テンプレート・エンジンの出力に含まれないように、テキストを説明するための
コメント含めることができます。
コメントは、あなた自身に思い出させてたり、あなたの VTL 文が何をしているかについて
説明したり、その他の目的に使うことができます。下記は、VTL でのコメントの例です。
</p>

<source><![CDATA[
## This is a single line comment.
]]></source>

<p>
一行コメントは、<em>##</em> から始まり、行末まで続きます。
複数行のコメントを書くのには、たくさんの一行コメントは必要ありません。
複数行コメント（それは <em>#*</em> ではじまり、<em>*#</em> で終了します）は、
そのような場合に利用できます。
</p>

<source><![CDATA[
This is text that is outside the multi-line comment. 
Online visitors can see it.

#*
 Thus begins a multi-line comment. Online visitors won't 
 see this text because the Velocity Templating Engine will
 ignore it.
*#

Here is text outside the multi-line comment; it is visible.
]]></source>

<p>
一行コメントと複数行コメントの有効範囲を明確にする2、3の例は、ここにあります：
</p>

<source><![CDATA[
This text is visible. ## This text is not.
This text is visible.
This text is visible. #* This text, as part of a multi-line comment, 
is not visible. This text is not visible; it is also part of the 
multi-line comment. This text still not visible. *# This text is outside 
the comment, so it is visible.
## This text is not visible.
]]></source>

<p>
コメント (VTLコメント・ブロック) の第3のタイプがあります。
それは文書著者とバージョン情報などを格納するために使われるかもしれません：
</p>

<source><![CDATA[
#**
This is a VTL comment block and
may be used to store such information
as the document author and versioning
information:
@author
@version 5
*#
]]></source>

</section>

<section name="References">

<p>
VTL には、3種類のリファレンスのタイプがあります：
変数とプロパティとメソッドです。
VTL を使っているデザイナーとして、あなたがあなたのテンプレートで正しくそれらを使うことができるように、あなたとあなたのエンジニアはリファレンスの特定の名前に関する合意をしなければなりません。
</p>

<p>
リファレンスへ／からやって来るものすべては、文字列オブジェクトとみなされます。
<em>$foo</em>（例えば整数オブジェクト）を表すオブジェクトがあるならば、Velocity はオブジェクトを文字列に分解するためにその<code>.toString()</code>メソッドを呼ぶことになります。
</p>

 <p>
 <a name="Variables"><strong>変数</strong></a>
 <br />
変数の短縮形表記法は、「$」文字に続くVTL <em>識別子</em>から構成されます。
VTL 識別子は、英字から始めなければなりません（a..zまたはA..Z）。
文字の残りは、以下の文字のタイプ限定されます：
 </p>

 <p> 
   <ul>
     <li>アルファベット (a .. z, A .. Z)</li>
     <li>数字 (0 .. 9)</li>
     <li>ハイフン ("-")</li>
     <li>アンダースコア ("_")</li>
   </ul>
 </p>

 <p>
    ここに、いくつかの有効な VTL での変数リファレンスの例があります。
 </p>

<source><![CDATA[
$foo
$mudSlinger
$mud-slinger
$mud_slinger
$mudSlinger1
]]></source>

 <p>
<em>$foo</em>のように、VTL が変数を参照するとき、テンプレートまたは Java から指示的な
<em>set</em> がコード化するどちらからでも、変数はその値を得ることができます。
例えば、テンプレートが要求される時、Java 変数 <em>$foo</em> が値 <em>bar</em>
を持つならば、<em>bar</em> は Web ページ上で <em>$foo</em> の全てのインスタンスと置き換えられます。
代わりに、私はステートメントを含ます
 </p>
<source><![CDATA[
#set( $foo = "bar" )
]]></source>

<p>
出力は、この指令以降の <em>$foo</em> の全てのインスタンスは同じになります。
</p>
                                                <p>
 <a name="Properties"><strong>Properties</strong></a>
 <br />
VTL リファレンスの第二の特色は、プロパティと特徴的なフォーマットを持つプロパティです。
短縮形表記法は、<em>$</em>文字に続く VTL 識別子と、ドット「.」によってつづく別の VTL 識別子
があります。
これらは、VTL での有効なプロパティ・リファレンスの例です：
 </p>

<source><![CDATA[
$customer.Address
$purchase.Total
]]></source>

<p>
最初の例（<em>$customer.Address</em>）をみてください。
それは、2つの意味を持つことができます。
それは意味することができます ― <em>customer</em> と確認される hashtable で見てください、そして、キー <em>Address</em> と関連される値を返してください。
しかし、<em>$customer.Address</em> は、また、メソッド（メソッドを呼ぶリファレンスは、次のセクションにおいて検討されることになります）を呼ぶことができます;
<em>$customer.Address</em> は、<em>$customer.getAddress()</em>
を書くことの略記された方法でもあります。
あなたのページが要求されるとき、Velocity はこれらの2つの可能性のうちどちらが意味をなすかについて決定して、それから適切な値を返します
</p>

<p>
 <a name="Methods"><strong>Methods</strong></a>
 <br />
メソッドは Java コードにおいて定義されて、役に立つ何かをすることができます、計算を実行するか、決定で到着するのが好きにしてください。
メソッドは「$」文字で始まり、それに続く VTL 識別子と、それに続く
VTL <em>Method Body</em> から構成されるリファレンスです。
VTL Method Body は、VTL 識別子と左括弧文字（"("と、それに続くオプションのパラメータ・リスト、それに続く右括弧(")")から構成されます。
これらは、VTL での有効なメソッド・リファレンスの例です：
 </p>

<source><![CDATA[
$customer.getAddress()
$purchase.getTotal()
$page.setTitle( "My Home Page" )
$person.setAttributes( ["Strange", "Weird", "Excited"] )
]]></source>

<p>
最初の2つの例（<em>$customer.getAddress()</em>と<em>$purchase.getTotal()</em>）は、上のプロパティ・セクション（<em>$customer.Address</em>と<em>$purchase.Total</em>）において使われるそれらに類似したように見えるかもしれません。
あなたがこれらの例が関係がなければならないと思うならば、若干の流儀の中のいくつか、あなたは正しいです！
</p>

<p>
VTL プロパティが、VTL メソッドのために短縮形表記法として使われることができます。
プロパティ <em>$customer.Address</em> は、
メソッド<em>$customer.getAddress()</em> を使いながら正確な同じ効果を持ちます。
利用できるとき、一般にプロパティを使うことが、好ましいです。
プロパティとメソッドの主な違いは、あなたがメソッドにパラメータ・リストを指定することができるということです。
</p>

<p>
短縮形表記法は、以下のメソッドで使うことができます
</p>

<source><![CDATA[
$sun.getPlanets()
$annelid.getDirt()
$album.getPhoto()
]]></source>

<p>
我々は、これらのメソッドが太陽に属している惑星の名前を返すか、
我々のミミズに餌をやるか、アルバムから写真を得るのを期待するかもしれません。
以下のメソッドは、長い表記法だけが動作します。
</p>

<source><![CDATA[
$sun.getPlanet( ["Earth", "Mars", "Neptune"] )
## Can't pass a parameter list with $sun.Planets

$sisyphus.pushRock()
## Velocity assumes I mean $sisyphus.getRock()

$book.setTitle( "Homage to Catalonia" )
## Can't pass a parameter list
]]></source>

 <p>
    <a name="Formal Reference Notation"><strong>Formal Reference Notation</strong></a>
    <br />
リファレンスのための短縮形表記法が上でリストされる例のために使われました、しかし、形式的な表記法がまた、リファレンスのためにあります。そして、それはデモをされます：
 </p>

<source><![CDATA[
${mudSlinger}
${customer.Address}
${purchase.getTotal()}
]]></source>

<p>
ほとんどすべての場合には、あなたはリファレンスのために短縮形表記法を使用することになります、しかし、若干の場合には、形式的な表記法は正しい処理のために必要です。
</p>

<p>
<em>$vice</em>が文の名詞でベース語として使われることになっていた所で、
あなたが飛んで文を構成していたと思ってください。
目的は、ベース語を選ぶ誰かを許して、以下の2つの結果のうちの1つを生じることです：
「Jack is pyromaniac.」、あるいは、「Jack is kleptomaniac.」となります。
短縮形表記法を使用することは、この作業に不適当です。
以下の例を考えてみてください：
</p>


<source><![CDATA[
Jack is a $vicemaniac.
]]></source>

<p>
ここに曖昧さがあり、そして、Velocity は<em>$vice</em>ではなく、
<em>$vicemaniac</em> があなたが使うつもりである識別子であると仮定します。
<em>$vicemaniac</em> のために値が見つからず、
それは <em>$vicemaniac</em> を返すことになります。
形式的な表記法を使用することで、この問題を解決することができます。
</p>

<source><![CDATA[
Jack is a ${vice}maniac.
]]></source>

<p>
これで、Velocity は<em>$vicemaniac</em>ではなく、<em>$vice</em>がリファレンスであるということが認識できます。
リファレンスがテンプレート中でテキストと直近のとき、形式的な表記法は多くの場合役に立ちます。
</p>

 <p>
    <a name="Quiet Reference Notation"><strong>Quiet Reference Notation</strong></a>
    <br />
Velocity が未定義リファレンスに遭遇したとき、その標準的な挙動はリファレンスのイメージを出力します。
例えば、以下のリファレンスは VTL テンプレートの一部として現れると思ってください。
 </p>

<source><![CDATA[
<input type="text" name="email" value="$email"/>
]]></source>

<p>
最初にフォームがロードされるとき、変数のリファレンス <em>$email</em> には値がありません、
しかし、あなたは「$email」という値より空白のテキスト・フィールドを好みます。
Silentリファレンス表記法を使用することで、Velocity の標準的な挙動を回避します;
VTL で <em>$email</em> を使う代わりに、あなたは <em>$!email</em> を使います。
それで、上記の例は、以下のように見えます：
</p>

<source><![CDATA[
<input type="text" name="email" value="$!email"/>
]]></source>

<p>
これで、フォームの初期読み込みで、<em>$email</em> がまだ値を持たないとき、
「$email」の替わりに空の文字列が出力されます。
</p>

<p>
形式的なリファレンスと Silent リファレンス表記法を一緒に使うことができます。
それは以下でデモされます。
</p>

<source><![CDATA[
<input type="text" name="email" value="$!{email}"/>
]]></source>

</section>

<section name="Getting literal">

 <p>
VTL は、<em>$</em> と <em>#</em> というよな特別な文字を使用するので、
あなたのテンプレートでこれらの文字を使用する場合には注意が必要です。
このセクションでは、<em>$</em> 文字をエスケープする方法を説明します。
  </p>

  <p>
    <a name="Currency"><strong>通貨</strong></a>
    <br />
「私は、たった$2.50ドルで農夫の市場で、4ポンド入りのジャガイモの袋を買いました！」
と書くことについては問題はありません。
VTL識別子は常に大文字または小文字の英字から始まるので、$2.50はリファレンスと間違えることはありません。
  </p>

   <p>
    <a name="Escaping Valid VTL References"><strong>Escaping Valid VTL References</strong></a>
    <br />
Velocity が混乱する可能性がある所で、発生するかもしれません。
<em>エスケープ</em>特別な文字、あなたのテンプレートとこれでの VTL の特別な文字が
バックスラッシュ（<em>\</em>）を使って、正当に扱われることができるハンドルに最高の方法は、
文字です。
  </p>

<source><![CDATA[
#set( $email = "foo" )
$email
]]></source>

<p>
Velocity があなたの VTL テンプレートで<em>$email</em>リファレンスを検出すると、
それは対応する値を求めてコンテキストを捜すことになります。
ここでは、<em>$email</em> が定義されるので、出力は <em>foo</em> になります。
<em>$email</em> が定義されないならば、出力は <em>$email</em> になります。
</p>

<p>
<em>$email</em> が定義される（例では値 <em>foo</em> を持ちます）、
そして、あなたが <em>$email</em> を出力したいと仮定します。
これを行なう2、3の方法があります、しかし、最も単純なものはエスケープ文字を使うことです。
</p>

<source><![CDATA[
## The following line defines $email in this template:
#set( $email = "foo" )
$email
\$email
\\$email
\\\$email
]]></source>

  <p>
     このようにレンダリングされます
  </p>

<source><![CDATA[
foo
$email
\$email
\\$email
]]></source>

<p>
<em>\</em> 文字が左から <em>$</em> まで縛ることに注意してください。
bind-from-left 規則は、<em>\\\$email</em> として提出する <em>\\$email</em> を引き起こします。
これらの例を <em>$email</em> が定義されないそれらと比較してください。
</p>

<source><![CDATA[
$email
\$email
\\$email
\\\$email
]]></source>

  <p>
     renders as 
  </p>

<source><![CDATA[
$email
\$email
\\$email
\\\$email
]]></source>

<p>
Velocity は、定義されなかったものと定義されものとでリファレンスの扱いが異なる
ことに注意してください。
<em>$foo</em> に値 <em>gibbous</em> を与えるセットされた指令は、ここにあります。
</p>

<source><![CDATA[
#set( $foo = "gibbous" )
$moon = $foo
]]></source>

<p>
出力が、次のようになります。
<em>$moon = gibbous</em> -- ここで <em>$moon</em> は、リテラルとして出力されます。
というのは、それは未定義で、<em>$foo</em> の場所には <em>gibbous</em> が出力されるからです。
</p>

<p>
VTL 指令をエスケープすることも、可能です;
これは、指令セクションにおいて更に詳細に記述されます。
</p>

</section>

<section name="Case Substitution">

<p>
あなたがリファレンスに精通している今、あなたはあなたのテンプレートで効果的にそれらを適用し始めることができます。
Velocity リファレンスは、テンプレート・デザイナーが使いやすいと見つけることになる若干の Java  原則を利用します。
例：
</p>

<source><![CDATA[
$foo

$foo.getBar()
## is the same as
$foo.Bar

$data.getUser("jon")
## is the same as
$data.User("jon")

$data.getRequest().getServerName()
## is the same as
$data.Request.ServerName
## is the same as
${data.Request.ServerName}
]]></source>

<p>
これらの例は、同じリファレンスの他の用途を図示します。
Velocity は、コンテキストで両方のオブジェクトにオブジェクト・メソッドと同様にリファレンス名を分解するために Java の introspection と bean 機能を利用します。
あなたのテンプレートに埋め込んで、ほとんどどこにでもリファレンスを評価することは、可能です。</p>

<p>
Velocity（それはサン・マイクロシステムズによって定義される bean 仕様書にならって作られます）は、大文字と小文字の区別がされます;
しかし、開発者はユーザー・エラーを捕えて、訂正するために努力するようにすることが可能です。
メソッド<em>getFoo()</em>が<code>$bar.foo</code>によってテンプレートで呼ばれるとき、Velocityは最初に<code>$getfoo</code>を試みることになります。
これが失敗するならば、それはそれから<em>$getFoo</em>を試みることになります。
同じように、テンプレートが<code>$bar.Foo</code>を呼ぶとき、Velocityは最初に<code>$getFoo()</code>を試みることになって、それから<em>getfoo()</em>を試みることになります。
</p>

      <p> 
注意: <em>テンプレートのインスタンス変更への参照は、解決されません。</em>
JavaBean と同様な属性への参照のみの getter/setter メソッドが解決されます。
(つまり、<code>$foo.Name</code>は、クラス Foo の <code>getName()</code>
インスタンスメソッドの解決されますが、Foo のインスタンス変更である
public <code>Name</code> ではありません。)
       </p> 

</section>


<section name="Directives">

<p>
リファレンスは、Web サイトに動的に内容を生成するためにテンプレート・デザイナーを許します。<em>directives</em>− 創造的に Java コードの出力を操作するために使われることができる使いやすいスクリプト要素−は、
Web デザイナーが本当に Web サイトの内容と見栄えを引き受けることができるようにします。
</p>

 <a name="Set"><strong>#set</strong></a>
<p>
<em>#set</em> 指示子は、リファレンスの値をセットするために使われます。
値はリファレンス変数かプロパティ・リファレンスに割り当てられることができます、そして、これは括弧内で起こります。そして、そのことはデモをしました：
</p>

<source><![CDATA[
#set( $primate = "monkey" )
#set( $customer.Behavior = $primate )
]]></source>

<p>
左辺（LHS）は、可変のリファレンスまたはプロパティ・リファレンスでなければなりません。
右辺（RHS）は、以下のタイプのうちの1つでありえます：
</p>

 <p>
    <ul>
        <li>変数リファレンス</li>
        <li>文字列リテラル</li>
        <li>プロパティリファレンス</li>
        <li>メソッド・リファレンス</li>
        <li>数値リテラル</li>
        <li>配列リスト</li>
    </ul>
 </p>

  <p>
    これらの例は、前記のタイプの各々を示します：
 </p>
<source><![CDATA[
#set( $monkey = $bill ) ## variable reference
#set( $monkey.Friend = "monica" ) ## string literal
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
#set( $monkey.Number = 123 ) ##number literal
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList
]]></source>

  <p>
注意: 要素が定義した最後の例で
[..] ArrayList クラスで定義されるメソッドを使用してアクセスできるオペレーターは、います。
それで、例えば、あなたは $monkey.Say.get(0) を使うことより上に最初の要素にアクセスすることができます。
 </p>

<p>
RHSは、また、単純な算術式でありえます：
</p>

<source><![CDATA[
#set( $value = $foo + 1 )
#set( $value = $bar - 1 )
#set( $value = $foo * $bar )
#set( $value = $foo / $bar )
]]></source>

<p>
他の Velocity 指令の一部と違って、<em>#set</em> 指示には、
<em>#end</em> ステートメントがありません。
</p>

<a name="String Literals"><strong>String Literals</strong></a>

 <p>
    <em>#set</em> 指示を使うとき、文字列リテラルは、
    ダブルクオート文字で囲む場合には、以下に示すようにレンダリングされます。
 </p>

<source><![CDATA[
#set( $directoryRoot = "www" )
#set( $templateName = "index.vm" )
#set( $template = "$directoryRoot/$templateName" )
$template
]]></source>

 <p>
  出力はこうなります
 </p>

<source><![CDATA[
www/index.vm
]]></source>

 <p>
    しかし、文字列リテラルがシングルクオートで囲まれている場合には、
解析されません。
 </p>

<source><![CDATA[
#set( $foo = "bar" )
$foo
#set( $blargh = '$foo' )
$blargh
]]></source>

  このレンダリングは、こうなります

<source><![CDATA[
  bar
  $foo
]]></source>

<p>
デフォルトで、テキストを解析されないようにするシングルクオートを使ったこの機能は、
Velocity で利用できます。
このデフォルトは、<code>velocity.properties</code> を編集して
<code>stringliterals.interpolate=false</code>
とすることによって変更することができます
</p>
</section>


<section name="Conditionals">

    <strong>If / ElseIf / Else</strong>
<p>
Velocity の <em>#if</em> 指示子は、Web ページの生成時に
if 文の条件が真でのときに、テキストが生成されます。
例：
</p>

<source><![CDATA[
#if( $foo )
   <strong>Velocity!</strong>
#end
]]></source>

<p>
変数 <em>$foo</em> はそれが true かどうか決定するために評価されます。
そして、それは2つの状況のうちの1つの下で起こることになります：
(i) <em>$foo</em> は true の値を持つ boolean（true/false）です、
あるいは、(ii) 値は null ではありません。

この場合、<em>$foo</em> が true ならば、出力があることになります：
「Velocity！」。<em>$foo</em> が null または、boolean で false ならば、
文の評価は false となり、出力はありません。
</p>
<p>
<em>#elseif</em>または<em>#else</em>要素が、<em>#if</em>要素と共に使用されます。
注意: Velocity テンプレートエンジンは、最初に式が true になったところで止まります。
下記の例では、<em>$foo</em> が値として 15 を持ち、<em>$bar</em> は値として 6 を持つとします。
</p>

<source><![CDATA[
#if( $foo < 10 )
    <strong>Go North</strong>
#elseif( $foo == 10 )
    <strong>Go East</strong>
#elseif( $bar == 6 )
    <strong>Go South</strong>
#else
    <strong>Go West</strong>
#end
]]></source>

<p>
この例では、<em>$foo</em> は、10 より大きい場合に、
最初の 2 つの比較は失敗します。次に、<em>$bar</em> が、6 と比較され、
それが true なので、出力は、<strong>Go South</strong> となります。
</p>
<p>
注意: 現在、Velocity の数の比較は整数まで切り上げされます -- 
そうでない場合には <em>false</em> と評価することになります。
これに対する唯一の例外は等号「==」です、Velocity は、「==」の両辺に存在する
各々のオブジェクトは、<em>同じ</em>クラスを要求します。
</p>

    <p>
    <a name="Relational and Logical Operators"><strong>Relational and Logical Operators</strong></a>
    </p>

<p>
Velocity は、変数の関係を決定するために等号オペレーターを使います。
等号オペレーターが使われる方法を図示する単純な例は、ここにあります。
</p>

<source><![CDATA[
#set ($foo = "deoxyribonucleic acid")
#set ($bar = "ribonucleic acid")

#if ($foo == $bar)
  In this case it's clear they aren't equivalent. So...
#else
  They are not equivalent and this will be the output.
#end
]]></source>

   <p>
      Velocity には、同様に論理 AND と論理 OR 演算子があります。
以下は、if 文で論理 AND を使用した例です。
    </p>

<source><![CDATA[
#if( $foo && $bar )
   <strong>Velocity Rocks!</strong>
#end
]]></source>

<p>
if 文は、<em>$foo</em> と <em>$bar</em> が共に true かどうか、
評価します。
<em>$foo</em> が false ならば、式全体は false に評価され
<em>$bar</em> は、評価されません。
<em>$foo</em> が true ならば、Velocity テンプレートエンジンは、
次に <em>$bar</em> の値をチェックすることになります。
<em>$bar</em> が true ならば、式全体が、true となって
<strong>Velocity Rocks!</strong> が出力されます。
<em>$bar</em> が false ならば、式全体が false となって
出力されません。
</p>

<p>
論理 OR 演算子は、式全体が true になるように評価をする必要があるリファレンス
のひとつを除き同じように作用します。
以下の例を考えてみてください。
</p>

<source><![CDATA[
#if( $foo || $bar )
    <strong>Velocity Rocks Again!</strong>
#end
]]></source>

<p>
<em>$foo</em> が true ならば、Velocity テンプレートエンジンは <em>$bar</em>
を調べる必要はありません;
<em>$bar</em> が true であるか false であるかどうかに関係なく、
式が再び true となり <strong>Velocity Rocks Again!</strong>が出力されます。
<em>$foo</em> が false ならば、今度は <em>$bar</em> をチェックしなければなりません。
この場合、<em>$bar</em> がまた、false ならば、式は false と評価して、出力はありません。
一方、<em>$bar</em> が true ならば、式全体が true になり、出力は、<strong>Velocity Rocks Again!</strong> となります。
</p>

 </section>

<section name="Loops">

   <strong>Foreach Loop</strong>

    <p>
      <em>#foreach</em> 要素は、ループができます。例えば
    </p>
<source><![CDATA[
<ul>
#foreach( $product in $allProducts )
    <li>$product</li>
#end
</ul>
]]></source>

<p>
この <em>#foreach</em> ループによって、<em>$allProducts</em> リスト
（オブジェクト）がリストにおいて製品（ターゲット）の全てでループにされるようになります。
ループによって、<em>$allProducts</em> からの値は <em>$product</em> 変数に置かれます。
</p>

<p>
<em>$allProducts</em> 変数の内容は、Vector、Hashtable または配列です。
<em>$product</em> 変数に割り当てられる値は、Java オブジェクトであって、
このように変数からリファレンスをつけられることができます。
たとえば、もし <em>$product</em> が本当に Java の Product クラスならば、
その名前は、<em>$product.Name</em> メソッドで参照して取り出すことができます。
(すなわち <em>$Product.getName()</em>）。
</p>

      <p> 
$allProduct が Hashtable だとしましょう。もし Hashtable からキーの値を
取り出し、Hashtable 内のオブジェクトを取り出したい場合には、次のように
コードを使用します。
       </p> 
    
   <source><![CDATA[ 
   <ul> 
   #foreach( $key in $allProducts.keySet() ) 
       <li>Key: $key -> Value: $allProducts.get($key)</li> 
   #end 
   </ul> 
   ]]></source> 
      <p> 
       Velocity provides an easy way to get the loop counter so that you 
       can do something like the following: 
       </p> 
    
   <source><![CDATA[ 
   <table> 
   #foreach( $customer in $customerList ) 
       <tr><td>$velocityCount</td><td>$customer.Name</td></tr> 
   #end 
   </table> 
   ]]></source> 
    
       <p> 
ループカウンタ変数参照のためのデフォルト名は、velocity.properties ファイル
に指定されている、$velocityCount です。カウンタのデフォルト値は
1 から開始しますが、0 や 1 に設定することが、<code>velocity.properties</code>
ファイルで可能です。これは、<code>velocity.properties</code> ファイルの
ループカウンタプロパティセクションにあります。
       </p> 
    
   <source><![CDATA[ 
   # ループカウンタ変数参照のデフォルト名
   counter.name = velocityCount 
    
   # ループカウンタ変数山椒うのデフォルト開始値
   counter.initial.value = 1 
   ]]></source> 
    

 </section>

<section name="Include">

<p>
<em>#include</em> スクリプト要素はローカル・ファイルをインポートするためにテンプレート・デザイナーを許します。そして、それはそれから <em>#include</em> 指示が定義される位置に挿入されます。
ファイルの中身は、テンプレートエンジンによってレンダリングされません。
セキュリティ上の理由のために、インクルードされるファイルは、
TEMPLATE_ROOT の下にあるだけかもしれません。
</p>

<source><![CDATA[
#include( "one.txt" )
]]></source>

<p>
<em>#include</em> 指示子が呼ぶファイルは、引用符において囲まれます。
複数のファイルをインクルードする場合には、それらをコンマで区切ります。
</p>

<source><![CDATA[
#include( "one.gif","two.txt","three.htm" )
]]></source>

<p>
インクルードされるファイルは、名前でリファレンスをつけられる必要はありません;
実際、多くの場合ファイル名でなく変数を使うことが、好ましいです。
ページ要求が提出されるとき、これは決定される基準によって出力を決定するのに役立ちます。
ここに、ファイル名と変数を示している例があります。
</p>

<source><![CDATA[
#include( "greetings.txt", $seasonalstock )
]]></source>

 </section>

<section name="Parse">

<p>
<em>#parse</em> スクリプト要素は、VTL を含むローカル・ファイルをインポートするためにテンプレート・デザイナーを許します。
Velocity は、VTL を解析することになって、指定されるテンプレートをレンダリングします。
</p>

<source><![CDATA[
#parse( "me.vm" )
]]></source>

<p>
<em>#include</em> 指示子のように、<em>#parse</em> は、テンプレートよりむしろ変数をとることができます。
<em>#parse</em> が呼ぶどんなテンプレートでも、TEMPLATE_ROOT の下で含まれなければなりません。
<em>#include</em> 指示子と違って、<em>#parse</em> は、ひとつの引数をとることになるだけです。
</p>

<p>
VTL テンプレートは、<em>#parse</em> ステートメントを持つ
テンプレートの中からさらに <em>#parse</em> を呼ぶことができます。
デフォルトで10にセットされて、<code>velocity.properties</code> の
<em>parse_directive.maxdepth</em> 行は、一つのテンプレートから起こることができる最大数の<em>#parse</em> 参照数をカスタマイズするためにユーザーを許します。
（注：
<em>parse_directive.maxdepth</em> プロパティが <code>velocity.properties</code>
ファイルになければ、Velocity がこのデフォルトを 10 にセットします。）、
テンプレート <code>dofoo.vm</code> が以下の行を含むならば、
例えば、再帰は許されます：
</p>

<source><![CDATA[
Count down.
#set( $count = 8 )
#parse( "parsefoo.vm" )
All done with dofoo.vm!
]]></source>

<p>
それは、以下の VTL の内容のテンプレート <code>parsefoo.vm</code> を参照します。
</p>

<source><![CDATA[
$count
#set( $count = $count - 1 )
#if( $count > 0 )
    #parse( "parsefoo.vm" )
#else
    All done with parsefoo.vm!
#end
]]></source>

<p>
「Count down.」が表示された後、8 からカウントダウンして、
Velocity は <code>parsefoo.vm</code> を通してパスします。
カウントが 0 に達するとき、それは「All done with parsefoo.vm!」メッセージを表示します。
この時点で、Velocity は<code>dofoo.vm</code> に戻って、
「All done with dofoo.vm!」メッセージを出力します。
</p>

 </section>


<section name="Stop">

<p>
<em>#stop</em> スクリプト要素は、テンプレート・エンジンの実行を止めて、
戻るためにテンプレート・デザイナーを許します。
これは、デバックするときに役立ちます。
</p>

<source><![CDATA[
#stop
]]></source>
 </section>

<section name="Velocimacros">

<p>
<em>#macro</em> スクリプト要素は、VTL テンプレートの繰り返された部分を定義するためにテンプレート・デザイナーを許します。
Velocimacros は、両方とも単純で複雑な広範囲にわたるシナリオに、非常に役立ちます。
このVelocimacro（キーストロークを少なくして、印刷上のエラーを最小にする唯一の目的のためにつくられる）は、Velocimacro の概念の紹介を提供します。
</p>

<source><![CDATA[
#macro( d )
<tr><td></td></tr>
#end
]]></source>

<p>
この例で定義されている Velocimacro は <em>d</em> です、そして、
それは他の VTL指令 と同じような方法で呼び出すことができます：
</p>

<source><![CDATA[
#d()
]]></source>

<p>
このテンプレートが呼ばれるとき、Velocity は <em>#d()</em> を一つの、
空のデータ・セルを含んでいる列と置換します。
</p>

<p>
Velocimacro は引数（ゼロ引数は最初の例で省略可能だと示したので）はどんな数でもとることができますが、Velocimacro が呼び出されるとき、それは定義された同じ数の引数で呼ばれなければなりません。
ものが上記を定義したより、多くの Velocimacro は、含みます。
2つの引数として、色と配列をとる Velocimacro がここにあります。
</p>

<source><![CDATA[
#macro( tablerows $color $somelist )
#foreach( $something in $somelist )
    <tr><td bgcolor=$color>$something</td></tr>
#end
#end
]]></source>

<p>
この例（<em>tablerows</em>）で定義されている Velocimacro は、2つの引数をとります。
最初の引数は、<em>$color</em> となり、2番目の引数は、<em>$somelist</em> となります。
</p>

<p>
VTL テンプレートに入れられるものは何でも、Velocimacro の本体に入ることができます。
<em>tablerows</em> Velocimacro は、<em>foreach</em> 文です。
2つの <em>#end</em> 文が、<em>#tablerows</em> Velocimacro の定義にありますが、
最初の end は、<em>#foreach</em> のもので、二番目の end は Velocimacro 定義のものです。
</p>

<source><![CDATA[
#set( $greatlakes = ["Superior","Michigan","Huron","Erie","Ontario"] )
#set( $color = "blue" )
<table>
    #tablerows( $color $greatlakes )
</table>
]]></source>

<p>
<em>$greatlakes</em> が <em>$somelist</em> に代わることに注意してください。
<em>#tablerows</em> Velocimacro がこの状況において呼ばれるとき、以下の出力が生成されます。
</p>

<source><![CDATA[
<table>
    <tr><td bgcolor="blue">Superior</td></tr>
    <tr><td bgcolor="blue">Michigan</td></tr>
    <tr><td bgcolor="blue">Huron</td></tr>
    <tr><td bgcolor="blue">Erie</td></tr>
    <tr><td bgcolor="blue">Ontario</td></tr>
</table>
]]></source>

<p>
Velocimacro は Velocity テンプレートで <em>inline</em> で定義ができますが、
同じ Web サイトで他の Velocity テンプレートには利用できません。
それが全てのテンプレートによって共有されることができるようなものは明らかにする Velocimacro を定義することは、利します：
それは、作業を保存して、エラーの可能性を減らし、多数のテンプレートの上で Velocimacro を再定義する必要を減らして、複数のテンプレートが利用できるマクロに、それに一つの変更点を保証します。
</p>

    <strong>Velocimacro Properties</strong>
    
<p>
<code>velocity.properties</code>ファイルの中のいくつかの行は、Velocimacro の柔軟な実装のために許します。注意:　<a href="developer-guide.html">開発者ガイド</a>も参照してください。

</p>

<p>
<code>velocimacro.library</code>
−
全ての Velocimacro テンプレート・ライブラリのコンマで区切られたリスト。
デフォルトで、Velocity は一つのライブラリを捜します：
<em>VM_global_lib.vm</em>。設定されたテンプレートパスは
Velomacro ライブラリを検索するために使用されます。

</p>

<p>
<code>velocimacro.permissions.allow.inline</code>
−
このプロパティ（それは true または false の値）は、
Velocimacro が標準テンプレートで定義されることができるかどうか決定します。
デフォルト（true）は、テンプレートで Velocimacro を定義するためにテンプレート・デザイナーを許します。
</p>

<p>
<code>velocimacro.permissions.allow.inline.to.replace.global</code>
−
このプロパティ ( true または false ) は、Velocimacro が標準テンプレートで定義されることができるかどうか決定します。
デフォルト（true）は、テンプレートで Velocimacro を定義するためにテンプレート・デザイナーを許します。
</p>

<p>
<code>velocimacro.permissions.allow.inline.local.scope</code>
−
このプロパティは、true もしはく false で、デフォルトは false で、
Velocimacro 定義された inline がテンプレートを定義することだけに「見えるか」どうか制御します。
言い換えると、正しく調整するこのプロパティ・セットで、テンプレートはテンプレートを定義することによってだけ有用である inline VM を定義することができます。
あなたは装飾的な VM トリックのためにこれを使うことができます−グローバルな VM がグローバルな別の VM を呼ぶならば、inline 範囲で、テンプレートはそのテンプレートによって呼ばれるとき、最初の VM によって呼ばれることになる第二の VM のプライベート実装を定義することができます。
全ての他のテンプレートは、影響ありません。
</p>

<p>
<code>velocimacro.context.localscope</code>
−
このプロパティは、true または false が設定可能で、デフォルトは false です。
true のとき、Velocimacro の範囲内の #set() を経たコンテキストへのどんな修正でも Velocimacro に「ローカルである」と思われて、永久にコンテキストに影響を及ぼしません。
</p>

<p>
ここで、<em>#tablerows($color $list)</em> Velocimacro が
Velocimacro テンプレートライブラリで定義てあり、このマクロはどの
標準テンプレートも使うこともできます。
それは、いつでもどんな目的でも使うことが出来ます。
テンプレートの <code>mushroom.vm</code> が全てのもの菌類のテンプレートで
提供されているとき、<em>#tablerows</em> Velocimacro は、
典型的なキノコの一部をリストするために呼び出すことができます：
</p>

<source><![CDATA[
#set( $parts = ["volva","stipe","annulus","gills","pileus"] )
#set( $cellbgcol = "#CC00FF" )
<table>
#tablerows( $cellbgcol $parts )
</table>
]]></source>

<p>
<code>mushroom.vm</code> の要求を満たすとき、Velocity は
<em>#tablerows</em> Velocimacro をテンプレートライブラリ
（<code>velocity.properties</code> ファイルにおいて定義される）で見つけて、
以下の出力を生成します：
</p>

<source><![CDATA[
<table>
    <tr><td bgcolor="#CC00FF">volva</td></tr>
    <tr><td bgcolor="#CC00FF">stipe</td></tr>
    <tr><td bgcolor="#CC00FF">annulus</td></tr>
    <tr><td bgcolor="#CC00FF">gills</td></tr>
    <tr><td bgcolor="#CC00FF">pileus</td></tr>
</table>
]]></source>

  <strong>Velocimacro 引数</strong>

  <p>
   Velocimacro は、以下の VTL 要素のどれでも引数として取ることができます。
  </p>

  <ul>
    <li> 
      リファレンス : すべて '$'で開始する
    </li>
    <li> 
      文字列リテラル : "$foo" や 'hello'のようなもの
    </li>
    <li> 
      数値リテラル : 1, 2 など
    </li>
    <li> 
      整数範囲 : [ 1..2] や [$foo .. $bar]
    </li>
    <li> 
      オブジェクト配列 : [ "a", "b", "c"]
    </li>
    <li> 
       boolean 値 true
    </li>
    <li> 
       boolean 値 false
    </li>
  </ul>

<p>
Velocimacro の引数としてリファレンスを渡すときに注意してください。
リファレンスは「名前」が渡されます。
これは、それらの値が Velocimacro の中に各使用で「生成される」ことを意味します。
この機能は、メソッド呼び出しによるリファレンスを渡して、メソッドを各使用で呼んでおくことができます。
例えば、以下に示すように Velocimacro を呼び出すと
</p>

   <source><![CDATA[
     #macro( callme $a )
         $a $a $a
     #end

     #callme( $foo.bar() )
   ]]></source>

<p>
結果として、リファレンス $foo のメソッド bar() は3回呼び出されます。
</p>

   <p>
一見したところでは、この機能は驚くべきように見えます、
しかし、あなたが Velocimacro の後に最初の動機づけを考慮に入れるとき ―
 一般に使われた VTL のカット&amp;ペーストの重複を除去するために ― それは意味をなします。
それは、Velocimacro へのステートフルなオブジェクト（例えばテーブル列に色をつけるために繰り返しシーケンスで色を生成するオブジェクト）を渡すようなことをすることができます。
</p>

<p>
あなたがこの機能を回避する必要があるならば、あなたは常に新しいリファレンスとしてのメソッドからの値を得て、それを渡すことができます：
</p>

    <source><![CDATA[
     #set( $myval = $foo.bar() )
     #callme( $myval )
   ]]></source>

    <strong>Velocimacro Trivia</strong>

<p>
現在、それらがテンプレートで最初に使われる前に、Velocimacro は定義されていなければなりません。
これは、あなたの #macro() 宣言を Velocimacros を使う前に行なう必要があることを意味します。
</p>

<p>
これは、インライン #macro() 指令を含んでいるテンプレートを #parse()
するときに覚えておくことは重要です。
というのも、実行時に #parse() が発生し、パーサーで起こるからはテンプレートでの VM -見ている要素がパース時の VM であるかどうか決めます。そして、VM 宣言の集合が動くことにはならならない #parse() が予期されます。
これに打ち勝つために、単に Velocity に起動時にあなたの VM をロードさせるために
<code>velocimacro.library</code> 機能を使ってください。
</p>

 </section>

<section name="Escaping VTL Directives">
<p>
VTL 指令は、ある意味で有効な VTL リファレンスに類似したバックスラッシュ文字（「\」）でエスケープすることができます。
</p>

<source><![CDATA[
## #include( "a.txt" ) renders as <contents of a.txt>
#include( "a.txt" )

## \#include( "a.txt" ) renders as \#include( "a.txt" )
\#include( "a.txt" )

## \\#include ( "a.txt" ) renders as \<contents of a.txt>
\\#include ( "a.txt" )
]]></source>

<p>
一つの指令（ステートメントのような if-else-end で）において、
複数のスクリプト要素を含む VTL 指令をエスケープするとき、特別な心配はとられるはずです。
典型的な VTL if 文は、ここにあります：
</p>

<source><![CDATA[
#if( $jazz )
    Vyacheslav Ganelin
#end
]]></source>

<p>
<em>$jazz</em>が true ならば、出力は
<source><![CDATA[ 
    Vyacheslav Ganelin 
]]></source> 
です。
</p> 
     <p> 
<em>$jazz</em>が false ならば、出力はありません。
スクリプト要素をエスケープすると、出力を変えます。
以下の場合を考えてください：
</p>

<source><![CDATA[
\#if( $jazz )
    Vyacheslav Ganelin
\#end
]]></source>

<p>
<em>$jazz</em>が ture か false かどうかに関係なく、
出力は、
</p>
<source><![CDATA[ 
#if($ jazz ) 
    Vyacheslav Ganelin 
#end 
]]></source> 
<p>
となるでしょう。

実際、全てのスクリプト要素がエスケープされるので、<em>$jazz</em>
の真偽は決してチェックされません。
バックスラッシュは合法的にエスケープするスクリプト要素に先行すると思ってください：
</p>

<source><![CDATA[
\\#if( $jazz )
   Vyacheslav Ganelin
\\#end
]]></source>

<p>
この場合、<em>$jazz</em>が true ならば、出力は
</p>

<source><![CDATA[ 
\ Vyacheslav Ganelin 
\ 
]]></source> 

<p>
です。
<em>$jazz</em>が false ならば、出力はありません。
</p>

<p> 
これを理解するためには、<code>#if( arg ) </code>が
改行(return) で終了しているときに、出力からの改行が除外されることに注意してください。
そのため、<code>#if()</code> ブロックのボディに続く最初の '\'は、
その前の <code>#if()</code> を '\\' からレンダリングされます。
最後の \ は、異なる行にあるので、テキストは、
'Ganelin' の後に改行がきて、そして
<code>#end</code> の前にある最後の \\ は、ブロックのボディの一部となります。
スクリプト要素が適切にエスケープされていなけば、分岐が開始することに注意すること。


</p>

<source><![CDATA[
\\\#if( $jazz )
    Vyacheslave Ganelin
\\#end
]]></source>

<p>
ここでは、<em>#if</em> はエスケープされますが、<em>#end</em> が残っています。
end が多すぎるので、解析エラーを引き起こすことになります。
</p>

</section>

<section name="VTL: Formatting Issues">

  <p>
このユーザー・ガイドの中の VTL が改行と空白（下で示されるVTL）で多くの場合表示されるけれども
    </p>

<source><![CDATA[
#set( $imperial = ["Munetaka","Koreyasu","Hisakira","Morikune"] )
#foreach( $shogun in $imperial )
    $shogun
#end
]]></source>

<p>
改行や空白が無関係というのを完全に図示するために、以下の断片は有効で等しいというのが、
Geir Magnusson Jr. によって Velocity のユーザー・メーリングリストに送られました：
</p>
<source><![CDATA[
Send me #set($foo = ["$10 and ","a cake"])#foreach($a in $foo)$a #end please.
]]></source>

<p>
Velocity の振る舞いは、余分な空白を飲み尽くすことです。
前の指令は、このように書くことができます：
</p>

<source><![CDATA[
Send me
#set( $foo = ["$10 and ","a cake"] )
#foreach( $a in $foo )
$a
#end
please.
]]></source>

 <p>
    または
    </p>
<source><![CDATA[
Send me
#set($foo       = ["$10 and ","a cake"])
                 #foreach           ($a in $foo )$a
         #end please.
]]></source>

   <p>
    どちらの場合も出力は同じです。
    </p>
</section>

<section name="Other Features">

<subsection name="Math">

<p>
Velocity は、<em>set</em> 指示子でテンプレートで使うことができる少数の
組み込み演算機能を持ちます。
以下の式は、それぞれ加算、減算、乗算、除算の例です：
</p>

<source><![CDATA[
#set( $foo = $bar + 3 )
#set( $foo = $bar - 4 )
#set( $foo = $bar * 6 )
#set( $foo = $bar / 2 )
]]></source>

<p>
除算が実行されるとき、結果は整数となります。
どんな余りも、余り（<em>%</em>）オペランドを使うことによって得ることができます。
</p>

<source><![CDATA[
#set( $foo = $bar % 5 )
]]></source>

<p>
整数だけ（...-2、-1、0、1、2...）許されます Velocity でいつの実行している数学的な式;
非整数が使われるとき、それはログに記録されます、そして、null は出力として返されることになります。
</p>

<p>
Velocity は、ゼロ除算を扱うことの組み込まれた方法を持ちます。
下記の例では：
</p>

<source><![CDATA[
#set( $foo = 5 )
#set( $bar = $foo - 5 )
#set( $uhoh = $foo / $bar )
$uhoh
]]></source>

<p>
リファレンス <em>$uhoh</em> は、ゼロによって割られる5の値を割り当てられます。
Velocity がこのテンプレートを提出するとき、出力があることになります：
</p>

<source><![CDATA[
$uhoh
]]></source>

<p>
デザイナーは <em>set</em> が生成する文字列に注意すべきです。
そして、それは範囲演算子によって使われる整数に変換されなければなりません。
この例は、そのような変換を示します：
</p>

<source><![CDATA[
#set($a = "7")
#set($b = $int.valueOf($a) + 10)
$b
]]></source>

  <p>
    この結果 <em>17</em> なります。
  </p>

  </subsection>

<subsection name="Range Operator">

<p>
範囲演算子は、<em>#set</em> と <em>#foreach</em> ステートメントと一緒に使うことができます。
範囲演算子は以下に説明する整数を含んでいるオブジェクト配列を生成に役立ちます：
</p>

<source><![CDATA[
[n..m]
]]></source>

<p>
<em>n</em> と <em>m</em> には、生成する整数が必要です。
<em>m</em> が、<em>n</em> より大きいか、より小さいかは重要ではありません;
より小さい場合には、範囲は単にカウントダウンします。
下記に範囲オペレーターの利用を示している例があります：
</p>

<source><![CDATA[
First example:
#foreach( $foo in [1..5] )
$foo
#end

Second example:
#foreach( $bar in [2..-2] )
$bar
#end

Third example:
#set( $arr = [0..1] )
#foreach( $i in $arr )
$i
#end

Fourth example:
[1..3]
]]></source>

  <p>
    以下の出力を生成します:
  </p>

<source><![CDATA[
First example:
1 2 3 4 5

Second example:
2 1 0 -1 -2

Third example:
0 1

Fourth example:
[1..3]
]]></source>

<p>
<em>#set</em> と <em>#foreach</em> 指令とともに使われるとき、
4番目の例で示されるように範囲オペレーターが配列を生成するだけである
ことに注意。
</p>

<p>
Web ページ・デザイナーは、標準サイズのテーブルを作成することに関心がありますが、
テーブルを埋めるほどの充分なデータを用意できない場合には、範囲オペレータが
役に立ちます。
</p>

  </subsection>

<subsection name="Advanced Issues: Escaping and !">

<p>
リファレンスは<em>!</em> 文字と、<em>\</em> エスケープ文字によって封じられた
<em>!</em> 文字でリファレンスが取り扱われる特別な方法。
</p>

<source><![CDATA[
#set( $foo = "bar" )
$\!foo
$\!{foo}
$\\!foo
$\\\!foo
]]></source>

   <p>
   レンダリング結果はこうなります
  </p>

<source><![CDATA[
$!foo
$!{foo}
$\!foo
$\\!foo
]]></source>

<p>
これを通常エスケープと比較してください、
ここで、<em>\</em> は <em>$</em> に先行します：
</p>

<source><![CDATA[
\$foo
\$!foo
\$!{foo}
\\$!{foo}
]]></source>

  <p>
    これは次のようにレンダリングされます
  </p>

<source><![CDATA[
\$foo
\$!foo
\$!{foo}
\bar
]]></source>

 </subsection>

</section>
  <subsection name="Velocimacro Miscellany"> 
    
   <p> 
このセクションでは、Velocimacro に関連するミニ-FAQ のトピックスです。
このセクションでは、つねに変更されるでしょう、そのために最新の情報は
常に確認してください。
   </p> 
    
   <p> 
   注意: この章では、「Velocimacro」は、「VM」と省略します。
   </p> 
    
   <strong>他の VM の引数として VM を直接渡したり指示できますか?</strong> 
    
   <p> 
   例 : <code>#center( #bold("hello") )</code> 
   </p> 
    
   <p> 
   いいえ。指示は、指示の有効な引数ではありません。
   一般的な目的としてVMは、指示です。
   </p> 
    
   <p> 
   <i>しかし...</i>、それを行ないたいです。ひとつの簡単な解決策は、
   ダブルクォート(")でその内容をレンダリングするという利点です。
   そのためには、このようにします。
   </p> 
    
   <source><![CDATA[ 
   #set($stuff = "#bold('hello')" ) 
   #center( $stuff ) 
   ]]></source> 
    
   <p> 
   省略して... 
   </p> 
    
   <source><![CDATA[ 
   #center( "#bold( 'hello' )" ) 
   ]]></source> 
    
   <p> 
   注意: 例の文字は、VM では<i>内部</i>は引数として評価され呼び出し時ではありません。
   言い換えれば、この VM に渡される引数は、
   言い換えると、VM への引数は、その全部でにおいてパスされて、
   それがパスされた VM の範囲内で評価されます。
  これは、このようにすることができます。
   </p> 
    
   <source><![CDATA[ 
    
   #macro( inner $foo ) 
     inner : $foo 
   #end 
    
   #macro( outer $foo ) 
      #set($bar = "outerlala") 
      outer : $foo 
   #end 
    
   #set($bar = 'calltimelala') 
   #outer( "#inner($bar)" ) 
    
   ]]></source> 
    
   <p> 
   ここで出力は
   </p> 
    
   <source><![CDATA[ 
   Outer : inner : outerlala 
   ]]></source> 
    
   <p> 
   なぜならば、"#inner($bar)" の評価は、#outer() の内部で発生するためで、
   そのため $bar 変数は #outer() 内部でセットされてその値が使われます。
   </p> 
    
   <p> 
   これは、意図的にガードされている機能です−引数は VM に「名前」がパスされます、
あなたが VM ものを手渡すことができるように、
例えばステートフルなリファレンスが好きにしてください
   </p> 
    
   <source><![CDATA[ 
   #macro( foo $color ) 
     <tr bgcolor=$color><td>Hi</td></tr> 
     <tr bgcolor=$color><td>There</td></tr> 
   #end 
    
   #foo( $bar.rowColor() ) 
   ]]></source> 
    
   <p> 
   そして rowColor() が繰り返し呼ばれ、1回行なわれます。これを禁止するには、
   VM の外側のメソッドを呼び出し、VM に値を渡してください。
   </p> 
    
   <source><![CDATA[ 
   #set($color = $bar.rowColor()) 
   #foo( $color ) 
   ]]></source> 
 

  <strong>#parse() から Velocimacro を登録できますか ? </strong> 
    
       <p> 
       現在、Velocimacro は、テンプレートで使うのに先立って定義しなければなりません。
       この意味は、#macro() 指示は、Velocimacro を使う前に来る必要があります。
       </p> 
    
       <p> 
       もし #parse() をテンプレートに含まれるインライン #macro() 指示で
       行なうとするときには、これは、とくに覚えておく必要がある重要事項です。
       なぜならば、#parse() が実行時に起こるのは、パーサーが
       テンプレートにある VM が探す要素が VM がパース時にに決定するので
       #parse() 実行は、VM 宣言の組が仮定されないのです。
       これを回避するために、単に <code>velocimacro.library</code>
       機能を使用して、あなたの VM の開始時に Velocity をロードします。
       </p> 

  <strong>Velocimacro 自動再ロードとは ?</strong>

  <p>
   <i>開発時</i>に使用するためのプロパティで、製品用ではありません。
  </p>
  
  <p>
  <code>velocimacro.library.autoreload</code>
  </p>

   <p>
   デフォルトは、 false です。 true にセットするには、下記のプロパティと<em>一緒に</em>使います。
   </p>
   
   <p>
   <code>&lt;type&gt;.resource.loader.cache = false</code>
   </p>
    
    <p>
    (ここで、 &lt;type&gt; は、'file' のようなあなたが使用するリソースローダーの名前です)
    そうすると Velocity エンジンは、自動的にあなたの Velocimacro 
ライブラリファイルが生成されたときに変更をリロードしようとします。
つまり、サーブレットエンジン(またはアプリケーション)を dump したり
なにか Velocimacro リソロードするための特別なトリックは必要ありません。
    </p>

    <p>
簡単なプロパティ設定はこのようになります。
    </p>

    <source><![CDATA[
    file.resource.loader.path = templates
    file.resource.loader.cache = false
    velocimacro.library.autoreload = true
    ]]></source>

    <p>
製品では使わないでください。
    </p>

</subsection>


<section name="Feedback">

<p>
あなたがこのマニュアルにおけるミスを見つけたり、Velocity ユーザー・ガイドと関係する他のフィードバックは <a href="mailto:velocity-user@jakarta.apache.org">Velocity ユーザメーリングリスト</a> に電子メールを送ってください。
ありがとう！
</p>

</section>

</body>
</document>

