# File lib/mail/encodings.rb, line 115 def Encodings.value_decode(str) # Optimization: If there's no encoded-words in the string, just return it return str unless str.index("=?") str = str.gsub(/\?=(\s*)=\?/, '?==?') # Remove whitespaces between 'encoded-word's # Split on white-space boundaries with capture, so we capture the white-space as well str.split(/([ \t])/).map do |text| if text.index('=?') .nil? text else # Join QP encoded-words that are adjacent to avoid decoding partial chars text.gsub!(/\?\=\=\?.+?\?[Qq]\?/m, '') if text =~ /\?==\?/ # Separate encoded-words with a space, so we can treat them one by one text.gsub!(/\?\=\=\?/, '?= =?') text.split(/ /).map do |word| word.to_str. gsub(/=\?.+\?[Bb]\?.+\?=/m) {|substr| b_value_decode(substr)}. gsub(/=\?.+\?[Qq]\?.+\?=/m) {|substr| q_value_decode(substr)} end end end.join("") end