2004年10月16日土曜日

Sledge::Template::TT::Shift_JIS - テンプレートファイルをShift-JISでかけるようにする

Sledgeは出力するコンテンツがShift-JISの場合でもテンプレートはEUC-JPで書く仕様になっています。
僕の会社では基本的にHTMLの文字コードはShift-JISということになっているのでコーダーからあがってくるHTMLは当然Shift-JISです。なのでこれをテンプレート化するにはパラメータの埋め込みの他、文字コードをEUC-JPに変換をしなければなりません。一括変換すればすむ話ですが、それがちょっとめんどくさい(笑)

ということで、テンプレートをShift-JISで書くためのSledge::Template::TTのサブクラス、Sledge::Template::TT::Shift_JISを作ってみました。使い方は簡単でPagesクラスで、

use Sledge::Template::TT;
と書いているところを
use Sledge::Template::TT::Shift_JIS;
に変更するだけです。

Sledge::Template::TT::Shift_JISのコードはこんな感じです。

package Sledge::Template::TT::Shift_JIS;

use strict;
use vars qw($VERSION);
$VERSION = '0.01';

use base qw(Sledge::Template::TT);

use Template;
use Sledge::Exceptions;
use FileHandle;
use Jcode;

sub output {
my $self = shift;
my %config = %{$self->{_options}};
my $input = delete $config{filename};
my $template = Template->new(\%config);
unless (ref($input) || -e $input) {
Sledge::Exception::TemplateNotFound->throw(
"No template file detected: $input",
);
}
my $text = do { local $/; my $fh = FileHandle->new($input); <$fh> };
$text = Jcode->new($text, 'sjis')->euc;
$template->process(\$text, $self->{_params}, \my $output)
or Sledge::Exception::TemplateParseError->throw($template->error);
return $output;
}

1;
最初は下のようなコードを書いたんですが、テンプレートのオプションのfilenameがスカラーリファレンスだとSledge::Tempate::TTのリビジョンが1.3より以前のものでは動かないことに気づいて、Sledge::Tempate::TTのコードをそのまま借りてきて、文字コード変換を差し込んだ結果、上のようなコードに落ち着きました。
package Sledge::Template::TT::Shift_JIS;

use strict;
use vars qw($VERSION);
$VERSION = '0.01';

use base qw(Sledge::Template::TT);

use FileHandle;
use Jcode;

sub output {
my $self = shift;
my %config = %{$self->{_options}};
if ( -e $config{filename} ) {
my $text = do { local $/; my $fh = FileHandle->new($config{filename}); <$fh> };
$text = Jcode->new($text, 'sjis')->euc;
$self->set_option(filename => \$text);
}
$self->SUPER::output;
}

1;



0 件のコメント:

コメントを投稿