前日に引き続きMediaWikiに関する記事です。
(Wikipedia Infobox)

素のMediaWikiは、記事を全てWiki記法でべた書きしなくてはなりません。Wikipediaの記事では、右の図の情報ボックス(Infobox)のように、記事の種類ごとにテンプレートがあって、同じようなレイアウトのWikiデータを何度もコピー&ペーストしないで済むようになっています。

Wikipediaの便利なテンプレートを自分で設置したローカルのMediaWikiでも使えるようにするには、まずWikipediaでInfoboxを定義しているデータをXMLファイルとしてエクスポートしてから、ローカルのMediaWikiにインポートする必要があります(Wikiデータのコピー)。また、特定の拡張機能に依存しているテンプレートの場合は、当該の拡張機能もインストールする必要があります(依存関係にある拡張機能のインストール)。さらに、テンプレート内で独自の画像を埋め込んでいる場合は、画像ファイルも別途コピーしてくる必要があります(画像データのコピー)。Infoboxはこれら三つ全てに当てはまるケースで、非常に面倒でした。

そこで、WikipediaのテンプレートInfoboxを、さくらインターネットのサーバに設置したMediaWikiでも使えるようにした手順を説明します。先に言っておきますと、長いです。

テンプレートのエクスポートとインポート

まず、Wikipedia閲覧中に、自分のMediaWikiでも使ってみたいよさそうなテンプレート(定型表現)を見かけたとします。Wikiのいいところは、その部分がどんなWiki記法で書かれているかすぐに調べられるところです。ページ右上の “Edit” をクリックして、該当箇所が {{Infobox (中略)}} と書かれていることが分かりました。これは、該当箇所がInfoboxテンプレートを用いて書かれていることを表しています。Template:Infoboxにアクセスすると、Infoboxテンプレートについての詳しい説明を読むことができます。

さて、テンプレートの名前が分かったところで、そのデータをXMLファイルとしてエクスポートしましょう。そのためには、Special:Exportにアクセスします。このExportページは、MediaWikiエンジンで動作しているどのWikiにも備わっています。大きなテキストエリアに Template:Infobox と入力して、 Include only the current revision, not the full history, Include templates,  Save as file 全てにチェックをつけてExportボタンをクリックすれば、XMLファイルがダウンロードできます。この中には、Infoboxテンプレートの他にも依存関係のあるすべてのテンプレートが含まれます。

ここまできたら自分のMediaWikiのSpecial:Importページにアクセスします。そこで、先ほどダウンロードしたXMLファイルを選択してアップロードすると、テンプレートがインポートされます。これだけで済めば楽ですが、Infoboxの場合は複数の拡張機能に依存しており、インポートしたTemplate:Infoboxを表示しようとするとエラーが表示されます。

ScribuntoとLuaのインストール

Infoboxは、インストール時のオプションによっては有効化されていないParserFunctionsと、素のMediaWikiには入っていないScribuntoという拡張機能に依存しています。

ParserFunctionsについては、Special:Version(リンク先はMediaWikiのもの)のInstalled extensionsという項目に表示されていなければLocalSettings.phpの末尾に以下の行を足せば有効化されます。

require_once "$IP/extensions/ParserFunctions/ParserFunctions.php";

Scribuntoは、サーバ環境にインストールされたスクリプティング言語のインタプリタを呼び出すことで、PHP以外の言語でスクリプトを記述できるようにする拡張機能です。Infoboxの定義には同名のLuaモジュール(Module:Lua)が使われており、Scribuntoに加えてサーバ環境にLuaのバイナリが必要です。

まず、Luaをサーバにインストールします。Lua download arealua-5.*.tar.gz というようなファイル名のソースコードがあるので、これをダウンロードしてmakeします。さくらインターネットのレンタルサーバにインストールするため、自分のホームディレクトリ以下にlocalというディレクトリを作って、そこにソース、ライブラリ、実行ファイルを置くようにしています。このあたりはTracをインストールしたときの記録に詳しく書きました。

cd ~/local/src/
wget http://www.lua.org/ftp/lua-5.*.tar.gz
tar -zxvf lua-5.*
cd lua-5.*
make freebsd
make local
cd bin
ln -s lua lua-5.*

これで ~/local/src/lua-5.*/bin の中に lua-5.* というバイナリが生成されます。

