# -*- coding: utf-8 -*- =encoding utf-8 =head1 NAME yatt_manual(ja) -- yatt 構文マニュアル (日本語版) =head1 SYNOPSIS =for code yatt <!yatt:args> <yatt:layout title="My hello world"> <yatt:myhello who="world!"/> </yatt:layout> <!yatt:widget myhello who> <h2>Hello &yatt:who;!</h2> <!yatt:widget layout title> <!doctype html> <title>&yatt:title;</title> <body> <yatt:body/> </body> =head1 Overview yatt ã®ãƒ†ãƒ³ãƒ—レートã¯ã€é€šå¸¸ã® HTML ã«ã€ B<åå‰ç©ºé–“ yatt:> ã§å§‹ã¾ã‚‹ yattã®æ§‹æ–‡è¦ç´ ã‚’åŠ ãˆãŸã‚‚ã®ã§ã™ã€‚ (åå‰ç©ºé–“㯠yatt ã®è¨å®šã§å¤‰æ›´å¯èƒ½ã§ã™ãŒã€ ã“ã®æ–‡æ›¸ã§ã¯ç°¡å˜ã®ãŸã‚ yatt: ã§èª¬æ˜Žã‚’統一ã—ã¾ã™) yatt ã®æ§‹æ–‡ã¯ XML ã«ä¼¼ã¦ã„ã¾ã™ãŒã€XML よりもå†å¸°æ€§ã‚’改善ã—ãŸã€ よりテンプレートå‘ãã®ç‹¬è‡ªæ§‹æ–‡ L<LRXML|YATT::Lite::LRXML::Syntax> (Loose but Recursive XML) を採用ã—ã¦ã„ã¾ã™ã€‚以下㯠LRXML ã®ä¸»ãªæ§‹æ–‡è¦ç´ ã¨ãã®å½¹å‰²ã®æ¦‚è¦ã§ã™ã€‚ =over 4 =item C<< <yatt: >> ... C<< /> >> =item C<< <yatt: >> ... C<< > >> ~ C<< </yatt:...> >> L<部å“(widget) ã®å‘¼ã³å‡ºã—|/Widget Invocation> =item C<< <:yatt: >> ... C<< /> >>~ =item C<< <:yatt: >> ... C<< > >> ~ C<< </:yatt:...> >> L<部å“(widget) ã¸ã®å¼•æ•°(ã‚¿ã‚°å½¢å¼)|/attribute element>. (引数ã®ä¸ã«æ›´ã«ã‚¿ã‚°ã‚’å«ã‚ãŸã„時ã«ä½¿ã†ã¨ã€HTML らã—ã„テンプレートãŒæ›¸ã‘ã¾ã™) =item C<< &yatt: >> ... C<< ; >> L<Entity å‚ç…§|/Entity reference> (埋ã‚è¾¼ã¿è¦ç´ :変数や関数呼ã³å‡ºã—) =item C<< <!yatt: >> ... C<< > >> L<yatt 宣言|/YATT Declaration> (部å“定義ã®å§‹ã¾ã‚Š) =item C<< <!--#yatt >> ... C<< --> >> L<コメント|/Comment block>. ã“ã®éƒ¨åˆ†ã¯ yatt ã®è§£æžå¯¾è±¡å¤–。 B<XXX:> å°†æ¥çš„ã«ã€é–‰ã˜ã‚’ C<< #--> >> ã«å¤‰æ›´ã™ã‚‹æ¡ˆãŒã‚ã‚Šã¾ã™ã€‚ =item C<< &yatt[[; >> ... C<< &yatt]]; >> =item C<< &yatt#num[[; >> ... C<< SINGULAR >> ... C<< &yatt||; >> ... C<< PLURAL >> ... C<< &yatt]]; >> 多国語化メッセージ. B<yatt xgettext> ã§æŠ½å‡ºã€‚ =item C<< <?yatt >> ... C<< ?> >>, C<< <?perl >> ... C<< ?> >> L<ターゲット言語ã®è¨˜è¿°ã‚’直接埋ã‚è¾¼ã¿ãŸã„時|/Processing instruction> =back =head1 Files yatt を用ã„㟠Web Application ã®å…¸åž‹çš„ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹æˆã®ä¾‹ã‚’挙ã’ã¾ã™ã€‚ . ├── app.psgi ├── cpanfile ├── lib ├── public │  ├── .htyattconfig.yml │  ├── hello.yatt │  ├── index.yatt │  ├── login.ydo │  └── other.html ├── static │  └── css │  └── main.css └── ytmpl ├── .htyattrc.pl ├── envelope.ytmpl └── error.ytmpl 一般的㪠F<.html>, F<.css> ã‚„ã€perl ã® L<PSGI> ベース㮠Web Application ã®æ¨™æº–çš„ãªãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚ã‚‹ F<.psgi>, F<cpanfile> 以外ã«ã€ yatt ã«å›ºæœ‰ãªãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—㦠F<.yatt>, F<.ytmpl>, F<.ydo>, F<.htyattconfig.yml>, F<.htyattrc.pl> ãŒå„所ã«ç½®ã‹ã‚Œã¦ã„ã¾ã™ã€‚以下ãã‚Œãžã‚Œã®å½¹å‰²ã‚’概説ã—ã¾ã™ã€‚ =over 4 =item C<*.yatt> Web Application ã¨ã—ã¦å¤–部ã«å…¬é–‹ã—ãŸã„ (public ãª) yatt ベースã®å‹•çš„ページã¯ã€ æ‹¡å¼µå F<.yatt> を付ã‘ã¦ã€Web Application ã®å…¬é–‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç›´æŽ¥é…ç½®ã—ã¾ã™ã€‚ 上記ã®ä¾‹ã§ã¯ F<public/> ディレクトリã«ç½®ã„ã¦ã„ã¾ã™ã€‚ (php ㌠F<.php> ファイルを公開ディレクトリã«é…ç½®ã™ã‚‹ã®ã¨åŒæ§˜ã§ã™) サブディレクトリも普通ã«æ‰±ãˆã¾ã™ã€‚公開ディレクトリã®åå‰ã¯è¨å®šã§å¤‰æ›´å¯èƒ½ã§ã™ã€‚ =item C<*.ytmpl> å対ã«ã€ãƒ¦ãƒ¼ã‚¶ã«è¦‹ã›ã‚‹äºˆå®šã®ç„¡ã„(B<private> ãª)テンプレートã«ã¯æ‹¡å¼µå F<.ytmpl> ã‚’ã¤ã‘ã¦ãã ã•ã„。公開ディレクトリã«ç½®ãã“ã¨ã‚‚å¯èƒ½ã§ã™ãŒè¡¨ç¤ºã¯æ‹’å¦ã•ã‚Œã¾ã™ã€‚通常ã¯ä¸Šè¨˜ã® F<ytmpl/> ã®ã‚ˆã†ã«ãƒ†ãƒ³ãƒ—レート専用ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆã—㦠ãã“ã«é…ç½®ã—ã¾ã™ã€‚ =item C<*.ydo> POST ã•ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã™ã‚‹å‡¦ç†ãªã©ã€ html 生æˆã‚ˆã‚Šã‚‚データã®æ“作㌠主ã§ã‚ã‚‹ã‚‚ã®ã¯ã€ãƒ†ãƒ³ãƒ—レートã®ä¸ã«æ›¸ã“ã†ã¨ã™ã‚‹ã¨å´ã£ã¦èªã¿ã«ãããªã‚Šã¾ã™ã€‚ ãã“ã§ãã®ã‚ˆã†ãªå‡¦ç†ã¯ç›´æŽ¥ perl ã§è¨˜è¿°å‡ºæ¥ã‚‹ã‚ˆã†ã€åˆ¥ã®ä»•çµ„ã¿ãŒç”¨æ„ã•ã‚Œã¦ã„ã¾ã™ã€‚ (ã“ã®æ–‡æ›¸ã§ã¯æ‰±ã„ã¾ã›ã‚“) =item C<.htyattconfig.yml>, C<.htyattconfig.xhf> ディレクトリ毎㮠L<YATT::Lite> ã‚’ãƒãƒ¼ãƒ‰ã™ã‚‹æ™‚ã«æ¸¡ã•ã‚Œã‚‹è¨å®šãƒ‘ラメータを記述ã—ã¾ã™ã€‚ 書å¼ã¯ YAML ã‹ L<XHF|YATT::Lite::XHF::Syntax> å½¢å¼ã§ã™ã€‚ =item C<.htyattrc.pl> ディレクトリ毎㮠Entity 関数を定義ã—ãŸã„時や〠ディレクトリ毎ã®å„種ãƒãƒ³ãƒ‰ãƒ©ã‚’オーãƒãƒãƒ¼ãƒ‰ã—ãŸã„時ã«ä½¿ã„ã¾ã™ã€‚ =back B<XXX:> 残念ãªãŒã‚‰ã€ç¾æ™‚点ã§ã¯ã€C<.htyattconfig.yml> 㨠C<.htyattrc.pl> ã®æ›´æ–°ã‚’åæ˜ ã•ã›ã‚‹ã«ã¯ã€ B<プãƒã‚»ã‚¹ã®å†èµ·å‹•> ãŒå¿…è¦ã§ã™ã€‚ =head1 Widget Invocation widget を呼ã³å‡ºã™ã«ã¯ã€ C<< <yatt:... > >> ã§å§‹ã¾ã‚‹ã‚¿ã‚°ã‚’書ãã¾ã™ã€‚ タグ㯠C<< /> >> ã§é–‰ã˜ã‚‹ empty element å½¢å¼ã‹ã€é–‰ã˜ã‚¿ã‚° C<< </yatt:... > >> ã‚’ 使ã†å½¢å¼ã€ã©ã¡ã‚‰ã§ã‚‚書ã‘ã¾ã™ã€‚引数㯠C< x="..." > ã®ã‚ˆã†ã«ã‚¿ã‚°ã®å±žæ€§ã¨ã—ã¦æ¸¡ã™ã‹ã€ L<引数を表ã™åˆ¥ã®ã‚¿ã‚°|/attribute element> ã¨ã—ã¦æ¸¡ã™ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ <!--foo ã®å‘¼ã³å‡ºã—. é–‰ã˜ã‚¿ã‚°ç„¡ã—. 引数ã¯å±žæ€§ x ã¨ã—ã¦æ¸¡ã™ä¾‹--> <yatt:foo x="hello!" y="world!"/> <!--é–‹ãタグ+閉ã˜ã‚¿ã‚°ã®ä¾‹ã€‚囲ã¾ã‚ŒãŸéƒ¨åˆ†ã¯ body 引数ã¨ã—ã¦æ¸¡ã•ã‚Œã¾ã™--> <yatt:foo x="hello!" y="world!"> my contents! </yatt:foo> <!--ä¸ã«å±žæ€§ã‚¿ã‚°å½¢å¼ã§å¼•æ•° x を書ã例--> <yatt:foo> <:yatt:x>hello!</:yatt:x> <:yatt:y>world!</:yatt:y> my contents! </yatt:foo> <!--属性タグã®ã€é–‰ã˜ã‚¿ã‚°ç„¡ã—å½¢å¼ã®ä¾‹--> <yatt:foo> my contents! <:yatt:x/> hello! <:yatt:y/> world! </yatt:foo> =head2 widget search order widget 㯠=over 4 =item * åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«å†… =item * → åŒä¸€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†… =item * → ä»–ã«æŒ‡å®šã•ã‚ŒãŸãƒ†ãƒ³ãƒ—レートディレクトリ =back ã®é †ã§æ¤œç´¢ã•ã‚Œã€æœ€åˆã«è¦‹ã¤ã‹ã£ãŸã‚‚ã®ãŒä½¿ã‚ã‚Œã¾ã™ã€‚B<検索ã¯ã‚³ãƒ³ãƒ‘イル時ã«> è¡Œã‚れ〠見ã¤ã‹ã‚‰ãªã„å ´åˆã¯ã‚³ãƒ³ãƒ‘イルエラーã¨ãªã‚Šã¾ã™ã€‚ =head2 widget B<path> 別ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリ内ã§å®šç¾©ã•ã‚ŒãŸ widget を呼ã³å‡ºã™äº‹ã‚‚å¯èƒ½ã§ã™ã€‚ ã“ã®å ´åˆã€ãƒ‘スåã‚’ C<:> ã§ã¤ãªã’ã¦æ›¸ãã¾ã™ã€‚(æ‹¡å¼µå F<.yatt> ã¯çœã„ã¦ä¸‹ã•ã„) 例ãˆã°ãƒ•ã‚¡ã‚¤ãƒ« F<foo/bar.yatt> ã®ä¸ã« <!yatt:widget baz> .... ãŒæœ‰ã£ãŸå ´åˆã€ã“れを F<index.yatt> ã‹ã‚‰å‘¼ã³å‡ºã™ã«ã¯ <yatt:foo:bar:baz/> ã¨æ›¸ãã¾ã™ã€‚ XXX: åŒã˜åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæœ‰ã£ãŸå ´åˆ =head2 XXX: positional arguments C<name=> ã‚’çœç•¥ã—ã¦å¼•æ•°ã‚’書ã話 =head2 XXX: path thru arguments 引数ã®å³è¾ºã« bareword を渡ã—ãŸã¨ãã®æŒ™å‹• =head2 Implicit arguments =head3 XXX: this, CON =head3 body argument X<body> å…¨ã¦ã® widget ã¯é–‰ã˜ã‚¿ã‚°ã‚’使ã†å½¢å¼ã§å‘¼ã³å‡ºã™ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ <yatt:foo> bar </yatt:foo> ã“ã®æ™‚ã€é–‰ã˜ã‚¿ã‚°ã¾ã§ã®é–“ã«æ›¸ã„ãŸè¨˜è¿°ã¯ã€æš—é»™ã®å¼•æ•° C<body> ã¨ã—㦠widget ã«æ¸¡ã•ã‚Œã¾ã™ã€‚ body 㯠(明示的ã«å®£è¨€ã—ãªã„é™ã‚Š) C<code> åž‹ã¨ã•ã‚Œã¾ã™ã€‚ ã“れを呼ã³å‡ºã™ã«ã¯, entity 呼ã³å‡ºã—å½¢å¼ã‹ã€widget 呼ã³å‡ºã—å½¢å¼ã€ ã©ã¡ã‚‰ã§ã‚‚使用ã§ãã¾ã™ã€‚ &yatt:body(); <yatt:body/> ã“ã‚Œã¯æœ€ã‚‚é »ç¹ã«ç¾ã‚Œã‚‹ã€ãƒ–ãƒãƒƒã‚¯å½¢å¼ã®éƒ¨å“を定義ã™ã‚‹ã¨ãã«å½¹ç«‹ã¡ã¾ã™ã€‚ <yatt:env title="mypage"> ...ã“ã“ã«å»¶ã€…ã¨æœ¬ä½“ã‚’... </yatt:env> <!yatt:widget env title> <h2>&yatt:title;</h2> <div class="content"> <yatt:body/> </div> =head2 attribute element é–‰ã˜ã‚¿ã‚°ã‚’使ㆠC<< <yatt:...> ... </yatt:...> >>å½¢å¼ã§ widget 呼ã³å‡ºã—を書ã„ãŸã¨ãã¯ã€ãã®ã‚¿ã‚°ã§å›²ã¾ã‚ŒãŸ body ã®ç®‡æ‰€ã«ã€ä»–ã®å¼•æ•°ã‚’特別ãªã‚¿ã‚° (属性タグ) ã¨ã—ã¦æ›¸ãã“ã¨ãŒã§ãã¾ã™ã€‚ (タグ型引数) ã“れを用ã„ã‚‹ã¨ã€html 属性 ã®ä¸ã«ã‚¿ã‚°çš„ãªè¨˜è¿°ã‚’æŒã¡è¾¼ã‚€å¿…è¦ã‚’減らã™ã“ã¨ãŒ 出æ¥ã¾ã™ã€‚ 属性タグã¯ã€å…ˆé ㌠C<< <:yatt... >> ã§å§‹ã¾ã‚‹ã‚¿ã‚°ã§ã™ã€‚ (lisp ã® C<:keyword> 引数ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã§ã™) 属性タグã®æ›¸ãæ–¹ã¯äºŒé€šã‚Šã‚り〠C<< /> >> ã§çµ‚ã‚る空è¦ç´ を使ã†å½¢å¼ã¨ã€ C<< </:yatt... >> é–‰ã˜ã‚¿ã‚°ã‚’æŒã¤å½¢å¼ã§ã™ã€‚ <yatt:env> ...body ã¨ã—ã¦æ¸¡ã•ã‚Œã‚‹éƒ¨åˆ†... <:yatt:title/> タイトル </yatt:env> <yatt:env> <:yatt:title> タイトル </:yatt:title> ...body ã¨ã—ã¦æ¸¡ã•ã‚Œã‚‹éƒ¨åˆ†... </yatt:env> =head1 BUILTIN Macro yatt ã®ã‚¿ã‚°ã¯ widget ã®å‘¼ã³å‡ºã—ã ã‘ã§ã¯ãªã〠他ã«ã‚‚制御構文を表ã™ã‚¿ã‚°ã«ã™ã‚‹ã“ã¨ã‚‚出æ¥ã¾ã™ã€‚ ã“れ㯠yatt ã®ãƒžã‚¯ãƒæ©Ÿèƒ½ã«ã‚ˆã£ã¦å®Ÿç¾ã•ã‚Œã¦ã„ã¾ã™ã€‚ L<YATT::Lite> ã«ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒãŒçµ„è¾¼ã¿å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚ =head2 C<yatt:my> X<my> 局所変数を宣言・åˆæœŸåŒ–ã—ãŸã„時ã«ä½¿ã„ã¾ã™ã€‚属性ã¨ã—㦠C<var="åˆæœŸå€¤"> を複数 書ãã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚åˆæœŸå€¤ã‚’çœç•¥ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ 変数ã«åž‹ã‚’指定ã™ã‚‹ã«ã¯ C<var:type="åˆæœŸå€¤"> ã®ã‚ˆã†ã« C<:> ã«ç¶šã‘㦠型åを書ãã¾ã™ã€‚型を指定ã—ãªã„å ´åˆã¯ L</text> åž‹ã«ãªã‚Šã¾ã™ã€‚ <yatt:my x=3 y=8 z /> <yatt:my foo="bar" val:value="&yatt:x; * &yatt:y;" /> é–‰ã˜ã‚¿ã‚°ã‚’用ã„ãŸå ´åˆã€è‡ªå‹•çš„ã« html åž‹ã®å¤‰æ•°å®£è¨€ã¨ãªã‚Šã€body ã«ç›¸å½“ã™ã‚‹éƒ¨åˆ†ãŒ 値ã¨ã—ã¦ç”¨ã„られã¾ã™ã€‚ <yatt:my foo> <h2>foobar</h2> </yatt:my> =head2 C<yatt:if>, C<:yatt:else> X<if> X<else> æ¡ä»¶åˆ†å²ã‚’記述ã—ãŸã„時ã«ä½¿ã„ã¾ã™ã€‚ <yatt:if "not &yatt:x;"> ...not x ã®æ™‚... <:yatt:else if="&yatt:x; < 10"/> ... x ㌠10 よりå°ã•ã„時 ... <:yatt:else/> ...ãã®ä»–... </yatt:if> =head2 C<yatt:foreach> X<foreach> ループを書ã時ã«ä½¿ã„ã¾ã™ã€‚ C<list="..."> ã«ãƒªã‚¹ãƒˆã‚’作るå¼ã‚’渡ã™ã¨ã€ ãã®ãƒªã‚¹ãƒˆã«å¯¾ã—ã¦ãƒ«ãƒ¼ãƒ—ã—ã¾ã™ã€‚ C<my=var> ã§ãƒ«ãƒ¼ãƒ—変数を宣言出æ¥ã¾ã™ã€‚ 宣言をçœç•¥ã—ãŸå ´åˆã¯ C<&yatt:_;> ãŒä½¿ã‚ã‚Œã¾ã™ã€‚ <yatt:foreach my=row list="&yatt:some_db_query();"> ...DB ã‹ã‚‰å–り出ã—ãŸä¸€è¡Œæ¯Žã«... </yatt:foreach> my ã§å¤‰æ•°ã‚’宣言ã™ã‚‹æ™‚ã«åž‹ã‚’指定ã™ã‚‹ã«ã¯ã€(変則的ã§ã™ãŒ) C<my:åž‹å=> ã®ã‚ˆã†ã«ã€ C<my> 㨠C<=> ã®é–“ã« C<:åž‹å> ã§åž‹ã‚’指定ã—ã¾ã™ã€‚ <yatt:foreach my:list=row list="&yatt:some_db_query();"> &yatt:row[0]; &yatt:row[1]; </yatt:foreach> =head2 C<yatt:return> X<return> エラー処ç†ãªã©ã§ Early return を書ããŸã„時ã«ä½¿ã„ã¾ã™ã€‚ C<if="..."> ã‹ C<unless="..."> ã®æ¡ä»¶å¼ã‚’渡ã™ã“ã¨ã§ã€æŒ‡å®šæ¡ä»¶æˆç«‹æ™‚ã« early return ã™ã‚‹ ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚(if, unless ã¯ç„¡ãã¦ã‚‚構ã„ã¾ã›ã‚“) <yatt:return if="&yatt:some_error;"> <h2>エラーãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼</h2> &yatt:some_error; </yatt:return> <yatt:my data:value="&yatt:get_some_data();"/> <yatt:return unless="&yatt:data;"> <h2>データãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸï¼</h2> </yatt:return> 注æ„点: C<yatt:return> ã¯å˜ãªã‚‹å®Ÿè¡Œã®æ‰“ã¡åˆ‡ã‚Šãªã®ã§ã€ãれ以å‰ã« 出力ã•ã‚ŒãŸå†…容ãŒæœ‰ã£ãŸå ´åˆã€ãれも出力ã•ã‚Œã¾ã™ã€‚ =head1 Entity Path Expression X<entpath> X<Entity reference> yatt ã§ã¯ãƒ†ãƒ³ãƒ—レートã¸ã®å€¤ã®åŸ‹ã‚è¾¼ã¿(ç½®æ›)ã‚’ (HTML/XMLã®) entity reference 記法を拡張ã—㟠Entity Path å¼ã§è¡¨ç¾ã—ã¾ã™ã€‚ HTML/XML ã® entity reference 㯠C<&>, C<"> ã®ã‚ˆã†ã« C<&> .. C<;> ã§è¡¨ç¾ã•ã‚Œã¾ã—ãŸãŒã€ yatt ã® Entity Path å¼ ã¯ C<&yatt> ã§å§‹ã¾ã‚Š C<;> ã§çµ‚ã‚ã‚Šã¾ã™ã€‚ (å‹¿è«–ã€ã“ã®æŽ¥é 辞 yatt ã‚‚è¨å®šã§å¤‰æ›´å¯èƒ½ã§ã™) 以下ã¯Entity Pathå¼ã®ä¾‹ã§ã™ã€‚ &yatt:foo; <!-- 変数 foo ã®å‚ç…§ --> &yatt:func(arg1,arg2); <!-- 関数 funcã®å‘¼ã³å‡ºã— --> &yatt:dict{name}; <!-- 辞書(ãƒãƒƒã‚·ãƒ¥è¡¨) dict ã®è¦ç´ å‚ç…§ --> &yatt:list[:x]; <!-- é…列 list ã®è¦ç´ å‚ç…§ --> é‡è¦ãªæ³¨æ„点ã§ã™ãŒã€ä¸€éƒ¨ã®ä¾‹å¤–を除ã〠Entity Pathå¼ã®ä¸ã«ã¯ B<スペースをãã®ã¾ã¾å«ã‚ã‚‹ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“>。 &yatt:func( space separated text ); <!-- ã‚¨ãƒ©ãƒ¼ï¼ --> ã“ã‚Œã¯æ„図的ã«åŠ ãˆãŸåˆ¶é™ã§ã™ã€‚ã‚ã¾ã‚Šè¤‡é›‘ãªæ§‹æ–‡ã‚’用æ„ã—ã¦ã‚‚〠既å˜ã® HTML/XML エディタã¨ã®ç›¸æ€§ãŒæ‚ªåŒ–ã™ã‚‹ã ã‘ã ã‹ã‚‰ã€ã¨ã„ã†ç†ç”±ã§ã™ã€‚ =head2 path element X<path element> Entity Pathå¼ã®ä¾‹ã‚’å†æŽ²ã—ã¾ã™ã€‚ &yatt:foo; <!-- 変数 foo ã®å‚ç…§ --> &yatt:func(arg1,arg2); <!-- 関数 funcã®å‘¼ã³å‡ºã— --> &yatt:dict{name}; <!-- 辞書(ãƒãƒƒã‚·ãƒ¥è¡¨) dict ã®è¦ç´ å‚ç…§ --> &yatt:list[:x]; <!-- é…列 list ã®è¦ç´ å‚ç…§ --> Entity Pathå¼ã®æ§‹æ–‡ã¯é–‹å§‹è¨˜å· C<&yatt> ã§å§‹ã¾ã‚Šã€ 一個以上㮠L</path element> ã®åˆ—ã®å¾Œã€æœ€å¾Œã«çµ‚äº†è¨˜å· C<;> ã§é–‰ã˜ã‚‰ã‚Œã¾ã™ã€‚ å¼ã®æ„味ã¯ã“ã® path element ã«ã‚ˆã£ã¦æ±ºã¾ã‚Šã¾ã™ã€‚ å…ˆã®ä¾‹ã‹ã‚‰ path element ã®ã¿ã‚’抜ã出ã™ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ :foo <!-- 変数 foo ã®å‚ç…§ --> :func(arg1,arg2) <!-- 関数 funcã®å‘¼ã³å‡ºã— --> :dict{name} <!-- 辞書(ãƒãƒƒã‚·ãƒ¥è¡¨) dict ã®è¦ç´ å‚ç…§ --> :list[:x] <!-- é…列 list ã®è¦ç´ å‚ç…§ --> path element ã®ã†ã¡ã€C<(..)>, C<[..]>, C<{..}> ã®ã‚ˆã†ã«æ‹¬å¼§ã‚’用ã„ã‚‹ã‚‚ã®ã¯ 以下ã®ç‰¹å¾´ãŒæœ‰ã‚Šã¾ã™ã€‚ =over 4 =item 括弧内ã®è¦ç´ 㯠C<,> ã§åŒºåˆ‡ã‚Šã¾ã™ 通常ã®è¨€èªžã®é–¢æ•°å‘¼ã³å‡ºã—ã¨é•ã„〠C<,> 㯠optional 㪠terminator ã¨ã—ã¦è§£é‡ˆã•ã‚Œã¾ã™ &yatt:func(); <!-- func() 引数ãªã— --> &yatt:func(1); <!-- func(1) 引数1㤠--> &yatt:func(1,); <!-- func(1) 引数2㤠--> &yatt:func(1,2); <!-- func(1,2) 引数2㤠--> &yatt:func(1,2,); <!-- func(1,2) 引数2㤠--> &yatt:func(1,2,,); <!-- func(1,2,'') 引数3㤠--> &yatt:func(1,2,()); <!-- func(1,2,'') 引数3㤠--> =item 括弧内ã®è¦ç´ 㯠C<:..> ã§å§‹ã¾ã‚‹ L</path element> ã¨ã€ãれ以外㮠L</literal element> ã«åˆ†é¡žã•ã‚Œã¾ã™ã€‚ 以下ã®ä¾‹ã§ã¯ã€ L<:val()|/entity_val> ã®å¼•æ•°ã¯ L</path element> ã§ã™ã€‚ &yatt:val(:foo); &yatt:val(:bar[3]); &yatt:val(:baz{foo}); 以下ã®ä¾‹ã§ã¯ã€ L<:val()|/entity_val> ã®å¼•æ•°ã¯ L</literal element> ã§ã™ã€‚ &yatt:val(other); &yatt:val({k,v,k2,v2}); &yatt:val([1,2,3]); =item 入れåã«ã™ã‚‹æ™‚ã¯C<&yatt> 㨠C<;> を書ãã¾ã›ã‚“。 括弧ã®è¦ç´ ã«ã¯ path element (ã‹ã€å¾Œè¿°ã® literal element) を入れåã§æ›¸ãã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ &yatt:func(&yatt:dict{name};,&yatt:list[:x];); <!-- ã‚¨ãƒ©ãƒ¼ï¼ --> &yatt:func(:dict{name},:list[:x]); <!-- æ£å¸¸ --> =item path element ã®å¾Œã«ã¯ã€åˆ¥ã® path element を続ã‘ã¦æ›¸ãã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ &yatt:object:method1():method2():method3(); &yatt:list[:x][:y]:method(); &yatt:dict{name}:method()[:ix]; =back =head3 C<:var> -- 変数å‚ç…§ X<:var> 変数 C<var> ã®å€¤ã‚’埋ã‚è¾¼ã¿ã¾ã™ã€‚例ãˆã°å¤‰æ•° C<bar> ã®å€¤ãŒ C<"BAR"> ã ã¨ã—ã¦ã€ foo &yatt:bar; baz 㯠foo BAR baz ã«ç½®æ›ã•ã‚Œã¾ã™ã€‚ =head3 C<:func(arg...)> -- 関数呼ã³å‡ºã— X<:func> ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã® .htyattrc.pl ã§å®šç¾©ã•ã‚ŒãŸ Entity C<"func"> を呼ã³å‡ºã—ã¾ã™ã€‚ 引数㯠C<,> ã§åŒºåˆ‡ã£ã¦è¤‡æ•°å€‹æ›¸ãã“ã¨ãŒã§ãã¾ã™ã€‚ 例ãˆã°ã€ã‚‚ã—引数ã®åˆè¨ˆã‚’計算ã™ã‚‹é–¢æ•° C<sum()> ㌠entity ã¨ã—ã¦å®£è¨€ã—ã¦ã‚ã‚Œã°ã€ 3+4+5 = &yatt:sum(3,4,5); 㯠3+4+5 = 12 ã«ç½®æ›ã•ã‚Œã¾ã™ã€‚ =head3 C<:dict{key}> -- 辞書ã‹ã‚‰å–り出㗠X<:dict> HASH(辞書)変数 C<dict> ã®è¦ç´ C<key> ã‚’å‚ç…§ã—ã¾ã™ã€‚ 例ãˆã°å¤‰æ•° C<car> ã«è¾žæ›¸ C<< {model => "Pulse", maker => "Renault"} >> ãŒå…¥ã£ã¦ã„ã‚‹å ´åˆã€ My car is &yatt:car{model};. 㯠My car is Pulse. ã«ç½®æ›ã•ã‚Œã¾ã™ã€‚ =head3 C<:list[ix]> -- é…列ã‹ã‚‰å–り出㗠X<:list> é…列変数 C<list> ã®è¦ç´ C<ix> ã‚’å‚ç…§ã—ã¾ã™ã€‚ =head2 literal element 引数をãã®ã¾ã¾è¿”ã™æ¨™æº– entity 関数 L<:val()|/entity_val> を用ã„㦠L<最åˆã® Entity ã®ä¾‹|/entpath>を書ãç›´ã—ã¦ã¿ã¾ã—ょã†ã€‚ &yatt:val(:var1); &yatt:val(:func(arg1,arg2)); &yatt:val(:dict{name}); &yatt:val(:list[:x]); ã“ã®æ‹¬å¼§ã®ä¸ã«ã¯ã€ä¸Šè¨˜ã®ã‚ˆã†ãª path element ã®ä»–ã«ã€ L<é…列|/:array-lireal>〠L<辞書(ãƒãƒƒã‚·ãƒ¥è¡¨)|/:hash-literal>〠L<æ–‡å—列|/:other-text>ã‚’ãã®ã¾ã¾åŸ‹ã‚込むã“ã¨ã‚‚出æ¥ã¾ã™ã€‚ ã“れを Entity Pathå¼ã® L</literal element> ã¨å‘¼ã³ã¾ã™ã€‚ &yatt:val([1,2,3]); &yatt:val({name,hkoba,age,XXX}); &yatt:val(rawstring); æ–‡å—列ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’å«ã‚ãŸã„å ´åˆã¯ã€æ–‡å—列全体を C<(...)> ã§å›²ã¿ã¾ã™ã€‚ &yatt:val((space separated string))); æ›´ã«æ–‡å—列 literal ã®å…ˆé ã« C<=> を入れãŸå ´åˆã€ Entity Pathå¼ã®è©²å½“箇所ã«(制é™ä»˜ããªãŒã‚‰)ホスト言語(Perl)ã®è¨ˆç®—å¼ã‚’埋ã‚込むã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ &yatt:val(=3*8); &yatt:val((= $x * $y)); =head3 C<{key,value...}> -- 辞書作り X<:hash-literal> 辞書(HASH表)ã‚’ãã®ã¾ã¾æ›¸ããŸã„å ´åˆã«ä½¿ã„ã¾ã™ã€‚ &yatt:val({foo,x,bar,y}{foo}); <!-- x ã‚’è¿”ã—ã¾ã™ --> &yatt:query(table,{user,hkoba,status,online}); &yatt:dbic:resultset(Artist):search({name,{like,John%}}); =head3 C<[val,val,...]> -- é…列作り X<:array-lireal> é…列をãã®ã¾ã¾æ›¸ããŸã„時ã«ä½¿ã„ã¾ã™ã€‚ &yatt:val([a,b,c][0]); <!-- a ã‚’è¿”ã—ã¾ã™ --> &yatt:query(table,[user,hkoba,status,online]); =head3 C<(spaced text)> -- 空白入り文å—列 X<:spaced-text> æ–‡å—列ã«ç©ºç™½ã‚„ C<,> ãªã©ã‚’å«ã‚ãŸã„時ã«ã¯ã€å…¨ä½“ã‚’ C<(...)> ã§å›²ã‚“ã§ä¸‹ã•ã„。 &yatt:query((select x, y from t)); 空文å—列(é•·ã•ã‚¼ãƒã®æ–‡å—列)を明示的ã«ä½¿ã„ãŸã„時も使ãˆã¾ã™ã€‚ &yatt:obj:someMethod(()); <!-- 空文å—列を引数ã¨ã—㦠obj.someMethod を呼㶠--> =head3 C<=expr>, C<(=expr)> -- è¨ˆç®—å¼ X<:expr> æ–‡å—列ã®å…ˆé ㌠C<=> ã§å§‹ã¾ã‚‹å ´åˆã€(perl ã®)å¼ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ 部分å¼ã«è¨ˆç®—å¼ã‚’書ããŸã„時ã«ä½¿ã„ã¾ã™ã€‚ &yatt:if(=$x<$y,yes,no); &yatt:if((= $x < $y),yes,no); =head3 C<..other-text..> -- æ–‡å—列 X<:other-text> 以上ã„ãšã‚Œã«ã‚‚属ã•ãªã„æ–‡å—列ã¯ã€å˜ãªã‚‹ãƒ†ã‚スト値ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ B<ç¾æ™‚点ã§ã¯> ã“ã“ã« perl ã® C<$var> å½¢å¼ã®å¤‰æ•°åŸ‹ã‚è¾¼ã¿ã‚’書ãã“ã¨ãŒè¨±ã•ã‚Œã¦ã„ã¾ã™ã€‚ =head2 Examples 例: &yatt:dict{foo}{:y}; &yatt:list[:y]; &yatt:x[0][:y][1]; &yatt:if(=$$list[0]or$$list[1],yes,no); &yatt:if(=$$list[0]*$$list[1]==24,yes,no); &yatt:if((=($$list[0]+$$list[1])==11),yes,no); &yatt:HTML(:dump([3])); &yatt:HTML([=3][0]); &yatt:HTML(=@$var); =head2 BUILTIN Entity B<XXX:> dump, render, HTML, default, join, url_encode, datetime, mkhash, breakpoint site_prefix, site_config, dir_config =head3 C<:val()> X<entity_val>, X<:val> 第一引数をãã®ã¾ã¾è¿”ã—ã¾ã™ã€‚第二引数以é™ã¯ç„¡è¦–ã—ã¾ã™ã€‚ &yatt:val(3); <!-- 3 ã‚’è¿”ã—ã¾ã™ --> &yatt:val(a,b,c); <!-- a ã‚’è¿”ã—ã¾ã™ --> &yatt:val(); <!-- undef(null) ã‚’è¿”ã—ã¾ã™ --> =head1 YATT Declaration yatt ã®ãƒ†ãƒ³ãƒ—レートã¯å®£è¨€æ–‡ã¨æœ¬æ–‡ã®ä¸¦ã³ã§ã™ã€‚ yatt宣言 㯠C<< <!yatt:... >> ã§å§‹ã¾ã‚Š C<< > >> ã§çµ‚ã‚ã‚Šã¾ã™ã€‚以下ã¯å®£è¨€ã®ä¾‹ã§ã™ã€‚ <!yatt:args x y="text" z='code' -- コメント -- body=[ title="text" name="text" ] > <!yatt:page "/doc/:item"> <!yatt:page other="/foo/:item"> <!yatt:widget another x y> 宣言ã®ä¸ã«æ›¸ã‘ã‚‹ã‚‚ã®ã¯ã€ä»¥ä¸‹ã®ã‚‚ã®ãŒæœ‰ã‚Šã¾ã™ã€‚ =over 4 =item C<name>, C<ns:name...> (ターゲット言語ã§è¨±ã•ã‚ŒãŸè˜åˆ¥å㨠C<:>) 引数やã€widget 自体ã®åå‰ã¯ã€(引用符抜ãã§) ãã®ã¾ã¾æ›¸ãã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ =item C<name=...> C<...>ã«ã¯ C<"..">, C<'..'>, C<[..]> ã„ãšã‚Œã‹ã®å¼•ç”¨è¨˜æ³•ã‹ã€ スペースã¨é–‰ã˜ã‚¿ã‚° C<< > >> ã‚’å«ã¾ãªã„æ–‡å—列を書ãã“ã¨ãŒã§ãã¾ã™ã€‚ =item C<"text in double quote">, C<'text in single quote'>, C<[ ... nested ... ]> 引数ã®åž‹ã‚„デフォルト値ã€ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚’書ãã¨ãã®è¨˜æ³•ã§ã™ã€‚ =item C<-- ... --> 宣言ã®ä¸ã«ã¯ L<-- ... -- ã§å›²ã‚“ã§|/Inline comment> コメントを書ãã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ =back =head2 C<< <!yatt:args ARGS...> >> X<!args> X<decl-args> X<default-widget> yatt ã§ã¯ã€æ‹¡å¼µå㌠F<*.yatt> åˆã¯ F<*.ytmpl> ã¨ãªã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯è‡ªå‹•çš„ã« widget ã¨ã—ã¦æ‰±ã‚ã‚Œã€ãƒ•ã‚¡ã‚¤ãƒ«åã‹ã‚‰ widget ã®åå‰ãŒä¸Žãˆã‚‰ã‚Œã¾ã™ã€‚例ãˆã° F<index.yatt> ã¯åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åˆ¥ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ C<< <yatt:index/> >> ã¨ã—ã¦å‘¼ã³å‡ºã™ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ ãã®ã‚ˆã†ã«ã—ã¦ä½œã£ãŸ widget ã¯(ファイルã®ä¸ã®) B<default widget> ã¨å‘¼ã°ã‚Œã¾ã™ã€‚ ã“ã® default widget ã«å¼•æ•°ã‚’渡ã›ã‚‹ã‚ˆã†ã«ã™ã‚‹ãŸã‚ã®å®£è¨€ãŒã€ C<< <!yatt:args> >> ã§ã™ã€‚ <!yatt:args x y> ...(以下ã€ã“ã®ãƒ†ãƒ³ãƒ—レートã§ã¯å¼•æ•°x 㨠y ãŒä½¿ç”¨å¯èƒ½ã«)... 引数ã«ã¯ L</Argument Declaration> を用ã„ã¦åž‹ã‚„デフォルト値を指定ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ ã¾ãŸã€L<URL Pattern|/subrouting> を用ã„ã¦, path_info ã®æ®‹ã‚Šã‚’引数ã«ç”¨ã„るよã†æŒ‡å®šã™ã‚‹ã“ã¨ã‚‚出æ¥ã¾ã™ã€‚ <!yatt:args "/:doc" x y> ... (引数 doc, x, y ãŒä½¿ç”¨å¯èƒ½ã«)... =head2 C<< <!yatt:widget NAME ARGS...> >> X<!widget> X<decl-widget> yatt ã§ã¯ä¸€ã¤ã®ãƒ†ãƒ³ãƒ—レートã®ä¸ã«è¤‡æ•°ã® widget を定義ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ <!yatt:widget foo x y> ...(foo ã®å®šç¾©)... <!yatt:widget bar x y> ...(bar ã®å®šç¾©)... ã“ã®ã‚ˆã†ã«ã—ã¦å®šç¾©ã—㟠widget 㯠(次㮠L</page> ã¨ã¯ç•°ãªã£ã¦) 内部的ãªã‚‚ã®ã§ã‚ã‚Šã€å¤–部ã‹ã‚‰ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã§å‹æ‰‹ã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã“ã¨ã¯æœ‰ã‚Šã¾ã›ã‚“。 =head2 C<< <!yatt:page NAME ARGS...> >> X<!page> X<decl-page> public 㪠widget を定義ã—ã¾ã™ã€‚一ã¤ã®ãƒ†ãƒ³ãƒ—レートファイル㧠複数㮠page を記述ã—ãŸã„時ã«ä½¿ã„ã¾ã™ã€‚ ファイル内㮠page を呼ã³å‡ºã™ã«ã¯ L</Request Sigil Mapping> ã‹ L<URL Pattern|/subrouting> を使ã£ã¦ä¸‹ã•ã„。 <h2>以下をã”記入ãã ã•ã„</h2> <form> ... <input type="submit" name="~confirm" value="確èª"> </form> <!yatt:page confirm> <h2>入力内容をã”確èªãã ã•ã„</h2> ... =head2 C<< <!yatt:action NAME> >> X<!action> X<decl-action> テンプレートã®ä¸ã« POST 動作も記述ã—ãŸã„時ã«ä½¿ã„ã¾ã™ã€‚ action 部分ã«æ›¸ã‘るプãƒã‚°ãƒ©ãƒ ã®è©³ç´°ã¯ L<XXX: (未完) prog_action|YATT::Lite::docs::prog_action> ã‚’å‚ç…§ã—ã¦ãã ã•ã„ <!yatt:page confirm> <h2>入力内容をã”確èªãã ã•ã„</h2> <form> ... <input type="submit" name="!register" value="登録"> </form> <!yatt:action register> ...(ã“ã“ã‹ã‚‰perl ã®ãƒ—ãƒã‚°ãƒ©ãƒ )... =head1 Request Sigil Mapping =head2 C<~PAGE=title>, C<~~=PAGE> page を呼ã³å‡ºã™ã«ã¯ POST/GET ã® parameter ã« C<~ページå=...> ã‹ C<~~=ページå> ã‚’å«ã‚ã¦ä¸‹ã•ã„。(B<...> 部分ã¯ä»»æ„ã®æ–‡å—列ã§æ§‹ã„ã¾ã›ã‚“。) (複数åŒæ™‚ã«é€ä¿¡ã—ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™) 例ãˆã° <input type="submit" name="~back" value="戻る"> <input type="submit" name="~confirm" value="確èªç”»é¢ã¸é€²ã‚€"> ã‚ã‚‹ã„㯠<input type="hidden" name="~~" value="confirm"> <input type="submit" value="確èªç”»é¢ã¸é€²ã‚€"> (submit ボタンãŒä¸€ã¤ã—ã‹ç„¡ã„ã¨ãã¯ã€å¾Œè€…ã®æ–¹ãŒå®‰å…¨ã§ã™) =head2 C<!ACTION=title>, C<!!=ACTION> action を呼ã³å‡ºã™ã«ã¯ POST/GET ã® parameter ã« C<!ページå=...> ã‹ C<!!=ページå> ã‚’å«ã‚ã¦ä¸‹ã•ã„。(B<...> 部分ã¯ä»»æ„ã®æ–‡å—列ã§æ§‹ã„ã¾ã›ã‚“。) (複数åŒæ™‚ã«é€ä¿¡ã—ãŸå ´åˆã¯ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™) 例ãˆã° <input type="submit" name="~back" value="戻る"> <input type="submit" name="!register" value="登録ã™ã‚‹"> ã‚ã‚‹ã„㯠<input type="hidden" name="!!" value="register"> <input type="submit" value="登録ã™ã‚‹"> (ã“れもã€submit ボタンãŒä¸€ã¤ã—ã‹ç„¡ã„ã¨ãã¯ã€å¾Œè€…ã®æ–¹ãŒå®‰å…¨ã§ã™) =head1 Inline URL Router X<subrouting> yatt ã® args åˆã¯ page ã«ã¯ã€URL パターンを書ã事ãŒå‡ºæ¥ã¾ã™ã€‚ パターン㯠yatt 宣言ã®ä¸ã®å…ˆé (引数よりもå‰)ã« æ–‡å—åˆ—å½¢å¼ (C<'/...'> ã‹ C<"/...">) ã§æ›¸ãã¾ã™ã€‚ パターンã®å‰ã« C<è˜åˆ¥å=> ã‚’åŠ ãˆã¦ C<name="/..パターン.."> ã®å½¢å¼ã§æ›¸ã„ãŸå ´åˆã€ C<name> ㌠widget ã®åå‰ã¨ã—ã¦ç”¨ã„られã¾ã™ã€‚ C<name=> ã‚’çœç•¥ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ã“ã®å ´åˆã€URLパターンã‹ã‚‰ widget åãŒè‡ªå‹•ç”Ÿæˆã•ã‚Œã¾ã™ã€‚ (パターンã¯å¿…ãš C<"/"> ã§å§‹ã¾ã‚‹å¿…è¦ãŒæœ‰ã‚Šã¾ã™ã€‚(å°†æ¥ã®æ‹¡å¼µã®ãŸã‚)) =head2 C<< <!yatt:args "ROUTE" ARGS...> >> X<decl-args-route> <!yatt:args "/:user"> ... &yatt:user; ... (C<!yatt:args> 㯠(æ—¢ã«åå‰ãŒæ±ºã¾ã£ã¦ã„ã‚‹ã®ã§) C<name=> ã¯ä¸è¦ã§ã™ã€‚) =head2 C<< <!yatt:page "ROUTE" ARGS...> >> <!yatt:page "/admin/:action" x y z> ... =head2 C<< <!yatt:page NAME="ROUTE" ARGS...> >> <!yatt:page blog="/blog/:article_id"> ... &yatt:article_id; ... <!yatt:page blog_comments="/blog/:article_id/:comment_id"> ... &yatt:article_id; ... &yatt:comment_id; ... =head2 Routing patterns 実際ã®ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã§ã¯ã€æœ€åˆã« page ã®ãƒ‘ターンãŒä¸Šã‹ã‚‰é †ã«è©¦ã•ã‚Œã€ 最後㫠args ã®ãƒ‘ターンãŒè©¦ã•ã‚Œã¾ã™ã€‚ =head3 C<:VAR> X<route-colon notation> C<[^/]+> ã«ãƒžãƒƒãƒã—ãŸã‚‚ã®ãŒã€å¼•æ•° C<:VAR> ã«æ¸¡ã•ã‚Œã¾ã™ã€‚ <!yatt:page '/authors/:id'> <!yatt:page '/authors/:id/edit'> <!yatt:page '/articles/:article_id/comments/:id'> =head3 C<{VAR}> X<route- curly notation> <!yatt:page "/{controller}/{action}/{id}"> <!yatt:page '/blog/{year}/{month}'> =head3 C<{VAR:REGEXP}> X<route-curly with regexp notation> <!yatt:page '/blog/{year:[0-9]+}/{month:[0-9]{2}}'> =head3 C<{VAR:NAMED_PATTERN}> X<route-curly with named pattern notation> <!yatt:page '/blog/{year:digits}-{month:digits}'> B<XXX:> named_pattern ã®æ‹¡å¼µæ–¹æ³•ã‚’書ã‹ãã°... ç¾çŠ¶ã§ã¯å¤‰æ•°ã®åž‹åã¨ã¯ç„¡é–¢ä¿‚ã§ã™ã€‚ =head3 C<(PATTERN)> X<route-optional match notation> C<(PAT)> ã¯ã€å¾Œã‚ã«æ£è¦è¡¨ç¾ã® C<?> を付ã‘㦠C<(PAT)?> ã¨ã—ã¦è§£é‡ˆã•ã‚Œã¾ã™ã€‚ ã¤ã¾ã‚Š, (..) ã«ãƒžãƒƒãƒã™ã‚‹å†…容ãŒç„¡ã„ケースも許ã™ãƒ‘ターンを書ããŸã„ã¨ãã«ä½¿ã„ã¾ã™ã€‚ <!yatt:args "/:article(/:comment(/:action))"> =head1 Argument Declaration <!yatt:args x y z -- 3ã¤ã®å¼•æ•° x y z を宣言。-- title="text?Hello world!" -- textåž‹ã®å¼•æ•° title を宣言, デフォルト値㯠Hello world -- yesno="bool/0" -- boolåž‹ã®å¼•æ•° yesno を宣言, デフォルト値㯠0 -- > yatt ã® widget ã«ã¯å¼•æ•°ã‚’宣言ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚引数宣言㯠æ£å¼ã«ã¯ C<引数å = "åž‹å ãƒ•ãƒ©ã‚°æ–‡å— ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤"> ã®å½¢å¼ã§æ›¸ã‹ã‚Œã¾ã™ã€‚ ã“ã®å†…ã€åž‹åã¯çœç•¥å¯èƒ½ã§ã€çœç•¥æ™‚㯠L<text|/text> åž‹(出力時ã«å…¨ã¦ escape ã•ã‚Œã‚‹)ã« ãªã‚Šã¾ã™ã€‚ 引数ã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’指定ã™ã‚‹ã«ã¯ã€åž‹åã¨åŒºåˆ¥ã™ã‚‹ãŸã‚〠L<デフォルト・フラグ文å—|/DEFAULT FLAG> を書ã„ã¦ã‹ã‚‰ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’続ã‘ã¦æ›¸ãã¾ã™ã€‚ 以下ã¯æ£ã—ã„引数宣言ã®ä¾‹ã§ã™ã€‚ x y=text z="text" victor="text?bar" dave ="?baz" ginger= "?" =head1 TYPE 引数ã«ã¯(escapeã®)åž‹ãŒã‚ã‚Šã¾ã™ã€‚型を指定ã—ãªã‹ã£ãŸå ´åˆã¯ L</text> åž‹ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ =head2 C<text> X<text> 出力時㫠escape ã•ã‚Œã¾ã™ã€‚通常ã¯ã“ã¡ã‚‰ã‚’用ã„ã¾ã™ã€‚ <yatt:foo x="my x" y="my y"/> <!yatt:widget foo x y="text"> &yatt:x; &yatt:y; =head2 C<html> X<html> 引数ã¨ã—ã¦æ¸¡ã•ã‚Œã‚‹å€¤ãŒã€æ—¢ã«å¤–å´ã§ä½•ã‚‰ã‹ã®æ–¹æ³•ã§ 安全㪠html ã¸ã¨ escape 済ã¿ã§ã‚ã‚‹ã¨åˆ†ã‹ã£ã¦ã„ã‚‹å ´åˆã«æŒ‡å®šã—ã¾ã™ã€‚ (ãªãŠ body 引数ã®è§£èª¬ã¯ L<ã“ã¡ã‚‰|/body> ã‚’å‚ç…§ã—ã¦ãã ã•ã„) <yatt:bq> <h2>foo</h2> bar </yatt:bq> <!yatt:widget bq body=html> <blockquote> &yatt:body; </blockquote> =head2 C<value> X<value> 引数ã«æ›¸ã„ãŸã‚‚ã®ãŒã‚¿ãƒ¼ã‚²ãƒƒãƒˆè¨€èªž(perl) ã®è¨ˆç®—å¼ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ 数値ãªã©è¨ˆç®—çµæžœã‚’渡ã—ãŸã„時ã«ä½¿ã„ã¾ã™ã€‚ 例 <yatt:expr_and_result expr="3 * 4" val="3 * 4"/> <!yatt:widget expr_and_result expr=text val=value> &yatt:expr; = &yatt:val; ã“ã®çµæžœã¯ä»¥ä¸‹ã®ã‚ˆã†ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ 3 * 4 = 12 =head2 C<bool> X<bool> フラグ用ã®åž‹ã§ã™ã€‚C<=1> ã‚’çœç•¥å‡ºæ¥ã‚‹ä»¥å¤–ã¯ã€L</value> åž‹ã¨åŒã˜ã§ã™ã€‚ <yatt:foo use_header/> <!yatt:widget foo use_header="bool/0"> <yatt:if "&yatt:use_header;"> ... </yatt:if> =head2 C<list> X<list> 引数ã¨ã—ã¦ã‚¿ãƒ¼ã‚²ãƒƒãƒˆè¨€èªžã®ãƒªã‚¹ãƒˆå½¢å¼ã®ãƒ‡ãƒ¼ã‚¿ã‚’渡ã—ãŸã„ã¨ãã«ä½¿ã„ã¾ã™ã€‚ <yatt:mymenu list="1..5"/> <yatt:mymenu list="&yatt:some_db_query();"/> <!yatt:widget mymenu items=list> <ul> <yatt:foreach my=item list=items> <li>&yatt:item;</li> </yatt:foreach> </ul> =head2 C<code> X<code> æ¡ä»¶å¼ã‚„ widget を渡ã—ãŸã„ã¨ãã«ä½¿ã„ã¾ã™ã€‚é…延評価ã•ã‚Œã¾ã™ã€‚ widget ã®å ´åˆã€æ›´ã«å¼•æ•°ã®åž‹æŒ‡å®šãŒå¯èƒ½ã§ã™ã€‚ (L<暗黙㮠body 引数|/body argument>ã¯ã“ã®åž‹ã«ãªã‚Šã¾ã™ã€‚) <!yatt:widget myquote author=[code name=text url=text]> <yatt:foreach my=rec list="&yatt:some_db_query();"> ... <yatt:author name="&yatt:rec{name};" url="&yatt:rec{url};" /> ... </yatt:foreach> =head2 XXX: C<attr> X<attr> =head2 XXX: C<delegate> X<delegate> XXX: C<[delegate -exclude_var]> =head1 DEFAULT FLAG =head2 C<|> - C<undef>, C<"">, C<0> X<|> 値㌠C<undef>, C<"">, C<0> ã®æ™‚ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ (覚ãˆæ–¹ï¼šperl ã® C<||> ã«ç›¸å½“) <!yatt:args x="| 1"> =head2 C<?> - C<undef>, C<""> X<?> 値㌠C<undef>, C<""> ã®æ™‚ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ (覚ãˆæ–¹ï¼šã‚ーボード㮠C</> ã« shift ã‚’åŠ ãˆã‚‹ã¨ C<?>) <!yatt:args x="?foo" y="html?bar"> =head2 C</> - C<undef> X</> 値㌠C<undef> ã®æ™‚ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚ (覚ãˆæ–¹ï¼šperl ã® C<//> ã«ç›¸å½“) <!yatt:args x="bool/0"> =head2 C<!> - mandatory X<!> å¿…ãšæŒ‡å®šã—ãªã‘ã‚Œã°ãªã‚‰ãªã„引数ã§ã‚ã‚‹ã“ã¨ã‚’宣言ã—ã¾ã™ã€‚ ã“ã®æŒ‡å®šãŒã‚ã‚‹å ´åˆã€å¼•æ•°ã‚’忘れるã¨ã‚³ãƒ³ãƒ‘イルエラー扱ã„ã«ãªã‚Šã¾ã™ã€‚ <!yatt:args title="!" x="value!"> =head1 Comment block B<XXX:> å°†æ¥çš„ã«ã€é–‰ã˜ã‚’ C<< #--> >> ã«å¤‰æ›´ã™ã‚‹æ¡ˆãŒã‚ã‚Šã¾ã™ã€‚ C<< <!--#yatt ... --> >> ã§å›²ã¾ã‚ŒãŸç¯„囲㯠yatt ã®è§£æžå¯¾è±¡ã‹ã‚‰å¤–ã•ã‚Œã€ ã¾ãŸå‡ºåŠ›ã«ã‚‚出ã•ã‚Œã¾ã›ã‚“。ã“ã‚Œã«å¯¾ã—〠C<#yatt> ã‚’å«ã¾ãªã„普通㮠C<< <!--...--> >> ã¯ã€ãã®é€šã‚Šã«å‡ºåŠ›ã•ã‚Œã¾ã™ã€‚ ã‚‚ã— yatt ã®ãƒ†ãƒ³ãƒ—レートã«ã†ã¾ãå‹•ã‹ãšã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ç®‡æ‰€ãŒã‚る時ã«ã€ ãã“をコメントアウトã™ã‚‹(å—é¢ä¸Šã¯æ®‹ã—ã¤ã¤ã€æ©Ÿèƒ½ã¯ã•ã›ãªã„〠å˜ãªã‚‹ã‚³ãƒ¡ãƒ³ãƒˆã«ã™ã‚‹)ã«ã¯ã€å¿…ãš C<#yatt> ã®ã¤ã„ãŸã€ yatt ã®ã‚³ãƒ¡ãƒ³ãƒˆã‚’使ã£ã¦ä¸‹ã•ã„。 =head2 Inline comment L<!yatt宣言|/YATT Declaration> ã‚„ L<widget 呼ã³å‡ºã—ã‚¿ã‚°|/Widget Invocation>, L<タグ型引数|/attribute element> ã®ä¸ã«ã‚‚ã€åˆ¶é™ä»˜ããªãŒã‚‰ C<-- ... --> ã§ã‚³ãƒ¡ãƒ³ãƒˆã‚’書ã入れるã“ã¨ãŒå‡ºæ¥ã¾ã™(タグ内コメント)。 制é™ã¨ã—ã¦ã¯ã€ã€Œä½¿ãˆã‚‹æ–‡å—ãŒåˆ¶é™ã•ã‚Œã‚‹(ex. ä¸ã«ã‚¿ã‚°ã¯æ›¸ã‘ãªã„)ã€ã€ 「タグã®çµ‚ã‚ã‚Š, コメントã®çµ‚ã‚ã‚Šã€ã¨èª¤è§£ã•ã‚Œã‚‹æ›¸ãæ–¹ã¯å‡ºæ¥ãªã„ã€ãŒã‚ã‚Šã¾ã™ã€‚ タグ内コメントã®ä¾‹ã‚’挙ã’ã¾ã™ã€‚ <yatt:foo id="myfoo" -- id="mybar" ã¨æ›¸ã“ã†ã¨æ€ã£ãŸã‘ã©ã‚„ã‚㟠-- > ... <:yatt:title -- ã“ã“ã«ã‚‚コメントを書ã‘ã¾ã™ -- /> <h2>ã‚れやã“れや</h2> </yatt:foo> <!yatt:widget foo id -- id ã«ã¯ dom id を入れã¦ä¸‹ã•ã„, ã¨ã‹ãªã‚“ã¨ã‹ -- title -- title ã«ã¯â—‹â—‹ã‚’入れã¦ä¸‹ã•ã„... -- > ... =head1 Processing instruction =over 4 =item C<< <?perl= ... ?> >> 処ç†çµæžœã‚’ escape ã—ã¦å‡ºåŠ›ã—ã¾ã™ã€‚ =item C<< <?perl=== ... ?> >> escape ã›ãšã«ã€ç”Ÿã®ã¾ã¾ã§çµæžœã‚’出力ã—ã¾ã™ã€‚ =item C<< <?perl ... ?> >> å˜ç´”ã«å‡¦ç†ã ã‘è¡Œã„ã¾ã™ã€‚ =back