[Hiki-dev] キーワードハイライト

Back to archive index

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)
 



Hiki-dev メーリングリストの案内
Back to archive index