class Mournmail::SummaryItem

Attributes

cache_id[RW]
date[R]
flags[R]
from[R]
replies[R]
subject[R]
uid[R]

Public Class Methods

new(uid, date, from, subject, flags) click to toggle source
# File lib/mournmail/summary.rb, line 189
def initialize(uid, date, from, subject, flags)
  @uid = uid
  @date = date
  @from = from
  @subject = subject
  @flags = flags
  @line = nil
  @replies = []
  @cache_id = nil
end

Public Instance Methods

add_reply(reply) click to toggle source
# File lib/mournmail/summary.rb, line 200
def add_reply(reply)
  @replies << reply
end
delete_reply_if() { |reply| ... } click to toggle source
# File lib/mournmail/summary.rb, line 204
def delete_reply_if(&block)
  @replies = @replies.flat_map { |reply|
    reply.delete_reply_if(&block)
    if yield(reply)
      reply.replies
    else
      [reply]
    end
  }
end
flags_char() click to toggle source
# File lib/mournmail/summary.rb, line 243
def flags_char
  format_flags(@flags)
end
set_flag(flag, update_server: true) click to toggle source
# File lib/mournmail/summary.rb, line 226
def set_flag(flag, update_server: true)
  if !@flags.include?(flag)
    update_flag("+", flag, update_server: update_server)
  end
end
to_s(limit = 78, from_limit = 16, level = 0) click to toggle source
# File lib/mournmail/summary.rb, line 215
def to_s(limit = 78, from_limit = 16, level = 0)
  @line ||= format_line(limit, from_limit, level)
  return @line if @replies.empty?
  s = @line.dup
  child_level = level + 1
  @replies.each do |reply|
    s << reply.to_s(limit, from_limit, child_level)
  end
  s
end
toggle_flag(flag, update_server: true) click to toggle source
# File lib/mournmail/summary.rb, line 238
def toggle_flag(flag, update_server: true)
  sign = @flags.include?(flag) ? "-" : "+"
  update_flag(sign, flag, update_server: update_server)
end
unset_flag(flag, update_server: true) click to toggle source
# File lib/mournmail/summary.rb, line 232
def unset_flag(flag, update_server: true)
  if @flags.include?(flag)
    update_flag("-", flag, update_server: update_server)
  end
end

Private Instance Methods

decode_eword(s) click to toggle source
# File lib/mournmail/summary.rb, line 308
def decode_eword(s)
  Mournmail.decode_eword(s)
end
format_date(date) click to toggle source
# File lib/mournmail/summary.rb, line 290
def format_date(date)
  (Time.parse(date) rescue Time.at(0)).localtime.strftime("%m/%d %H:%M")
end
format_flags(flags) click to toggle source
# File lib/mournmail/summary.rb, line 276
def format_flags(flags)
  if !flags.include?(:Seen)
    "u"
  elsif flags.include?(:Deleted)
    "d"
  elsif flags.include?(:Flagged)
    "$"
  elsif flags.include?(:Answered)
    "a"
  else
    " "
  end
end
format_from(from) click to toggle source
# File lib/mournmail/summary.rb, line 294
def format_from(from)
  addr = from&.[](0)
  if addr.nil? || addr.mailbox.nil?
    return "Unknown sender"
  end
  mailbox = Mournmail.escape_binary(addr.mailbox)
  host = Mournmail.escape_binary(addr.host.to_s)
  if addr.name
    "#{decode_eword(addr.name)} <#{mailbox}@#{host}>"
  else
    "#{mailbox}@#{host}"
  end
end
format_line(limit = 78, from_limit = 16, level = 0) click to toggle source
# File lib/mournmail/summary.rb, line 249
def format_line(limit = 78, from_limit = 16, level = 0)
  space = "  " * (level < 8 ? level : 8)
  s = +""
  s << format("%6d %s%s %s[ %s ] ",
              @uid, format_flags(@flags), format_date(@date), space,
              ljust(format_from(@from), from_limit))
  s << ljust(decode_eword(@subject.to_s), limit - Buffer.display_width(s))
  s << "\n"
  s
end
ljust(s, n) click to toggle source
# File lib/mournmail/summary.rb, line 260
def ljust(s, n)
  width = 0
  str = +""
  s.each_char do |c|
    w = Buffer.display_width(c)
    width += w
    if width > n
      width -= w
      break
    end
    str.concat(c)
    break if width == n
  end
  str + " " * (n - width)
end
update_flag(sign, flag, update_server: true) click to toggle source
# File lib/mournmail/summary.rb, line 312
def update_flag(sign, flag, update_server: true)
  if update_server
    Mournmail.imap_connect do |imap|
      data = imap.uid_store(@uid, "#{sign}FLAGS", [flag])&.first
      if data
        @flags = data.attr["FLAGS"]
      else
        update_flag_local(sign, flag)
      end
    end
  else
    update_flag_local(sign, flag)
  end
  if @line
    s = format("%6d %s", @uid, format_flags(@flags))
    @line.sub!(/^ *\d+ ./, s)
  end
end
update_flag_local(sign, flag) click to toggle source
# File lib/mournmail/summary.rb, line 331
def update_flag_local(sign, flag)
  case sign
  when "+"
    @flags.push(flag)
  when "-"
    @flags.delete(flag)
  end
end