次に、Scribuntoをインストールします。基本的にはMediaWiki上の日本語の説明に従っていけば大丈夫です。Download MediaWiki extension – MediaWikiから自分のMediaWiki環境に合ったバージョンを選択し、Continueボタンをクリックすると wikimedia-mediawiki-extensions-Scribunto-*.tar.gz のような名前の圧縮ファイルがダウンロードできます。これをMediaWikiのインストールディレクトリに移動し、

tar zxf wikimedia-mediawiki-extensions-Scribunto-*.tar.gz
mv wikimedia-mediawiki-extensions-Scribunto-* ~/www/wiki/extensions/Scribunto

LocalSettings.php の末尾で次のように呼び出してやればインストール完了です。(username, 5.*は環境に合わせて変えてください。)

require_once "$IP/extensions/Scribunto/Scribunto.php";
$wgScribuntoDefaultEngine = 'luastandalone';
$wgScribuntoEngineConf['luastandalone']['luaPath'] = '/home/username/local/src/lua-5.*/bin/lua5.*';

僕の環境ではシンタックスハイライトのための拡張機能GeSHiとコードエディタの拡張機能CodeEditorをインストールしていたため、次の行を追加して連携させました。

$wgScribuntoUseGeSHi = true;
$wgScribuntoUseCodeEditor = true;

これで、Template:Infoboxがサーバエラーなく表示されるようになるはずです。しかし、テンプレートが依存している画像データがないため、当該箇所の表示が崩れます。

画像データのコピー

最後に、テンプレートが依存している画像の一覧を取得し、WikipediaおよびWikimediaにアップロードされた同名画像をダウンロードして、自前のMediaWikiに登録します。これにより、Infoboxが完璧な状態で表示されるようになります。本当は、Special:ExportおよびSpecial:Importが文字ベースのXMLファイルだけでなく依存関係にある画像まで扱えるようになってくれれば楽なのですが、そのようなリクエストはMediaWikiのBugzillaに登録されたまま長らく放置されています。

MediaWikiにおいて、画像など存在しないファイルへのリンクはSpecial:WantedFiles(リンク先はWikipediaのもの)で一覧できます。これをコマンドラインで取得して、足りないものと同名のファイルをWikipediaからうまく取得、登録できたらよいのですが…方針が立たず困っていたところ、Mediawiki: How to export a subset of pages including imagesという、とても参考になる記事を見つけました。

この記事によれば、MediaWikiでは、画像ファイルはMD5ハッシュの先頭1文字および2文字を名前に持つフォルダの中に格納されます。例えば、 Lua-logo-nolabel.svg なら

% echo -n Lua-logo-nolabel.svg | md5
6a3ed151b18e5e08776de4449bdf8bbe

なので、 $MEDIAWIKI/images/6/6a/Lua-logo-nolabel.svg に保存されます。MD5ハッシュの値はWikipediaでもさくらインターネットのレンタルサーバでも一緒なので、これを使ってWikipediaのURLを推測できます。 Lua-logo-nolabel.svg はWikimedia Commonsにアップロードされたものなら http://upload.wikimedia.org/wikipedia/commons/6/6a/Lua-logo-nolabel.svg にあるはずです。

そこで、まずローカルのMediaWikiに対してコマンドラインでSQLクエリを発行して足りないファイルの一覧を取得し、ローカルのファイルを探して、もしなければリモートのWikiエンジンにおけるファイルのURLを推測してファイルをダウンロードするという方法が取れることになります。

上述の記事に掲載されているシェルスクリプトを、さくらインターネットのレンタルサーバ用に味付けしたものを以下に示します。(コードの整理と、さくらインターネットのレンタルサーバではmd5ハッシュを求めるコマンドがmd5sumではなくmd5なので、そこを変えたりしています。)

#!/bin/sh

SQL_HOST="mysql*.db.sakura.ne.jp"
SQL_USER="digitalmuseum"
SQL_PWD="***"
SQL_TABLE="digitalmuseum"
MEDIAWIKI_DIR="$HOME/www/wiki"
IMAGE_DOWNLOAD_DIR="./images"
REMOTE_PATH="http://upload.wikimedia.org/wikipedia/en"

