Class: Redwood::SearchManager
- Includes:
- Singleton
- Defined in:
- lib/sup/search.rb
Defined Under Namespace
Classes: ExpansionError
Instance Attribute Summary collapse
-
#predefined_searches ⇒ Object
readonly
Returns the value of attribute predefined_searches.
Instance Method Summary collapse
- #add(name, search_string) ⇒ Object
- #all_searches ⇒ Object
- #delete(name) ⇒ Object
- #edit(name, search_string) ⇒ Object
- #expand(search_string) ⇒ Object
-
#initialize(fn) ⇒ SearchManager
constructor
A new instance of SearchManager.
- #name_format_hint ⇒ Object
- #predefined_queries ⇒ Object
- #rename(old, new) ⇒ Object
- #save ⇒ Object
- #search_string_for(name) ⇒ Object
- #valid_name?(name) ⇒ Boolean
Methods included from Singleton
Constructor Details
#initialize(fn) ⇒ SearchManager
Returns a new instance of SearchManager.
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/sup/search.rb', line 12 def initialize fn @fn = fn @searches = {} if File.exist? fn IO.foreach(fn) do |l| l =~ /^([^:]*): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}" @searches[$1] = $2 end end @modified = false @predefined_searches = { 'All mail' => 'Search all mail.' } @predefined_queries = { 'All mail'.to_sym => { :qobj => Xapian::Query.new('Kmail'), :load_spam => false, :load_deleted => false, :load_killed => false, :text => 'Search all mail.'} } @predefined_searches.each do |k,v| @searches[k] = v end end |
Instance Attribute Details
#predefined_searches ⇒ Object (readonly)
Returns the value of attribute predefined_searches.
10 11 12 |
# File 'lib/sup/search.rb', line 10 def predefined_searches @predefined_searches end |
Instance Method Details
#add(name, search_string) ⇒ Object
46 47 48 49 50 51 52 53 54 |
# File 'lib/sup/search.rb', line 46 def add name, search_string return unless valid_name? name if @predefined_searches.has_key? name warn "cannot add search: #{name} is already taken by a predefined search" return end @searches[name] = search_string @modified = true end |
#all_searches ⇒ Object
36 |
# File 'lib/sup/search.rb', line 36 def all_searches; return @searches.keys.sort; end |
#delete(name) ⇒ Object
76 77 78 79 80 81 82 83 84 |
# File 'lib/sup/search.rb', line 76 def delete name return unless @searches.has_key? name if @predefined_searches.has_key? name warn "cannot delete predefined search: #{name}." return end @searches.delete name @modified = true end |
#edit(name, search_string) ⇒ Object
66 67 68 69 70 71 72 73 74 |
# File 'lib/sup/search.rb', line 66 def edit name, search_string return unless @searches.has_key? name if @predefined_searches.has_key? name warn "cannot edit predefined search: #{name}." return end @searches[name] = search_string @modified = true end |
#expand(search_string) ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/sup/search.rb', line 86 def search_string = search_string.dup until (matches = .scan(/\{([\w-]+)\}/).flatten).empty? if !(unknown = matches - @searches.keys).empty? = "Unknown \"#{unknown.join('", "')}\" when expanding \"#{search_string}\"" elsif .size >= 2048 = "Check for infinite recursion in \"#{search_string}\"" end if warn raise ExpansionError, end matches.each { |n| .gsub! "{#{n}}", "(#{@searches[n]})" if @searches.has_key? n } end return end |
#name_format_hint ⇒ Object
44 |
# File 'lib/sup/search.rb', line 44 def name_format_hint; "letters, numbers, underscores and dashes only"; end |
#predefined_queries ⇒ Object
35 |
# File 'lib/sup/search.rb', line 35 def predefined_queries; return @predefined_queries; end |
#rename(old, new) ⇒ Object
56 57 58 59 60 61 62 63 64 |
# File 'lib/sup/search.rb', line 56 def rename old, new return unless @searches.has_key? old if [old, new].any? { |x| @predefined_searches.has_key? x } warn "cannot rename search: #{old} or #{new} is already taken by a predefined search" return end search_string = @searches[old] delete old if add new, search_string end |
#save ⇒ Object
103 104 105 106 107 |
# File 'lib/sup/search.rb', line 103 def save return unless @modified File.open(@fn, "w:UTF-8") { |f| (@searches - @predefined_searches.keys).sort.each { |(n, s)| f.puts "#{n}: #{s}" } } @modified = false end |
#search_string_for(name) ⇒ Object
37 38 39 40 41 42 |
# File 'lib/sup/search.rb', line 37 def search_string_for name; if @predefined_searches.keys.member? name return name.to_sym end return @searches[name]; end |
#valid_name?(name) ⇒ Boolean
43 |
# File 'lib/sup/search.rb', line 43 def valid_name? name; name =~ /^[\w-]+$/; end |