Changeset 13618

Show
Ignore:
Timestamp:
06/10/08 21:07:09 (7 years ago)
Author:
cho45
Message:

Made faster keyword search.
Fixed crush bug on full-text search.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/ruby/Chemr/CHMDocument.rb

    r2803 r13618  
    175175                }.sort_by {|k,v| k.length } 
    176176 
     177                @search_thread.kill rescue nil 
    177178                if @now.length.zero? 
    178                         r = /(#{str.split(//).map {|c| Regexp.escape(c) }.join(").*?(")})/i 
    179                         @now.concat @index.select {|k,v| 
    180                                 k =~ r 
    181                         }.sort_by {|k,v| 
    182                                 # 文字が前のほうに集っているほど高ランクになるように 
    183                                 m = r.match(k) 
    184                                 (0...m.size).map {|i| m.begin(i) }.inject {|p,i| p + i } 
    185                         } 
     179                        @now << ["Loading...", [""]] 
     180                        @search_thread = Thread.start(str) do |str| 
     181                                r = /(#{str.split(//).map {|c| Regexp.escape(c) }.join(").*?(")})/i 
     182                                @now = @index.sort_by {|k,v| 
     183                                        # 文字が前のほうに集っているほど高ランクになるように 
     184                                        m = r.match(k) 
     185                                        !m ? Float::MAX : (0...m.size).map {|i| m.begin(i) }.inject {|p,i| p + i } 
     186                                }.first(30) 
     187                                @list.reloadData 
     188                        end 
    186189 
    187190                        @list.usesAlternatingRowBackgroundColors = false 
     
    318321                        }, 
    319322                        "C-\r" => Proc.new {|s| 
    320                                 @now = @chm.search(@search.stringValue).map {|title,url| 
     323                                @now = (@chm.search(@search.stringValue) || []).map {|title,url| 
    321324                                        [title, [url]] 
    322325                                }