NAME (ja)

YATT::LRXML - Loose But Recursive XML.

SYNOPSIS

require YATT::LRXML;
my $tree = read YATT::LRXML($filename, %opts);

or

my $tree = read_string YATT::LRXML(q{foo<yatt:bar>..</yatt:bar>baz}
              , namespace => ['yatt', 'perl']);
for (my $cursor = $tree->open; $cursor->readable; $cursor->next) {
   print $cursor->stringify, "\n";
}

DESCRIPTION

LRXML は、XML よりも HTMLのテンプレートを記述しやすくするために 設計された、独自の構文です。 LRXML は XML の整形式を逸脱するため、 XML Parser ではパースできません。また、(現段階では) シリアライズ用に使う仕組みも持っていません。しかしその分、 元々の XML よりも豊かな再帰性と、 DTD を一切不要にする柔軟性を持っています。

SYNTAX

LRXML は、LRXML の構文要素と、それ以外の印字可能テキスト(PCDATA)の 並びです。いずれの構文要素も、予め定めた 名前空間マーカー で始まります。 PCDATA は (LRXML の構文要素と誤解されない限り) エスケープの必要はありません。 これはテンプレートシステムとしての使用を主眼に設計されたためです。

以下の説明では、名前空間マーカーとして yatt を用います。

Element (タグ, 要素)

タグは HTML や XML と同様、

<yatt:NAME ATTLIST>  ..BODY.. </yatt:NAME>

又は

<yatt:NAME ATTLIST />

と書けます。XML と異なり、..BODY.. 部分にも属性情報を書けるよう、 "Attribute Element (属性要素)" の構文が定義されています。

Attribute Element (属性要素)

属性要素は XML と LRXML の最大の相違点です。タグ名の直前に : を加えて

<:yatt:ATT_NAME SUB_ATTLIST> ..ATT_VALUE.. </:yatt:ATT_NAME>

又は

<:yatt:ATT_NAME SUB_ATTLIST />
..ATT_VALUE..

と書きます。(Common Lisp の :keyword 構文と同じように読んでください。)

この構文を使うと、属性の中にタグを書きたいケースでも、 もっと HTML らしく書く事が出来ます。例えば

<yatt:mynews title="<b>H</b>eadline">
  ...
</yatt:mynews>

のような情報を書きたいときに、

<yatt:mynews>
  <:yatt:title>
     <b>H</b>eadline
  </:yatt:title>
  ...
</yatt:mynews>

あるいは

<yatt:mynews>
  ...
<:yatt:title />
  <b>H</b>eadline
</yatt:mynews>

と書くことが出来ます。

Attribute List (属性リスト)

ATTLIST には XML と同様の

NAME = VALUE
NAME = 'VALUE'
NAME = "VALUE"

に加えて、NAME を省略した

VALUE
'VALUE'
"VALUE"

と、VALUE を省略した

NAME

を書けます。(NAME だと解釈可能な文字のみからなる場合は NAME, それ以外は VALUE).

Quoted Value

XML と異なり、'VALUE', "VALUE" の引用符の中でも <> を (escape せずに)使って構いません。これは、テンプレートとして用いる場合に、 条件式を

<yatt:event if="x > 0">....</yatt:event>

のように書けた方が、はるかに読みやすいからです。

Entity (実体参照, 又は単に参照)

&yatt:NAME;

Entity Path

テンプレートを書く人になるべく大きな自由を与えつつ、 部品化への動機付けも残すため、 Entity の中にある程度までの複雑な式を 書くことが可能になっています。

&yatt:NAME:NAME;   (名前空間か、hash の要素参照)
&yatt:NAME{};      (hash の要素参照)
&yatt:NAME[];      (配列の要素参照)
&yatt:NAME();      (関数の呼び出し)

(括弧内は、記法の用途の一例で、最終的には Translator の自由です)

カッコの中に再び Entity Path を書くには、先頭に : を書きます。 : が無い場合は、通常の文字列として扱われます。 カッコの中では , で要素を区切ります。

&yatt:foo:bar(:baz(),bang,:hoe):moe();

上記では、真ん中の bang が文字列を表します。

, は省略可能な終端子の扱いです。つまり、

&yatt:foo(bar);
&yatt:foo(bar,);

の二つは等価です。また、空文字列を明示的に渡したい場合は

&yatt:foo(,);

と書きます。

Declarator (宣言子)

宣言子は要素の並びに、メタな意味情報を付け加える時に使います。 典型的には、 widget の区切りに使います。

<!yatt:NAME DECL_ATTLIST>

Declaration Attribute

宣言子の中には、タグの属性リストと同じものに加えて、

  • NAME = [TYPE NAME=VALUE NAME=VALUE ...]

  • -- コメント --

  • %NAME;

を書く事が出来ます。

Processing Instruction (処理指令)

<?perl ... ?>

php などでお馴染みの、プログラム指令を書ける場所です。

Comment (注釈)

<!--#yatt ... -->

XXX: ここは議論の余地あり。

AUTHOR

"KOBAYASI, Hiroaki" (小林 弘明) hkoba at cpan.org