/ 最近 .rdf 追記 編集 設定 本棚

脳log[20080717] quote_pageプラグインを使用したときに tocの飛び先が狂うのを修正 (Hiki-0.8.7)



2008年07月17日 (木)

[Hiki] quote_pageプラグインを使用したときに tocの飛び先が狂うのを修正 (Hiki-0.8.7)

http://vvvvvv.sakura.ne.jp/w/9784320122079/?QuotePageProblem

ちょっと説明。

アンカーが重複するのを防ぐために、quote_pageプラグインが他ページを HTML化する際に prefixを用いるようにした。でもこの prefixがそのままではうまく動かない。

prefixとは Hiki::HTMLFormatter_default#initializeが受け取る五番目のパラメータ。その意味は、見出しに付くアンカーの接頭辞。デフォルトでは prefix='l' となっており、l0, l1, l2,...とアンカーが割り振られることになる。

ところで、quote_pageが様々な prefixを用いてメソッドを呼び出しても、Hiki::HTMLFormatter_default::HEADING_REが

%r!<h(\d)>.*<a name="l\d+">.*?</a>(.*?)</h\1>!

となっており prefix='l' がハードコーディングされている(太字部分)。これの修正が必要だった。

また、rd+スタイルの場合はもっと悲惨で、五番目のパラメータ(なぜか suffixという名前)は全く利用されていない。修正の可能性はリンク先で書いたが自分で使っていないので未対応のまま。

なんでこんな使えないパラメータ(prefix, suffix)があるんだろう。

 追記

bugfix in headings in blockquotes (html_formatter.rb, Revision 1.47)

このへんが関係ありそう。引用の中の見出しは TOCに含めたくないとかそういうことだろうか。テストケースがあれば regressionの有無を確認できるんだけど……。

現在の状態で確認したが、引用の中の見出しが TOCに含まれるということはなかった。

ちなみに、Revision 1.46の tocメソッドにも prefix='l' 決めうちのミスがあったが、1.47でのそれにあわせるような変更から考えるに、ミスではなく prefix='l' の見出しだけが TOCに含まれるという仕様なのかもしれない。<ないない

ところで、最初のリンク先の Hikiには最新の HikiDocを入れているのだけど、その場合、html_formatter.rbを最新の hikidoc.rbに対応したものに全面的に書き換えないと、hikidoc.rbの大改造のメリットが半分しか活かせていないことになる。現在の html_formatter.rbはかつての hikidoc.rbを思わせる、正規表現で全体をバッサバッサと置換していく、文脈無視の大味な実装。(そこまで正規表現を信用できないし、最大長のわからない文字列を何度も何度もなめまわすのは避けたいところ)

 追記@2008-07-18: 最新の HikiDoc用のフォーマッタ(HikiDoc.newの第一引数)を書いてみたけど.

  • WikiNameを見つけ出す(自動リンク)正規表現が微妙に違う。

    HikiDocの正規表現(WIKI_NAME_RE)
    /\b(?:[A-Z]+[a-z\d]+){2,}\b/
    default/html_formatterの正規表現(WIKINAME_RE)
    /(\b(?:[A-Z][a-z0-9]+){2,}[A-Z]*\b)/n

    HikiDocにおまかせしたので、連続する大文字が許容される一方、大文字で終わる名前は拒否されるようになります。(GOODWikiName, BadWikiNAME)

  • default/html_formatterの URI_REはオーバースペックなので簡略化したいけど、すると動作が変わる。したけど。
  • tocを HTML化と並行して作るようにしてみたけど、quote_pageで引用してきた部分の tocが消えてしまうので、これまで通り最後に HTML全体をなめて作成することに。
  • tocは <ul>の直下に <ul>を配置したりするけど、どうなん?
  • 他に細かい違いがいっぱいあるはず。
    • aliasと titleと ページ名が重複したときどれが優先されるのか。
    • 重複した aliasは、最初に見つかった URLが選ばれるのか最後のものか。
    • ある変数が URLエンコードされているのか HTMLエスケープされているのかが極めてわかりにくい。絶対にどこかで間違えている。(実際に一か所間違えていた)

日記に書いた手前、どんな風になるのか試してみただけだし、現状で困ってもいないので、この(追記部分の)変更は使用中の Hiki( http://vvvvvv.sakura.ne.jp/w/ )には入れていない。あしからず。