トリミング・ファイナル
ただでさえちょっとしか更新しないのに、そのちょっともしなくなるとあっという間に時間が過ぎて、面倒になって、ますます更新しなくなる。悪循環ってやつ?
毎日ブログ更新していますって人もいるだろうけど、どうやらそんな几帳面なことは出来そうもないw
トリミングでは、DPL(Dynamic Page List)を使った抜粋で、Mediawikiのリンクである、”[[“か”]]”が、抜粋文字の末尾に来たらずらす、という対応でリンク崩れを回避するとしたが、実際には、”[[“や”]]”がちょうど末尾に来ることは少なくて、起きる事象としては、”[[“だけが抜粋側に残って、後ろの”]]”が切り捨てられて、本文中に”[[“が表示されてしまうという美しくない状況の方が可能性としては高い。
ずっと前から気になってはいたけど、なかなかいい回避方法が見つからなかったので、起きてしまった時には、本文を書き換えて、リンクが崩れないように対応して回避していたw
でも、せっかく選り抜き記事や新しい記事は、カテゴリ設定で自動的に選択し、抜粋を一覧表示するようにしているのに、肝心の抜粋でリンクが崩れるのはかなり残念な状況ではある。そこで、ない知恵を絞って、トリミングに再挑戦し、なんとか解決策を見つけたので、これで最後にするという意味で、タイトルはファイナルとしたw
DPL自身には、シングルバイトの文字列なら、リンク切れや文字区切りの規則対応などが実装されているが、日本語には正しく対応できていない。ここに手を入れると大掛かりになるのと、万が一DPLのバージョンアップがあった時に対応しきれないので、前回と同様、抜粋の部分でのみ対応することにした。
方針としては、選り抜き記事(300文字切り抜き)や新しい記事(200文字切り抜き)で抜粋した一覧表示するとき、抜粋した範囲内にリンク崩れが起きないこと。回避のためには多少文字数が増えることは許容することとした。
PHPの文字列関数である、strrpos()のマルチバイト対応版である、mb_strrpos()を使い、対象文字列の中に指定された文字列が最後に現れる位置を取得する。”[[“と”]]”の対応関係は、前者が必ず後者より前に位置するはずなので、最後に現れた”[[“と”]]”の位置を比較し、”[[“が”]]”より後ろに位置する時に、リンクが崩れていると判定し、”[[“の位置から、mb_strpos()を使い、崩れたリンクの場所から見て、最初に現れる、”]]”の位置を取得し、抜粋位置をそこまで延長することで、リンク崩れを回避することにした。この方法であれば、ほとんどのケースに対応できるはずなので、これでトリミング対応は最後にできればと思っている。
変更した場所は、DPL.phpの399行目付近で、多少の知識がないと読み解けないと思う。
if( $this->mIncMaxLen > 0 && (strlen($text) > $this->mIncMaxLen) ) { $textx = DPLInclude::limitTranscludedText($text, $this->mIncMaxLen,""); $posx = mb_strrpos($textx, "[["); $posy = mb_strrpos($textx, "]]"); if ($posx) { if ($posx > $posy) { $chgpos = mb_strpos($text, "]]", $posx); $this->mIncMaxLen = $chgpos * 2 + 2; } } $text = DPLInclude::limitTranscludedText($text, $this->mIncMaxLen, ' [['.$title.'|...more>>]]');
もう一箇所修正する場所があるので以下のように修正します。場所は399行目付近です。
// $cut = substr( $text, 0, $n0 + 1 ); $cut = mb_strimwidth( $text, 0, $n0 + 1 );
以上です。