トリミング
mediawikiのextensionsの一つに、Dynamic Page List(3rd Party)というのがあって、条件設定に従って記事の一覧を作成してくれます。指定によっては、一部を抽出して表示することもでき、Tsubopediaのトップページでは頻出のextensionsです。
仕様がsingle byte(英語圏)となっているため、日本語などの非英語圏の記事(unicode)は、文字区切りによっては意図しないところで区切り文字と判定されてしまう場合があります。対策は、substr()関数をmb_strimwidth()関数に変更することですが、パッケージphp-mbstringが必要です。
また、mediawikiの基本仕様である記事リンク([[ ]]で記事を囲む)を使用している場合、”[[“でも”]]”でも、二つ連続することでparserがリンクと判定しているので、途中で区切りを入れると、リンク自体が壊れます。そこで、最後の”[[“が”]]”より後ろにあるか判定し、trueの場合には、位置を調整しリンク切れを防いでいます。extensions/DynamicPageList/DPL.php
オリジナルのコード。
if ( $this->mIncMaxLen > 0 && ( strlen( $text ) > $this->mIncMaxLen ) ) { $text = DPLInclude::limitTranscludedText( $text, $this->mIncMaxLen, ' [[' . $title . '|...more]]' ); }
次のように変更します。
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]]' ); }
extensions/DynamicPageList/DynamicPageListInclude.phpのsubstr()は全てmb_strimwidth()に置き換えます。引数は共通なので、%sコマンドで一括置換えでOKです。これをやっておかないと、抜粋の際の文字区切りがメチャクチャになります。必須の日本語対応です。
最終更新日: 2016年11月30日