sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/

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