# ----------------------------------------------------------------------------- # Tripletail::InputFilter - CGIクエリパラメータを読み取る # ----------------------------------------------------------------------------- package Tripletail::InputFilter; use strict; use warnings; use Tripletail; 1; sub _new { my $class = shift; my $this = bless {} => $class; $this; } sub _formFromPairs { # 戻り値: Tripletail::Form my $this = shift; my $pairs = shift; my $filename_h = shift; my $incode = $this->_getIncode($pairs); my $form = $TL->newForm; foreach my $pair (@$pairs) { my ($key, $value) = @$pair; if( exists($filename_h->{$key}) ) { # このキーに対するファイル名が存在する。 $form->setFileName( $this->_raw2utf8($key => $incode) => $this->_raw2utf8($filename_h->{$key} => $incode)); } if (ref $value) { $form->setFile( $this->_raw2utf8($key => $incode) => $value); } else { $form->add( $this->_raw2utf8($key => $incode) => $this->_raw2utf8($value => $incode) ); } } $form; } sub _raw2utf8 { my $this = shift; my $str = shift; my $incode = shift; $TL->charconv($str, $incode => 'utf8'); } sub _getIncode { # 戻り値: UniJP文字コード名 my $this = shift; my $pairs = shift; # CCCを探し、文字コードを判定。 my $CCC; for(my $i = 0; $i < @$pairs; $i++) { if($pairs->[$i][0] eq 'CCC' && $pairs->[$i][1]) { $CCC = $pairs->[$i][1]; splice @$pairs, $i, 1; # CCCをpairsから消す last; } } # 文字コードが指定されていたらそれを使用 my $charset = $TL->INI->get('InputFilter' => 'charset'); if(defined($charset)) { $charset; } elsif(defined($CCC)) { $this->_getIncodeFromCCC($CCC); } else { 'auto'; } } sub _getIncodeFromCCC { # 戻り値: 文字コード名 my $this = shift; my $CCC = shift; my $table = { "\xb0\xa6" => 'EUC-JP', "\x88\xa4" => 'Shift_JIS', "\xe6\x84\x9b" => 'UTF-8', "\x61\x1b" => 'UCS-2', }; if(my $code = $table->{$CCC}) { $code; } elsif ($CCC =~ /\x30\x26/) { 'ISO-2022-JP'; } else { 'auto'; } } sub _urlDecodeString { my $this = shift; my $str = shift; $str =~ tr/+/ /; $str =~ s{\%([0-9a-fA-F][0-9a-fA-F])|\%u([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])}{ defined($1) ? pack("C", hex($1)) : pack("n", hex($2)); }eg; $str =~ s/\r\n/\n/g; # Win -> UNIX $str =~ s/\r/\n/g; # Mac -> UNIX $str; } __END__ =encoding utf-8 =head1 NAME Tripletail::InputFilter - CGIクエリパラメータを読み取る =head1 SYNOPSIS $TL->setInputFilter('Tripletail::InputFilter::HTML'); $TL->startCgi( -main => \&main, ); sub main { if ($CGI->get('mode') eq 'Foo') { ... } } =head1 DESCRIPTION QUERY_STRING, PATH_INFO, stdin等からリクエストのパラメータを受け取り、 L を生成する為のフィルタ。 =head2 フィルタ一覧 =over 4 =item L QUERY_STRING / stdinからリクエストを読む。 L<セッション|Tripletail::Session> は L<クッキー|Tripletail::Cookie> から読む。(デフォルト) =item L QUERY_STRING / stdinからリクエストを読む。 L<セッション|Tripletail::Session> はFormから読む。文字コード変換には常にUniJPを使う。 =item L SEO入力フィルタ。 =item L 何もしないフィルタ。 =back =head2 METHODS =over 4 =item C<< $TL->newInputFilter >> $filter = $TL->newInputFilter Tripletail::InputFilter オブジェクトを作成。 =item C<< decodeCgi >> $filter->decodeCgi($form); 任意の場所からリクエストデータを読み、それを$formに追加する。 =item C<< decodeURL >> $filter->decodeURL($form, $url, $fragment) 指定されたURLから(可能なら)読めるデータを読み、それを$formに追加する。 URLにフラグメント部分は含まれない。もしフラグメントが存在したなら、 それは$fragmentに入る。フラグメントが無ければ$fragmentはundefになる。 =back =head2 Ini パラメータ =over 4 =item C<< charset >> charset = UTF-8 クエリの文字コードを指定する。ここで文字コードを指定した場合は文字コードの自動判別は行われない。 L<< $TL->charconv|Tripletail/"charconv" >>で使用できる文字コードを指定可能。 =back =head1 SEE ALSO =over 4 =item L =item L =back =head1 AUTHOR INFORMATION =over 4 Copyright 2006 YMIRLINK Inc. This framework is free software; you can redistribute it and/or modify it under the same terms as Perl itself このフレームワークはフリーソフトウェアです。あなたは Perl と同じライセンスの 元で再配布及び変更を行うことが出来ます。 Address bug reports and comments to: tl@tripletail.jp HP : http://tripletail.jp/ =back =cut