# Ruby/EB 拡張ライブラリ

for version 2.5

## 目次

- 概要
- 取得

- module EB
- EB::Book
  - メソッド（書籍）
  - メソッド（副本）
  - メソッド（検索）
  - メソッド（副本：外字・フォント）
  - メソッド（マルチメディアデータ）
- EB::Position
- EB::ExtFont
- EB::Hookset
- EB::定数

### 概要

EPWING/EBなどのCD-ROM 書籍にアクセスするための関数を集めた、C 言語のライブラリ 「EB」 をrubyから利用するための拡張ライブラリです。EBについて詳しくは配布元である こちら のページへどうぞ。EBの作者はMotoyuki Kasahara様です。

利用には当然EBが正しくインストールされている必要があります。
Ruby/EB version2より、EBの3.2以降を要求します。 また、Ruby/EBの1.xに対してテキストフック関係の仕様が変更されています。ご注意下さい。

EBが漢字コードとしてEUCを要求しますので、$KCODEはEUCでお願いします。

EB自身がGPLのため、本Ruby拡張ライブラリもGPLとします。

実はこの文章は こちら の笠原様の文章のパクリの部分が多々あります。どうもすみません。

Book#search2系、Book#content,フック関連、Positionクラスなどは黒田様からのパッチに拠るところが大きいです。どうもありがとうございました。

EBの3.0alphaへの対応は新改様のコーディングに依るものです。どうもありがとうございました。

EB3.0+への対応は、やまだ様、うえち様両名よりパッチを頂きました。どうもありがとうございました。

EB-3.2.1への対応は、高宗様、knu様作成のパッチによります。どうもありがとうございました。

いいかげんだったAppendixへの対応は、山田様によって修正されました。どうもありがとうございます。

EB-4.0を利用する場合は、EB-4.0本体にパッチが必要です。

RubyEB 2.2より、かずひこ氏が開発に参加されました。

### 取得

RubyEBのページから取得して頂けます。
また、cvsから取得すると、一番新しいものが手に入ったりするかもしれません。しかし大々的な不具合が混入中の可能性もあります。
→方法

文中の最大ブロック長はデフォルトでは65530bytesです。

## module EB

errorcode
  ebでエラーが発生したときセットされます。
error_message
  errorcodeを文字列にしたものを返します

## EB::Book

### クラスメソッド

new

### メソッド(書籍)

bind
  オブジェクトを、パス path にある CD-ROM 書籍に結び付けます。パスは書籍のトップディレクトリ、つまり `CATALOG' か `CATALOGS' ファイルのあるディレクトリでなくてはなりません。
suspend
  オブジェクトが現在選択中のもの、すなわち、選択中の副本、言語、フォントの高さをすべて未選択にします
bound?
  書籍に結び付いているかどうかを調べます。
disctype
  ディスクの形式を返します。 オブジェクトはあらかじめ書籍に結び付いていなければなりません。
path
  書籍のパスを返します。 オブジェクトはあらかじめ書籍に結び付いていなければなりません。
charcode
  書かれている文字コードを返します。 オブジェクトはあらかじめ書籍に結び付いていなければなりません。
subbook_count
  オブジェクト内の副本の数を返します。オブジェクトは、あらかじめ書籍に結び付けられていなくてはなりません。
subbook_list
  副本のリストを作成して副本コードの配列として返します。ここで得られる副本コードを用いて、set(subbook)/title/directoryメソッドにおいて副本を指定します。
set(subbook) : alias subbook=
  副本を選択します。
subbook
  現在選択中の副本の副本コードを返します。あらかじめ、オブジェクト内のいずれかの副本が選択されていなくてはなりません。 設定されていない場合は-1となります。
unset
  副本の選択を解除します。
hookset/hooset=
  テキストフックのセットを取得・設定します。設定する場合はEB::Hooksetのインスタンスかnilしか出来ません。nilを設定したときはフックを解除します。
appendix_path=
  Appendixを設定します。

### メソッド(副本)

title(subbook=currently)
  現在選択中の副本の題名を返します。あらかじめ、オブジェクト内のいずれかの副本が選択されていなくてはなりません。
  引数を省略すると、現在選択されている副本の題名を返します。
directory(subbook=currently)
  現在選択中の副本のディレクトリ名を返します。あらかじめ、オブジェクト内内のいずれかの副本が選択されていなくてはなりません。
  引数を省略すると、現在選択されている副本のディレクトリを返します。
search_available?
  現在選択中の副本が前方一致検索メソッドを持っているかどうか調べます。
  副本が選択されていない場合はRuntimeErrorをraiseします。
exactsearch_available?
  現在選択中の副本が完全一致検索メソッドを持っているかどうか調べます。
  副本が選択されていない場合はRuntimeErrorをraiseします。
endsearch_available?
  現在選択中の副本が後方一致検索メソッドを持っているかどうか調べます。
  副本が選択されていない場合はRuntimeErrorをraiseします。
keywordsearch_available?
  現在選択中の副本がキーワード検索メソッドを持っているかどうか調べます。
  副本が選択されていない場合はRuntimeErrorをraiseします。
menu_available?
  メニューが利用できるかどうかを調べます。
  副本が選択されていない場合などでRuntimeErrorをraiseします。
copyright_available?
  著作権表示が利用できるかどうかを調べます。
copyright
  著作権表示を返します。

### メソッド(検索)

search(word,max=all)
  wordをキーとして前方一致検索を行い、結果を配列に入れて返します。配列の各要素は[ heading, text ]として与えられます。
  イテレータとして用いると、[heading,text]の配列をyieldします。返り値としてEB::Cancelを与えると、イテレートを終了します。(breakで抜けても良いです)
exactsearch(word,max=all)
  wordをキーとして完全一致検索を行い、結果を配列に入れて返します。配列の各要素は[ heading, text ]として与えられます。
  イテレータとして用いると、[heading,text]の配列をyieldします。返り値としてEB::Cancelを与えると、イテレートを終了します。(breakで抜けても良いです)
endsearch(word,max=all)
  wordをキーとして後方一致検索を行い、結果を配列に入れて返します。配列の各要素は[ heading, text ]として与えられます。
  イテレータとして用いると、[heading,text]の配列をyieldします。返り値としてEB::Cancelを与えると、イテレートを終了します。(breakで抜けても良いです)
keywordsearch(words,max=all)
  wordsはキーワードの配列とし、キーワードによる検索を行います。それ以外は上記検索メソッドと同じ。
search2(word,max=all)
exactsearch2(word,max=all)
endsearch2(word,max=all)
  この３つはそれぞれ、search/exactsearch/endsearchと同じですが、配列に入れたりyieldするものが異なります。
  イテレータとして用いると、[結果のEB::Positionインスタンス,検索語]をyieldします。そうでない場合は、同じ物を配列に入れて返します。
keywordsearch2(words,max=all)
  wordsはキーワードの配列とし、キーワードによる検索を行います。それ以外は上記検索メソッドと同じ。
menu
  トップメニューの内容を返します。各メニュー項目の参照先はテキストフックのCANDIDATEやREFERENCEとして渡されます。
menu2
  トップメニューの書籍上の位置をEB::Positionのインスタンスで返します。
content(position)
  positionはEB::Positionのインスタンスです。
  positionで示される位置の本文の内容を返します。最大ブロック長まで読み込みます。
  イテレータとして用いると最大ブロック長のブロックをyieldしながら本文の区切りが来るまで読み込みます。
content_noseek
  シーク動作を行わずに本文の内容を読みとり返します。最大ブロック長だけ読み込みます。このメソッドを読む前にはcontent()などでシークを行っておく必要があります。

### メソッド（副本：外字・フォント）

fontcode_list
  利用可能なフォントの一覧（配列）を返します。中身はintegerですが、それぞれEB::FONT_**の定数に対応します。FONT_16,FONT_24,FONT_30,FONT_48がそれぞれ0,1,2,3です。
fontcode/fontcode=
  フォントの大きさを取得・指定します。EB::FONT_**の定数を与えます。取得する外字フォントのサイズに影響します。fontcode未設定の場合はEB::FONT_INVALID(-1)となります。
get_widefont(code)
  codeで示される全角外字フォントを得ます。返値はEB::ExtFontのインスタンスです。
get_narrowfont
  codeで示される半角外字フォントを得ます。返値はEB::ExtFontのインスタンスです。
wide_startcode
  選択中の副本における全角外字の先頭コードを返します。
wide_endcode
  選択中の副本における全角外字の終了コードを返します。
narrow_startcode
  選択中の副本における半角外字の先頭コードを返します。
narrow_endcode
  選択中の副本における半角外字の終了コードを返します。

### メソッド(マルチメディアデータ)

