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