Skip to content

Instantly share code, notes, and snippets.

@nanto
Created November 12, 2014 03:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nanto/27c25094ba7788da50f3 to your computer and use it in GitHub Desktop.
Save nanto/27c25094ba7788da50f3 to your computer and use it in GitHub Desktop.
Text::Xslate::TTerse の undocumented な動作
Out of WRAPPER
[%- WRAPPER 'wrapper.tt' WITH arg1 = var, arg2 = 'literal' -%]
arg2: [% arg2 %]
[%- END -%]
use strict;
use warnings;
use Text::Xslate;
my $tx = Text::Xslate->new(syntax => 'TTerse', cache => 0);
print $tx->render('content.tt', { var => 42 });
arg1: [% arg1 %]
content: [% content %]
@nanto
Copy link
Author

nanto commented Nov 12, 2014

render.pl の実行結果は:

Xslate: Useless use of text 'Out of WRAPPER' at render.pl line 6.
arg1: 42
content: arg2: literal

ここから 3 つの文書化されていない挙動がうかがえる。

  1. WRAPPER ステートメントの外側の記述 (Out of WRAPPER) は無視される。
    • ドキュメント には WRAPPER ステートメントの外側に関する記述はない。
  2. WRAPPER ステートメントの引数 (arg1) に変数 (var) を渡せる。
    • ドキュメントには “The argument of WRAPPER, however, must be string literals,” とある。
  3. WRAPPER ステートメントの内容において、引数 (arg2) を変数のように扱える。

@gfx
Copy link

gfx commented Nov 12, 2014

いずれの挙動も、今後互換性を壊す変更はしないつもりです。この挙動をテストするコードをpull-requestでいただけると、意図せず壊すこともなくなります。

具体的には、1はドキュメント化されてないだけで想定どおりの挙動、2はドキュメントの間違い、3は意図しない挙動でたまたま動いているだけですがいまの振る舞いを変更すべきでない、とそれぞれステータスは違うのですが、互換性を壊す変更をするつもりがないという点では一致しています。

@nanto
Copy link
Author

nanto commented Nov 12, 2014

回答ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment