FreePWING プログラミングドキュメント

[前へ] [次へ] [目次]

# 応用機能

前章で 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";
>        }

[前へ] [次へ] [目次]