トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

BugTrack-wiki/313

ページの作成や編集にはユーザ登録が必要です。

Wiki 書式の固定的な優先順位による不具合

  • 投稿者: ぐうます
  • カテゴリ: 本体
  • 優先度: 重要
  • 状態: リリース済
  • 日時: 2007年12月01日 18時19分43秒

 内容

2 つの Wiki 書式をネストして記述したとき、意図した通りのページ出力結果が得られない場合があります。

不具合例

BBS-サポート掲示板/768 にて指摘されている通り、

== http://honyarara.dotto.kom/index.cgi ==

ような Wiki ソースの場合、

http://honyarara.dotto.kom/index.cgi

となり、取消線を使用したつもりなのに取消線になりません。

原因

上記不具合は、2 つの Wiki 書式間に、処理順序による固定的な優先順位が存在することが原因です。上記の例の場合では取消線よりもリンクが優先して処理されるため、リンクの処理後に取消線の書式を正しく認識することができず、取消線として処理されません。

背景

上記に例示した不具合は、BBS-サポート掲示板/768 での指摘の通り、FreeStyleWiki 3.6.3dev2 から発生しており、それ以前の版では問題ありませんでした。これは、BugTrack-wiki/294 の不具合を修正するため、同ページに添付された patch が 3.6.3dev2 から適用されたことが原因です。この patch では、不具合を修正するために Wiki 書式の処理順序を入れ替えていますが、それによる副作用として FreeStyleWiki 3.6.3dev1 まではリンクの処理よりも優先順位が高かった取消線の処理の優先順位がリンクの処理よりも下がったため、上記例のような場合に取消線が処理されなくなってしまいました。

対策の検討

次のような例の場合、

(1) http://honyarara.dotto.kom/tekito-na-url_____2391034_____334.html
(2) __ http://honyarara.dotto.kom/tekito-na-url334.html __

結果は次のようになります。

(1) http://honyarara.dotto.kom/tekito-na-url_____2391034_____334.html

(2) http://honyarara.dotto.kom/tekito-na-url334.html

本サイトに現在適用されている 3.6.3dev2 では、(1) は正しく処理されますが、(2) は正しく処理されません。下線よりもリンクが先に処理されるためです。一方で、3.6.3dev1 以前の場合、下線の方が先に処理されるため (2) は正しく表示されるものの、(1) の url 内に含まれる '__' の部分が下線として認識されてしまうため、url がリンクとして認識されなくなってしまうという問題が発生します(BugTrack-wiki/294 での指摘)。

以上のことから、固定した処理順序に依存して 2 つの Wiki 書式の優先順位が決まってしまうと、(1),(2) いずれかの場合に必ず問題が生じるということが分かります。すなわち、「書式間の優先順位が固定の処理順序に依存してはいけない」ということであり、対策としてはこの点に対する変更が必要となります。

対策案

Wiki 書式がネストして使用された場合にも対応するため、対策案としては、「そのソース行の先頭から調べていき、出現した順に Wiki 書式を処理すればよい」ということになります。このような観点から下記のような変更を提案致します。

  • 変更箇所
    1. lib/Wiki/Parser.pm:parse_line()
      • Wiki ソース 1 行を処理する本サブルーチンについて、与えられたソース 1 行の先頭から調べていき、Wiki 書式を出現順に処理するように変更します。具体的には、ソース行で最初に出現する Wiki 書式先頭パターン('[[' や '==' や 'http' 等)の位置を検出した後、それ以降のソースに対しどの Wiki 書式に match するかを行頭 match で判定するようにします。行頭 match なら、行の途中に match しないため、ネストされた内側の書式が外側の書式よりも先に match することがなくなるからです。これを繰り返すことにより、与えられたソース 1 行のすべてを処理します。
    2. lib/Wiki/InterWiki.pm:exists_interwiki()
      • InterWikiName が使用されているか否かを判定する本サブルーチンについて、これを呼ぶ lib/Wiki/Parser.pm:parse_line() の上記変更に対応して、与えられたソースの先頭で InterWikiName が使われている場合のみ真を返すように変更します。
    3. lib/Wiki/Keyword.pm:parse_line()
      • ページ Keyword からキーワードを抽出する本サブルーチンについて、この中で使用している lib/Wiki/InterWiki.pm:exists_interwiki() の上記変更に伴い、lib/Wiki/Parser.pm:parse_line() と同様な変更を実施します。

