トリミング

閲覧数: 61(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)タグ, ,
PHP終了タグの件

今回の「サイト引越」に関連して移動後の動作確認でいろいろ不具合があった中で一番大きかったのはアップロ  続きを読む

Elasticsearch 6.8.11
blank

2017年末に「2.4.6」から「5.6.5」へバージョンアップして以来の大幅バージョンアップです。  続きを読む

今週のトップ10
blank

前回の「閲覧数を記録してみる」で記事の閲覧記録を取ることには成功しましたが、このプラグインでは細かい  続きを読む

SWIPER実装編
blank

Swiperの実装編、このサイトで実際に使っているJavaScriptの紹介です。 [code la  続きを読む

コンテナの自動起動
blank

最新バージョンのPHP-FPMをdockerのコンテナとして動かしてみたところ、思ったより安定して動  続きを読む

検索エンジンを分離
blank

何度か紹介しているのでご存知の方もいると思うが、ここの環境は、AWS上のEC2最少インスタンス(t2  続きを読む

スポンサーリンク

コメントを残す

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