最終更新: kitamomonga 2010年08月22日(日) 15:09:01履歴
Mechanize がサーバから取得したファイルを扱うクラスを、レスポンスヘッダの Content-Type によって振り分けるためのクラスです。
普通に Mechanize の動作で充分である場合にはユーザーが使うことはありません。
Mechanize#pluggable_parser の返り値がこの PluggableParser クラスの唯一のインスタンスで、これに #[]= で自作クラスを登録してカスタマイズします。これ(と#default=)以外のメソッドをユーザーが使用する機会はないと思われます。
ユーザーが PluggableParser を何も設定しなかった場合、デフォルトの Mechanize の動作はおおむね
- Content-Type が text/html → Mechanize::Page を使用する
- それ以外 → Mechanize::File を使用する
というものになっています(実際はいくつかありますが省略)。
これに処理を追加したい場合、たとえば Content-Type: text/plain のときに特別な処理をして欲しい場合は、Mechanize#pluggable_parser に #[]= で処理クラスを登録します。
class TextFile < Mechanize::File def title; @body.to_a[0]; end # 適当に1行目をタイトルにする end agent.pluggable_parser['text/plain'] = TextFileとすると、
- Content-Type が text/html → Mechanize::Page を使用する
- Content-Type が text/plain → TextFile を使用する
- それ以外 → Mechanize::File を使用する
「それ以外」の時の処理を切り替えるには #default= メソッドを使用します。
agent.pluggable_parser.default = Mechanize::FileSaverとすると、
- Content-Type が text/html → Mechanize::Page を使用する
- それ以外 → Mechanize::FileSaver を使用する
- new - Mechanize::PluggableParser オブジェクトを生成する
- html= - ファイルタイプが HTML のときの取り扱いクラスを指定
- xhtml= - ファイルタイプが XHTML のときの取り扱いクラスを指定
- pdf= - ファイルタイプが PDF のときの取り扱いクラスを指定
- csv= - ファイルタイプが CSV のときの取り扱いクラスを指定
- xml= - ファイルタイプが XML のときの取り扱いクラスを指定
- [] - 特定の Content-Type のときに Mechanize が処理に使用するクラスを返す
- []= - 特定の Content-Type のときに Mechanize が処理に使用するクラスを指定
- default - 未設定の Content-Type だったときに Mechanize が処理に使用するクラスを返す
- default= - 未設定の Content-Type だったときに Mechanize が処理に使用するクラスを指定
Mechanize::PluggableParser オブジェクトを生成します。ユーザーが使用することはありません。
Content-Type が text/html のときに Mechanize が使用するクラスを設定します。
設定が行われない場合は Mechanize::Page が使用されます。
klass はクラスオブジェクトです(たとえば Mechanize::Page)。agent.pluggable_parser['text/html']=klass に同じです。
Content-Type が application/xhtml+xml のときに Mechanize が使用するクラスを設定します。
設定が行われない場合は Mechanize::Page が使用されます。
klass はクラスオブジェクトです(たとえば Mechanize::Page)。agent.pluggable_parser['application/xhtml+xml']=klass に同じです。
Content-Type が application/pdf のときに Mechanize が使用するクラスを設定します。
設定が行われない場合は Mechanize::File が使用されます(Mechanize に PDF パーサがあるとかそういうことはありません)。
klass はクラスオブジェクトです(たとえば Mechanize::File)。agent.pluggable_parser['application/pdf']=klass に同じです。
Content-Type が text/csv のときに Mechanize が使用するクラスを設定します。
設定が行われない場合は Mechanize::File が使用されます(Mechanize に CSV パーサがあるとかそういうことはありません)。
klass はクラスオブジェクトです(たとえば Mechanize::File)。agent.pluggable_parser['text/csv']=klass に同じです。
Content-Type が text/xml のときに Mechanize が使用するクラスを設定します。
設定が行われない場合は Mechanize::File が使用されます(Mechanize に XML パーサがあるとかそういうことはありませ…、Nokogiri::XML ならパースできそうな気はしますが)。
klass はクラスオブジェクトです(たとえば Mechanize::Page)。agent.pluggable_parser['text/xml']=klass に同じです。
レスポンスヘッダの Content-Type が引数の content_type と同一だったときに Mechanize が使用するクラスを返します。
# CSV ファイル用のクラスをnew agent.pluggable_parser['text/csv'].new該当するものが登録されていなければ nil を返します。
該当しない場合に実際に使用されるクラスは #default を参照してください。
レスポンスヘッダの Content-Type が引数の content_type と同一だったときに Mechanize が使用するクラスを設定します。
Hash のように使用されることを期待しています。実際は
agent.pluggable_parser[content_type] = klassのようになることでしょう。
登録されていない Content-Type のときに使用されるクラスは #default= で設定します。
Mechanize が設定しておらず、ユーザーが追加してもいない Content-Type に対する処理クラスを返します。
デフォルトは Mechanize::File です。
設定は #default= で行います。
未設定 Content-Type に対する処理クラスを返す #default メソッドの返り値を klass に変更します。
klass はクラスオブジェクトです(たとえば Mechanize::File)。
Mechanize が最初から設定している Content-Type は以下の3つです。
- text/html
- application/xhtml+xml
- application/vnd.wap.xhtml+xml
どれも Mechanize::Page クラスが使用されます。これ以外は全て #default の返り値、Mechanize::File です。