SQL_CMD="SET NAMES utf8; SELECT distinct il_to FROM imagelinks;"
IMAGE_DIR="$MEDIAWIKI_DIR/images"
MD5="md5"

mkdir -p $IMAGE_DOWNLOAD_DIR

images=`echo $SQL_CMD | mysql -h $SQL_HOST -u $SQL_USER -p"$SQL_PWD" $SQL_TABLE | grep -v '^il_to$'`
for image in $images
do
md5=`echo -n $image | $MD5`
first=`echo $md5 | cut -c1-1`
second=`echo $md5 | cut -c1-2`
target="$IMAGE_DIR"/"$first"/"$second"/"$image"
if [ -f $target ]
then
echo found $target
else
url="$REMOTE_PATH"/"$first"/"$second"/"$image"
echo downloading $url
wget -a ./getMediaWikiImages.log --restrict-file-names=nocontrol -P $IMAGE_DOWNLOAD_DIR $url
fi
done

php $MEDIAWIKI/maintenance/importImages.php $IMAGE_DOWNLOAD_DIR

これを実行すると、足りないファイルをWikipediaからダウンロードして、自前のMediaWikiに登録してくれます。

こうして、晴れてWikipediaのテンプレートを画像も含めコピーすることができました!いやー長かった…。


6 Responses to “Wikipediaのテンプレートを自前のMediaWikiに追加した”

  1. mediawiki_beginner

    初めまして。加藤さん。

    MediawikiにWikipediaのテンプレートを導入する方法についてですが、
    僕はMAMPのサーバーにMediawikiを入れ、そこでInfoboxのようなデザインの表を使いたいのですが、どのようにやれば良いでしょうか

    今のところ、LocalSettings.phpに
    require_once “$IP/extensions/Scribunto/Scribunto.php”;
    $wgScribuntoDefaultEngine = ‘luastandalone’;
    を追加したりと、
    このサイト(https://www.mediawiki.org/wiki/Extension:Scribunto/ja)を参考にしてやってみたのですが、Infoboxのデザインが反映されません。

    そもそも、WikipediaのテンプレートをMAMPのサーバー上のMediawikiでやるということはできないのでしょうか。

    分かりづらい説明で失礼しました。OSはmacOS Sierra (Version 10.12.4)で、MAMPのバージョンは4.1.1(492)です。

    返信
    • Jun Kato (arc@dmz)

      初めまして。これはもうだいぶ古い記事なので今でも通用するか分かりませんが、少なくとも当時は、

      1. Wikiデータのコピー
      2. 依存関係にある拡張機能のインストール
      3. 画像データのコピー

      という3つのステップが必要でした。

      mediawiki_beginner さんは2つめのステップしかされていないように見えますので、残りの2つをやってみてはいかがでしょうか。

      返信

Trackbacks and Pingbacks:

  1. レンタルサーバのMediaWikiにJava製SVGレンダラを設定した | junkato.jp

    […] そこで、この記事では、SVG画像のレンダリングに使うエンジンをImageMagickからApache BatikというJavaで動作するものに差し替えた手順を紹介します。(これで、前日、前々日から続いたMediaWikiのセットアップ記録は終わりです。) […]

  2. MediaWikiをセットアップしてみた | プログラマのつれづれなるままに

    […] MediaWikiを使っているときに一番ありがたいのは最悪Wikipediaのテンプレートがそのまま使える、ということです。ちょうど調べているとWikipediaのテンプレートを自前のMediaWikiに追加した – People are programmers.というありがたい記事があったのでそのまま使わせてもらいました。今回の場合はレンタルサーバーではなくVPSサーバーなのでLuaはパッケージインストールされたものをそのまま使います。その場合の場所はwhichコマンドで出てきたものを使います。あとはParserFunctionsとScribuntoを拾ってきて設定を行えばImportとExportし放題になります。 […]

  3. VANGUARD FLIGHT | MediaWikiにExtension:Scribuntoをインストール | Remove Before Flight

    […] 参考記事:Wikipediaのテンプレートを自前のMediaWikiに追加した […]

  4. mediawikiのinfoboxを有効にする

    […] https://www.mediawiki.org/wiki/Manual:Importing_Wikipedia_infoboxes_tutorial http://junkato.jp/ja/blog/2014/01/13/mediawiki-import-templates-from-wikipedia/ […]

Leave a Reply

  • (will not be published)