## 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 ]
+ RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent, :deleted, :inbox, :attachment ]
- ## labels which it nonetheless makes sense to search for by
- LISTABLE_RESERVED_LABELS = [ :starred, :spam, :draft, :sent, :killed, :deleted ]
-
- ## labels that will never be displayed to the user
- HIDDEN_RESERVED_LABELS = [ :starred, :unread ]
+ ## labels that will typically be hidden from the user
+ HIDDEN_RESERVED_LABELS = [ :starred, :unread, :attachment ]
def initialize fn
@fn = fn
[]
end
@labels = {}
+ @new_labels = {}
@modified = false
labels.each { |t| @labels[t] = true }
+ end
+
+ def new_label? l; @new_labels.include?(l) end
- self.class.i_am_the_instance self
+ ## all labels user-defined and system, ordered
+ ## nicely and converted to pretty strings. use #label_for to recover
+ ## the original label.
+ def all_labels
+ ## uniq's only necessary here because of certain upgrade issues
+ (RESERVED_LABELS + @labels.keys).uniq
end
- ## all listable (user-defined and system listable) labels, ordered
+ ## all user-defined 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
+ def user_defined_labels
+ @labels.keys
end
## reverse the label->string mapping, for convenience!
- def label_for string
- string.downcase.intern
+ def string_for l
+ if RESERVED_LABELS.include? l
+ l.to_s.capitalize
+ else
+ l.to_s
+ end
end
-
+
+ def label_for s
+ l = s.intern
+ l2 = s.downcase.intern
+ if RESERVED_LABELS.include? l2
+ l2
+ else
+ l
+ end
+ end
+
def << t
+ raise ArgumentError, "expecting a symbol" unless t.is_a? Symbol
unless @labels.member?(t) || RESERVED_LABELS.member?(t)
@labels[t] = true
+ @new_labels[t] = true
@modified = true
end
end
def delete t
- if @labels.delete t
+ if @labels.delete(t)
@modified = true
end
end
def save
return unless @modified
- File.open(@fn, "w") { |f| f.puts @labels.keys }
+ File.open(@fn, "w") { |f| f.puts @labels.keys.sort_by { |l| l.to_s } }
+ @new_labels = {}
end
end