Template::Plugin::TruncateByWord #
UTF-8 な文章の概要(「あいうえおかきくけこ」を「あいうえお。。。」)とか表示するのに Template-Toolkit でやってしまいたいなぁ、と思った
本当は Template-Toolkit でフラグ付 UTF-8 を上手に扱うワザを身につければいいのだろう、とは思うのだが、今使いたい。今欲しい
ちょっと探したけど思うようなものがなかったのでパラリと書いた
もうちょっと探して似たようなものがなければ、pod 書いて公開するか
euc-jp や utf-8 のバイト列 -> フラグ付 UTF8 -> 指定「文字数」でちょんぎる -> 元の文字コードに戻す
というようなことをやっている
package Template::Plugin::TruncateByWord;
use strict;
use warnings;
our $VERSION = '0.1';
use Template::Plugin::Filter;
use base 'Template::Plugin::Filter';
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
our $FILTER_NAME = 'truncate_by_word';
sub init {
my $self = shift;
$self->{_DYNAMIC} = 1;
$self->install_filter($self->{_ARGS}->[0]||$FILTER_NAME);
return $self;
}
sub filter {
my($self, $string, $args, $conf) = @_;
return '' unless $string;
# decode
my $org_enc;
unless ( utf8::is_utf8($string) ) {
my $enc = Encode::Guess::guess_encoding($string);
$org_enc = ref $enc ? $enc->name : 'euc-jp';
$string = Encode::decode($org_enc, $string);
}
my $org_length = CORE::length($string);
my $length = $args->[0] || $org_length;
return if $length =~ /\\D/;
$string = CORE::substr($string, 0, $length);
my $suffix = $args->[1]||'';
# revive encode
$string = Encode::encode($org_enc, $string) if $org_enc;
return $org_length > $length ? $string.$suffix : $string ;
}
1;