Class: Redwood::SearchManager

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/sup/search.rb

Defined Under Namespace

Classes: ExpansionError

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Singleton

included

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_searchesObject (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_searchesObject



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 expand search_string
  expanded = search_string.dup
  until (matches = expanded.scan(/\{([\w-]+)\}/).flatten).empty?
    if !(unknown = matches - @searches.keys).empty?
      error_message = "Unknown \"#{unknown.join('", "')}\" when expanding \"#{search_string}\""
    elsif expanded.size >= 2048
      error_message = "Check for infinite recursion in \"#{search_string}\""
    end
    if error_message
      warn error_message
      raise ExpansionError, error_message
    end
    matches.each { |n| expanded.gsub! "{#{n}}", "(#{@searches[n]})" if @searches.has_key? n }
  end
  return expanded
end

#name_format_hintObject



44
# File 'lib/sup/search.rb', line 44

def name_format_hint; "letters, numbers, underscores and dashes only"; end

#predefined_queriesObject



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

#saveObject



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

Returns:

  • (Boolean)


43
# File 'lib/sup/search.rb', line 43

def valid_name? name; name =~ /^[\w-]+$/; end