import quopri
import base64
import operator

def decode(s):
  try:
    [x1,charset,encoding,encoded_text,x2]=s.split("?",4) 
	# "=?" charset "?" encoding "?" encoded-text "?="
  except:
    return s
  if x1 != "=" or x2 != "=":
    return s
  if encoding=="Q":
    return quopri.decodestring(encoded_text).decode(charset)
  if encoding=="B":
    return base64.decodestring(encoded_text).decode(charset)
  else:
    return s

def encode(s, unicode=True, enc=None):
  # if no non-ascii characters, leave as is
  if unicode:
    if not enc:
      enc="utf-8"
    s=s.encode(enc)
  nonasciicount=reduce(operator.add, map(lambda x: 1-int(32<=ord(x)<127), s))
  if nonasciicount==0:
    return s
  assert(enc) # characters >=127, must specify encoding
  # base64 newsize=oldsize*8/6
  # quoted-printable newsize=oldsize+nonasciicount*2
  print len(s)*1.33333, len(s)+nonasciicount*2
  if len(s)*1.33333 > len(s)+nonasciicount*2:
    # quoted-printable
    coding="Q"
    es=quopri.encodestring(s).strip()
  else:
    # base64
    coding="B"
    es=base64.encodestring(s).strip()

  assert( len(es)<=75 ) # limit by rfc2047, TODO splitting
  return "=?%s?%s?%s?="%(enc,coding,es)

#a=encode("fuierhfuipes fioeghfiouwefuiogh\x80\xFE", False, "cp866")
#print a
#print decode(a)

