トリミング

閲覧数: 57(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閑話, 公開タグ,
関連記事
アクセシビリティ対策
2019年6月23日

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

dockerとproxy
blank
2019年6月18日

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

関連記事の大原則
blank
2019年6月16日

ググったりしてあるページにたどり着いた閲覧者に対して、それに関連する記事を提示して少しでもサイトの滞  続きを読む

dockerとiptables
blank
2019年6月13日

クラウドサーバーを利用する場合、ファイアウォール(Firewalld/iptables)の設定に失敗  続きを読む

コンテナとFirewall
blank
2019年6月12日

三日連続のdockerネタです。前回の「コンテナの自動起動」でサーバーを再起動した時にコンテナ(ph  続きを読む

コンテナの自動起動
blank
2019年6月11日

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

コメントを残す

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