Tripletail::Filter::MobileHTML - 携帯電話向け HTML 出力用フィルタ


Tripletail documentation Contained in the Tripletail distribution.

Index


Code Index:

NAME

Top

Tripletail::Filter::MobileHTML - 携帯電話向け HTML 出力用フィルタ

SYNOPSIS

Top

  $TL->setContentFilter('Tripletail::Filter::MobileHTML');

  $TL->print($TL->readTextFile('foo.html'));

DESCRIPTION

Top

HTML に対して以下の処理を行う。

Tripletail::Filter::HTML との違いは以下の通り。

セッション

携帯端末ではクッキーが利用できない場合があるため、セッション情報を クッキーではなくフォームデータとして引き渡す必要がある。

TripletaiL では、Tripletail::Filter::MobileHTML フィルタを使うことで この作業を半自動化することができる。

Tripletail::Filter::MobileHTML フィルタは、出力時にリンクやフォームを チェックし、セッション情報を付与すべきリンク・フォームであれば、 自動的にパラメータを追加する。

セッション情報を付与すべきかどうかは、以下のように判断する。

セッション情報は、 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 の絵文字変換マップに 従って変換され、出力されます。

この変換マップは、携帯キャリアが公式に提供している絵文字変換マップとは 異なる部分があります。

フィルタパラメータ

type
  $TL->setContentFilter('Tripletail::Filter::MobileHTML', type => 'xhtml');

'html' もしくは 'xhtml' を利用可能。省略可能。

フィルタが HTML を書換える際の動作を調整する為のオプション。 XHTML を出力する際に、このパラメータを html のままにした場合、 不正な XHTML が出力される事がある。

xhtmlを指定した場合、コンテントタイプは application/xhtml+xml となる.

デフォルトは 'html'。

contenttype
  $TL->setContentFilter(
    "Tripletail::Filter::MobileHTML",
    contenttype => 'text/x-hdml; charset=Shift_JIS',
    charset     => 'Shift_JIS',
  );

HDML 使用時に指定. それ以外の値の場合はフィルタが自動判定した値で上書きされる.

METHODS

getSaveForm
  my $SAVE = $TL->getContentFilter->getSaveForm;

出力フィルタが所持している保存すべきデータが入った、 Form オブジェクトを返す。

setHeader
  $TL->getContentFilter->setHeader($key => $value)

他の出力の前に実行する必要がある。

同じヘッダを既に出力しようとしていれば、そのヘッダの代わりに指定したヘッダを出力する。(上書きされる)

addHeader
  $TL->getContentFilter->addHeader($key => $value)

他の出力の前に実行する必要がある。

同じヘッダを既に出力しようとしていれば、そのヘッダに加えて指定したヘッダを出力する。(追加される)

print

Tripletail::Filter参照

reset

Tripletail::Filter参照

SEE ALSO

Top

Tripletail
Tripletail::Filter
Tripletail::Filter::HTML
Tripletail::Form

AUTHOR INFORMATION

Top

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__