lib/sup/label.rb in sup-0.0.8 vs lib/sup/label.rb in sup-0.1
- old
+ new
@@ -6,32 +6,58 @@
## labels that have special semantics. user will be unable to
## add/remove these via normal label mechanisms.
RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted ]
## labels which it nonetheless makes sense to search for by
- LISTABLE_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted ]
+ LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted ]
## labels that will never be displayed to the user
- HIDDEN_LABELS = [ :starred, :unread ]
+ HIDDEN_RESERVED_LABELS = [ :starred, :unread ]
def initialize fn
@fn = fn
labels =
if File.exists? fn
IO.readlines(fn).map { |x| x.chomp.intern }
else
[]
end
@labels = {}
+ @modified = false
labels.each { |t| @labels[t] = true }
self.class.i_am_the_instance self
end
- def user_labels; @labels.keys; end
- def << t; @labels[t] = true unless @labels.member?(t) || RESERVED_LABELS.member?(t); end
- def delete t; @labels.delete t; end
+ ## all listable (user-defined and system listable) labels, ordered
+ ## nicely and converted to pretty strings. use #label_for to recover
+ ## the original label.
+ def listable_label_strings
+ LISTABLE_RESERVED_LABELS.sort_by { |l| l.to_s }.map { |l| l.to_s.ucfirst } +
+ @labels.keys.map { |l| l.to_s }.sort
+ end
+
+ ## reverse the label->string mapping, for convenience!
+ def label_for string
+ string.downcase.intern
+ end
+
+ def << t
+ t = t.intern unless t.is_a? Symbol
+ unless @labels.member?(t) || RESERVED_LABELS.member?(t)
+ @labels[t] = true
+ @modified = true
+ end
+ end
+
+ def delete t
+ if @labels.delete t
+ @modified = true
+ end
+ end
+
def save
+ return unless @modified
File.open(@fn, "w") { |f| f.puts @labels.keys }
end
end
end