read_monographic(pos,width,height)
  モノクロ図版のデータを取得し、Stringとして返します。
  posはEB::Positionのインスタンスで読み込み位置を示します。また、widthとheightで読み込まれるべき図版のサイズを指定します。サイズや位置はテキストフックの引数として得られます。
read_colorgraphic(pos,stoplength=最大ブロック長)
read_colorgraphic(pos,stoplength=最大ブロック長){|block| proc}
  カラーの図版を取得し、Stringとして返します。（最大stoplengthバイトまで）
  イテレータとして用いるとstoplengthバイトを読み出してblockとして与え、終わるまで繰り返します。その場合、メソッドの返値は読み込み長を返します。
  posはEB::Positionのインスタンスで読み込み位置を示します。また、stoplengthで読み込みバイト数を指定します。stoplengthは読み込むバイト数の上限です。電子ブックではEBライブラリに「データ終了位置が来ても読み込みをやめない」という制限事項があります。（BMPやJPEGのデコードを本ライブラリで行い、適当に止めれれば良いのですが）
read_wavedata(startpos,endpos,stoplength=最大ブロック長)
  音声データをStringとして取得します。（最大stoplengthバイトまで）
  イテレータとして用いるとstoplengthバイトを読み出してblockとして与え、終わるまで繰り返します。その場合、メソッドの返値は読み込み長を返します。
  startposは開始位置、endposは終了位置を示す、EB::Positionのインスタンスです。これらはテキストフックから情報が得られます。
read_mpeg(code1,code2,code3,code4,stoplength=最大ブロック長)
  動画データをStringとして取得します。（最大stoplengthバイトまで）
  イテレータとして用いるとstoplengthバイトを読み出してblockとして与え、終わるまで繰り返します。その場合、メソッドの返値は読み込み長を返します。
  code1かcode4までは、HOOK_BEGIN_MPEGのargv[2]からargv[5]に相当します。
compose_mpegfilename(code1,code2,code3,code4)
  code1からcode4で示される動画のファイル名を取得します。

## EB::Position

### クラスメソッド

new(page,offset)
  ページとオフセットからEB_Positionを設定します。

### 属性

読み書き可能です。

page
offset

## EB::ExtFont

外字を表します。インスタンスはEB::Book#get_widefontもしくはEB::Bookget_narrowfontで取得します。

widefont?
  外字が全角であればtrueを返します。
code
  外字のコードを返します。
to_xbm
  外字のビットマップデータをxbm形式のStringで返します。
to_xpm
  外字のビットマップデータをxpm形式のStringで返します。
to_gif
  外字のビットマップデータをgif形式のStringで返します。
  ファイルに落とせばそのままgifファイルになります。
to_bmp
  外字のビットマップデータをbmp形式のStringで返します。
  ファイルに落とせばそのままbmpファイル(Windows・OS/2)になります。
to_png
  外字のビットマップデータをpng形式のStringで返します。
  ファイルに落とせばそのままpngファイルになります。

## EB::Hookset

### クラスメソッド

new
  Hooksetのインスタンスを作成します。これはテキストフックを扱います。

### メソッド

