Play Framework 2.2 のScalaテンプレート(views/*.scala.html)内に、再利用可能ブロックを定義してみました。

### まずはソース
#### app/views/index.scala.html ```html @(message: String)

@jslink(js: String) = { <script src=”@js” type="text/javascript"></script> } @title = @{ val head = “【テスト環境】” val appname = “hogehoge” head + appname }

<html> <head> <title>@title</title> <script src=”@routes.Assets.at(“javascripts/jquery-1.9.0.min.js”)” type="text/javascript"></script> @jslink(“http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js") @jslink(routes.Assets.at(“javascripts/jquery-1.9.0.min.js”).url) </head> <body> Hello World! </body> </html>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</div>
<div class="section">
    #### コンパイルされたScalaソース(target/scala-2.10/src_managed/main/views/html/index.template.scala)
    ```scala
package views.html

import play.templates._
import play.templates.TemplateMagic._

import play.api.templates._
import play.api.templates.PlayMagic._
import models._
import controllers._
import java.lang._
import java.util._
import scala.collection.JavaConversions._
import scala.collection.JavaConverters._
import play.api.i18n._
import play.core.j.PlayMagicForJava._
import play.mvc._
import play.data._
import play.api.data.Field
import play.mvc.Http.Context.Implicit._
import views.html._
/**/
object index extends BaseScalaTemplate[play.api.templates.HtmlFormat.Appendable,Format[play.api.templates.HtmlFormat.Appendable]](play.api.templates.HtmlFormat) with play.api.templates.Template1[String,play.api.templates.HtmlFormat.Appendable] {

    /**/
    def apply/*1.2*/(message: String):play.api.templates.HtmlFormat.Appendable = {
        _display_ {
def /*3.2*/jslink/*3.8*/(js: String):play.api.templates.HtmlFormat.Appendable = {_display_(

Seq[Any](format.raw/*3.24*/("""
	text/javascript">
""")))};def /*6.2*/title/*6.7*/ = {{
	val head = "テスト環境"
	val appname = "hogehoge"
	head + appname 
}};
Seq[Any](format.raw/*1.19*/("""

"""),format.raw/*5.2*/("""
"""),format.raw/*10.2*/("""
&lt;!DOCTYPE html>
&lt;html>
    &lt;head>
        &lt;title>"""),_display_(Seq[Any](/*14.17*/title)),format.raw/*14.22*/("""&lt;/title>
        &lt;script src=""""),_display_(Seq[Any](/*15.23*/routes/*15.29*/.Assets.at("javascripts/jquery-1.9.0.min.js"))),format.raw/*15.74*/("""" type="text/javascript">&lt;/script>
        """),_display_(Seq[Any](/*16.10*/jslink("http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"))),format.raw/*16.83*/("""
        """),_display_(Seq[Any](/*17.10*/jslink(routes.Assets.at("javascripts/jquery-1.9.0.min.js").url))),format.raw/*17.73*/("""
    &lt;/head>
    &lt;body>
        Hello World!
    &lt;/body>
&lt;/html>"""))}
    }
    
    def render(message:String): play.api.templates.HtmlFormat.Appendable = apply(message)
    
    def f:((String) => play.api.templates.HtmlFormat.Appendable) = (message) => apply(message)
    
    def ref: this.type = this

}
                /*
                    -- GENERATED --
                    DATE: Sat Dec 14 23:05:42 JST 2013
                    SOURCE: C:/usr/workspace/Java/playProject/app/views/index.scala.html
                    HASH: 12d570f04484050ca0b144e2def00f478fac70d9
                    MATRIX: 774->1|868->21|881->27|977->43|1028->59|1051->61|1109->99|1121->104|1223->18|1251->97|1279->176|1366->227|1393->232|1460->263|1475->269|1542->314|1622->358|1717->431|1763->441|1848->504
                    LINES: 26->1|28->3|28->3|30->3|31->4|31->4|32->6|32->6|37->1|39->5|40->10|44->14|44->14|45->15|45->15|45->15|46->16|46->16|47->17|47->17
                    -- GENERATED --
                */
            

#### 出力されたHTML ```html

<html> <head> <title>【テスト環境】hogehoge</title> <script src=”/assets/javascripts/jquery-1.9.0.min.js” type="text/javascript"></script>

&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript">&lt;/script>

    
&lt;script src="/assets/javascripts/jquery-1.9.0.min.js" type="text/javascript">&lt;/script>

&lt;/head>
&lt;body>
    Hello World!
&lt;/body>

</html>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
</div>
</div>
<div class="section">
    ### ざっくりとした解説
    まず、Scalaテンプレートファイルの先頭で、2種類の再利用可能ブロックを定義しています。
```html
@jslink(js: String) = {
	&lt;script src="@js" type="text/javascript">&lt;/script>
}
@title = @{
	val head = "【テスト環境】"
	val appname = "hogehoge"
	head + appname 
}

```1つ目の「jslink」は中括弧の先頭に「@」が無いため『再利用可能なコードブロック』で、2つ目の「title」は中括弧の先頭に「@」がある為『再利用可能な Scala のコードブロック』となっています。

<div class="section">
    #### 『再利用可能なコードブロック』
    内容はScalaテンプレートに変換されています。<br/>
コンパイルされたScalaソースを見ると、&lt;!DOCTYPE html>以下と同じような処理をされているようです。実際、
```html
@jslink(js: String) = {
	&lt;script src="@js" type="text/javascript">&lt;/script>
}
@jslink("http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js")
@jslink(routes.Assets.at("javascripts/jquery-1.9.0.min.js").url)

```これが
```html
&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript">&lt;/script>
&lt;script src="/assets/javascripts/jquery-1.9.0.min.js" type="text/javascript">&lt;/script>

```こう変換されました。<br/>
<br/>


</div>
<div class="section">
    #### 『再利用可能な Scala のコードブロック』
    内容はScalaコードそのものに変換されています。<br/>
コンパイルされたScalaソースを見ても、通常の関数定義に変換されているようです。実際、
```html
@title = @{
	val head = "【テスト環境】"
	val appname = "hogehoge"
	head + appname 
}
&lt;title>@title&lt;/title>

```これが
```html
&lt;title>【テスト環境】hogehoge&lt;/title>

```こう変換されました。<br/>
<br/>
<br/>


</div>
</div>
<div class="section">
    ### 参考URL
    
<ul>
<li><a href="http://www.playframework-ja.org/documentation/2.0.8/ScalaTemplates">http://www.playframework-ja.org/documentation/2.0.8/ScalaTemplates</a></li>
</ul>
</div>