FreePWING プログラミングドキュメント
笠原 基之
FreePWING は JIS X 4081 形式の書籍データを生成を行うソフトウェアです。 JIS X 4081 は EPWING V1 のサブセットですので、FreePWING によって生成 した JIS X 4081 形式の書籍データは、原理上 EPWING の検索ソフトウェアで検索 を行うことが可能です。
ただし、FreePWING で作成した JIS X4081 形式の書籍データが、お持ちの EPWING 検索ソフトウェアで正しく扱えなかったとしても、検索ソフトウェア の発売元や作者に対して問い合わせることはご遠慮下さい。 (Windows 向けの EPWING 検索ソフトウェアには、書籍データが CD-ROM 以外 の媒体上にあると検索できないようになっているものもあります。)
FreePWING のほとんどの部分は Perl 5 (バージョン 5.005 以上が必要) で 書かれていますが、現状では UNIX 系 OS および Cygwin のような UNIX 互換 の開発環境をインストールしてあるシステム上でないと動作しません。 生成した書籍データはシステムによらず共通なので、UNIX 以外でも使えます。
FreePWING はフリーソフトウェアです。 あなたは、Free Software Foundation が公表した GNU General Public License (GNU 一般公有使用許諾) バージョン 2 あるいはそれ以降の 各バージョンの中からいずれかを選択し、そのバージョンが定める条項に 従って本プログラムを再頒布または変更することができます。
FreePWING は有用とは思いますが、頒布にあたっては、市場性及び 特定目的適合性についての暗黙の保証を含めて、いかなる保証も行いません。 詳細については GNU General Public License をお読み下さい。
FreePWING で生成した JIS X 4081 形式のデータに関しては、使用許諾および その他の権利について、FreePWING の著作者は一切の主張をいたしません。 ただし、上述の GNU General Public License に従い、あなたの作成した データに対して、FreePWING はいかなる保証も行いません。
最新の FreePWING は ftp://ftp.sra.co.jp/pub/misc/freepwing/ から入手できます。
FreePWING に関する情報は http://www.sra.co.jp/people/m-kasahr/freepwing/ から得ることができます。
コメントやバグの報告は m-kasahr@sra.co.jp 宛にお送り下さい。
あなたが既に FreePWING で変換してみたい書籍データをお持ちなら、その 辞書は JIS X 4081 以外の形式、たとえば、HTML、Texinfo、PDIC といった 形式で書かれていると思います。 しかしながら、FreePWING にはこうした特定のテキスト形式を解釈する機能は ありません。 もし、書籍データが HTML で書かれているとしたら、データを HTML として 解釈する処理プログラムはあなたが用意しなくてはなりません。
たとえば、HTML で書かれた書籍データに一節があったとします。
FreePWING では<EM>できません</EM>!!!
HTML では <EM> と </EM> はそのまま文章として 扱われるのではなく、その間の文字列を強調するという意味を持ちます。 したがって、HTML を JIS X 4081 形式に変換するためには、<EM> や </EM> が特殊な意味を持つことを認識して、他の普通の文字列とは 分けて処理しなくてはなりません。
けれども、繰り返しになりますが、FreePWING には HTML を解釈する機能は 用意されていません。 JIS X 4081 形式に変換するには、HTML を解釈するための HTML パーサ (構文解析器) と、解釈したデータを FreePWING に渡すための橋渡し的な プログラムを用意する必要があります。
「<EM>できません</EM>」の部分を JIS X 4081 形式に変換する FreePWING プログラムを敢えて書くなら、次のようになります。
## $text は FreePWING::FPWUtils::Text クラスのオブジェクトで、 ## 既に出力ファイルをオープンしているものとします。 $text->add_emphasis_start(); $text->add_text("できません"); $text->add_emphasis_end();
このように、FreePWING を扱うには、プログラミング、特に Perl 5 での プログラミングが常に付いて回ります。 FreePWING の実体は、「Perl 5 用のライブラリ」と言っても良いでしょう。
この文書は、FreePWING のプログラミングの仕方について解説します。 なお、あなたが既に Perl 5 のプログラミングの基本知識を身に付けている ものとしますので、あらためてこの文書の中で説明することは致しません。 ご了承下さい。
FreePWING が変換した書籍データには、次の機能を与えることができます。
なお、この一覧には「完全一致検索」(ユーザが入力した単語に対して、完全 に一致する単語の検索) はありません。 これは、FreePWING が対応していないからではなく、完全一致検索は 前方一致検索用のデータを使って行うからです。 したがって、書籍に前方一致検索の機能を持たせれば、完全一致検索も扱う ことができまるようになります。
ここからは、FreePWING の実際のプログラミングについて解説します。 JIS X 4081 は、辞典検索を得意とするデータ形式になっていますので、本章 でも辞典を対象にして、JIS X 4081 形式のデータを生成するまでの過程を 記すことにします。
すでに JIS X 4081 形式になった国語辞典があるとしましょう。 EPWING の検索ソフトウェアを用いて、この辞典で「たいさく」という語を 引いてみると、おそらく「大作」「対策」という語が見つかり、以下のような 感じで見出しが表示されると思います。
たいさく 【大作】 たいさく 【対策】
次に、このうちの「対策」の方を選ぶと、「対策」という語についての本文が 表示されます。
たいさく 【対策】 状況に応じてとる手段や策略。
通常、紙の辞典では、この本文の部分が「対策」という語に関する全データに なるでしょう。 それに対して、JIS X 4081 形式の辞典では、本文というデータに加えて、 「たいさく」が「対策」の検索語であるという情報や、検索したときに表示 する見出しをデータとして保持しています。 つまり、JIS X 4081 形式の辞書データでは、「検索語」、「見出し」、 「本文」の三つの成分に分けて保持するのです。
(JIS X 4081 形式は漢字を含んだ語も検索できますので、「たいさく」に 加えて「対策」も検索語として挙げています。 つまり、見出し、本文は一つであるのに対し、検索語は複数個用意することが できます。)
あなたが紙の辞典と似た書式の辞典データを JIS X 4081 形式に変換しようと 思ったら、このようにデータを検索語、見出し、本文に分類する処理を行う ことになります。 逆に分類さえ行えば、残る JIS X 4081 形式への変換処理の殆んどは FreePWING が自動的に行います。
では、前節の国語辞典のようなデータを JIS X 4081 形式に変換する FreePWING のプログラムを実際に作ることにしましょう。 今回の辞典では簡略化のため、前方一致、後方一致検索だけを用意すること にします。 条件検索や外字は使いません。
まず、変換前の辞典データの形式について若干補足しておきます。 辞典データの形式は、次のように見出しと説明が一行ごとに交互に現れる という単純なものであるとします。
たいさく 【大作】 (← 見出し) 大掛かりな作品。 (← 説明) たいさく 【対策】 (← 見出し) 状況に応じてとる手段や策略。 (← 説明)
見出し部分の正確な書式は、次のいずれかの形式であるものとします。
形式 1: <かな検索語> 形式 2: <かな検索語> <空白> "【" <漢字を含んだ検索語> "】"
さらに、元のデータは EUC-JP で書かれているもとします。
これは、FreePWING の取り扱う文字コードが EUC-JP だからです。
別のコードで書かれている場合は、jcode.pl
や
Jcode.pm
などで、EUC-JP に変換してから処理する必要が
あります。
この国語辞典データを処理する FreePWING プログラム例は、以下の通りです。 プログラムの細部の説明は、次節以降で行います。 なお、データと同様に、本プログラムも EUC-JP で書かれているものとします。
use FreePWING::FPWUtils::FPWParser; ## インスタンスを生成する。 $fpwword2 = FreePWING::FPWUtils::Word2->new(); $fpwheading = FreePWING::FPWUtils::Heading->new(); $fpwtext = FreePWING::FPWUtils::Text->new(); ## 書き込み用の作業ファイルを開く。 $fpwword2->open() || die $fpwword2->error_message() . "\n"; $fpwheading->open() || die $fpwheading->error_message() . "\n"; $fpwtext->open() || die $fpwtext->error_message() . "\n"; for (;;) { ## 次の一行 (見出し) を読み込む。 last if (!defined($_ = <>)); chomp; ## 本文と見出しを新しいエントリに切り替える。 $fpwtext->new_entry() || die $fpwtext->error_message() . "\n"; $fpwheading->new_entry() || die $fpwheading->error_message() . "\n"; ## 見出しを書き込む。 $fpwheading->add_text($_) || die $fpwheading->error_message() . "\n"; ## 本文を書き込む。 if (!$fpwtext->add_keyword_start() || !$fpwtext->add_text($_) || !$fpwtext->add_keyword_end() || !$fpwtext->add_newline()) { die $fpwtext->error_message() . "\n"; } ## かなの検索語を登録する。 ($kanaword = $_) =~ s/ 【.*$//; $heading_position = $fpwheading->entry_position(); $text_position = $fpwtext->entry_position(); if (!$fpwword2->add_entry($kanaword, $heading_position, 'head', $text_position, 'text')) { die $fpwword2->error_message() . "\n"; } ## 漢字の検索語があれば、それも登録する。 if (/ 【(.*)】$/) { $kanjiword = $1; if (!$fpwword2->add_entry($kanjiword, $heading_position, 'head', $text_position, 'text')) { die $fpwword2->error_message() . "\n"; } } ## 次の一行 (説明) を読み込む。 last if (!defined($_ = <>)); ## 本文を書き込む。 if (!$fpwtext->add_text($_) || !$fpwtext->add_newline()) { die $fpwtext->error_message() . "\n"; } } ## 書き込み用の作業ファイルを閉じる。 $fpwword2->close() || die $fpwword2->error_message() . "\n"; $fpwheading->close() || die $fpwheading->error_message() . "\n"; $fpwtext->close() || die $fpwtext->error_message() . "\n";
本節から数節に分けて、前節に示した FreePWING プログラムの解説を 行います。
今回の国語辞典データの例では、FreePWING が用意している以下の 3 つの クラスを使います。
FreePWING::FPWUtils::Word2
FreePWING::FPWUtils::Heading
FreePWING::FPWUtils::Text
これらのクラスを使うには、モジュールを直接読み込むのではなく、
FreePWING::FPWUtils::FPWParser
というモジュールを
読み込みます。
このモジュールが、上記の 3 つのクラスと同名のモジュールを読み込みます。
use FreePWING::FPWUtils::FPWParser;
次に各クラスのインスタンスを一つずつ生成します。
## インスタンスを生成する。 $fpwword2 = FreePWING::FPWUtils::Word2->new(); $fpwheading = FreePWING::FPWUtils::Heading->new(); $fpwtext = FreePWING::FPWUtils::Text->new();
さらに、それぞれのオブジェクトに対して open()
メソッドを
呼び出して、作業用ファイルを開いておきます。
ファイル名は、あらかじめモジュール内部で決めてあるものが使用されます。
## 書き込み用の作業ファイルを開く。 $fpwword2->open() || die $fpwword2->error_message() . "\n"; $fpwheading->open() || die $fpwheading->error_message() . "\n"; $fpwtext->open() || die $fpwtext->error_message() . "\n";
これより後はしばらく、for
文を用いた無限の繰り返しに
なっています。
この for
ブロックが処理の中心部分です。
元の国語辞典データの読み込み方は自由ですが、今回は Perl の
ファイルハンドル <>
から読み込むことにしました。
for
ブロックの中で見出しと説明を一行ずつ交互に
読んでいます。
ファイルの終端まで呼んだら for
ループから抜けます。
処理の概要を記すと、次のようになります。
for (;;) { ## 次の一行 (見出し) を読み込む。 last if (!defined($_ = <>)); (読み込んだ見出しの処理...) ## 次の一行 (説明) を読み込む。 last if (!defined($_ = <>)); (読み込んだ説明の処理...) }
続いて、for
ブロックの中の処理について見ていきます。
見出し分のデータを一行読み込んだら、まず本文と見出しオブジェクトに
対してそれぞれ new_entry()
を呼び、次に新しい
「エントリ (entry)」に切り替える処理を行ってから、本文
($fpwtext
)、見出し($fpwheading
) に
書き込みます。
## 次の一行 (見出し) を読み込む。 last if (!defined($_ = <>)); chomp; ## 本文と見出しを新しいエントリに切り替える。 $fpwtext->new_entry() || die $fpwtext->error_message() . "\n"; $fpwheading->new_entry() || die $fpwheading->error_message() . "\n"; ## 読み込んだ見出しを「本文部」に書き込む。 if (!$fpwtext->add_keyword_start() || !$fpwtext->add_text($_) || !$fpwtext->add_keyword_end() || !$fpwtext->add_newline()) { die $fpwtext->error_message() . "\n"; } ## 読み込んだ見出しを「見出し部」に書き込む。 $fpwheading->add_text($_) || die $fpwheading->error_message() . "\n";
本文と見出しのエントリの切り替えとは、現在の検索語の見出し、本文の 終端を宣言し、新たな検索語に切り替えることを意味します。 たとえば、「大作」という検索語に対する書き込みが終わったら、そこで エントリを切り替え、次に「対策」という検索語に対する書き込みを行う、 といった手順で処理を行います。
辞書の元データの見出し分の行は、JIS X 4081 の見出し部と本文部の両方に 書き込んでいますが、これは辞書のデータの分類の仕方を思い出してみれば、 理解できると思います。
ただし、本文部では add_keyword_start()
と
add_keyword_end()
で囲っいることに注意して下さい。
これによって、囲った部分が「検索キー」であることを記す印が
埋め込まれます。
EPWING の検索ソフトウェアによっては、この印を本文の切れ目を意味する印
として扱っているものもありますので、必ず埋め込むようにして下さい
また、見出しは必ず一行で完結するものなので、改行の書き込み
(add_newline()
の呼び出し) は行いませんが、本文に対しては
明示的に書き込む必要があります。
読み込んだデータ側に含まれている改行文字 ("\r"
と
"\n"
) は add_text()
に渡しても無視されます
ので、本文中で改行を行う
には必ず add_newline()
を呼び出す必要があります。
プログラムでは、次に検索語を登録しています。
## かなの検索語を登録する。 ($kanaword = $_) =~ s/ 【.*$//; $heading_position = $fpwheading->entry_position(); $text_position = $fpwtext->entry_position(); if (!$fpwword2->add_entry($kanaword, $heading_position, $text_position)) { die $fpwword2->error_message() . "\n"; }
検索語の登録は、検索用のオブジェクト ($fpwword2
) に対して
add_entry()
メソッドを呼び出すことによって行います。
本文、見出しとは異なり、検索語の登録前に new_entry()
を
呼ぶ必要はありません。
add_entry()
には、次の 3 つの引数が必要です。
$fpwheading->entry_position()
で得られる位置)
$fpwtext->entry_position()
で得られる位置)
漢字の検索語の登録処理は、かなの検索語と変わりませんので、説明は 省略します。
ループ内の最後の部分です。 説明分の行を一行読み、それを本文として書き込みます。
## 次の一行 (説明) を読み込む。 last if (!defined($_ = <>)); chomp; ## 本文を書き込む。 if (!$fpwtext->add_text($_) || !$fpwtext->add_newline()) { die $fpwtext->error_message() . "\n"; }
ループを抜けた後の部分の処理です。
生成したインスタンスの最終処理として、それぞれのインスタンスで開いて
いた書き込み用の作業ファイルを閉じます。
これには、close()
メソッドを用います。
## 書き込み用の作業ファイルを閉じる。 $fpwword2->close() || die $fpwword2->error_message() . "\n"; $fpwheading->close() || die $fpwheading->error_message() . "\n"; $fpwtext->close() || die $fpwtext->error_message() . "\n";
以上でプログラムは終りです。
では、この FreePWING プログラムを実行して、JIS X 4081 形式のデータを
生成してみます。
プログラム名が fpwkokugo
、データファイル名が
kokugo.dat
だとすると、次のように実行します。
% perl fpwkokugo kokugo.dat
処理が正常に終了すると、カレントディレクトリには word
、
eword
、head
、text
、
textref
、texttag
というファイルが生成
されます。
これらのファイルは JIS X 4081 形式のデータファイルではなく、
中間生成ファイルです。
JIS X 4081 形式のデータファイルを作成するには、さらに次のコマンドを
実行する必要があります。
% perl /usr/local/libexec/freepwing/fpwsort % perl /usr/local/libexec/freepwing/fpwindex % perl /usr/local/libexec/freepwing/fpwcontrol % perl /usr/local/libexec/freepwing/fpwlink
(ここでは FreePWING を /usr/local
以下にインストールし、
libexecdir
の位置を変更していないものとします。
他の場所にインストールしているときは、適宜読み替えて下さい。)
これらの処理をすべて行うと、カレントディレクトリにはさらにいくつかの
中間生成ファイルに加えて、honmon
というファイルが生成
される筈です。この honmon
というのが、JIS X 4081 形式の
ファイルになります。
しかし、毎回これらのコマンドを一つ一つ手で実行するのは大変ですので、
自動化を考えましょう。
それにはもちろん、コマンド行を書き並べた sh スクリプトを作って実行する
ようにしても良いのですが、FreePWING では make に対応するための仕掛けを
用意しています。
これを使えば、データファイルの最終修正時刻が honmon
よりも後の場合だけ honmon
を生成し直すといったことが
できます。
Makefile
の作成
fpwmake 用の Makefile
の記し方を説明していきます。
まず、この Makefile
の文法は、必ず GNU make 向けのもので
なければならないので注意して下さい。
つまり、make は必ず GNU make を用いる必要があります。
今回のプログラム用の Makefile
は次のようになります。
FPWPARSER = fpwkokugo FPWPARSERFLAGS = kokugo.txt include fpwutils.mk
変数 FPWPARSER
には作成した FreePWING プログラム名を、
変数 FPWPARSERFLAGS
には FreePWING プログラムに渡す
コマンド行引数を設定します。
Makefile
の末尾では include
コマンドを用いて
fpwutils.mk
というファイルを読み込みます。
(このファイルの中に生成規則が書かれています。
また、GNU make を用いる必要があるのは、このファイルが GNU make 用に
書かれているからに他なりません。)
Makefile
が準備できたら、make を実行します。
これには、専用の sh スクリプト fpwmake コマンドを使うと便利です。
fpwmake は GNU make に適切なオプションを与えて呼び出します。
カレントディレクトリを fpwkokugo のあるディレクトリに移して、 次のようにして fpwmake を実行します。
% fpwmake
fpwmake を実行すると、カレントディレクトリには work
というディレクトリができ、その下にいくつかのファイルが生成されます。
% ls control.dep eidxref1 idxref0 sort.dep ctrl esort idxref1 text ctrlref eword index.dep textref eidx0 head link.dep texttag eidx1 idx0 parse.dep word eidxref0 idx1 sort
正常に終了すれば、カレントディレクトリに honmon
ファイル
が生成されます。
fpwmake を実行すると、カレントディレクトリには work
というディレクトリができ、その下にいくつかの中間ファイルが生成されます。
無事に honmon
ファイルを生成し終り、中間ファイルおよび
honmon
ファイルが必要なくなった場合は、fpwmake clean を
実行すると、fpwmake 時に生成されたファイルがすべて消去されます。
% fpwmake clean
くれぐれも消去する前に honmon
ファイルを別の場所に移す
ことを忘れないで下さい。
そうしないと honmon
も消えてしまい、もう一度 fpwmake で
生成し直す羽目になってしまいます。
ALLDEPS
と CLEANEXTRA
ターゲット
もし fpwmake を実行するにあたって前処理を行いことがあるときは、
ALLDEPS
変数を利用します。
いま、変換スクリプトを読み込むべき辞書データが、もとは roff の ms
マクロを使用して書かれたファイル kokugo.ms
であると
しましょう。
そして、nroff コマンドを使って平文ファイル kokugo.txt
を
生成し、変換スクリプトは平文のほうを読み込んで処理をするとしたら、次の
ように書いておきます。
FPWPARSER = fpwkokugo FPWPARSERFLAGS = kokugo.txt ALLDEPS = kokugo.txt CLEANEXTRA = kokugo.txt kokugo.txt: kokugo.ms rm -f $@ tbl kokugo.ms | nroff -ms | col -b > kokugo.txt include fpwutils.mk
ただし、ALLDEPS
の仕組みを使って生成したファイル (ここ
では kokugo.txt
) は fpwmake clean を実行しても消去
されません。
そこで、CLEANEXTRA
という変数に fpwmake clean 実行時に
消して欲しいファイルを書いておきます。
以上で作業は完了なのですが、ここで再びプログラムの記述に焦点を戻します。
変換プログラムの先頭では、必ず次のようにインスタンスの生成と書き込み用 の作業ファイルを開く処理を行います。 これはどの変換プログラムでも同じです。
## インスタンスを生成する。 $fpwword2 = FreePWING::FPWUtils::Word2->new(); $fpwheading = FreePWING::FPWUtils::Heading->new(); $fpwtext = FreePWING::FPWUtils::Text->new(); ## 書き込み用の作業ファイルを開く。 $fpwword2->open() || die $fpwword2->error_message() . "\n"; $fpwheading->open() || die $fpwheading->error_message() . "\n"; $fpwtext->open() || die $fpwtext->error_message() . "\n";
実は、FreePWING にはこの部分と等価な処理をもう少し簡単に書くために、
initialize_fpwparser()
というサブルーチンが
FreePWING::FPWUtils::FPWParser
パッケージに用意されてい
ます。
initialize_fpwparser()
を使うと、上のプログラムは次のよう
に簡略化できます。
initialize_fpwparser('text' => \$fpwtext, 'heading' => \$fpwheading, 'word2' => \$fpwword2);
ファイルを閉じる部分についても同様です。
これまでは、各オブジェクトに対して close()
メソッドを呼び
出していました。
## 書き込み用の作業ファイルを閉じる。 $fpwword2->close() || die $fpwword2->error_message() . "\n"; $fpwheading->close() || die $fpwheading->error_message() . "\n"; $fpwtext->close() || die $fpwtext->error_message() . "\n";
この部分は、次のように finalize_fpwparser()
メソッドで置き
換えることができます。
finalize_fpwparser('text' => \$fpwtext, 'heading' => \$fpwheading, 'word2' => \$fpwword2);
前節に記した修正事項を反映すると、プログラムは次のようになります。 これで、本章で扱った変換プログラムは完成です。
use FreePWING::FPWUtils::FPWParser; ## インスタンスを生成する。 initialize_fpwparser('text' => \$fpwtext, 'heading' => \$fpwheading, 'word2' => \$fpwword2); for (;;) { ## 次の一行 (見出し) を読み込む。 last if (!defined($_ = <>)); chomp; ## 本文と見出しを新しいエントリに切り替える。 $fpwtext->new_entry() || die $fpwtext->error_message() . "\n"; $fpwheading->new_entry() || die $fpwheading->error_message() . "\n"; ## 見出しを書き込む。 $fpwheading->add_text($_) || die $fpwheading->error_message() . "\n"; ## 本文を書き込む。 if (!$fpwtext->add_keyword_start() || !$fpwtext->add_text($_) || !$fpwtext->add_keyword_end() || !$fpwtext->add_newline()) { die $fpwtext->error_message() . "\n"; } ## かなの検索語を登録する。 ($kanaword = $_) =~ s/ 【.*$//; $heading_position = $fpwheading->entry_position(); $text_position = $fpwtext->entry_position(); if (!$fpwword2->add_entry($kanaword, $heading_position, $text_position)) { die $fpwword2->error_message() . "\n"; } ## 漢字の検索語があれば、それも登録する。 if (/ 【(.*)】$/) { $kanjiword = $1; if (!$fpwword2->add_entry($kanjiword, $heading_position, $text_position)) { die $fpwword2->error_message() . "\n"; } } ## 次の一行 (説明) を読み込む。 last if (!defined($_ = <>)); ## 本文を書き込む。 if (!$fpwtext->add_text($_) || !$fpwtext->add_newline()) { die $fpwtext->error_message() . "\n"; } } ## 書き込み用の作業ファイルを閉じる。 finalize_fpwparser('text' => \$fpwtext, 'heading' => \$fpwheading, 'word2' => \$fpwword2);
ここでは、前章で触れなかった諸々の細かな注意点をいくつか記しておきます。
FreePWING では、文字コードに EUC-JP を使用していますが、正確には
honmon
ファイルの中では JIS X 0208 の文字 (全角文字) しか
使用できません。
このため、JIS X 0201 のカタカナ (半角カタカナ) および ASCII の文字
(半角英数字) が与えられると、FreePWING 側で対応する JIS X 0208 の文字
に置き換えられます。
また、JIS X 0212 の文字 (補助漢字) は使用することができず、与えると エラーになります。
検索語に関する注意点は、次の通りです。
本文の各エントリの冒頭では、以下のように add_keyword_start()
と add_keyword_end()
で囲い、囲った部分が検索キーであると
いう印を付けるようにすることは既に記しました。
## 読み込んだ見出しを「本文部」に書き込む。 if (!$fpwtext->add_keyword_start() || !$fpwtext->add_text($_) || !$fpwtext->add_keyword_end() || !$fpwtext->add_newline()) { die $fpwtext->error_message() . "\n"; }
EPWING の検索ソフトウェアによっては、この検索キーのを本文の切れ目を 意味する印として扱っているものもあります。 こうした検索ソフトウェアでは、2 度目の検索キー開始指定子が出現すると、 そこが次のエントリの開始位置であり、今のエントリが終了したのだと判断 して、そこで本文の表示、出力を止めるようになっています。 したがって、このような検索ソフトウェアで正しく書籍の本文が表示、出力 されるように考慮して、検索キーの指定をエントリの冒頭で入れることが推奨 されます。 さもないと、次のエントリ、次の次のエントリ、とどこまでも本文を表示、 出力してしまいます。
逆に、必要があればエントリの途中で検索キーを置いても構いませんが、 むやみに置いてしまうと、エントリの本文の出力がそこで途切れてしまうこと になります。 検索キーの配置は慎重に行って下さい。
ここまでの説明で honmon
ファイルは生成できるように
なりましたが、これだけでは JIS X 4081 形式の書籍として完全なものでは
ありません。
この章では、JIS X 4081 形式の書籍としてパッケージ化する方法などに
ついて説明します。
JIS X 4081 形式の書籍では、これまでに生成した honmon
ファイルの他に、catalogs
というファイルが必ず必要です。
FreePWING には catalogs
ファイルを生成する仕掛けが用意
として、EPWUTIL というソフトウェアに付属している catdump
コマンドと互換の Perl スクリプトが用意されています。
catdump
を使って catalogs
ファイルを生成する
には、まず次のような catalogs.txt
ファイルを用意します。
[Catalog] FileName = catalogs Type = EPWING1 Books = 1 [Book] Title = "国語辞典" BookType = 6001 Directory = "KOKUGO"
用意ができたら、実際に catalogs
ファイルを生成します。
catdump
を直接起動する代わりに、次のようにします。
% fpwmake catalogs
catalogs.txt
ファイルの書式の詳細については、
EPWUTIL 付属の catdump
のマニュアル
をご覧ください。
なお、/usr/local/share/freepwing/catalogs
ディレクトリに
catdump 用の catalogs.txt
のサンプルファイルと、 catdump
で生成した catalogs
ファイルがインストールされます
(ただし、FreePWING を /usr/local
以下にインストールして
datadir を変更していない場合)。
こちらを参考にすると良いでしょう。
用意した Makefile
にいくつかの変数を追加することで、
パッケージ化を容易にすることができます。
以下に記述例を記します。
PACKAGE = kokugo-fpw1.0 PACKAGEEXTRA = README.pkg=README TODO VERSION PACKAGEDEPS = VERSION ARCHIVEEXTRA = README.pkg TODO CLEANEXTRA = VERSION DIR = kokugo VERSION: rm -f $@ date +'version %Y-%m-%d' > VERSION
各パラメタの意味は、次の通りです。
PACKAGE
kokugo-fpw1.0
、ファイル
名は kokugo-fpw1.0-src.tar.gz
になります。
また、JIS X 4081 形式に変換した書籍データ一式をパッケージ化して
tar+gzip 形式や zip 形式でアーカイブする際のファイル名にも使われます。
上記の例では kokugo-fpw1.0.tar.gz
、
kokugo-fpw1.0.zip
になります。
PACKAGEEXTRA
catalogs
、
honmon
および外字ファイル) を収めたアーカイブを作る際に、
書籍データ以外に一緒に入れるファイルを書き並べます。
`ファイル名=ファイル名' という形で指定した場合は、左辺のファイルを右辺
のファイル名に改名してパッケージに入れることを意味します。
PACKAGEDEPS
PACKAGEEXTRA
で指定したファイルの中に、最初から用意されて
いるファイルではなく、何らかの処理をして生成しなくてはならないファイル
があった場合は、この PACKAGEDEPS
に書き、生成方法を
Makefile
の中に記しておくと良いでしょう。
ARCHIVEEXTRA
README
、
Makefile
、catdump 用の catalogs.txt
以外に
一緒に入れるファイルを書き並べます。
`ファイル名=ファイル名' という形で指定した場合は、左辺のファイルを右辺
のファイル名に改名してパッケージに入れることを意味します。
DIR
honmon
および外字ファイルを収めるサブディレクトリの名前
です。
catalogs.txt
の中で Directory
パラメタに
書いた値を小文字化したものを指定する必要があります。
また、この DIR
の値は、変換した書籍データ一式を
パッケージ化する際のトップディレクトリにも使われます。
前節で説明した改良を Makefile
に施したら、fpwmake を実行
してみます。
まず、JIS X 4081 形式に変換した書籍データ一式をインストールしてみます。
これには、install ターゲットを使います。
% fpwmake install
FreePWING を /usr/local
以下にインストールし、
datadir
の位置を変更していなければ、
/usr/local/share/dict
にインストールされます。
前節の例を使った場合、ディレクトリ以下は次のようになります。
kokugo/README kokugo/TODO kokugo/catalogs kokugo/kokugo/data/honmon
別の場所にインストールしたい場合は、INSTALLDIR
で指定
します。
% fpwmake install installdir=/some/where
次に、JIS X 4081 形式に変換した書籍データ一式をパッケージ化して tar+gzip 形式および zip 形式でアーカイブしてみます。 (インストールを実行しなくても、アーカイブの作成は可能です。) これには、package ターゲットを使います。
% fpwmake package
先にも記しましたが、今回の例では、できあがるファイル名は
kokugo-fpw1.0.tar.gz
、kokugo-fpw1.0.zip
に
なります。
これらのファイルに収められるファイルは、次の通りです。
基本的に、インストールのときの構成と同じです。ただし、zip 形式では
ファイル名およびディレクトリ名は大文字になります。
kokugo/README kokugo/TODO kokugo/catalogs kokugo/kokugo/data/honmon
最後に、変換プログラム一式をパッケージ化して tar+gzip 形式でアーカイブ してみます。 (honmon を作成していなくても、アーカイブの作成は可能です。) これには、archive ターゲットを使います。
% fpwmake archive
今回の例では、できあがるファイル名は
kokugo-fpw1.0-src.tar.gz
になります。
これらのファイルに収められるファイルは、次の通りです。
kokugo-fpw1.0/README kokugo-fpw1.0/catalogs.txt kokugo-fpw1.0/Makefile kokugo-fpw1.0/README.pkg kokugo-fpw1.0/TODO
前章で JIS X 4081 形式のファイル生成における FreePWING の基本的な 使用方法を一通り紹介しましたので、これ以降の章では、応用的な機能について 説明します。
本文および見出しには、文字に強調を施したり、ある区間内で折り返しを禁止 したりといった修飾の指定を挿入することができます。 ただし、これらの指示が JIS X 4081 検索ソフトウェア上でどのように表示 されるかは、それぞれのソフトウェアによって異なります。
FreePWING で扱える修飾には、次のような種類があります。
開始指定と終了指定は入れ子にすることで、複数の修飾を同時に行うことも 可能です。 たとえば、分割禁止と強調の両方の修飾を行いたい場合は、
[分割禁止開始] ... [強調開始] ... [強調終了] ... [分割禁止終了]
という順序で指定子を挿入します。 強調開始と強調終了の間は、分割禁止と強調と両方が有効になります。 修飾の指定子は入れ子になっていれば良いので、次のように強調を外側、 分割禁止を内側にしても構いません。
[強調開始] ... [分割禁止開始] ... [分割禁止終了] ... [強調終了]
しかし、次のような用法は入れ子になっていないので、誤りです。
[分割禁止開始] ... [強調開始] ... [分割禁止終了] ... [強調終了]
開始指定子を指定したら、それと対になる終了指定子を必ずエントリの末尾 までに呼ばなくてはなりません。 エントリ終端時点で終了指定子が呼ばれていない修飾があると、エラーに なります。
また、入れ子の中で外側と同じ修飾を再度かけることはできません。 これも行おうとするとエラーになります。
よく辞書では、本文中に別の箇所への参照情報を入れていることがあります。 JIS X 4081 形式のデータでは紙の辞書と違って、参照先の位置情報を 入れますので、(ちょうど HTML のリンクのように) 参照先に飛んでそこの 本文を表示することも可能です。
FreePWING でこのような参照を行うには、次の操作が必要になります。
タグ (tag) というのは、本文の特定の位置に対して名前を付けるものです。 たとえば、「エンジン」という語のエントリの開始位置に engine という名前 のタグを割り当てることができます。 タグの名前は必ず本文内で一意でなくてはなりません。 タグに使える文字は、アルファベット (A..Z, a..z)、数字 (0..9)、下線 (_)、およびハイフン (-) です。
FreePWING で、エントリの先頭に対してタグを割り当てるには、
FreePWING::FPWUtils::Text
クラスのオブジェクトに対して
add_entry_tag()
を呼び出します。
$fpwtext->add_entry_tag("engine");
タグを割り当てたら、そのタグの参照元では参照情報を埋め込みます。 参照情報は語句に対して付加するので、開始指定と終了指定があります。 たとえば、先ほど割り当てた engine という名前のタグへの参照を
(参考: →「エンジン」も参照のこと)
という表現で行い、このうち『→「エンジン」』の部分だけに参照情報を 入れる場合は、次のような処理を行うことになります。
$fpwtext->add_text("(参考: "); $fpwtext->add_reference_start(); $fpwtext->add_text("→「エンジン」"); $fpwtext->add_reference_end("engine"); $fpwtext->add_text("も参照のこと)");
add_reference_start()
が参照の開始指定、
add_reference_end()
が終了指定になります。
終了指定時に参照先のタグを一緒に指定します。
(正確に言えば、参照情報は
修飾指定子
の一種になりますので、修飾指定子に関する規則がそのまますべて
当てはまります。)
なお、参照情報を入れる時点でまだ定義されていないタグ名を指定することも 可能です。 (そうでないと、本文の後方への参照が行えないからです。) ただし、本文が終了したのにもかかわらずそのタグが未定義だった場合は、 エラーが発生します。
紙の辞書で言うところの「本文」を複数個をまとめて JIS X 4081 の一個の
honmon
ファイルの中に入れてしまうことができます。
たとえば、EPWING の辞書には英和辞典と和英辞典を本文を一つにまとめて
いるものがあります。
もちろん、英和辞典、和英辞典に対して一つずつ honmon
を
用意しても良いのですが、一緒にしておくと辞書を切り替えずに英和、和英の
両方が検索できるという利点があります。
FreePWING でも、複数個の本文を入れるための仕掛けが用意されています。
FreePWING では FreePWING::FPWUtils::Text
クラスの
オブジェクトを介して本文データを書き込みますが、
FreePWING::FPWUtils::Text
クラスの new_context()
メソッドを使うと、そこで新しい「本文」に切り替わります。
(FreePWING では、本文一個を「コンテキスト (context)」と
呼んでいます。)
$fpwtext->new_context();
英和辞典と和英辞典を一体化させるなら、まず英和辞典の本文データを一通り
書き込み、new_context()
で「本文」を切り替えた後に
和英辞典の本文データを書き込む、という手順になります。
なお、相互参照 用のタグは、本文を
切り替えても共有されますので、タグ名は必ず honmon
全体で
一意でなくてはなりません。
逆にこのことは、複数の本文の間で相互参照が可能であることを意味します。
JIS X 4081 形式のファイル honmon
には、本文以外にも、
メニューという特殊な文章データを組み込むことができます。
メニューは主に、辞書の付録、序文、使い方をいった部分を収録するときに 用います。 通常、メニューは以下のような階層構造にします。
* 序文 * この辞書の使い方 - 検索方法 - 表記について - 発音について * 付録 - 不規則変化動詞一覧表
この辞書のトップメニューは次のようになります。 検索ソフトウェアはこのメニューを表示する際に、メニューの各項目、つまり 「序文」や「この辞書の使い方」「付録」にそれぞれ参照先があることが ユーザに分かるように表示するでしょう。
* 序文 * この辞書の使い方 * 付録
ユーザが「序文」を選べば序文の内容が表示され、「この辞書の使い方」を 選べば「検索方法」「表記について」「発音について」といった項目が並んだ サブメニューが表示されます。
FreePWING でこのようなメニューを扱うには、次のように
FreePWING::FPWUtils::Menu
クラスのオブジェクトを用意する
必要があります。
## インスタンスを生成する。 $fpmenu = FreePWING::FPWUtils::Menu->new(); ## 書き込み用の作業ファイルを開く。 $fpmenu->open() || die $fpwmenu->error_message() . "\n";
initialize_fpwparser()
を使う場合は、次のように
'menu'
という項目を足します。
initialize_fpwparser('text' => \$fpwtext, 'heading' => \$fpwheading, 'word2' => \$fpwword2, 'menu' => \$fpwmenu); # ←追加
finalize_fpwparser()
の呼び出しでも同様の操作を行います。
FreePWING::FPWUtils::Menu
クラスは、本文書き込み用の
クラスである FreePWING::FPWUtils::Text
とまったく同じ
メソッド群を持ちます。
異なるのは、どの中間ファイルに書き出すかという点だけです。
つまり、FreePWING::FPWUtils::Text
クラスで用意されて
いるのと同名の書き込み用のメソッドを呼び出すことで、メニューに書き込み
を行うことができます。
メニューの中の、トップメニュー、サブメニューおよび「序文」等の文章は それぞれ、独立した コンテキスト にします。 したがって、メニューでは参照情報の付加、タグの設定、コンテキストの 切り替えといった操作を多用することになります。 なお、メニューから本文への参照やその逆の参照を行うことも可能です。 ただし、タグ名はメニューと本文とで共有されますので、衝突しないように して下さい。
JIS X 4081 形式のファイル honmon
には、
メニュー
の他にもう一つ、著作権表示という特殊な文章データがあります。
これは、その名の通り書籍の著作権表示を文章化したものです。
FreePWING で著作権表示を扱うには、
FreePWING::FPWUtils::Copyright
クラスのオブジェクトを
用意する必要があります。
## インスタンスを生成する。 $fpwcopyright = FreePWING::FPWUtils::Copyright->new(); ## 書き込み用の作業ファイルを開く。 $fpwcopyright->open() || die $fpwcopyright->error_message() . "\n";
initialize_fpwparser()
を使う場合は、次のように
'copyright'
という項目を足します。
initialize_fpwparser('text' => \$fpwtext, 'heading' => \$fpwheading, 'word2' => \$fpwword2, 'menu' => \$fpwmenu, 'copyright' => \$fpwcopyright); # ←追加
finalize_fpwparser()
の呼び出しでも同様の操作を行います。
メニューもそうでしたが、著作権表示のクラスである
FreePWING::FPWUtils::Copyright
クラスもまた、
本文書き込み用のクラスである FreePWING::FPWUtils::Text
と完全に同じメソッド群を持ちます。
異なるのは、どの中間ファイルに書き出すかという点だけです。
FreePWING::FPWUtils::Text
クラスで用意されているのと同名
の書き込み用のメソッドを呼び出すことで、著作権表示に書き込みを行う
ことができます。
条件検索を扱うには、
FreePWING::FPWUtils::KeyWord
クラスのオブジェクトを用意
する必要があります。
## インスタンスを生成する。 $fpwkeyword = FreePWING::FPWUtils::KeyWord->new(); ## 書き込み用の作業ファイルを開く。 $fpwkeyword->open() || die $fpwkeyword->error_message() . "\n";
initialize_fpwparser()
を使う場合は、次のように
'keyword'
という項目を足します。
initialize_fpwparser('text' => \$fpwtext, 'heading' => \$fpwheading, 'word2' => \$fpwword2, 'keyword' => \$fpwkeyword); # ←追加
finalize_fpwparser()
の呼び出しでも同様の操作を行います。
使い方は FreePWING::FPWUtils::Word2
クラスのオブジェクト
とまったくと同じで、エントリの追加は add_entry
メソッドを
用います。
## かなの検索語を登録する。 if (!$fpwkeyword->add_entry($kanaword, $heading_position, $text_position)) { die $fpwkeyword->error_message() . "\n"; }
FreePWING では、辞書に固有の字を外字として定義して利用することも できます。 ただし、外字を利用するには、外字定義ファイルと、各文字の ビットマップデータ (フォントデータ) を用意する必要があります。 以下、この章では外字を使用する方法を詳しく見ていきます。
外字を定義する際は、各字のビットマップデータを用意しなくてはなりません。 ビットマップデータは、小さな長方形の点を縦横に何個も敷き詰めたもので 構成されます。 また、マップ自体はモノクロのデータで、色情報は持ちません。 ちょうど、XBM (X BitMap) 形式の画像データと同じです。
次は音楽のト音記号の外字ビットマップデータの例です。 (■が前景色の点、□が背景色の点です。)
□□□□□■■■ □□□□■□■□ □□□■□■□□ □□□■□■□□ □□□■■□□□ □□■□■□□□ □□■□■■■□ □■□■□■□■ □■□■□■□■ □■□□□■□■ □□■□□■■□ □□□■■■□□ □□□□■□□□ ■■□□■□□□ ■■□■□□□□ □■■□□□□□
JIS X 4081 では、「全角」「半角」という 2 種類の外字を定義しています。 全角外字はビットマップの縦と横の点の数がほぼ同じ外字で、それに対して 半角外字では横方向の点の数が縦の半分になります。 上のト音記号は、半角外字 (横 8、縦 16) です。
半角外字と全角外字はまったく独立しています。 辞書は、全角あるいは半角のどちらか一方の外字だけ定義することも できますし、両方とも定義することも可能です。 両方定義する場合でも、ある字を半角、全角の一方にだけ登録することも 可能です。
ビットマップデータは、全角、半角それぞれの外字に対して、以下のように 4 つずつサイズの違うものを用意することが可能です。
外字の種類 \ 高さ | 高さ 16 | 高さ 24 | 高さ 30 | 高さ 48 |
半角外字 (横×縦) | 8×16 | 16×24 | 16×30 | 24×48 |
全角外字 (横×縦) | 16×16 | 24×24 | 32×30 | 48×48 |
このうち、縦方向の点が 16 個のビットマップ (半角の 8x16, 全角の 16x16) は必須です。 他のサイズは、大きなサイズのビットマップから順に省略することができます。 これはたとえば、縦の点の数が 48 と 30 の外字を省略して 16 と 24 だけ 定義することは可能ですが、48 と 24 を省略して 16 と 30 だけ定義する ことはできない、ということです。
また、ビットマップは、それぞれの外字について利用可能なすべてのサイズの 分を用意しなければなりません。 たとえば、あなたが 16, 24, のサイズのビットマップを用意すると決めたら、 定義した外字すべてに対して、必ず 16 と 24 のサイズのビットマップを それぞれ用意しなければなりません。 ある外字は 16 と 24 のサイズのビットマップを用意するけれども、別の外字 には 16 だけしか用意しないということはできません。
FreePWING では、外字のビットマップデータには XBM 形式のファイルを 用います。 登録したい外字一字毎、サイズ毎に一つの XBM ファイルを用意します。 XBM ファイルは、UNIX の X の環境であれば bitmap コマンド等で作成 できます。 ビットマップエディタが XBM 形式を扱えるものでなければ、描画した後で 画像形式の変換ツールを使って XBM に変換して下さい。
ビットマップが用意できたら、次に外字定義ファイルを作成します。 半角外字、全角外字を両方とも定義する場合は、定義ファイルも 2 つに 分けて用意します。
外字定義ファイルには、次のような形式で 1 行に 1 つの外字を定義します。
外字名 XBMファイル名 XBMファイル名 XBMファイル名 XBMファイル名
以下は記述例です。
g-clef g-clef16.xbm g-clef24.xbm g-clef30.xbm g-clef48.xbm f-clef f-clef16.xbm f-clef24.xbm f-clef30.xbm f-clef48.xbm
各パラメタは 1 個以上の空白かタブで区切ります。
「外字名」とは、その外字を利用するときに参照する名前です。 全外字で一意であれば、好きな名前を付けることができます。 ただし、外字名には空白やタブ、改行文字は使用することができません 外字名は半角と全角で独立していますので、同じ名前のものを定義しても、 衝突することはありません。 半角外字内、全角外字内で複数回同じ外字名を定義すると、エラーになります。
「XBMファイル名」は、外字のビットマップファイル名です。 左から順に高さが 16, 24, 30, 48 のものを並べます。 一部のサイズのビットマップを用意しない場合は、そのパラメタは指定 しないで下さい。 ですから、実際は XBM ファイル名は 1 〜 4個の範囲で指定されることに なります。 ただし、指定するファイル名の個数は、ファイル内で一定でなければ なりません。 途中で変化するとエラーになります。
なお、ファイル名はカレントディレクトリからの相対パス指定になります。 次のように、ディレクトリの区切りを入れることも可能です。
g-clef bitmap/g-clef16.xbm bitmap/g-clef24.xbm f-clef bitmap/f-clef16.xbm bitmap/f-clef24.xbm
指定した XBM の画像サイズは、その外字のサイズと同一のものでなくては なりません。 異なったサイズだと、エラーが発生します。
前節までに書かれたことの準備ができたら、実際に外字データを生成します。
半角外字用には fpwhalfchar
コマンド、全角外字用には
fpwfullchar
コマンドを実行します。
両方定義しているときは、両方実行します。
順番はどちらが先でも構いません。
たとえば、半角外字の外字定義ファイル名が halfchar.txt
、
全角外字の外字定義ファイル名が fullchar.txt
だとすると、
次のようなコマンド行を入力して下さい。
% perl /usr/local/share/FreePWING/fpwutils/fpwhalfchar halfchar.txt % perl /usr/local/share/FreePWING/fpwutils/fpwfullchar fullchar.txt
(ここでは FreePWING を /usr/local
以下にインストールし、
libexecdir
の位置を変更していないものとします。
他の場所にインストールしているときは、適宜読み替えて下さい。)
正常に終了すれば、次のビットマップデータファイルができ上がります。 ただし、用意しなかったサイズの分は作成されません。
外字の種類 \ 高さ | 高さ 16 | 高さ 24 | 高さ 30 | 高さ 48 |
半角外字 | gai16h | gai24h | gai30h | gai48h |
全角外字 | gai16f | gai24f | gai30f | gai48f |
これらのファイルは honmon
と同じく、最終的に
辞書データパッケージの一部として使われます。
それ以外に中間ファイルも生成されますが、これらは本文の中で外字を
参照するときに使用されます。
fpwhalfchar, fpwfullchar を直接実行する代わりに fpwmake を使って外字 データを生成することもできます。 通常は、こちらのほうが楽で良いでしょう。
前節と同様に、半角外字の外字定義ファイル名が halfchar.txt
、
全角外字の外字定義ファイル名が fullchar.txt
だと仮定する
と、Makefile
に以下の記述を追加します。
HALFCHARS = halfchar.txt FULLCHARS = fullchar.txt
半角外字、全角外字の一方だけを生成する場合は、HALFCHARS
、
FULLCHARS
の一方だけを定義して下さい。
なお、複数個のファイルを指定することも可能です。
変換した書籍データのアーカイブ を作る際
に、HALFCHARS
、FULLCHARS
で指定した
外字定義ファイルは自動的にアーカイブに収録されますが、ファイル中に指定
されている XBM ファイルは、収録されません。
XBM ファイルをアーカイブに収録するには、ARCHIVEEXTRA
で
明示的に指定する必要があります。
ARCHIVEEXTRA = g-clef16.xbm g-clef24.xbm g-clef30.xbm g-clef48.xbm \ f-clef16.xbm f-clef24.xbm f-clef30.xbm f-clef48.xbm
XBM ファイルの数が多いときは、外字ファイルをサブディレクトリに置き、
ARCHIVEEXTRA
にはそのディレクトリ名を指定すると
良いでしょう。
ARCHIVEEXTRA = gaiji
外字を本文中で使用するには、あらかじめ fpwhalfchar
、
fpwfullchar
コマンドを実行して、定義された外字の
参照ファイルを用意しておかなければなりません。
つまり、fpwhalfchar
、fpwfullchar
は
変換プログラムよりも前に実行する必要があります。
(fpwmake を使用するのであれば、自動的に正しい順番で実行されますので、
実行順序を気にする必要はないでしょう。)
半角外字を本文中に書き込むには、本文書き込み用のクラス
FreePWING::FPWUtils::Text
のオブジェクトに対して
add_half_user_character()
を呼び出します。
if (!$fpwtext-$gt;add_half_user_character('g-clef')) { die $fpwtext->error_message() . "\n"; }
この例では、"g-clef" という名前の半角外字を書き込んでいます。 この外字名は、半角外字の外字定義ファイルに登録されているもので なければなりません。 未登録の外字を使用すると、エラーになります。
全角外字については、代わりに
add_full_user_character()
メソッドを呼び出す点が異なる
だけで、呼び出し方などはすべて同じです。
FreePWING では、BMP の画像をカラー図版として収録することができます。 (モノクロ図版用の画像形式が別途存在しますので、ここでは便宜上 BMP 画像のことを「カラー図版」と呼ぶことにします。 モノクロの BMP 画像であっても、区分上はカラー図版になります。)
なお、FreePWING はモノクロ図版には対応していません。
カラー図版のデータは、honmon
ファイルの中に格納されます。
カラー図版を利用するには、カラー図版定義ファイルを用意する必要が あります。 カラー図版定義ファイルでは、1 行に 1 つのカラー図版を定義することが できます。 行の記述形式は、次の通りです。
図版名 BMPファイル名
以下は記述例です。
nutcracker nutcracker.bmp prtruska prtruska.bmp
カラー図版名に使える文字はタグ名と同じく、アルファベット (A..Z, a..z)、 数字 (0..9)、下線 (_)、およびハイフン (-) です。
カラー図版定義ファイルを用意したら、このファイルを
Makefile
の CGRAPHS
変数に指定します。
たとえば、ファイル名を cgraphs.txt
としたとすると、次の
ように記述します。
CGRAPHS = cgraphs.txt
この例では一つしかファイルを指定していませんが、複数指定することも可能 です。
CGRAPHS
変数に指定したファイルは、
変換スクリプトのアーカイブ
を作る際に、自動的にはアーカイブに収録されますが、ファイル中に
記されている BMP ファイルは収録されないので注意して下さい。
BMP ファイルを収録するには、Makefile
の
ARCHIVEEXTRA
変数で指定する必要があります。
ARCHIVEEXTRA = nutcracker.bmp prtruska.bmp
ファイルの数が多いときは、BMP ファイルをサブディレクトリに置き、
ARCHIVEEXTRA
にはそのディレクトリ名を指定すると良い
でしょう。
ARCHIVEEXTRA = images
カラー図版を本文中から参照するには、本文書き込み用のクラス
FreePWING::FPWUtils::Text
のオブジェクトに対して、
add_color_graphic_start()
メソッドと
add_color_graphic_end()
メソッドを呼び出します。
これらのメソッドは 修飾指定子 の
一種ですので、修飾指定子に関する規則がすべて適用されます。
$fpwtext->add_color_graphic_start("prtruska"); $fpwtext->add_text("→図版"); # キャプション $fpwtext->add_color_graphic_end();
add_color_graphic_start()
を呼び出す際に、参照したい
カラー図版名を指定しす。
カラー図版の参照は、相互参照 とよく
似ています。
ただし、相互参照では _end
メソッドで参照先の情報を
書き込むのに対して、
カラー図版の参照では _start
メソッドで書き込むという違い
がある点に注意して下さい。
FreePWING::FPWUtils::Word2
クラス
FreePWING::FPWUtils::Word2
は、前方一致および後方一致検索
用の検索語一覧を同時に生成するためのクラスです。
以下のメソッドを持っています。
new()
FreePWING::FPWUtils::Word2
クラスのオブジェクトを生成して、
そのリファレンスを返すクラスメソッドです。
open()
close()
add_entry($word, $heading_position, $text_position)
$word
が追加する検索語、
$heading_position
が見出しの位置、
$text_position
が本文の位置です。
見出しと本文の位置は、FreePWING::FPWUtils::Heading
および
FreePWING::FPWUtils::Text
クラスのオブジェクトが持っている
entry_position()
メソッドを使って取得します。
このメソッドは成功すれば 1 を、失敗すれば 0 を返します。
追加する検索語の最大長は 255 バイトです。
file_name()
entry_count()
error_message()
FreePWING::FPWUtils::KeyWord
クラス
FreePWING::FPWUtils::KeyWord
は、条件検索用の検索語一覧を
同時に生成するためのクラスです。
このクラスのオブジェクトが有するメソッドは、
FreePWING::FPWUtils::Word2
クラス
とまったく同じですので、そちらを参照して下さい。
FreePWING::FPWUtils::Text
クラス
FreePWING::FPWUtils::Text
は、本文を生成するためのクラス
です。
以下のメソッドを持っています。
new()
FreePWING::FPWUtils::Text
クラスのオブジェクトを生成して、
そのリファレンスを返すクラスメソッドです。
通常は直接このメソッドを呼び出さずに、fpwutils が提供する
initialize_fpwparser()
サブルーチンを用います。
open()
initialize_fpwparser()
サブルーチンを用います。
close()
open()
メソッドで開いたファイルをすべて閉じます。
成功すれば 1 を、失敗すれば 0 を返します。
開いていなければ何もせず、1 を返します。
通常は直接このメソッドを呼び出さずに、fpwutils が提供する
finalize_fpwparser()
サブルーチンを用います。
new_context()
new_entry()
new_context()
で新たな
コンテキストを開始した直後の一文字もデータを書き込んでいない状態で、
このメソッドを呼んでも、さらに新たなエントリを開始することはしません。
これにより、先頭のエントリに対しては、明示的にこのメソッドを呼んでも
呼ばなくてもどちらでも良いようになっています。
add_text($text)
$text
で指定した文字列を本文に追加します。
文字列は、EUC-JP で書かれていなくてはなりません。
ただし、$text
中に出現する改行文字 (CR および LF) は無視
されます。
このメソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
add_half_user_character($character_name)
add_full_user_character($character_name)
add_half_user_character()
は引数 $character_name
で指定した半角外字を本文に追加します。
同様に add_full_user_character()
は、全角外字を追加します。
$character_name
は、外字定義ファイルの中で定義されている
外字名でなければなりません。
成功すれば 1 を、失敗すれば 0 を返します。
add_entry_tag($tag)
add_entry_tag($tag)
は本文の現在のエントリの先頭位置に
対して、それぞれ $tag
という名前のタグを設定します。
これらのメソッドを呼び出すには、あらかじめ本文ファイルと
参照情報ファイル、タグファイルを開いていなければなりません。
タグ名は本文、メニュー、著作権表示データ内で一意のものでなくては
なりません。
このメソッドは成功すれば 1 を、失敗すれば 0 を返します。
add_keyword_start()
add_keyword_end()
add_keyword_start()
は検索キー開始指定子を、
add_keyword_end()
は検索キー終了指定子を、それぞれ
呼ばれた時点での本文の現在位置に挿入します。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
いずれのメソッドも成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
読み込んだ見出しの処理、
本文に関する注意点、
修飾指定子
の節もあわせてご覧下さい。
add_reference_start()
add_reference_end($position)
add_reference_start()
は参照開始指定子を、
add_reference_end()
は参照終了指定子を、それぞれ呼ばれた
時点での本文の現在位置に挿入します。
参照先の位置は $position
で指定します。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
相互参照 の節もあわせてご覧下さい。
add_subscript_start()
add_subscript_end()
add_subscript_start()
は下添え字開始指定子を、
add_subscript_end()
は下添え字終了指定子を、それぞれ
呼ばれた時点での本文の現在位置に挿入します。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
修飾指定子
の節もあわせてご覧下さい。
add_indent_level($level)
$level
に設定します。
指定できるのは、2 から 6 までの整数です。
また、各エントリ開始時に自動的に 1 に設定されます。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
add_newline()
add_superscript_start()
add_superscript_end()
add_superscript_start()
は上添え字開始指定子を、
add_superscript_end()
は上添え字終了指定子を、それぞれ
呼ばれた時点での本文の現在位置に挿入します。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
修飾指定子
の節もあわせてご覧下さい。
add_nowrap_start()
add_nowrap_end()
add_nowrap_start()
は分割禁止開始指定子を、
add_nowrap_end()
は分割禁止終了指定子を、それぞれ呼ばれた
時点での本文の現在位置に挿入します。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
修飾指定子
の節もあわせてご覧下さい。
add_emphasis_start()
add_emphasis_end()
add_emphasis_start()
は強調開始指定子を、
add_emphasis_end()
は強調終了指定子を、それぞれ呼ばれた
時点での本文の現在位置に挿入します。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
修飾指定子
の節もあわせてご覧下さい。
add_font_start($font_name)
add_font_end()
add_font_start()
は別フォント開始指定子を、
add_font_end()
は同終了指定子を、それぞれ呼ばれた時点での
本文の現在位置に挿入します。
引数の $font_name
として有効な値は、'italic'
(イタリック体を指定) および 'bold'
(ボールド体を指定) の
2 種類です。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
修飾指定子
の節もあわせてご覧下さい。
add_color_graphic_start($graphic_name)
add_color_graphic_end()
add_color_graphic_start()
はカラー図版参照開始指定子を、
add_color_graphic_end()
は参照終了指定子を、それぞれ
呼ばれた時点での本文の現在位置に挿入します。
参照先のカラー図版名は $graphic_name
で指定します。
メソッドを呼び出すには、あらかじめ本文ファイルを開いていなければ
なりません。
成功すれば 1 を、失敗すれば 0 を返します。
使用方法に関しては、
カラー図版 の節もあわせてご覧下さい。
file_name()
reference_file_name()
tag_file_name()
context_position()
entry_position()
context_count()
entry_count()
total_entry_count()
error_message()
FreePWING::FPWUtils::Heading
クラス
FreePWING::FPWUtils::Heading
は、見出しを生成するための
クラスです。
FreePWING::FPWUtils::Text
クラスとだいたい同じメソッドを
持っていますが、次のメソッドは使用できなくなっています。
その他のメソッドの使用方法については、
FreePWING::FPWUtils::Text
クラス
を参照して下さい。
FreePWING::FPWUtils::Menu
クラス
FreePWING::FPWUtils::Menu
は、メニューを生成するための
クラスです。
FreePWING::FPWUtils::Text
とまったく同じメソッド群を
持っています。
FreePWING::FPWUtils::Copyright
クラス
FreePWING::FPWUtils::Copyright
は、著作権表示を生成する
ためのクラスです。
FreePWING::FPWUtils::Text
とまったく同じメソッド群を
持っています。
FreePWING::FPWUtils::FPWParser
モジュール
他の FreePWING 付属の Perl モジュールとは異なり、
FreePWING::FPWUTils::FPWParser
モジュールではクラスを定義
しません。
代わりに、main
パッケージに対してサブルーチンや変数を定義
し、コマンド行のオプションの解析処理を行います。
FreePWING::FPWUTils::FPWParser
モジュールが定義する
サブルーチンには
initialize_fpwparser()
と
finalize_fpwparser()
があります。
initialize_fpwparser()
は FreePWING 関係のクラスの
オブジェクトを初期化するためのサブルーチンで、次のように 2 つの要素を
組にして並べたものを引数にとります。
initialize_fpwparser('word2' => \$w, 'text' => \$t);
要素の組はそれぞれ、1 番目の引数には 'word'
,
'endword'
のような名前を示す文字列をとり、2 番目の引数
には変数へのリファレンスを取るようにします。
1 番目のパラメタとして認識される文字列とその用途は、次の通りです。
word2
FreePWING::FPWUtils::Word2
クラスのオブジェクトを生成し、
初期化します。
heading
FreePWING::FPWUtils::Heading
クラス
のオブジェクトを生成し、初期化します。
text
FreePWING::FPWUtils::Text
クラスの
オブジェクトを生成し、初期化します。
menu
FreePWING::FPWUtils::Text
クラス
のオブジェクトを生成し、初期化します。
copyright
FreePWING::FPWUtils::Text
クラス
のオブジェクトを生成し、初期化します。
生成して初期化されたオブジェクトは、要素の各組の 2 番目の引数に 参照先としてセットされます。 このサブルーチンは、処理に成功すると 1 を、失敗すると 0 を返します。
finalize_fpwparser()
は
initialize_fpwparser()
で生成したオブジェクトを
使い終わったときに呼び出すサブルーチンで、各オブジェクトに対して
後処理を行います。
引数の書式は initialize_fpwparser()
とまったく同じです。
このサブルーチンも、処理に成功すると 1 を、失敗すると 0 を返します。
initialize_fpwparser()
, finalize_fpwparser()
の具体的な使用例については
fpwutils 対応 をご覧下さい。
FreePWING::FPWUtils::FPWParser
モジュールによって定義
される変数には以下のものがあります。
$work_directory
$text_file_name
"$work_directory/text"
)FreePWING::FPWUtils::Word2::add_entry()
を呼び出す
際に、第 2 引数として渡します。
$text_ref_file_name
"$work_directory/textref"
)
$text_tag_file_name
"$work_directory/texttag"
)
$menu_file_name
"$work_directory/menu"
)
$menu_ref_file_name
"$work_directory/menuref"
)
$menu_tag_file_name
"$work_directory/menutag"
)
$copyright_file_name
"$work_directory/copy"
)
$copyright_ref_file_name
"$work_directory/copyref"
)
$copyright_tag_file_name
"$work_directory/copytag"
)
$heading_file_name
"$work_directory/head"
)FreePWING::Word2::add_entry()
を呼び出す際に、
第 3 引数として渡します。
$word_file_name
"$work_directory/word"
)
$endword_file_name
"$work_directory/eword"
)
$sort_file_name
"$work_directory/sort"
)
$endsort_file_name
"$work_directory/esort"
)
$index_file_name
"$work_directory/idx"
)
$index_ref_file_name
"$work_directory/idxref"
)
$endindex_file_name
"$work_directory/eidx"
)
$endindex_ref_file_name
"$work_directory/eidxref"
)
$control_file_name
"$work_directory/ctrl"
)
$control_ref_file_name
"$work_directory/ctrlref"
)
$honmon_file_name
"honmon"
)
$half_char_name_file_name
"$work_directory/halfchar"
)
$full_char_name_file_name
"$work_directory/fullchar"
)
$half_char_bitmap_16_file_name
$half_char_bitmap_24_file_name
$half_char_bitmap_30_file_name
$half_char_bitmap_48_file_name
"gai16h"
、"gai24h"
、"gai30h"
、
"gai48h"
)
$full_char_bitmap_16_file_name
$full_char_bitmap_24_file_name
$full_char_bitmap_30_file_name
$full_char_bitmap_48_file_name
"gai16f"
、"gai24f"
、"gai30f"
、
"gai48f"
)
FreePWING::FPWUTils::FPWParser
は
Getopt::Long
モジュールを用いてコマンド行オプションの解析
を行います。
この解析処理は、モジュールを読み込みさえすれば自動的に行われますので、
ユーザ側で明示的にサブルーチンを呼ぶ必要はありません。
今のところ、コマンド行オプションには次のものが定義されています。
-workdir
directory'work'
が使われます。
プログラム内では、変数$work_directory
で参照できます。
解析後、指定されたオプションは @ARGV
から取り除かれます。
残りの引数をどう解釈するかは、ユーザの処理プログラムに任されます。
未知のオプションが指定された場合はエラーとなり、その時点でプログラムを
強制的に終了します。
FreePWING::FPWUtils::FPWParser
は古い作業ファイルが
作業ディレクトリに残っていると、それを削除します。
削除に失敗しても、エラーとして報告することはしません。
fpwmake
コマンドfpwmake コマンドの実体は sh スクリプトで、中で GNU make を呼び出します。
たとえば、GNU make のコマンド名が /usr/local/bin/gmake
、
fpwutils.mk
ファイルがインストールされているディレクトリ
が /usr/local/share/freepwing
だとすると、
% fpwmake 引数...
という呼び出しは、実際には
% /usr/local/bin/gmake -I/usr/local/share/freepwing 引数...
という処理を手動で実行するのとまったく同じことです。
GNU make について詳しく知りたい方は、GNU make のドキュメントをお読み 下さい。
fpwutils.mk
ファイル
fpwutils.mk
ファイルの中で、いくつかの変数、生成規則を
定義していますが、詳細については fpwutils.mk
ファイルを
直接ご覧になって下さい。