RXML

version 0.5

目次

現在、実現している機能は一部のみです。 未対応の機能に付いては、未対応と記述してあります。
未対応の仕様は、変更される可能性があります。
Copyright (C) T's-Neko 2000


RXML の概要

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 クラス


RXML データ・オブジェクト

XML のように、任意のタグからそれに '/' を付けたタグまでの間が RXML で処理できるデータになります。

以下は未対応

データはタグの種類ごとに、RXML データ・オブジェクト (RXML_Tag 型)になり、 オブジェクトの属性を応用することで、データを加工することが 出来るようになります。 タグがネストしていれば、別のデータオブジェクトになります。
<LEVEL2>object_name=LEVEL2</LEVEL2>
<LEVEL1>
  <LEVEL2>object_name=LEVEL1.LEVEL2</LEVEL2>
</LEVEL1>

属性

属性名を省略したときは、に応じて 適当な属性(text や num など)の値が評価されます。


RXML のタグ

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>

タグ属性内容
TEMPLATEhref RXML データ・オブジェクトのタグ名を指定します
同じタグ名がつけられている複数のデータ・オブジェクトをループします。
arg ループ変数の名前を宣言します
省略した場合、無名のループ変数になります
name テンプレートに名前を付けて、RXML データ・オブジェクトに追加します
in 未対応)ループ変数の条件式を指定します。 条件式を満たさなかったときは、その値でループしません。
PRIVATEin 未対応)公開する条件式を指定します。 in 属性を省略したり条件式を満たさなかったときは </PRIVATE> までスキップします。 オブジェクトを指定したときは、count 属性が 0 なら スキップします。
VARhref オブジェクトや属性を指定して、その値に置換します。 を指定することも出来ます。
指定したところが <A> タグの name 属性に相当した場合、 ハイパーリンクも付きます。
interval テンプレートの内部において、指定したループ変数の 次の要素があるときのみ VAR タグを置換
(無名のループ変数のときは "." と指定)
value 置換する値を直接指定します。通常、interval 属性と一緒に使用して区切り文字を指定します

href属性

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 の処理概要

RXML に対する処理は、次のステップで行われます。

  1. RXML データ・クラス定義ステップ(RXML_pickupDC 関数)
    RXML データ・オブジェクトとして抽出するタグを決定します。 DTD によって決定することもあります。
  2. タグ抽出ステップ(RXML_pickupTags 関数)
    TEMPLATE タグ、VAR タグ、その他任意のタグの情報を RXML_Tag クラスに記録します。RXML_Tag は、ツリー構造です。
  3. ドキュメント変換ステップ(RXML_out 関数, RXML_File_out 関数, RXML_Tag_out 関数)
    TEMPLATE タグ、VAR タグの展開をします。 展開する内容は、タグ名を指定する RXML_DB_getTag 関数または RXML_DB_getTagInFile 関数から RXML_Tag オブジェクトを取得し、 RXML_Tag_getAttrVar 関数から属性の値を取得します。 (→RXML データ・オブジェクト

RXML データ・クラス定義ステップ(RXML_pickupDC 関数)

TEMPLATE タグと VAR タグの href 属性から、DC (Data Class) を RXML::dataClasses, RXML_File::dataClasses(RXML_Tag型リスト) に構築します。ネストしたクラスは RXML_Tag::tags に格納します。

タグ抽出ステップ(RXML_pickupTags 関数)


上記の TMP1 から出ている2本の矢印は、RXML_Tag::start と RXML_Tag::end です。
タグ抽出ステップでは、図の中央の Objects のような オブジェクト(タグ)構造(ツリー構造)を組み立てます。 ツリー構造のトップは RXML_File::tags です。 ツリーのノードは、RXML_Tag 型インターフェイスのリストを 子ノードとして持っており、そのインターフェイスの実体として RXML_Tag を持っています。
抽出するときは、図の右端の stack ようなスタックを使用します。

ドキュメント変換ステップ(RXML_out 関数, RXML_File_out 関数, RXML_Tag_out 関数)

分析したタグ情報を元に、ドキュメントを変換します。 その際、href属性によって指定される式を評価します (RXML_getHrefTag 関数, RXML_getHrefRef 関数)。

対応するループ変数は、TEMPLATE のスタックをボトムアップに たどって解決します。 変数のスコープを解決するために、 トップダウンに参照できるようにする必要もあります。


開始・終了タグ・行スキップ処理の説明

TEMPLATE や PRIVATE タグの開始終了タグのみの行は、 出力しないようにします。 その処理方法は次の場所でそれぞれ協調することで実現します。

行スキップ処理に対応した出力には、RXML_Out_outPart 関数を使います。 行スキップしないときは、RXML_Out_outStrong 関数を使います。


written by M.Toda from Jan.21.2000