FreeStyleWiki 3.6.3dev2 のソースファイルに対し、このように変更したものを本ページに添付致します。なお、この対策案を試用しやすいように plugin 版も作成しました。

注意:この対策案は、FreeStyleWiki 3.6.2 を含む、それ以前の version では動作しません。

  • plugin 版:test_parse_line.20080203.zip(478)
    • ダウンロードして展開すると、plugin/test_parse_line というフォルダができるので、この test_parse_line フォルダとその中のファイルを各サイトの plugin フォルダの下に保存して下さい。その後、プラグイン設定ページから、test_parse_line プラグインパッケージを有効にすると、上記変更箇所に該当する 3 ルーチンをプラグインがオーバーライドすることにより対策が適用されます。
    • 同じ Wiki ソースについて、test_parse_line プラグインパッケージの有効/無効を切り替えるだけで、本対策有り/無しによる出力結果の違いを簡単に確認することができます。
    • 初回に添付しました test_parse_line.20071201.zip には、plugin 化した際の作業ミスによる Bug がありました。申し訳ありません。
  • 変更ソースファイル一式:parse_line.20071201.zip(506)
    • ダウンロードして展開すると、lib/Wiki というフォルダができ、変更を適用した Parser.pm, InterWiki.pm, Keyword.pm が入っています。plugin 版ではなく、こちらを使用する場合には、この 3 つの *.pm を各サイトの lib/Wiki フォルダの中に上書きして下さい。このとき、念のため、オリジナルの Parser.pm, InterWiki.pm, Keyword.pm をファイル名変更するなどして保存しておくことをお奨めします。

備考

添付した対策案では、本件不具合とは直接関係ない下記の変更も同時に実施していますので、念のため記載しておきます。

  • lib/Wiki/Parser.pm:parse_line()
    • Keyword と WikiName の処理を別ルーチン parse_line_keyword() に分離。
    • tail recursion を loop に変更(効果があるかどうかは未検証)。
    • 各 Wiki 書式の判定を行頭 match としたことにより、match 箇所より前の部分($pre)が常に空となる。よって、$pre に対する処理が不要となるため、それらの処理を削除。
  • lib/Wiki/InterWiki.pm:exists_interwiki()
    • 与えられた Wiki ソース行が '[[' で始まらない場合には、即座に偽を返して終了(各 InterWikiName の使用有無をチェックする loop の中に入らない)。
  • lib/Wiki/Keyword.pm:parse_line()
    • Keyword 定義が Wiki ソース 1 行中に複数存在した場合、その全てを有効とする(現状では、Wiki ソース 1 行中の最初に match した定義のみが有効)。

 コメント

  • これ、次回リリースにはぜひ盛り込んでいただきたいです。よろしくご検討ください。 - 名無しさん (2008年01月03日 13時26分48秒)
  • 3.6.2にも対応したものを作成いただけないでしょうか。3.6.2で使うと、plugin版、差し替え版、ともにプラグインのパースに失敗してしまい、lastmodified}}プラグインは存在しません。などとエラーになってしまいます。よろしくお願いします。 - 名無しさん (2008年01月30日 19時31分15秒)
  • 初回投稿時に添付しました plugin 版に Bug がありましたので、修正版 test_parse_line.20080203.zip(478) を添付しました。申し訳ありませんでした。 - ぐうます (2008年02月03日 03時03分40秒)
  • 3.6.2 で動作しない件につきましては、現象を確認しました。調べましたところ、内部的に使用しているコア内のメソッドが 3.6.2 と 3.6.3dev* で仕様が変わっているため、両 version に対応するものを作成するのは残念ですが困難のようです。 - ぐうます (2008年02月03日 03時06分48秒)
  • 検討ありがとうございます。本対応を非常に重要なものだと考えていますので、がんばって本体のバージョンを上げることにします。できれば、3.6.3リリース時には正式対応していただきたいです。 - 名無しさん (2008年02月03日 08時48分33秒)
  • BugTrack-plugin/391を取り込んだことにより、この問題自体は次のバージョンで解消するはずのですので、ステータスを「完了」に変更させていただきます。 - たけぞう (2009年08月12日 18時41分37秒)
お名前: コメント:
parse_line.20071201.zip test_parse_line.20071201.zip test_parse_line.20080203.zip

最終更新時間:2010年10月24日 00時53分16秒