現在、実現している機能は一部のみです。
未対応の機能に付いては、未対応と記述してあります。 未対応の仕様は、変更される可能性があります。 Copyright (C) T's-Neko 2000 |
RXML (Replacing teXt Markup Language) は、
テキストファイルや HTML ファイルにマーキングすることで、
テキストのコピーやタイトルの一覧などのテキスト処理を
行う汎用的なマークアップ言語です。
(ここから未対応)
また、マーキングしたテキストを数値として扱うことで、
計算など、データベース的な処理も可能にします。
(ここまで未対応)
<DATA1>12</DATA1> <DATA2>23</DATA2> <VAR href="#DATA1"/> + <VAR href="#DATA2"/> = <VAR href="#DATA1 + #DATA2"/> |
↓ |
<DATA1>12</DATA1> <DATA2>23</DATA2> 12 + 23 = 35 (35 の出力は未対応) |
RXML は XML のネストに関する厳密な構文ルールが無いので、 既存の HTML ファイルの中にデータを定義したり、 通常のテキストファイルの中に XSL のような埋め込みをしたり することができます。 ただし、埋め込みは、ブラウザが随時インタプリトするのではなく、 RXML モジュールを含む Knowledge Take! 2 などの アプリケーションによってコンパイルすることにより行います。
(ここから未対応) DTD を指定することにより、RXML 中の XML 成分を抽出し、 他の XML 対応アプリケーションとの連携も取れるようにします。 (ここまで未対応)
Knowledge Take! 2 などのアプリケーションを使ってコンパイルします。
プログラムソースでは、次のように 入力ファイルとプログラムデータを設定して変換を実行します。
/* RXML エンジンを初期化する */ RXML_DB_init( &RXML_db ); RXML_init( &rxml, basePath ); /* プログラムデータ(Sym) を初期化する */ Sym_init( &sym ); bSym = true; TakeX_registSymStruct( &sym ); Sym_registVar( &sym, "TakeX", "take", &app->take ); /* 入力ファイルを設定する */ RXML_toEmpty( &rxml ); RXML_addFile( &rxml, path1 ); RXML_addFile( &rxml, path2 ); /* RXML データ・クラス定義ステップ、タグ抽出ステップ を実行する */ RXML_pickupDC( &rxml ); RXML_pickupTags( &rxml ); /* ドキュメント変換ステップを実行する */ for ( ListX_forEach( &rxml.files, &file, RXML_File ) ) { out = FileX_open( path, "wb" ); bOut = true; RXML_File_out( file, out, rxml ); if ( bOut ) fclose( out ); } /* 後始末する */ Sym_finish( &sym ); RXML_finish( &rxml ); RXML_DB_finish( &RXML_db ); |
参照:Sym クラス
XML のように、任意のタグからそれに '/' を付けたタグまでの間が RXML で処理できるデータになります。
以下は未対応
データはタグの種類ごとに、RXML データ・オブジェクト (RXML_Tag 型)になり、 オブジェクトの属性を応用することで、データを加工することが 出来るようになります。 タグがネストしていれば、別のデータオブジェクトになります。
<LEVEL2>object_name=LEVEL2</LEVEL2> <LEVEL1> <LEVEL2>object_name=LEVEL1.LEVEL2</LEVEL2> </LEVEL1> |
属性名を省略したときは、式に応じて 適当な属性(text や num など)の値が評価されます。
RXML は、TEMPLATE タグ、PRIVATE タグ、VAR タグのみ予約しています。
これらのタグは、指定した RXML データ・オブジェクトの内容と
置換されます。
VAR タグの最後の / 文字 (<VAR/>) は省略可能です。
<MAKEFILE> $(OBJ) = \ <TEMPLATE href="src" arg="i"> <VAR href="i.name"/>.o \ </TEMPLATE> <TEMPLATE href="src"> <VAR href=".name"/>.o : <VAR href=".name"/>.c cl -c -o <VAR href=".name"/>.o <VAR href=".name"/>.c </TEMPLATE> </MAKEFILE> <PRIVATE> <DATA>first</DATA><DATA>second</DATA><DATA>third</DATA> </PRIVATE> |
タグ | 属性 | 内容 |
---|---|---|
TEMPLATE | href | RXML データ・オブジェクトのタグ名を指定します 同じタグ名がつけられている複数のデータ・オブジェクトをループします。 |
arg | ループ変数の名前を宣言します 省略した場合、無名のループ変数になります | |
name | テンプレートに名前を付けて、RXML データ・オブジェクトに追加します | |
in | (未対応)ループ変数の条件式を指定します。 条件式を満たさなかったときは、その値でループしません。 | |
PRIVATE | in | (未対応)公開する条件式を指定します。 in 属性を省略したり条件式を満たさなかったときは </PRIVATE> までスキップします。 オブジェクトを指定したときは、count 属性が 0 なら スキップします。 |
VAR | href | オブジェクトや属性を指定して、その値に置換します。
式を指定することも出来ます。 指定したところが <A> タグの name 属性に相当した場合、 ハイパーリンクも付きます。 |
interval | テンプレートの内部において、指定したループ変数の
次の要素があるときのみ VAR タグを置換 (無名のループ変数のときは "." と指定) | |
value | 置換する値を直接指定します。通常、interval 属性と一緒に使用して区切り文字を指定します |
href 属性のパスは、RXML ファイルを基準とした URL に似た
構文で指定します。
'#' または '.' の区切りの間の文字列は最大 255 文字、
href 属性全体では最大 511 文字です。
RXML データ・オブジェクトを指定するときは、次の構文を使用します。 (RXML_getHrefFile 関数、RXML_getHrefTag 関数)
href="[filepath][#object][.attr1][.attr2]..." |
型 | 内容 | 省略したときの値 |
---|---|---|
filepath | 参照する絶対パス、
または RXML ファイルのあるフォルダからの相対パス。 RXML を内蔵するプログラムによって、参照するファイルが 特定できる場合、ファイル名のみの指定も可。 複数のフォルダに同じ名前のファイルがあるときは、 どちらを参照するかは未定。(相対パスで指定すればよい) ネットワーク・コンピュータも指定可能。 http: から始まると、インターネットの URL も指定可能(予定)。 "all" を指定すると、RXML を内蔵するプログラムによって グループ化されたすべての RXML ファイルが指定対象となる。(予定) | この href 属性が所属する RXML ファイル |
#object | filepath で指定したファイルに含まれる RXML データ・オブジェクトの名前 または、<A> タグの name 属性の値 |
ファイル全体 |
.attrN | 参照する属性(グローバル変数のメンバ変数) または、ネストした RXML データ・オブジェクトの名前、または name 属性の値 |
グローバル変数そのもの、または集合全体 |
<TEMPLATE> タグのループ変数や、プログラムデータとのリンク によって予約されるキーワードを指定するときは、次の構文を使用します。 (RXML_getHrefRef 関数)
href="[object][.attr1][.attr2]..." |
型 | 内容 | 省略したときの値 |
---|---|---|
object | <TEMPLATE> タグのループ変数の名前 または、アプリケーションによって予約されるキーワード(プログラムデータとのリンク) |
<TEMPLATE> タグの「無名のループ変数」 続いて属性(.attrN )を指定しない場合は、href="." と指定します。 |
.attrN | 参照する属性(グローバル変数のメンバ変数) または、ネストした RXML データ・オブジェクトの名前、または name 属性の値 |
グローバル変数そのもの、または集合全体 |
未対応
VAR タグの href属性の中には、RXML データ・オブジェクトの 他に、式を指定することが出来ます。
<VAR href="#data1"> <VAR href="#data1.sum"> <!-- 合計値の属性 --> <VAR href="#data1 + #data2"> <!-- 数値の加算式 --> <TEMPLATE href="#customer" arg="i" in="i.pay > 0 && i.age >= 18"> <!-- 条件式 --> <VAR href="i.name">, <VAR href="i.pay"><BR> </TEMPLATE> <VAR href="sum( #customer, i.pay > 0 && i.age >= 18, i.pay )"> <!-- 合計関数 --> |
関数名を指定してもそれに続く括弧がなければ、href属性によるタグの参照とみなします。 たとえば、sum(...) なら sum 関数、sum のみなら sum ファイル(または sum タグ、sum 変数)となります。
具体的に何の関数が使えるかは未定です。
構文解析の方法に付いては、 CYacc モジュールの説明を参照してください。
Sym クラスを使うと、
VAR タグを使用したときに構造体のメンバ変数を参照したり、
関数が呼び出されるようなオブジェクトを
RXML データ・オブジェクトに追加します。
これを応用すると、プログラムで計算した結果を
ユーザ定義の結果出力テンプレートに
埋め込むことが容易に出来ます。
この機能は、Sym モジュールを使用するプログラムを作成するときに
使用することができます。Knowledge Take! 2 などの出来上がっている
プログラムのユーザが、この機能を使って RXML データ・オブジェクトに
追加することはできません。
RXML に対する処理は、次のステップで行われます。
TEMPLATE タグと VAR タグの href 属性から、DC (Data Class) を RXML::dataClasses, RXML_File::dataClasses(RXML_Tag型リスト) に構築します。ネストしたクラスは RXML_Tag::tags に格納します。
上記の TMP1 から出ている2本の矢印は、RXML_Tag::start と
RXML_Tag::end です。
タグ抽出ステップでは、図の中央の Objects のような
オブジェクト(タグ)構造(ツリー構造)を組み立てます。
ツリー構造のトップは RXML_File::tags です。
ツリーのノードは、RXML_Tag 型インターフェイスのリストを
子ノードとして持っており、そのインターフェイスの実体として
RXML_Tag を持っています。
抽出するときは、図の右端の stack ようなスタックを使用します。
分析したタグ情報を元に、ドキュメントを変換します。 その際、href属性によって指定される式を評価します (RXML_getHrefTag 関数, RXML_getHrefRef 関数)。
対応するループ変数は、TEMPLATE のスタックをボトムアップに たどって解決します。 変数のスコープを解決するために、 トップダウンに参照できるようにする必要もあります。
TEMPLATE や PRIVATE タグの開始終了タグのみの行は、 出力しないようにします。 その処理方法は次の場所でそれぞれ協調することで実現します。
行スキップ処理に対応した出力には、RXML_Out_outPart 関数を使います。 行スキップしないときは、RXML_Out_outStrong 関数を使います。