=encoding utf-8 =head1 NAME (ja) YATT::LRXML - Loose But Recursive XML. =head1 SYNOPSIS require YATT::LRXML; my $tree = read YATT::LRXML($filename, %opts); or my $tree = read_string YATT::LRXML(q{foo..baz} , namespace => ['yatt', 'perl']); for (my $cursor = $tree->open; $cursor->readable; $cursor->next) { print $cursor->stringify, "\n"; } =head1 DESCRIPTION LRXML は、XML よりも HTMLのテンプレートを記述しやすくするために 設計された、独自の構文です。 LRXML は XML の整形式を逸脱するため、 XML Parser ではパースできません。また、(現段階では) シリアライズ用に使う仕組みも持っていません。しかしその分、 元々の XML よりも豊かな再帰性と、 DTD を一切不要にする柔軟性を持っています。 =head1 SYNTAX LRXML は、LRXML の構文要素と、それ以外の印字可能テキスト(PCDATA)の 並びです。いずれの構文要素も、予め定めた B<名前空間マーカー> で始まります。 PCDATA は (LRXML の構文要素と誤解されない限り) エスケープの必要はありません。 これはテンプレートシステムとしての使用を主眼に設計されたためです。 以下の説明では、名前空間マーカーとして B を用います。 =head2 Element (タグ, 要素) タグは HTML や XML と同様、 ..BODY.. 又は と書けます。XML と異なり、..BODY.. 部分にも属性情報を書けるよう、 L の構文が定義されています。 =head3 Attribute Element (属性要素) 属性要素は XML と LRXML の最大の相違点です。タグ名の直前に C<:> を加えて <:yatt:ATT_NAME SUB_ATTLIST> ..ATT_VALUE.. 又は <:yatt:ATT_NAME SUB_ATTLIST /> ..ATT_VALUE.. と書きます。(Common Lisp の C<:keyword> 構文と同じように読んでください。) この構文を使うと、属性の中にタグを書きたいケースでも、 もっと HTML らしく書く事が出来ます。例えば ... のような情報を書きたいときに、 <:yatt:title> Headline ... あるいは ... <:yatt:title /> Headline と書くことが出来ます。 =head3 Attribute List (属性リスト) ATTLIST には XML と同様の NAME = VALUE NAME = 'VALUE' NAME = "VALUE" に加えて、NAME を省略した VALUE 'VALUE' "VALUE" と、VALUE を省略した NAME を書けます。(NAME だと解釈可能な文字のみからなる場合は NAME, それ以外は VALUE). =head4 Quoted Value XML と異なり、C<'VALUE'>, C<"VALUE"> の引用符の中でも C<< <> >> を (escape せずに)使って構いません。これは、テンプレートとして用いる場合に、 条件式を .... のように書けた方が、はるかに読みやすいからです。 =head2 Entity (実体参照, 又は単に参照) &yatt:NAME; =head3 Entity Path テンプレートを書く人になるべく大きな自由を与えつつ、 部品化への動機付けも残すため、 Entity の中にある程度までの複雑な式を 書くことが可能になっています。 &yatt:NAME:NAME; (名前空間か、hash の要素参照) &yatt:NAME{}; (hash の要素参照) &yatt:NAME[]; (配列の要素参照) &yatt:NAME(); (関数の呼び出し) (括弧内は、記法の用途の一例で、最終的には Translator の自由です) カッコの中に再び Entity Path を書くには、先頭に C<:> を書きます。 C<:> が無い場合は、通常の文字列として扱われます。 カッコの中では C<,> で要素を区切ります。 &yatt:foo:bar(:baz(),bang,:hoe):moe(); 上記では、真ん中の C が文字列を表します。 C<,> は省略可能な終端子の扱いです。つまり、 &yatt:foo(bar); &yatt:foo(bar,); の二つは等価です。また、空文字列を明示的に渡したい場合は &yatt:foo(,); と書きます。 =head2 Declarator (宣言子) 宣言子は要素の並びに、メタな意味情報を付け加える時に使います。 典型的には、 widget の区切りに使います。 =head3 Declaration Attribute 宣言子の中には、タグの属性リストと同じものに加えて、 =over 4 =item * NAME = [TYPE NAME=VALUE NAME=VALUE ...] =item * -- コメント -- =item * %NAME; =back を書く事が出来ます。 =head2 Processing Instruction (処理指令) php などでお馴染みの、プログラム指令を書ける場所です。 =head2 Comment (注釈) XXX: ここは議論の余地あり。 =head1 AUTHOR "KOBAYASI, Hiroaki" (小林 弘明) hkoba at cpan.org