register(hook,proc)
register(hook){|eb,argv| proc }
  hookはフックの種類を示す定数です。
  ebは呼び出し元のEB::Bookであり、argvはテキストフックの引数の配列です。
  イベント発生時に呼ばれるメソッドを設定します。hookに与える定数は、EB::の下に定数として定義されています(EB::HOOK_****)。"EB::定数"の項参照。
  また、返値がnil以外の場合はテキストに返値を書き込みます。(String以外の場合はObject#to_strします）
  同じフックに対して複数回設定を行うと、最後に行った設定のみ有効です。

## EB::定数

Ruby EB のバージョンは以下の定数で定義されています。

- RUBYEB_VERSION

また、eb-3.2以降では以下の定数が定義されています。eb.cの最後の方と、EB Libraryのリファレンスを参照して下さい。

- RUBYEB_VERSION
- FONT_16
- FONT_24
- FONT_30
- FONT_48
- FONT_INVALID
- HOOK_BEGIN_CANDIDATE
- HOOK_BEGIN_COLOR_BMP(hookcode,?,page,offset)
- HOOK_BEGIN_COLOR_JPEG(hookcode,?,page,offset)
- HOOK_BEGIN_DECORATION(decoration)
- HOOK_BEGIN_EMPHASIS
- HOOK_BEGIN_GRAPHIC_REFERENCE
- HOOK_BEGIN_GRAY_GRAPHIC
- HOOK_BEGIN_IN_COLOR_BMP(hookcode,?,page,offset)
- HOOK_BEGIN_IN_COLOR_JPEG(hookcode,?,page,offset)
- HOOK_BEGIN_KEYWORD
- HOOK_BEGIN_MONO_GRAPHIC(hookcode,?,height,width)
- HOOK_BEGIN_MPEG(hookcode,?,code1,code2,code3,code4)
- HOOK_BEGIN_NARROW
- HOOK_BEGIN_NO_NEWLINE
- HOOK_BEGIN_REFERENCE
- HOOK_BEGIN_SUBSCRIPT
- HOOK_BEGIN_SUPERSCRIPT
- HOOK_BEGIN_WAVE(hookcode,?, begin_page, begin_offset, end_page, end_offset)
- HOOK_END_CANDIDATE_GROUP(hookcode,page,offset)
- HOOK_END_CANDIDATE_LEAF(hookcode,0,0)
- HOOK_END_COLOR_GRAPHIC(hookcode)
- HOOK_END_DECORATION
- HOOK_END_EMPHASIS
- HOOK_END_GRAPHIC_REFERENCE
- HOOK_END_GRAY_GRAPHIC
- HOOK_END_IN_COLOR_GRAPHIC(hookcode)
- HOOK_END_KEYWORD
- HOOK_END_MONO_GRAPHIC(hookcode,page,offset)
- HOOK_END_MPEG
- HOOK_END_NARROW
- HOOK_END_NO_NEWLINE
- HOOK_END_REFERENCE (hookcode,page,offset)
- HOOK_END_SUBSCRIPT
- HOOK_END_SUPERSCRIPT
- HOOK_END_WAVE
- HOOK_GB2312
- HOOK_GRAPHIC_REFERENCE
- HOOK_INITIALIZE
- HOOK_ISO8859_1()
- HOOK_NARROW_FONT(code)
- HOOK_NARROW_JISX0208()
- HOOK_NEWLINE()
- HOOK_SET_INDENT(hookcode,indent)
- HOOK_WIDE_FONT(code)
- HOOK_WIDE_JISX0208()

### 例

    #!/bin/env ruby -Ke
    require "eb"

    b=EB::Book.new
    b.bind("/cdrom")
    b.subbook=0
    b.exactsearch( "じしょ" ) do |word,desc|
      print "====================¥n"
      print "==   ",word,"¥n"
      print "¥n",desc,"¥n"
    #  EB::Cancel   # yield will be stopped
    end

## 例2

    require "eb"

    b=EB::Book.new
    b.bind("/cdrom")
    b.subbook=0
    b.exactsearch2( "じしょ" ) do |pos,word|
      print "====================¥n"
      print "==   ",word,"¥n"
      print "¥n",b.content(pos),"¥n"
    #  EB::Cancel   # yield will be stopped
    end

## 履歴

- v2.6 2004/??/?? eb-4.1に対応。EB::ExtFont#to_pngの追加。
- v2.5 2004/03/15 Appendixを正しく読むように修正。eb-4.0(パッチ必要）に対応。
- v2.4 2003/12/26 文字装飾系フックと pthread に対応
- v2.3 2003/08/20 ruby-1.8に対応
- v2.2 2003/01/26 eb-3.2.3での不具合修正とかずひこ氏による機能追加
- v2.1 2003/01/22 かずひこ氏による定数定義ミスとcompose_mpegfilenameのバグフィクス
- v2.0 2003/01/05 機能強化（画像・音声・動画・外字） 機能変更（フックなど）
- v1.7 2002/03/31 高宗様、knu様のパッチにより、EB-3.2.1へ対応（定数）
- v1.6 2001/06/22 やまだ様、うえち様のパッチによりEB3.0の定数名変更に対応
- v1.5 2001/04/04 新改様のコードにより、EBの3.0に対応
- v1.4(再) 2000/06/26 折田様のパッチにより、人を惑わすextconf.rbを修正
- v1.4 2000/06/23 search2系、イテレータ使用時のキャンセルが効くように
- v1.3 2000/06/22 黒田様からの再パッチ。活動時間の差異によるタイミングずれが....
- v1.2 2000/06/22 v1.1への修正。メソッド追加、機能整理など。(未公開)
- v1.1 2000/06/21 黒田様からのパッチによるsearch2系、Position、フック（未公開）
- v1.0 2000/04/10 初版