トリミング

閲覧数: 58(0)

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日】
カテゴリーIT閑話, 公開タグ,
新年早々の非互換対応
2021年1月1日

昨年から先送りしていた「mediawiki」のマイナーバージョンアップ(2020/12/18リリース  続きを読む

検索精度を高める
blank
2020年11月1日

検索ネタを連発するのはElasticsearchやElasticPressがバージョンアップした時の  続きを読む

ElasticPress日本語設定2020年版
blank
2020年10月29日

ElasticsearchをWordpressで利用するためのプラグインであるElasticPres  続きを読む

ElasticPress 3.5
blank
2020年10月22日

Elasticsearch用のプラグインであるElasticPressがメジャーバージョンアップ(3  続きを読む

アクセシビリティ対策
blank
2019年6月23日

テーマカスタマイズの一環で、トップページに一覧表示されている「写真を左右交互に表示する」ようにした際  続きを読む

dockerとproxy
blank
2019年6月18日

dockerやdocker-composeをプロキシ環境下で使うのに苦労したので忘れないようにメモし  続きを読む

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください