racc で xvcd を生成することを試し始めた (その7)
ruby/racc で xfy/xvcd を生成する実験を続けています。
今回は2つの変更を行いました。
1. 属性指定方法の書式を導入
2. 任意の xml タグを生成できるようにした
今回のソースコードは以下で公開しています。
http://homepage2.nifty.com/youichi_kato/src.html
- racc で xvcd
zzz-2007-06-16.tgz(2007-06-16)
1. 属性指定方法の書式を導入
-------------------------
前回は、
変換結果 xml の属性指定を "name", "val" で指定させていたが、
name=>"val" で指定するようにしました。
つまり
xvcd:foo(name=>"val")
と書いたら
<xvcd:foo name="val">
</xvcd:foo>
が出力されます。
2. 任意の xml タグを生成できるようにした
-------------------------------------
いままでは 変換プログラム側で認識できないタグは無視していました。
しかし、今回からは 定義済みチェックをせずに すべて、xml タグ展開をすることに変更しました。
そうすることで これまでは "<<" での ヒアドキュメントで書くしかなかった部分も、
すべて 関数呼び出し風に書くことが可能となります。
つまり
<< <html>
<< <body>
<< </body>
<< </html>
と
html() {
body();
};
は、同じ変換結果になります。
(すべてを 無理に関数呼び出し風に書く必要は無いです。
ケースに応じてヒアドキュメント記述と使いわければよいと思う)
いままでつかってきた 入力ソースは次のように書き換えることになります。
出力結果は前回までと同じです。
$ cat src
<<
xvcd(
xmlns => "http://www.w3.org/1999/xhtml",
xmlns:xvcd => "http://xmlns.xfy.com/xvcd",
xmlns:instruction => "http://xmlns.xfy.com/instruction",
xmlns:ctrl => "http://xmlns.xfy.com/controls",
xmlns:event => "http://xmlns.xfy.com/event",
xmlns:ui => "http://xmlns.xfy.com/ui",
xmlns:command => "http://xmlns.xfy.com/command",
xmlns:ab => "http://xmlns.example.com/developer/tutorial/addressbook",
version => "1.0"
) {<<
//============== VOCABULARY ==========
vocabulary(name => "AddressBook",
match => "ab:addressbook",
call-template => "Root") {
//============== MENU ==========
ui:ui(version=>"1.0") {
ui:main-menu() {
ui:menu(label=>"Entry") {
ui:menu-item(label=>"add", command=>"my:AddEntry", open-dialog=>"true");
ui:menu-item(label=>"edit", command=>"my:EditEntry", open-dialog=>"true");
};
};
};
};<<
//============== COMMAND ==========
def my:AddEntry(a, b)
dialog(return-to=>"result") {
<< <ab:edit-dialog>
<< <ab:entry>
<< <ab:person />
<< <ab:address />
<< </ab:entry>
<< </ab:edit-dialog>
};if "'ok'=$result/ab:edit-dialog/@closed-by" then
insert(select=>"/ab:addressbook", position=>"last-child") {
copy_of(select=>"$result//ab:entry");
};
end
end<<
//============== TEMPLATE ==========
template(name=>"EditDialogRoot") {
html() {
body()
};
};
};
#--- End of File ---
今回も、前回予告とは反する変更を行ってしまいました。
次回こそは、include 機能を実装しようと思う...
« ピックアップ:Ruby 会議 2007の動画, Viper 2 Open Betaはもうすぐ, etc... | トップページ | ピックアップ:ハードディスクの中身を3次元地図で表示, 「みんなのうた」まとめ »
この記事へのコメントは終了しました。
« ピックアップ:Ruby 会議 2007の動画, Viper 2 Open Betaはもうすぐ, etc... | トップページ | ピックアップ:ハードディスクの中身を3次元地図で表示, 「みんなのうた」まとめ »
コメント