非互換対応その後
年初からずっと取り組んで来た「非互換」対応のその後です。MediaWiki 1.35以降で非推奨となった内部機能を使用していた「DynamicPageList」を騙し騙しここまで使って来ましたが、MediaWiki本体の更なるバージョンアップ(1.37)に伴い、完全に非互換となってしまいました。DynamicPageList(DPL)にはMediawiki本家バージョンと3rd Partyと呼ばれる外部バージョンがあります。これまで使用してきたのは3rd Partの方で、その後継は、同じチームが開発した「DynamicPageList3」(以下、DPL3)と呼ばれるExtensionです。”完全”下位互換を謳っていながら、過去の設定のままなのに同じ表示にならないという、下位互換が”自称”なだけと言う「ITあるある」状態です。
例によってコードを見ていきます。ディレクトリの構造やファイル名が大きく変わっていますが、内部のコードは完全刷新とまでは行かないようで、所々に見たことのある構造があり、助けられます。DPL3の非互換で一番大きなものが、本文の抜粋機能が働かない、というものです。いつものようにわかってしまえば原因は至って単純で、単なる記述ミス。。。確認とかテストとかしないのが最近の流行りなので致し方無し。
public function __construct( Parameters $parameters, Parser $parser ) { ... // $this->setIncludePageMaxLength( $parameters->getParameter( 'includemaxlen' ) ); $this->setIncludePageMaxLength( $parameters->getParameter( 'includemaxlength' ) ); ... }
mediawikiのテンプレート等で記述されたパラメータを取り込む際に使われれるDPLのパラメータですが、取得して設定する際にパラメータ名を間違えてしまっています。「includemaxlength」とすべきところを「includemaxlen」としてしまったという初歩的過ぎて誰も気が付かない。本来はこのパラメータで抜粋文字数(200文字なら”200″とか)を指定するのですが、それがパラメータ名が違うため取り込めず、コードに反映されないため、全文が表示されてしまっていました。ここを修正することで、抜粋は機能するようになりましたが、いつものように日本語、正確にはマルチバイトを全く考慮していないコーディングとなっているので、従来通りの修正を加えます。
public static function limitTranscludedText( $text, $limit, $link = '' ) { ... // $cut = substr( $text, 0, $n0 + 1 ); $cut = mb_strimwidth( $text, 0, $n0 + 1 ); ...
次に、厳密に指定文字数(200文字等)で抜粋すると、リンク([[]]で囲われた文字)が含まれていると、リンクが壊れてしまうので、その対策をします。
if ( $this->includePageMaxLength > 0 && ( strlen( $text ) > $this->includePageMaxLength ) ) { // $text = LST::limitTranscludedText( $text, $this->includePageMaxLength, ' [[' . $title . '|..→]]' ); $textx = LST::limitTranscludedText($text, $this->includePageMaxLength, ""); $posx = mb_strrpos($textx, "[["); $posy = mb_strrpos($textx, "]]"); if ($posx) { if ($posx > $posy) { $chgpos = mb_strpos($text, "]]", $posx); $this->includePageMaxLength = $chgpos * 2 + 2; } } $text = LST::limitTranscludedText($text, $this->includePageMaxLength, ' [['.$title.'|...more]]'); }
後半はいつもの修正なので、パラメータ名が変更されている点などに注意すればOKです。これで晴れてDPL3が使用可能となったので、本体を1.37.0へバージョンアップいたしました。