トリミング

閲覧数: 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年4月1日

記事ページの下部に前後の記事(投稿)へのリンクが表示される仕様なのだが、「カテゴリーに制限」をかけて  続きを読む

閲覧数まとめ
blank
2021年3月25日

閃きついでに総合計と週合計をフラグで制御する方式に変更してみた。これまではベタに関数をまるまるコピー  続きを読む

閃きは大事だw
blank
2021年3月23日

このサイトは、あくまでもCMSであるWordPressの構築やクラウドであるAWSの運用ノウハウ取得  続きを読む

ElasticPress 3.5.6
blank
2021年3月19日

マイナーバージョンアップにも関わらず、検索スコアリングのパラメータが微調整された結果、期待する検索結  続きを読む

新年早々の非互換対応
blank
2021年1月1日

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

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

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

スポンサーリンク

コメントを残す

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