Ruby Mechanize wiki (ja) - Mechanize::PluggableParser

Mechanize::PluggableParser


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 を使用する
という「Content-Type が text/plain のときは自作の TextFile クラスを使う」という処理が追加されます。pluggable_parser に指定するクラスは少なくとも Mechanize::File クラスを継承しておいてください。

「それ以外」の時の処理を切り替えるには #default= メソッドを使用します。
agent.pluggable_parser.default = Mechanize::FileSaver
とすると、
  • Content-Type が text/html → Mechanize::Page を使用する
  • それ以外 → Mechanize::FileSaver を使用する
という、「HTML 以外はアクセスした途端に全部自動でディスクに保存する」という動作になります。



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 です。