]> git.cworth.org Git - sup/blob - lib/sup/label.rb
Merge branch 'master' into next
[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     @modified = false
23     labels.each { |t| @labels[t] = true }
24
25     self.class.i_am_the_instance self
26   end
27
28   ## all labels user-defined and system, ordered
29   ## nicely and converted to pretty strings. use #label_for to recover
30   ## the original label.
31   def all_labels
32     ## uniq's only necessary here because of certain upgrade issues
33     (RESERVED_LABELS + @labels.keys).uniq
34   end
35
36   ## all user-defined labels, ordered
37   ## nicely and converted to pretty strings. use #label_for to recover
38   ## the original label.
39   def user_defined_labels
40     @labels.keys
41   end
42
43   ## reverse the label->string mapping, for convenience!
44   def string_for l
45     if RESERVED_LABELS.include? l
46       l.to_s.capitalize
47     else
48       l.to_s
49     end
50   end
51
52   def label_for s
53     l = s.intern
54     l2 = s.downcase.intern
55     if RESERVED_LABELS.include? l2
56       l2
57     else
58       l
59     end
60   end
61   
62   def << t
63     t = t.intern unless t.is_a? Symbol
64     unless @labels.member?(t) || RESERVED_LABELS.member?(t)
65       @labels[t] = true
66       @modified = true
67     end
68   end
69
70   def delete t
71     if @labels.delete t
72       @modified = true
73     end
74   end
75
76   def save
77     return unless @modified
78     File.open(@fn, "w") { |f| f.puts @labels.keys.sort_by { |l| l.to_s } }
79   end
80 end
81
82 end