日本語対応トリミングフィルタ

talk to oneself 2より

見れば、エントリーのタイトルが長すぎて、折り返し表示されているところが多い。ここを決めた文字数で切れれば、スペースを稼げるんだが……。
 そう思って探してみたら、以下の記事でビンゴ。

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;

Similar Posts:

13 Responses to “日本語対応トリミングフィルタ”

  1. mura Says:

    はじめまして。
    すばらしいです。これで完璧ですね。
    自分のサイトのログを見ると、utf-8だから、という理由で利用できないと見送っていた方もおられたようですので、きっと需要は高いのではないかと思います。

  2. ヴァリウム男爵 Says:

    はじめまして。
    muraさんの記事のおかげで、長い間つかえていたモヤモヤが取れた感じです。どうもありがとうございました。:-)

  3. 太鉄 Says:

    お、素早い。
    さすがです。

  4. ヴァリウム男爵 Says:

    あれ。今見たら、ちょっと化けてるところがあるみたいです。なにがいけないんだろう。あとで調べてみます。

  5. 人生迷い箸 Says:

    日本語対応トリミングフィルタ(バグ修正)

    文字化けの原因は、指定したバイト数よりも元の文字列長が短くてトリミングされない場合に文字コードがeucに変換されたままリターンしているのが原因でした。すみません。 なんでこ

  6. ヴァリウム男爵 Says:

    バグを修正しました

    http://valium.oops.jp/archives/000171.html

  7. Takubon Says:

    はじめまして、Takubonと申します。

    ちなみにこのプラグインを使って、RSSFEEDしてきた記事を縮める事は可能でしょうか?

  8. ヴァリウム男爵 Says:

    Takubonさん、はじめまして。

    「RSSFEEDしてきた記事」というのは、mt-rssfeedなどを使ってRSSを表示するということでしょうか?もしそうであれば、できるんじゃないかと思います。確認したことはないので憶測ですが。

    ちなみにうちではMTPingedEntry プラグインを利用してRacent Trackbacksにトラックバック先Entryを表示していますが、そのタグでこのtrimj_toを利用してトリミングしており、うまく動作しています。

    参考になれば幸いです。

  9. 人生迷い箸 Says:

    日本語対応トリミングフィルタ(再度バグ修正)

    kubotさんより、utf-8からeuc変換前に文字数を判断してしまうと、3バイトコードがあるときに希望する文字数を得られないのではないか、というご指摘を受けました。確かにそのとおりです

  10. kinoの旅 Says:

    左のサイドバーに表示されるエントリーのタイトルが長すぎて折り返されて見づらくて…

    左のサイドバーには最近のエントリーのタイトルが10個ばかし表示されるようになっているんだがエントリーに長いタイトルを付けると折り返されまくって見栄えがひじょーによくない サイトのデザインをいじって文字を小さめに表示するようにしてみたものの、この折り返す…

  11. COLOR NO.A Says:

    長いタイトルを短く表示

    長いタイトルをサイドのメニューに表示すると、2段になってレイアウトが崩れてしまいます。 そんなときは、trim_toを使って、指定文字数分だけ表示すればいい! …はずなのですが、MovableTypeは舶来品なので、2バイト文字コードである日本語のことなんか、当然ながら考…

  12. Blog VINAPARK Says:

    タイトル表示をトリミング

     エントリーのタイトルがやたら長くなったりすることもたまにはあるわけでして、そう…

  13. デジタル番長 Says:

    長いタイトルを省略する

    前々から、タイトルが長くなった時にページ左のRecentEntryでタイトルが折…

Leave a Reply