| Tripletail documentation | Contained in the Tripletail distribution. |
Tripletail::Filter::MobileHTML - 携帯電話向け HTML 出力用フィルタ
$TL->setContentFilter('Tripletail::Filter::MobileHTML');
$TL->print($TL->readTextFile('foo.html'));
HTML に対して以下の処理を行う。
Tripletail::Filter::HTML との違いは以下の通り。
携帯端末ではクッキーが利用できない場合があるため、セッション情報を クッキーではなくフォームデータとして引き渡す必要がある。
TripletaiL では、Tripletail::Filter::MobileHTML フィルタを使うことで この作業を半自動化することができる。
Tripletail::Filter::MobileHTML フィルタは、出力時にリンクやフォームを チェックし、セッション情報を付与すべきリンク・フォームであれば、 自動的にパラメータを追加する。
セッション情報を付与すべきかどうかは、以下のように判断する。
INT というキーが存在すれば、セッション情報を
付与し、 INT キーを削除する。
INT キーがなければ、セッション情報は付与されない。
<a href="tl.cgi?INT=1">セッション情報が付与されるリンク</a> <a href="tl.cgi">セッション情報が付与されないリンク</a>
INT キーは、Form クラスの toLink メソッドを利用すると自動的に付与される。
toExtLink メソッドを利用すると、INT キーは付与されない。
<a href="<&LINKINT>">セッション情報が付与されるリンク</a> <a href="<&LINKEXT>">セッション情報が付与されないリンク</a>
$template->expand({
LINKINT => $TL->newForm({ KEY => 'data' })->toLink,
LINKEXT => $TL->newForm({ KEY => 'data' })->toExtLink,
});
<form action="" EXT="1">
EXT="1" が付与される。
EXT="1" が付与されているフォームに関しては、セッション情報の付与を行わない。
また、EXT="1" は出力時には削除される。セッション情報は、 http 領域用のセッション情報は "SID + セッショングループ名"、
https 領域用のセッション情報は "SIDS + セッショングループ名" という名称で保存する。
USER_AGENT 文字列を元に、 DoCoMo 、 Softbank ( Vodafone 、 J-PHONE )、 AU 、 ASTEL を自動判別し、 それぞれの端末用に出力します。 文字コードは Softbank 3G 以外は Shift_JIS + 各キャリアの絵文字コード、 Softbank 3G の場合は UTF-8 + Softbank 絵文字コードとなります。
それ以外の端末( Willcom や PC )の場合は、Shift_JIS コードで出力します。
携帯から送信されたフォームデータは、 DoCoMo 、 Softbank 2G 以前( J-PHONE )、 AU 、 ASTEL の場合は Shift_JIS + 各キャリアの絵文字コード、 Softbank 3G の場合は UTF-8 + Softbank 絵文字コードとして 解析します。
それ以外の端末( Willcom や PC )の場合は、Tripletail::InputFilter::HTML と同様に
CCC による文字コード判別を行います。
絵文字は、入力時に UTF-8 のプライベート領域にマップされ、出力時に絵文字に戻されます。
入力時と出力時で携帯キャリアが異なる場合は、Unicode::Japanese の絵文字変換マップに 従って変換され、出力されます。
この変換マップは、携帯キャリアが公式に提供している絵文字変換マップとは 異なる部分があります。
$TL->setContentFilter('Tripletail::Filter::MobileHTML', type => 'xhtml');
'html' もしくは 'xhtml' を利用可能。省略可能。
フィルタが HTML を書換える際の動作を調整する為のオプション。
XHTML を出力する際に、このパラメータを html のままにした場合、
不正な XHTML が出力される事がある。
xhtmlを指定した場合、コンテントタイプは application/xhtml+xml となる.
デフォルトは 'html'。
$TL->setContentFilter(
"Tripletail::Filter::MobileHTML",
contenttype => 'text/x-hdml; charset=Shift_JIS',
charset => 'Shift_JIS',
);
HDML 使用時に指定. それ以外の値の場合はフィルタが自動判定した値で上書きされる.
my $SAVE = $TL->getContentFilter->getSaveForm;
出力フィルタが所持している保存すべきデータが入った、 Form オブジェクトを返す。
$TL->getContentFilter->setHeader($key => $value)
他の出力の前に実行する必要がある。
同じヘッダを既に出力しようとしていれば、そのヘッダの代わりに指定したヘッダを出力する。(上書きされる)
$TL->getContentFilter->addHeader($key => $value)
他の出力の前に実行する必要がある。
同じヘッダを既に出力しようとしていれば、そのヘッダに加えて指定したヘッダを出力する。(追加される)
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/
| Tripletail documentation | Contained in the Tripletail distribution. |
# ----------------------------------------------------------------------------- # Tripletail::Filter::MobileHTML - æºå¸¯é»è©±åãHTMLåºåç¨ãã£ã«ã¿ # ----------------------------------------------------------------------------- package Tripletail::Filter::MobileHTML; use strict; use warnings; use Tripletail; require Unicode::Japanese; require Tripletail::Filter::HTML; our @ISA = qw(Tripletail::Filter::HTML); # Tripletail::Filter::MobileHTMLã¯ã # * æåã³ã¼ãã®å¤æããã # * ãã©ã¼ã ã¸"CCC=æ"ã追å ãã # * å¤é¨ãªã³ã¯ã®æ¸æãã *ãã* # * ã»ãã·ã§ã³ãã¼ã¿ããªã³ã¯ã»ãã©ã¼ã ã«è¿½å *ãã* # * Content-Dispositionãåºåããªã # ãªãã·ã§ã³ä¸è¦§: # * charset => åºåã®æåã³ã¼ãã(UTF-8ãã夿ããã) # 常ã«UniJPãç¨ãã¦å¤æãããã # * contenttype => ããã©ã«ã: text/html; charset=(CHARSET) 1; sub _new { my $class = shift; my $this = $class->SUPER::_new(@_); $TL->{outputbuffering} = 1; $this; } sub _setCode { my $this = shift; do{ my $set_ctype = $this->{replacement}{'Content-Type'}; my $add_ctype = $this->{addition}{'Content-Type'} || []; my $ctype = $set_ctype ? $set_ctype : ($add_ctype->[0] || ''); if( $ctype && $ctype =~ /hdml/i ) { return; } }; my $ocode = 'sjis'; if(my $agent = $ENV{HTTP_USER_AGENT}) { if($agent =~ m/^DoCoMo/i) { $ocode = 'sjis-imode'; } elsif($agent =~ m/^ASTEL/i) { $ocode = 'sjis-doti'; } elsif($agent =~ m/^(Vodafone|SoftBank|MOT-)/i) { $ocode = 'utf8-jsky'; } elsif($agent =~ m/^(J-PHONE)/i) { $ocode = 'sjis-jsky'; } elsif($agent =~ m/UP\.Browser/i) { # Softbank端æ«ãã¤UP.Browserãå«ããã®ãããã®ã§Softbankã®å¾ã«å¤å¥ããã㨠$ocode = 'sjis-au'; } } my $ctype = $this->{option}{type} eq 'html' ? 'text/html' : 'application/xhtml+xml'; $this->{option}{charset} = $ocode; if($ocode =~ m/^sjis/) { $this->{option}{contenttype} = "$ctype; charset=Shift_JIS"; } elsif($ocode =~ m/^utf8/) { $this->{option}{contenttype} = "$ctype; charset=UTF-8"; } else { die "internal errlr.\n"; } $this->setHeader('Content-Type' => $this->{option}{contenttype}); $this; } sub print { my $this = shift; my $data = shift; if(!$this->{content_printed}) { # content_printed 㯠Tripletail::Filter::HTML ã®å±æ§. $this->_setCode; if(defined(&Tripletail::Session::_getInstance)) { # Tripletail::Sessionãæå¹ã«ãªã£ã¦ããã®ã§ããã¼ã¿ãæãã°ãããã$this->{save}ã«å ããã foreach my $group (Tripletail::Session->_getInstanceGroups) { Tripletail::Session->_getInstance($group)->_setSessionDataToForm($this->{save}); } } } $this->SUPER::print($data); } sub _make_header { my $this = shift; # ã¯ããã¼ã®åºåã¯è¡ããªã my %opts = (); if(defined $this->{locationurl}) { if(!$TL->getDebug->{location_debug}) { # relinkããä¸ã§Locationãçæã %opts = (Location => $this->_relink(url => $this->{locationurl})); } } return { %opts, }; } __END__