Aug 2, 2004

Movable Type 3.0のIndividual Entry Archiveの命名方式の問題点

Movable Type 3.0になってIndividual Entry Archive(個別のアーカイブ)のファイル名の命名規則が変わったことは知られていますが、このエントリではこの命名方式にまつわる問題点を述べたいと思います。

MT3.0になって各エントリのレコードにbasenameというフィールドが追加されました。これはIndividual Entry Archiveを生成するときのファイル名(のベースネーム)を決定するためのもので、「一つのエントリに一つのファイル名を対応させる」ために個々のエントリにuniqueな文字列が設定されます(MT::Util::make_unique_basename)。基本的にはタイトルを元に生成され、すでに存在するエントリと同一のbasenameになってしまう場合には_1、_2、...と接尾辞を付けることでuniquenessを実現しています。

このbasenameはMT 2.6X以前には存在しませんでしたから、MT 2.Xからアップグレードした場合には(MT 2.Xのエントリを一旦ExportしてからImportしている場合は該当しません)、既に存在するエントリではNULLになっています。また、MT 3.0ではエントリを「最初に」作成した時点でこのbasenameが決定されてエントリの情報と共に保存されます。タイトルを入力せずに暫定的にエントリを保存した場合には、本文からbasenameを生成します。

実はこのbasenameの決め方やbasenameがNULLのときのMT3.0の振る舞いにはかなり疑問を感じなくはありません。

  1. 初回作成時以降にエントリのタイトルを追加したり変更したりしてもそれがbasenameに反映されることはありません。暫定的なタイトルを付けた場合、あるいはタイトルを入力せずに暫定的に保存した場合に、それを変更できないのではDraft(下書き)の意味がありません。エントリの内容や作成時刻はいつでも変更できるのですから、basenameを再設定する機能や、元となる情報をキーワードなどでいつでも指定できる機能があってもよいと考えられます。

  2. タイトルを入力しなかった場合には、本文の先頭10文字をdirifyしたものを元にbasenameが決定されます。しかし、このとき使われるlib/MT/I18N.pmのfirst_n_textは改行文字を除去しないため、basenameに改行を含んだ文字列が設定される可能性があります。つまり生成されるファイル名が「hoge[改行][改行].html」「hoge[改行][改行]_1.html」のような困ったものになる可能性があります。

    これはI18N.pmのイージーなバグですので簡単に直すことができます。修正方法はOgawa::Buzz: Movable Type 3.01D 日本語版・修正案に述べています。また、3.11日本語版などではこの修正が取り入れられています。が、すでに異常なbasenameを設定してしまっているエントリを修正することは、1.に書いた通りできません。

  3. basenameがNULLの時(つまりMT2.Xからアップグレードした場合など)の振る舞いに問題があります。この場合、個別のアーカイブの名前はどのように作られるかというと、タイトルがあればタイトルをdirifyしたもの、なければ本文の先頭10文字をdirifyしたものをそのままファイル名に使用します(MT::Util::archive_file_for)。つまり、(MT3.0で)エントリ生成時にユニークなbasenameが付与される時とは異なり、一つのエントリに一つのファイル名という原則が成り立ちません。

    このことは重大な状況を容易に引き起こし得ます。同じ月に同じタイトルのエントリを2個以上作っていた場合、複数のエントリが同じファイル名を持つことになり、どれか一つしか生成されないことになります。また、すべて日本語のタイトルを付けていた場合、ファイル名は「.html」「.php」だけになってしまいますし、すべて日本語のタイトルを持つ複数のエントリを同月に作っていた場合には(ごく一般的な状況ですが)より一層悲惨なことになることが容易に想像されます。

3. に関しては、実はNULLになっているbasenameをMT 3.0の枠組みで設定することができます。basenameがNULLの状態でエントリを保存し直そうとすると、そのエントリのタイトルや本文を元にを新たにuniqueな文字列を生成して設定してくれるのです。したがって片っ端からエントリを保存し直せばbasenameは設定されます。

それが面倒ならOpen power-editing mode(一括編集モード)でエントリの一覧を表示して何も変更せずに保存すれば、まとめて再保存したことになります。ただし要注意なのは、この方法では新しいエントリから順に設定がなされるということです。例えば、すべて日本語のエントリが5個しかないという状況を仮定します。これを一度に再保存すると、古いものから順にpost_4、post_3、...と名前が付き、一番新しいエントリにpostというbasenameが付けられてしまいます。次に新しいエントリを作るとpost_5となります。とてつもなく気持ち悪いですね。

要するに、basenameがNULLのエントリを古いものから読み込んでは再保存する簡単なツールがあれば結構楽ができそうです。と言ってもまだ作ってもいないのですが...。作ってみました(以下参照)。

Ogawa::Buzz: mt-resave-entries.cgi: basenameを正しく設定するためのCGIスクリプト

また、このツールがあれば1.や2.の問題に起因する異常なbasenameを再設定する機能を実現するのも比較的容易になるはずです。つまり、一旦エントリのbasenameをNULLにした後にこのツールを適用するとbasenameを再設定できるわけです。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com