Skip to content

03.05.モックカスタムタグ、ファンクション

Akinori Yamada edited this page Aug 21, 2014 · 3 revisions

モックカスタムタグ、ファンクションのドキュメントです。

project.yaml

project.yamlのfunctionとtag項目を設定すると、カスタムタグやファンクションのモックをGroovyスクリプトで実装することができます。

tag.root

カスタムタグのルートディレクトリです。プロジェクトルートからの相対パスを指定します。

function.root

カスタムファンクションのルートディレクトリです。プロジェクトルートからの相対パスを指定します。

tag:
  root: ./tag

function:
  root: ./function

Freemarker

Freemarkerのカスタムディレクトリをカスタムタグとして、Shared Variableに登録するオブジェクトをカスタムファンクションとしてサポートします。

モックタグの作成

タグルートディレクトリに、呼び出したいタグ名.groovyでスクリプトを作成します。Struts2のs.textのような命名のタグにも対応しています。

スクリプト内では、ビルトイン変数に加え、Freemarkerの独自の変数が利用できます。

変数名 内容
_env freemarker.core.Environment 環境設定オブジェクト
_params java.util.Map タグの属性値Map
_loopVars freemarker.template.TemplateModel[] ループ変数
_body freemarker.template.TemplateDirectiveBody タグのbody部分
_writer java.io.Writer タグ出力結果のWriter
_data java.util.Map データファイルのデータ

特殊なclassを持つspanタグを作ってみましょう。span.groovyでスクリプトを作成します。

_writerにタグの出力結果を追記していきます。タグに指定された属性も指定し、@spanタグの内部も評価するスクリプトは以下のようになります。

span.groovy
_writer.write("""<span""")

// add class attribute
_writer.write(""" class="special-span" """)

// write tag attributes
for (entry in _params) {
    _writer.write(""" ${entry.key}=\\"${entry.value}\\"""")
}

_writer.write(""">""")
if (_body != null) {
    // render inner body.
    _body.render(_writer)
}
_writer.write("""</span>""")

作成したtagは以下のように呼び出すことができます。

test.ftl
<body>
<@span>aaaa</@span>
</body>

モックファンクションの作成

ファンクションルートディレクトリに、呼び出したいファンクション名.groovyでスクリプトを作成します。

スクリプト内では、ビルトイン変数に加え、Freemarker独自の変数が利用できます。

staticUrlという関数のモック実装です。与えられたURI文字列にAeromockのホスト名を付加して返すファンクションです。

staticUrl.groovy
if (arguments.isEmpty()) {
  throw new RuntimeException("Argument required")
}
return "http://localhost:3183${arguments[0]}"

作成したfunctionは以下のように呼び出すことができます。

test.ftl
<body>
${staticUrl('/img/sample.jpg')}
</body>
変数名 内容
arguments java.util.List ファンクションの引数
_data java.util.Map データファイルのデータ

Handlebars.java

Handlebars.javaのHelpersをfunctionとしてサポートしています。tagは利用しません。

モックファンクションの作成

ファンクションルートディレクトリに、呼び出したいファンクション名.groovyでスクリプトを作成します。

スクリプト内では、ビルトイン変数に加え、Handlebars.java独自の変数が利用できます。

変数名 内容
argument ファンクションの引数による ファンクションの引数
options com.github.jknack.handlebars.Options @See Options.java
_data java.util.Map データファイルのデータ

staticUrlという関数のモック実装です。与えられたURI文字列にAeromockのホスト名を付加して返すファンクションです。

staticUrl.groovy
if (argument == null || argument.length() == 0) {
    throw new IllegalArgumentException("Argument required")
}
return "http://${HOST}${argument}"

作成したHelperは以下のように呼び出すことができます。

test.hbs
<li>staticUrl(original) = <img src="{{staticUrl "/img/sample.jpg"}}"/></li>

Jade4j

Jade4jのHelpersをfunctionとしてサポートしています。tagは利用しません。

モックファンクションの作成

ファンクションルートディレクトリに、呼び出したいファンクション名.groovyでスクリプトを作成します。

Jade4jのモックファンクションスクリプトでは、現状スクリプト内でビルトイン変数やデータファイルのデータを参照することはできません。

Jade4jのHelpersは特定のインタフェースの縛りがありません。そのため、Helperクラスそのものをスクリプト内で定義する必要があります。

math.round(1.44)という、任意の値を丸めることができるHelperを作成します。math.groovyという名前で作成します。このスクリプトでは、Helperのクラスを定義し、そのインスタンスを作成して返します。FreemarkerやHandlebars.javaとはアプローチが違うので注意です。

math.groovy
class MathHelper {

    long round(double number) {
        return Math.round(number)
    }

}

return new MathHelper()

作成したHelperは以下のように呼び出すことができます。

test.jade
p= math.round(1.44)

Velocity

Velocimacrosがあるので、Aeromockとしてはカスタムタグ・ファンクションとしてのサポートはしていません。

Groovy Templates

Groovy Templatesはテンプレートそのものがスクリプトであるため、Aeromockとしてはカスタムタグ・ファンクションとしてのサポートはしていません。

Thymeleaf

ThymeleafのUtility Objectをfunctionとしてサポートしています。tagは利用しません。

モックファンクションの作成

ファンクションルートディレクトリに、呼び出したいファンクション名.groovyでスクリプトを作成します。

Thymeleafのモックファンクションスクリプトでは、現状スクリプト内でビルトイン変数やデータファイルのデータを参照することはできません。

ThymeleafのUtility Objectは特定のインタフェースの縛りがありません。そのため、Utility Objectクラスそのものをスクリプト内で定義する必要があります。

helperという変数から呼び出すことができるUtility Objectを作成します。ファンクションルートにhelper.groovyで作成します。このスクリプトでは、UtilityObjectのクラスを定義し、そのインスタンスを作成して返します。

helper.groovy
class HelperUtilityObject {

    long round(double number) {
        return Math.round(number)
    }

    String hello(String message) {
        return "Hello!! $message"
    }

}
return new HelperUtilityObject()

作成したUtility Objectは以下のように呼び出すことができます。

<h4>function</h4>
<ul>
    <li><span th:text="${#helper.hello('neko')}">hoge</span></li>
    <li><span th:text="${#helper.round(1.1)}">hoge</span></li>
</ul>
Clone this wiki locally