以前は Jcode モジュールを利用してましたが、Encode モジュールに書き換えてみました。MT も 3.2-ja では確か Encode モジュールを利用するようになったらしいし。Perl 5.8 以降だったらこちらで。
そういえば確かめてないけれど、3.2-ja では trim_to もちゃんと 2 バイト文字に対応しているのだろうか。もし対応していたら、あまり意味がなくなっちゃうかも。
でもひょっとして全角も 1 文字換算で数える仕様とかだとイヤーンな感じだし、末尾に「…」を付けるのがイイという人もいるだろうから、まあ一応念のため公開しておきたいと思います。使い方は、以前とまったく一緒です。
ちなみにあまりテストしてませんのでうまく動かない場合はご一報を。
※注)このスクリプトはmuraさんの記事(M’s folder: MT 長いタイトルをトリミングする)で公開されているものをEUC以外の文字コードに対応するように改変したものです。
package MT::Plugin::Trimj; use MT::Template::Context; use MT::ConfigMgr; use Encode qw/ from_to /; MT::Template::Context->add_global_filter(trimj_to => sub { my($str, $nstr, $ctx) = @_; my $sippo = '...'; my $tmpstr = $str; my $c = MT::ConfigMgr->instance->PublishCharset; my $conv_in; if (lc $c eq lc 'Shift_JIS') { $conv_in = 'shiftjis'; } elsif (lc $c eq lc 'ISO-2022-JP') { $conv_in = 'iso-2022-jp'; } elsif (lc $c eq lc 'UTF-8') { $conv_in = 'utf8'; } elsif (lc $c eq lc 'EUC-JP') { $conv_in = 'euc-jp'; } if ($conv_in ne 'euc-jp') { from_to($str, $conv_in, 'euc-jp'); } # 比較 my $lenstr = length($str); if($lenstr <= $nstr) { return $tmpstr; } my $out = substr($str,0,$nstr); if ($out =~ /x8F$/ or $out =~ tr/x8ExA1-xFE// % 2) { chop $out; if($out =~ /x8F$/){ chop $out; } } $out .= $sippo; # 尻尾を付けたくない場合は、コメントアウトのこと。 if ($conv_in ne 'euc-jp') { from_to($out, 'euc-jp', $conv_in); } return $out; }); 1;
8 Comments
Pingback: M E T A B O L I S M
Pingback: kj-takのいろいろ言ってみます
Pingback: 'ohana
Pingback: Neuro-nex.net blog
Pingback: アファメーションで独立・起業・夢実現。「いきなり!社長宣言!!」-“夢は口に出すことで実現する!”というアファメーション
Pingback: MovableType備忘録