« カレンダーの日付から日別アーカイブにリンクする | Home | 複数ユーザーでwebを管理する »

[Movable Type]   長いタイトルを省略して「...」をつける

インデックスなどで長いエントリーのタイトルをトリミングして表示したいが、デフォルトで"trim_to"といグローバル・タグ・アトリビュートがあるけど日本語に対応してないし「...」をつけてくれない。自分で書こうかと思ったらすでに作っている人がいたので導入してみる。

詳しくは人生迷い箸 日本語対応トリミングフィルタ(再度バグ修正)を参考にする。

# 指定された文字数(半角文字数)にトリミングするフィルタ
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 $tmpstr = $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 $lenstr = length($str);
  if($lenstr <= $nstr) { 
    return $tmpstr;
  }

  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;

これをmt_trimj.plとでも名前をつけてpluginsディレクトリに保存してやる。

使い方は

<$MTEntryTitle trimj_to="20"$>

ちなみに全角文字は2文字として計算される模様。

Trackbacks:

このエントリーのトラックバックURL:

コメントを投稿