module MailParser::RFC2047

Public Instance Methods

b_decode(str) click to toggle source
# File lib/mailparser/rfc2047.rb, line 54
def b_decode(str)
  return str.gsub(/[^A-Z0-9\+\/=]/i,"").unpack("m")[0]
end
decode(str, opt=nil) click to toggle source
# File lib/mailparser/rfc2047.rb, line 15
def decode(str, opt=nil)
  if opt.is_a? Hash
    charset = opt[:output_charset]
    charset_converter = opt[:charset_converter]
  else
    charset = opt
  end
  charset_converter ||= MailParser::ConvCharset.method(:conv_charset)
  words = []
  ss = StringScanner.new(str.gsub(/\r?\n/, ''))
  until ss.eos?
    if s = ss.scan(/\=\?[^\(\)\<\>\@\,\;\:\"\/\[\]\?\.\=]+\?[QB]\?[^\? ]+\?\=/i)
      begin
        s = Encoded.new s, charset, charset_converter
        words.pop if words.length >= 2 and words[-1].is_a? Space and words[-2].is_a? Encoded
      rescue
        # ignore
      end
      words.push s
    elsif s = ss.scan(/\s+/)
      words.push Space.new(s)
    elsif s = ss.scan(/[^\s=]+/)
      words.push s
    else
      words.push ss.scan(/./)
    end
  end
  begin
    ret = words.join
  rescue
    ret = words.map{|w| w.to_s.force_encoding('binary')}.join
  end
  charset ? charset_converter.call(charset, charset, ret) : ret
end
q_decode(str) click to toggle source
# File lib/mailparser/rfc2047.rb, line 50
def q_decode(str)
  return str.gsub(/_/," ").gsub(/=\s*?$/,"=").unpack("M")[0]
end