]> git.cworth.org Git - sup/blob - lib/sup/label.rb
maintain labels as Sets rather than arrays
[sup] / lib / sup / label.rb
1 module Redwood
2
3 class LabelManager
4   include Singleton
5
6   ## labels that have special semantics. user will be unable to
7   ## add/remove these via normal label mechanisms.
8   RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted, :inbox, :attachment ]
9
10   ## labels that will typically be hidden from the user
11   HIDDEN_RESERVED_LABELS = [ :starred, :unread, :attachment ]
12
13   def initialize fn
14     @fn = fn
15     labels = 
16       if File.exists? fn
17         IO.readlines(fn).map { |x| x.chomp.intern }
18       else
19         []
20       end
21     @labels = {}
22     @new_labels = {}
23     @modified = false
24     labels.each { |t| @labels[t] = true }
25
26     self.class.i_am_the_instance self
27   end
28
29   def new_label? l; @new_labels.include?(l) end
30
31   ## all labels user-defined and system, ordered
32   ## nicely and converted to pretty strings. use #label_for to recover
33   ## the original label.
34   def all_labels
35     ## uniq's only necessary here because of certain upgrade issues
36     (RESERVED_LABELS + @labels.keys).uniq
37   end
38
39   ## all user-defined labels, ordered
40   ## nicely and converted to pretty strings. use #label_for to recover
41   ## the original label.
42   def user_defined_labels
43     @labels.keys
44   end
45
46   ## reverse the label->string mapping, for convenience!
47   def string_for l
48     if RESERVED_LABELS.include? l
49       l.to_s.capitalize
50     else
51       l.to_s
52     end
53   end
54
55   def label_for s
56     l = s.intern
57     l2 = s.downcase.intern
58     if RESERVED_LABELS.include? l2
59       l2
60     else
61       l
62     end
63   end
64
65   def << t
66     raise ArgumentError, "expecting a symbol" unless t.is_a? Symbol
67     unless @labels.member?(t) || RESERVED_LABELS.member?(t)
68       @labels[t] = true
69       @new_labels[t] = true
70       @modified = true
71     end
72   end
73
74   def delete t
75     if @labels.delete(t)
76       @modified = true
77     end
78   end
79
80   def save
81     return unless @modified
82     File.open(@fn, "w") { |f| f.puts @labels.keys.sort_by { |l| l.to_s } }
83     @new_labels = {}
84   end
85 end
86
87 end