tgif データ (obj/sym) 形式の「仕様」は、
tgif
のソース配布物 に含まれる "tgif.pl"
というファイルに書かれているものが唯一です。
これは、Perl ファイルでは なく、
Prolog コードのファイルです。
Prolog を知っていれば、それを理解するのはかなり易しいでしょうが、
Prolog を知らなければ、以下の "tgif.pl" を読む方法の概要を
見てください。
"tgif.pl" のサイズは大きいですが、それはそれが
すべてのバージョンの tgif オブジェクトの情報を持っているからです。
これは、データ形式の説明も少し大きくしています。
記法、記法、記法...
tgif の各オブジェクトは、以下の形式を持つ Prolog の
'項目' (term) として表現されます。
- functor(arg1,arg2,...,argN)
ここで N は項目の '項数' (アリティ) と呼ばれます。
トップレベル オブジェクトはすべてピリオド (.) で終了し、
それはオブジェクトを指定する項目の直後に置かれます。
もう一つ重要な構成物に、以下の形式の Prolog の 'リスト' があります:
- [term1,term2,...,termK]
K はリストの長さです (0 も可)。
項目の引数はリストでも構わないことに注意してください。
最後に、% で始まる行はコメントで、
Prolog の変数は宣言は必要ありません。
大文字か下線 (_) で始まる名前は変数です。
ファイルバージョン...
tgif ファイルの最初の行は、そのファイルを書いた tgif
のバージョン情報を含むコメント行です。
tgif ファイルの 2 行目 (最初のオブジェクト) は、
state オブジェクトです (functor が state である項目)。
state 項目の 2 つめの引数は、
そのファイルの ファイルバージョン と呼ばれます。
tgif で生成されるファイルの例を見てください:
%TGIF 2.16-p12
state(0,32,300,0,0,0,16,1,3,1,1,0,0,3,0,1,1,'Times-Roman',
0,20,0,0,0,10,0,0,1,1,0,16,1,0,1,1,1,1,1089,1407).
%
% @(#)$Header: /mm/src/tgif/httpd/faq/RCS/format.html,v 1.3 2005/08/17 06:21:25 william Exp william $
% %W%
%
page(1,"").
text('blue',96,64,'Times-Roman',0,20,1,1,0,1,94,22,2,0,18,4,0,0,0,0,[
"Hello World"]).
(実際は、state 行は折り返されませんが、
ここでは見やすくするために折り返しています。)
このファイルバージョンは 32 で、トップレベルオブジェクトが 3 つ
(state オブジェクトを含め) あります。
state, page, text のそれぞれの名前の
直後のカッコに対応する閉じカッコのすぐ後ろにピリオドがあるので、
それらはトップレベルオブジェクトであると言うことができます。
テキストオブジェクトの例...
"tgif.pl" 内の情報に使われている
テキストオブジェクトを解析する方法を見ていきましょう。
最初に、"tgif.pl" の、
tgif_text で始まる条項 (clause) を持つセクションを
探してください。
"FileVersion" を持つ条項部分は、関連しています。
そのような条項部分は、以下のような行を含みます:
FileVersion =< 2, !,
これは、この条項をファイルバージョン 1 と 2 に対して
使用することを意味します。
2 つ目の条項は以下のようになります:
FileVersion =< 6, !,
これは、この条項をファイルバージョン 3 から 6 までに対して
使用することを意味します。以下同様となります。
ファイルバージョン 32 に関しては、
以下の行を持つ条項を探してください:
FileVersion =< 32, !,
現在は、この条項はファイルバージョン 30 から 32 に対するものに
なっていて、それは以下のようになっています:
tgif_text(Obj,Parms) :-
current_predicate(tgif_file_version,tgif_file_version(_)),
tgif_file_version(FileVersion),
FileVersion =< 32, !,
% From version 30 on, the FontSize is the actual size;
% the TextSize in older versions is a size index.
( var(Obj) -> OutputObj = true ; OutputObj = false ),
Obj = text(_Color,_X,_Y,_FontName,_TextStyle,_FontSize,_NumLines,
_TextJust,_TextRotate,_PenPat,_BBoxW,_BBoxH,_Id,0,_Asc,_Des,
_ObjFill,_VSpace,_Rotation,_Locked,StrList),
tgif_chk_output(OutputObj,Obj),
Parms = [color=_Color,x=_X,y=_Y,font_name=_FontName,
text_style=_TextStyle,font_size=_FontSize,num_lines=_NumLines,
text_just=_TextJust,text_rotate=_TextRotate,pen_pat=_PenPat,
bbox_w=_BBoxW,bbox_h=_BBoxH,id=_Id,asc=_Asc,des=_Des,
obj_fill=_ObjFill,v_space=_VSpace,rotation=_Rotation,
obj_locked=_Locked,strs=StrList],
tgif_strs(StrList).
上の条項で一番重要な部分は以下のものです:
Obj = text(_Color,_X,_Y,_FontName,_TextStyle,_FontSize,_NumLines,
_TextJust,_TextRotate,_PenPat,_BBoxW,_BBoxH,_Id,0,_Asc,_Des,
_ObjFill,_VSpace,_Rotation,_Locked,StrList),
これは、tgif ファイル内のテキストオブジェクトに対して
照合させるのに必要なものです。上の例から見てみます:
text('blue',96,64,'Times-Roman',0,20,1,1,0,1,94,22,2,0,18,4,0,0,0,0,[
"Hello World"]).
_Color が 'blue' に対応し、
_X が 96 に、
_Y が 64 に、
_FontName が 'Times-Roman' に、となって、
最後は
StrList が ["Hello World"] に対応することは
容易にわかるでしょう。
この例では、["Hello World"]
は文字列の一つの項目を持つリストになっています。
(Prolog では文字列は文字のリストですが、
その情報を与えることはしません。)
Tgif ファイル中のタブと改行...
上の例では、["Hello World"] は
tgif ファイル内で分離していて、[ の後に改行があり、
<TAB> 文字の後に "Hello World"]
が続いています。重要な注意ですが、
改行と <TAB> 文字は、
(Prolog 解析器ではそれらは無視されるのですが)
tgif 解析器では 意味を持ちます。
それらの規則を説明するのはやや難しいです。
あなたが tgif ファイルを (手動で、あるいはプログラムで) 作成する場合、
生成しようとするオブジェクトを tgif で試してみてください。
そのファイルを保存し、テキストエディタでそのファイルを見て、
そして改行とタブをそれに合わせるようにしてください。
そして、あなた自身の Tgif ファイルをあなたが作成した後で、
もちろんそれを tgif でテストし、
オブジェクトに欠けがないかを確認してください。