日本語対応トリミングフィルタ
見れば、エントリーのタイトルが長すぎて、折り返し表示されているところが多い。ここを決めた文字数で切れれば、スペースを稼げるんだが……。
そう思って探してみたら、以下の記事でビンゴ。
M’s folder: MT 長いタイトルをトリミングするより
そこで、EUC-JP限定だが、日本語対応のフィルタを作ってみた。
MT標準のtrim_toだと日本語文字コードに対応していないため、イケナイところでぶった切ってしまう。そんなわけで僕もtrim_toは利用しないようにしていたのですが、太鉄さんがなにやら見つけたご様子。しかし、そこには「EUC-JP限定だが」の一文が・・・。
うちはUTF-8なんですが、ここであきらめるのもいやなので、他の文字コードにも対応してみました。JcodeでEUC-JPに変換し、フィルタ後元の文字コードに戻すようにしてるだけです。ただし、UTF-8&Jcode.pmな環境でしか動作チェックしてません。
2004/3/1追記:このソースにはバグがあります。最新版はこの記事を参照してください。
# 指定された文字数(半角文字数)にトリミングするフィルタ
package MT::Plugin::Trimj;
use MT::Template::Context;
use MT::ConfigMgr;
MT::Template::Context->add_global_filter(trimj_to => sub {
my($str, $nstr, $ctx) = @_;
my $sippo = '...';
my $lenstr = length($str);
if($lenstr < = $nstr) {
return $str;
}
my $c = MT::ConfigMgr->instance->PublishCharset;
my $conv_in;
if (lc $c eq lc 'Shift_JIS') {
$conv_in = 'sjis';
} elsif (lc $c eq lc 'ISO-2022-JP') {
$conv_in = 'jis';
} elsif (lc $c eq lc 'UTF-8') {
$conv_in = 'utf8';
} elsif (lc $c eq lc 'EUC-JP') {
$conv_in = 'euc';
}
my $jcnv;
eval 'use Jcode;';
if($@){
require 'jcode.pl';
$jcnv = 'jcode::convert';
}else{
$jcnv = 'Jcode::convert';
}
if ($conv_in ne 'euc') {
&$jcnv(\$str, 'euc', $conv_in);
}
my $out = substr($str,0,$nstr);
if ($out =~ /\x8F$/ or $out =~ tr/\x8E\xA1-\xFE// % 2) {
chop $out;
if($out =~ /\x8F$/){
chop $out;
}
}
$out .= $sippo;
# 尻尾を付けたくない場合は、コメントアウトのこと。
if ($conv_in ne 'euc') {
&$jcnv(\$out, $conv_in, 'euc');
}
return $out;
});
1;
2 月 2nd, 2004 at 20:39:10
はじめまして。
すばらしいです。これで完璧ですね。
自分のサイトのログを見ると、utf-8だから、という理由で利用できないと見送っていた方もおられたようですので、きっと需要は高いのではないかと思います。
2 月 2nd, 2004 at 21:48:32
はじめまして。
muraさんの記事のおかげで、長い間つかえていたモヤモヤが取れた感じです。どうもありがとうございました。:-)
2 月 3rd, 2004 at 0:45:26
お、素早い。
さすがです。
2 月 3rd, 2004 at 9:49:52
あれ。今見たら、ちょっと化けてるところがあるみたいです。なにがいけないんだろう。あとで調べてみます。
2 月 5th, 2004 at 11:19:33
日本語対応トリミングフィルタ(バグ修正)
文字化けの原因は、指定したバイト数よりも元の文字列長が短くてトリミングされない場合に文字コードがeucに変換されたままリターンしているのが原因でした。すみません。 なんでこ…
2 月 5th, 2004 at 11:22:04
バグを修正しました
http://valium.oops.jp/archives/000171.html
2 月 10th, 2004 at 23:22:19
はじめまして、Takubonと申します。
ちなみにこのプラグインを使って、RSSFEEDしてきた記事を縮める事は可能でしょうか?
2 月 10th, 2004 at 23:48:53
Takubonさん、はじめまして。
「RSSFEEDしてきた記事」というのは、mt-rssfeedなどを使ってRSSを表示するということでしょうか?もしそうであれば、できるんじゃないかと思います。確認したことはないので憶測ですが。
ちなみにうちではMTPingedEntry プラグインを利用してRacent Trackbacksにトラックバック先Entryを表示していますが、そのタグでこのtrimj_toを利用してトリミングしており、うまく動作しています。
参考になれば幸いです。
3 月 1st, 2004 at 18:13:53
日本語対応トリミングフィルタ(再度バグ修正)
kubotさんより、utf-8からeuc変換前に文字数を判断してしまうと、3バイトコードがあるときに希望する文字数を得られないのではないか、というご指摘を受けました。確かにそのとおりです…
4 月 27th, 2004 at 10:50:18
左のサイドバーに表示されるエントリーのタイトルが長すぎて折り返されて見づらくて…
左のサイドバーには最近のエントリーのタイトルが10個ばかし表示されるようになっているんだがエントリーに長いタイトルを付けると折り返されまくって見栄えがひじょーによくない サイトのデザインをいじって文字を小さめに表示するようにしてみたものの、この折り返す…
6 月 10th, 2004 at 0:21:22
長いタイトルを短く表示
長いタイトルをサイドのメニューに表示すると、2段になってレイアウトが崩れてしまいます。 そんなときは、trim_toを使って、指定文字数分だけ表示すればいい! …はずなのですが、MovableTypeは舶来品なので、2バイト文字コードである日本語のことなんか、当然ながら考…
9 月 24th, 2004 at 16:15:50
タイトル表示をトリミング
エントリーのタイトルがやたら長くなったりすることもたまにはあるわけでして、そう…
5 月 16th, 2006 at 10:31:14
長いタイトルを省略する
前々から、タイトルが長くなった時にページ左のRecentEntryでタイトルが折…