我在這篇《Fixing wordpress plugin - recent comments》介紹了怎麼樣修正以便安裝 recent comments 在某些比較新版本的 wordpress 裡。然後網友 1614 留訊息問可不可以解決中文字切一半的問題,所以我就研究了一下,然後就不小心解決了。

首先,先把 PHPmultibyte string extension 裝起來,對於 FreeBSD 來說,就是把 converters/php5-mbstring 裝起來即可。如下:

SHELL> cd /usr/ports/converters/php5-mbstring
SHELL> make install
...

基本上,我們將使用 mb_strimwidth() 幫我們切文字,這個函式知道一段字串在 terminal 上會有多「寬」,好比說兩個全形字加三個半形字,會被認知為寬度為 (2*2+3*1)=7,然後依據給定的寬數「切」字串。所以,只要改用 mb_strimwidth() 來作真正的切字串的動作即可。

請修改 recent commentskjgrc_excerpt() 這個函式如下:

  function kjgrc_excerpt ($text,$chars_per_comment,$chars_per_word,$tag,$output)
  {
      $length = strlen(str_replace($tag,"",strip_tags($output)));
      $length = $chars_per_comment - $length;
      $length = $length -2; // we will add three dots at the end
      if ($length < 0) $length = 0;
      if (strlen($text) > $length) {
+         if (function_exists('mb_strimwidth')) {
+             $text = mb_strimwidth($text, 0, $chars_per_comment, '...', 'utf-8');
+         }
+         else {
              $text = substr($text,0,$length);
              $text = substr($text,0,strrpos($text,' '));
              // last word exceeds max word length:
              if ((strlen($text) - strrpos($text,' ')) > $chars_per_word) {
                  $text = substr($text,0,strlen($text)-3);
              }
              $text = $text . "...";
+         }
      }
      #$text = "[EXCERPT]: '$text'";
      return "$text";
  }

其中,前面有 + 號的部分,就是要加的部分。如果系統裡的 PHP 有 mb_strimwidth() 可以用的話,就會用來切字串,就不會造成中文字或其他非 ASCII 字元,從中間被切一半的狀況了。

至於英文字被分屍的問題,這是原本的設計使然。在其 Option 頁面中,有一項 Wrap long words at: [n] characters 的選項,可以選擇英文字字母數超過 n 的話,就會被切成兩半。把這個值社長一點,英文字就比較不會被分屍了。當然,這是因為沒有什麼好的方法,可以依據音節將長英文字切斷分行,然後用 hyphen 接的緣故。相對於版面的破壞,這一點點缺陷,我想是可以被接受的。