Hikiで、WikiNameを完全に無効にする

前置き

本サイトで使っているHiki(ver 0.8.8.1)には、管理メニューでWikiName機能をON/OFFすることができます。ところが、OFFしているにも関わらず、ときどきWikiNameの自動リンクが生成されてしまうことがあり、気になっていました。

これを解決できたので書いておきます。ただし、Hiki本体を変更するのでベストな方法ではないと思います。また、最新バージョンでどうなっているかは未確認です。

本文

結論から

Parser_defaultクラスのparse()メソッドを修正します。

  • hiki/style/default/parser.rb
    def parse( s, top_level = 2 )
#      HikiDoc.new( s, :level => top_level ).to_html
#      HikiDoc.to_xhtml( s, :level => top_level )
      HikiDoc.to_xhtml( s, :level => top_level, :use_wiki_name=>false )
    end

元々はto_htmlの1行だけだったと思いますが、何か問題があるとかで2行目のto_xhtml()に変えたんだと思います。良く覚えてません。いずれにしろ、今回修正したのが3行目のuse_wiki_nameオプションです。

ちょっと解説

入力したHiki文章は、上記のparse()によりXHTML文章になります。use_wiki_nameオプションがtrue(デフォルト)の場合、この時点で、例えばFireFoxみたいな文字列がリンクに置換されます。

<p><a href="FireFox">FireFox</a></p>

このXHTML文章が、HTMLFormatter_defaultクラスによって加工されて最終出力となります。

  • hiki/style/default/html_formatter.rb
def to_s
  s = @html      # ←parse()結果が@htmlに入っている。
  s = replace_inline_image( s )
  s = replace_wikiname( s ) if @conf.use_wikiname
  s = replace_link( s )
  s = replace_auto_link( s ) if @conf.auto_link
  s = replace_heading( s )
  s = replace_plugin( s ) if @conf.use_plugin
  @html_converted = s
  s
end

管理メニューでWikiName機能をON/OFFすると、@conf.use_wikinameに作用して、replace_wikiname()呼び出しがON/OFFされるわけですね。

その後replace_link()の中で「FireFoxのリンク先はmissing page」と判定され、missing_page_anchor()の中で下記のように加工されます。

FireFox<a class="nodisp" href="./?c=edit;p=FireFox" title="ページ FireFox を新規作成し、編集します。">?</a>

疑問点

上記の理解が正しいとすると、use_wiki_nameオプションがtrueで、管理メニューがWikiName機能OFFだった場合、すべてのXxxxYyyyがリンク化されそうなものですが、実際は一部のXxxxYyyyのみがリンク化されてました。その規則性は良く分かりませんが、例えば段落の先頭にXxxxYyyyがあるとWikiNameが発動するような気がします。to_xhtml()のWikiName検出ルールが独特なのかもしれません。

ちなみに、use_wiki_nameオプションをfalseにしても、管理メニューでWikiName機能をONにすれば、ちゃんとWikiNameは有効になります。

Last modified:2011/05/28 11:35:42
Keyword(s):
References:[サーバ管理・Linux関連]
This page is frozen.