Junichiro Kita
kita****@kitaj*****
2003年 10月 12日 (日) 00:59:13 JST
きたです. # 多分ここでははじめまして? 指定したキーワードをハイライトする機能を実装してみました. 最初は plugin だけで実装してみようかとおもったのですが,良い方法を思いつ かなかった(というかまだ hiki のことを良く理解していない)ので hiki 本体を イジってしまいました. http://example.com/?c=view&p=PageName&key=hoge とすると,PageName 中の hoge という文字列を <em class="hilight">hoge</em> に置き換えます.RWiki の em=hoge と同じですね.というかまんまパクってます. # hilighten はほぼ RWiki のものをそのままパクってしまいました. ついでに,検索画面からのリンクを上記のような key=hoge 付きリンクにしてみ ました. hikiconf.rb で $hilight_keys を true にした時のみ動作するようになってい ます. 以下,CVS HEAD に対するパッチです. Index: hiki/command.rb =================================================================== RCS file: /cvsroot/hiki/hiki/hiki/command.rb,v retrieving revision 1.4.2.37 diff -u -r1.4.2.37 command.rb --- hiki/command.rb 24 Aug 2003 12:03:21 -0000 1.4.2.37 +++ hiki/command.rb 11 Oct 2003 15:52:31 -0000 @@ -135,6 +135,12 @@ tokens = parser.parse( text ) formatter = HikiFormatter::new( tokens, @db, @plugin ) contents, toc = formatter.to_s, formatter.toc + if $hilight_keys + word = @params['key'][0] + if word && word.size > 0 + contents = hilighten(contents, word.split) + end + end @db.set_references( @p, formatter.references ) @db.increment_hitcount( @p ) @@ -159,6 +165,20 @@ generate_page( data ) end + + def hilighten(str, keywords) + hilighted = str.dup + keywords.each do |key| + re = Regexp.new('(' << Regexp.escape(key.escape) << ')', Regexp::IGNORECASE) + hilighted.gsub!(/([^<]*)(<[^>]*>)?/) { + body, tag = $1, $2 + body.gsub(re) { + %Q[<em class="hilight">#{$1}</em>] + } << ( tag || "" ) + } + end + hilighted + end def cmd_index list =****@db*****_info.sort {|a, b| @@ -343,7 +363,11 @@ word = @params['key'][0] if word && word.size > 0 total, l =****@db*****(word) - l.collect! {|p| @plugin.hiki_anchor( p[0].escape, @plugin.page_name(p[0])) + " - #{p[1]}"} + if $hilight_keys + l.collect! {|p| @plugin.make_anchor("#{$cgi_name}?cmd=view&p=#{p[0].escape}&key=#{word.split.join('+').escape}", @plugin.page_name(p[0])) + " - #{p[1]}"} + else + l.collect! {|p| @plugin.hiki_anchor( p[0].escape, @plugin.page_name(p[0])) + " - #{p[1]}"} + end data = get_common_data( @db, @plugin ) @plugin.hiki_menu(data, @cmd)