]> git.cworth.org Git - sup/blob - lib/sup/label.rb
minor label bugfix
[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 ]
9
10   ## labels which it nonetheless makes sense to search for by
11   LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted, :inbox ]
12
13   ## labels that will typically be hidden from the user
14   HIDDEN_RESERVED_LABELS = [ :starred, :unread ]
15
16   def initialize fn
17     @fn = fn
18     labels = 
19       if File.exists? fn
20         IO.readlines(fn).map { |x| x.chomp.intern }
21       else
22         []
23       end
24     @labels = {}
25     @modified = false
26     labels.each { |t| @labels[t] = true }
27
28     self.class.i_am_the_instance self
29   end
30
31   ## all listable (just user-defined at the moment) labels, ordered
32   ## nicely and converted to pretty strings. use #label_for to recover
33   ## the original label.
34   def listable_labels
35     ## uniq's only necessary here because of certain upgrade issues
36     (LISTABLE_RESERVED_LABELS + @labels.keys).uniq
37   end
38
39   ## all apply-able (user-defined and system listable) labels, ordered
40   ## nicely and converted to pretty strings. use #label_for to recover
41   ## the original label.
42   def applyable_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.ucfirst
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     t = t.intern unless t.is_a? Symbol
67     unless @labels.member?(t) || RESERVED_LABELS.member?(t)
68       @labels[t] = true
69       @modified = true
70     end
71   end
72
73   def delete t
74     if @labels.delete t
75       @modified = true
76     end
77   end
78
79   def save
80     return unless @modified
81     File.open(@fn, "w") { |f| f.puts @labels.keys }
82   end
83 end
84
85 end