lib/sup/label.rb (2014B) - raw
1 # encoding: utf-8
2
3 module Redwood
4
5 class LabelManager
6 include Redwood::Singleton
7
8 ## labels that have special semantics. user will be unable to
9 ## add/remove these via normal label mechanisms.
10 RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted, :inbox, :attachment, :forwarded, :replied ]
11
12 ## labels that will typically be hidden from the user
13 HIDDEN_RESERVED_LABELS = [ :starred, :unread, :attachment, :forwarded, :replied ]
14
15 def initialize fn
16 @fn = fn
17 labels =
18 if File.exist? fn
19 IO.readlines(fn).map { |x| x.chomp.intern }
20 else
21 []
22 end
23 @labels = {}
24 @new_labels = {}
25 @modified = false
26 labels.each { |t| @labels[t] = true }
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:UTF-8") { |f| f.puts @labels.keys.sort_by { |l| l.to_s } }
83 @new_labels = {}
84 end
85 end
86
87 end