ochalog

Ruby と MediaWiki が好きな電子・情報系の学生のブログ。

MediaWikiのページをStructured Discussionsボードに変換するメンテナンススクリプト

就職して1年ほど経ち毎日忙しいが、スパロボWiki型月Wikiなどのwikiの管理はなんとか続けている。今後もクリエイターズネットワークMediaWiki環境は最新の状態に保ち、また積極的に新機能を導入していきたい。

先日、クリエイターズネットワークのwikiで使われているMediaWikiを最新版の1.32.1に更新した。その際、スパロボWiki、型月WikiガンダムWikiStructured Discussionsという拡張機能を新しく導入した。この拡張機能を個々のページに対して有効化すると、そのページを便利な掲示板として使うことができる。しかし、この拡張機能が提供する移行機能を使用すると、詳細不明のエラーが発生して対象ページの移行作業が中断されてしまう場合があった。このエラーを回避することとエラー発生時に原因を調べやすくすることを目的として、単一のページの移行作業を行うことができるメンテナンススクリプトを作った。

動機

拡張機能Structured Discussionsは、記法が守られなければ無法地帯となりがちであるMediaWikiトークページに、以下の図のような本格的な掲示板の機能を追加する。

拡張機能Structured Discussionsが提供する掲示板の例。左の欄で話題の追加が簡単に行えるほか、右の欄にその掲示板の説明を表示することができる。
拡張機能Structured Discussionsが提供する掲示板の例。MediaWiki公式サイトの「https://www.mediawiki.org/wiki/Extension:StructuredDiscussions」にEd Sanders氏)が投稿。CC 表示-継承 3.0。

MediaWikiの公式サイトにおいて利用者として使用してみると、

  • 投稿者と投稿日時が必ず表示される
  • 話題の作成や返信などの操作が簡単
  • スマホからの操作がしやすい

など、wiki上での議論に有用な機能が充実していた。そのため、議論が比較的多くなされる上記の3つのwikiに導入してみた。

Structured Discussionsは、ページや名前空間ごとに有効化する必要がある。ある特定のページにおいてこの拡張機能を有効化したい場合は、特別ページ「Special:EnableStructuredDiscussions」(特別:Structured Discussions の有効化)を使う。しかし、この特別ページを使用し、「トーク」または「利用者・トーク」以外の名前空間にあるページ*1においてStructured Discussionsを有効化しようとすると、詳細不明のエラー*2が発生してページの移行作業が中断されてしまった。その場合、対象ページのStructured Discussionボード*3化と既存のページの過去ログ化は行われるが、変換後のボードの説明欄や過去ログページにテンプレートが追加されず、過去ログページが孤立してしまうという問題が起こる。テンプレートを手作業で追加することはできるが、正しくテンプレートを書くことは煩雑な作業なので、できれば避けたい。

一方、ある名前空間のすべてのページにおいてStructured Discussionsを有効化する場合は、後述する移行作業を行った後、LocalSettings.php 内で以下のように名前空間のコンテンツ・モデルを設定するだけでよい。

<?php
$wgNamespaceContentModels[NS_TALK] = 'flow-board';
$wgNamespaceContentModels[NS_USER_TALK] = 'flow-board';

対象の名前空間にある既存のページは、メンテナンススクリプト extensions/Flow/maintenance/convertNamespaceFromWikitext.php を使用して一括移行することができる。以下のように実行すれば、名前空間トーク」や「利用者・トーク」にあるページは問題なく移行することができた。

# MW_INSTALL_PATH: MediaWikiがインストールされている場所
cd $MW_INSTALL_PATH/extensions/Flow/maintenance

sudo -u Webサーバーを動かしているユーザー php convertNamespaceFromWikitext.php --server='srw.wiki.cre.jp' Talk
sudo -u Webサーバーを動かしているユーザー php convertNamespaceFromWikitext.php --server='srw.wiki.cre.jp' User_talk

また、このメンテナンススクリプトを使用した場合、移行作業の途中でエラーが発生したとしても、スタックトレースが表示されるため原因を調べやすい。

そこで、単一のページに対してこのメンテナンススクリプトが提供する移行機能を使えるようにすれば、対象のページの移行が成功しやすくなり、エラー発生時にも対処しやすくなるのではないかと考えた。そのため、単一ページを対象として移行作業を行うメンテナンススクリプトを作ることにした。

単一ページを対象として移行作業を行うメンテナンススクリプト

今回作ったメンテナンススクリプトのコードを以下に示す。convertNamespaceFromWikitext.php を改造してこのスクリプトを作った。

これを convertPageToSDBoard.php という名前でMediaWikiをインストールしたディレクトリに保存した後、以下のように実行する。sudo でWebサーバーを動かしているユーザーとして実行することは、一時ファイルを作る権限を得るために必要だった。

# MW_INSTALL_PATH: MediaWikiがインストールされている場所
cd $MW_INSTALL_PATH/extensions/Flow/maintenance

sudo -u Webサーバーを動かしているユーザー php convertPageToSDBoard.php 移行するページの名前

処理手順は、「Special:EnableStructuredDiscussions」における入力から対象ページ名を取得する処理を行った後、そのページを対象として convertNamespaceFromWikitext.php の移行処理を行う、という単純なもの。ただし、対象ページが名前空間トーク」または「利用者・トーク」に存在しなければならないという制限をなくしている。エラーが発生した場合は、例外処理においてロガーがスタックトレースを表示するため、原因を調べやすい。

実行結果

名前空間トーク」、「利用者・トーク」にあるページに加えて、それ以外の名前空間にあるページも上記のメンテナンススクリプトで問題なくStructured Discussionボードに移行することができた。処理内容自体は「Special:EnableStructuredDiscussions」と大して変わらないため、特別ページでエラーが発生してしまう理由は分からなかった。

まとめ

指定した単一のページをStructured Discussionsボードに移行するメンテナンススクリプトを作った。このメンテナンススクリプトを使うことで、単一のページのStructured Discussionsボードへの移行が成功しやすくなり、エラーが発生した場合もスタックトレースから原因を特定しやすくなる。複数のページに対して使う機会があれば、より効率よく移行作業が行える。

*1:スパロボWikiTYPE-MOON Wikiでは、「Project」名前空間にあるページ「BBS/2019」などが掲示板として使用されている。それらのページにおいて、Structured Discussionsが提供する掲示板機能を使いたかった。

*2:データベースのロールバックが発生していたので、データベースの更新に失敗していたようだったが、どの段階でエラーが発生したのかは表示されなかった。PhabricatorのT197234が関連していると思われる。

*3:ボードとは、Structured Discussionの掲示板機能が有効化されたページのこと。詳細はmediawiki.orgの「Help:Structured Discussions/Glossary/ja」を参照。