home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_262 / mimify.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-09-09  |  10.1 KB  |  434 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.7)
  3.  
  4. MAXLEN = 200
  5. CHARSET = 'ISO-8859-1'
  6. QUOTE = '> '
  7. import re
  8. import warnings
  9. warnings.warn('the mimify module is deprecated; use the email package instead', DeprecationWarning, 2)
  10. __all__ = [
  11.     'mimify',
  12.     'unmimify',
  13.     'mime_encode_header',
  14.     'mime_decode_header']
  15. qp = re.compile('^content-transfer-encoding:\\s*quoted-printable', re.I)
  16. base64_re = re.compile('^content-transfer-encoding:\\s*base64', re.I)
  17. mp = re.compile('^content-type:.*multipart/.*boundary="?([^;"\n]*)', re.I | re.S)
  18. chrset = re.compile('^(content-type:.*charset=")(us-ascii|iso-8859-[0-9]+)(".*)', re.I | re.S)
  19. he = re.compile('^-*\n')
  20. mime_code = re.compile('=([0-9a-f][0-9a-f])', re.I)
  21. mime_head = re.compile('=\\?iso-8859-1\\?q\\?([^? \t\n]+)\\?=', re.I)
  22. repl = re.compile('^subject:\\s+re: ', re.I)
  23.  
  24. class File:
  25.     
  26.     def __init__(self, file, boundary):
  27.         self.file = file
  28.         self.boundary = boundary
  29.         self.peek = None
  30.  
  31.     
  32.     def readline(self):
  33.         if self.peek is not None:
  34.             return ''
  35.         line = None.file.readline()
  36.         if not line:
  37.             return line
  38.         if None.boundary:
  39.             if line == self.boundary + '\n':
  40.                 self.peek = line
  41.                 return ''
  42.             if None == self.boundary + '--\n':
  43.                 self.peek = line
  44.                 return ''
  45.         return line
  46.  
  47.  
  48.  
  49. class HeaderFile:
  50.     
  51.     def __init__(self, file):
  52.         self.file = file
  53.         self.peek = None
  54.  
  55.     
  56.     def readline(self):
  57.         if self.peek is not None:
  58.             line = self.peek
  59.             self.peek = None
  60.         else:
  61.             line = self.file.readline()
  62.         if not line:
  63.             return line
  64.         if None.match(line):
  65.             return line
  66.         self.peek = self.file.readline()
  67.         if (len(self.peek) == 0 or self.peek[0] != ' ') and self.peek[0] != '\t':
  68.             return line
  69.         line = None + self.peek
  70.         self.peek = None
  71.         continue
  72.  
  73.  
  74.  
  75. def mime_decode(line):
  76.     newline = ''
  77.     pos = 0
  78.     while None:
  79.         res = mime_code.search(line, pos)
  80.         if res is None:
  81.             break
  82.         newline = newline + line[pos:res.start(0)] + chr(int(res.group(1), 16))
  83.         pos = res.end(0)
  84.         continue
  85.         return newline + line[pos:]
  86.  
  87.  
  88. def mime_decode_header(line):
  89.     newline = ''
  90.     pos = 0
  91.     while None:
  92.         res = mime_head.search(line, pos)
  93.         if res is None:
  94.             break
  95.         match = res.group(1)
  96.         match = ' '.join(match.split('_'))
  97.         newline = newline + line[pos:res.start(0)] + mime_decode(match)
  98.         pos = res.end(0)
  99.         continue
  100.         return newline + line[pos:]
  101.  
  102.  
  103. def unmimify_part(ifile, ofile, decode_base64 = 0):
  104.     multipart = None
  105.     quoted_printable = 0
  106.     is_base64 = 0
  107.     is_repl = 0
  108.     if ifile.boundary and ifile.boundary[:2] == QUOTE:
  109.         prefix = QUOTE
  110.     else:
  111.         prefix = ''
  112.     hfile = HeaderFile(ifile)
  113.     while None:
  114.         line = hfile.readline()
  115.         if not line:
  116.             return None
  117.         if None and line[:len(prefix)] == prefix:
  118.             line = line[len(prefix):]
  119.             pref = prefix
  120.         else:
  121.             pref = ''
  122.         line = mime_decode_header(line)
  123.         if qp.match(line):
  124.             quoted_printable = 1
  125.             continue
  126.         if decode_base64 and base64_re.match(line):
  127.             is_base64 = 1
  128.             continue
  129.         if not prefix and repl.match(line):
  130.             is_repl = 1
  131.         mp_res = mp.match(line)
  132.         if mp_res:
  133.             multipart = '--' + mp_res.group(1)
  134.         if he.match(line):
  135.             break
  136.             continue
  137.             continue
  138.             if is_repl:
  139.                 if quoted_printable or multipart:
  140.                     is_repl = 0
  141.     while None:
  142.         line = ifile.readline()
  143.         if not line:
  144.             return None
  145.         line = None.sub(mime_head, '\\1', line)
  146.         if prefix and line[:len(prefix)] == prefix:
  147.             line = line[len(prefix):]
  148.             pref = prefix
  149.         else:
  150.             pref = ''
  151.         while multipart:
  152.             if line == multipart + '--\n':
  153.                 ofile.write(pref + line)
  154.                 multipart = None
  155.                 line = None
  156.                 break
  157.             if line == multipart + '\n':
  158.                 ofile.write(pref + line)
  159.                 nifile = File(ifile, multipart)
  160.                 unmimify_part(nifile, ofile, decode_base64)
  161.                 line = nifile.peek
  162.                 if not line:
  163.                     break
  164.                     continue
  165.                     continue
  166.             break
  167.         if line and quoted_printable:
  168.             while line[-2:] == '=\n':
  169.                 line = line[:-2]
  170.                 newline = ifile.readline()
  171.                 if newline[:len(QUOTE)] == QUOTE:
  172.                     newline = newline[len(QUOTE):]
  173.                 line = line + newline
  174.             line = mime_decode(line)
  175.         if line and is_base64 and not pref:
  176.             import base64
  177.             line = base64.decodestring(line)
  178.         if line:
  179.             ofile.write(pref + line)
  180.             continue
  181.             continue
  182.             return None
  183.  
  184.  
  185. def unmimify(infile, outfile, decode_base64 = 0):
  186.     if type(infile) == type(''):
  187.         ifile = open(infile)
  188.         if type(outfile) == type('') and infile == outfile:
  189.             import os
  190.             (d, f) = os.path.split(infile)
  191.             os.rename(infile, os.path.join(d, ',' + f))
  192.         
  193.     else:
  194.         ifile = infile
  195.     if type(outfile) == type(''):
  196.         ofile = open(outfile, 'w')
  197.     else:
  198.         ofile = outfile
  199.     nifile = File(ifile, None)
  200.     unmimify_part(nifile, ofile, decode_base64)
  201.     ofile.flush()
  202.  
  203. mime_char = re.compile('[=\x7f-\xff]')
  204. mime_header_char = re.compile('[=?\x7f-\xff]')
  205.  
  206. def mime_encode(line, header):
  207.     if header:
  208.         reg = mime_header_char
  209.     else:
  210.         reg = mime_char
  211.     newline = ''
  212.     pos = 0
  213.     if len(line) >= 5 and line[:5] == 'From ':
  214.         newline = ('=%02x' % ord('F')).upper()
  215.         pos = 1
  216.     while None:
  217.         res = reg.search(line, pos)
  218.         if res is None:
  219.             break
  220.         newline = newline + line[pos:res.start(0)] + ('=%02x' % ord(res.group(0))).upper()
  221.         pos = res.end(0)
  222.         continue
  223.         line = newline + line[pos:]
  224.         newline = ''
  225.         while len(line) >= 75:
  226.             i = 73
  227.             while line[i] == '=' or line[i - 1] == '=':
  228.                 i = i - 1
  229.             i = i + 1
  230.             newline = newline + line[:i] + '=\n'
  231.             line = line[i:]
  232.         return newline + line
  233.  
  234. mime_header = re.compile('([ \t(]|^)([-a-zA-Z0-9_+]*[\x7f-\xff][-a-zA-Z0-9_+\x7f-\xff]*)(?=[ \t)]|\n)')
  235.  
  236. def mime_encode_header(line):
  237.     newline = ''
  238.     pos = 0
  239.     while None:
  240.         res = mime_header.search(line, pos)
  241.         if res is None:
  242.             break
  243.         newline = '%s%s%s=?%s?Q?%s?=' % (newline, line[pos:res.start(0)], res.group(1), CHARSET, mime_encode(res.group(2), 1))
  244.         pos = res.end(0)
  245.         continue
  246.         return newline + line[pos:]
  247.  
  248. mv = re.compile('^mime-version:', re.I)
  249. cte = re.compile('^content-transfer-encoding:', re.I)
  250. iso_char = re.compile('[\x7f-\xff]')
  251.  
  252. def mimify_part(ifile, ofile, is_mime):
  253.     has_cte = is_qp = is_base64 = 0
  254.     multipart = None
  255.     must_quote_body = must_quote_header = has_iso_chars = 0
  256.     header = []
  257.     header_end = ''
  258.     message = []
  259.     message_end = ''
  260.     hfile = HeaderFile(ifile)
  261.     while None:
  262.         line = hfile.readline()
  263.         if not line:
  264.             break
  265.         if not must_quote_header and iso_char.search(line):
  266.             must_quote_header = 1
  267.         if mv.match(line):
  268.             is_mime = 1
  269.         if cte.match(line):
  270.             has_cte = 1
  271.             if qp.match(line):
  272.                 is_qp = 1
  273.             elif base64_re.match(line):
  274.                 is_base64 = 1
  275.             
  276.         mp_res = mp.match(line)
  277.         if mp_res:
  278.             multipart = '--' + mp_res.group(1)
  279.         if he.match(line):
  280.             header_end = line
  281.             break
  282.         continue
  283.         while None:
  284.             line = ifile.readline()
  285.             if not line:
  286.                 break
  287.             if multipart:
  288.                 if line == multipart + '--\n':
  289.                     message_end = line
  290.                     break
  291.                 if line == multipart + '\n':
  292.                     message_end = line
  293.                     break
  294.                 
  295.             if is_base64:
  296.                 message.append(line)
  297.                 continue
  298.             if is_qp:
  299.                 while line[-2:] == '=\n':
  300.                     line = line[:-2]
  301.                     newline = ifile.readline()
  302.                     if newline[:len(QUOTE)] == QUOTE:
  303.                         newline = newline[len(QUOTE):]
  304.                     line = line + newline
  305.                 line = mime_decode(line)
  306.             if has_iso_chars and iso_char.search(line):
  307.                 has_iso_chars = must_quote_body = 1
  308.             
  309.         if must_quote_body or len(line) > MAXLEN:
  310.             must_quote_body = 1
  311.         
  312.         continue
  313.         for line in header:
  314.             if must_quote_header:
  315.                 line = mime_encode_header(line)
  316.             chrset_res = chrset.match(line)
  317.             if chrset_res:
  318.                 if has_iso_chars or chrset_res.group(2).lower() == 'us-ascii':
  319.                     line = '%s%s%s' % (chrset_res.group(1), CHARSET, chrset_res.group(3))
  320.                 
  321.             else:
  322.                 line = '%sus-ascii%s' % chrset_res.group(1, 3)
  323.         if has_cte and cte.match(line):
  324.             line = 'Content-Transfer-Encoding: '
  325.             if is_base64:
  326.                 line = line + 'base64\n'
  327.             elif must_quote_body:
  328.                 line = line + 'quoted-printable\n'
  329.             else:
  330.                 line = line + '7bit\n'
  331.         ofile.write(line)
  332.     if (must_quote_header or must_quote_body) and not is_mime:
  333.         ofile.write('Mime-Version: 1.0\n')
  334.         ofile.write('Content-Type: text/plain; ')
  335.         if has_iso_chars:
  336.             ofile.write('charset="%s"\n' % CHARSET)
  337.         else:
  338.             ofile.write('charset="us-ascii"\n')
  339.     if must_quote_body and not has_cte:
  340.         ofile.write('Content-Transfer-Encoding: quoted-printable\n')
  341.     ofile.write(header_end)
  342.     for line in message:
  343.         if must_quote_body:
  344.             line = mime_encode(line, 0)
  345.         ofile.write(line)
  346.     
  347.     ofile.write(message_end)
  348.     line = message_end
  349.     while multipart:
  350.         if line == multipart + '--\n':
  351.             while None:
  352.                 line = ifile.readline()
  353.                 if not line:
  354.                     return None
  355.                 if None:
  356.                     line = mime_encode(line, 0)
  357.                 continue
  358.         if line == multipart + '\n':
  359.             nifile = File(ifile, multipart)
  360.             mimify_part(nifile, ofile, 1)
  361.             line = nifile.peek
  362.             if not line:
  363.                 break
  364.             ofile.write(line)
  365.             continue
  366.         while None:
  367.             line = ifile.readline()
  368.             if not line:
  369.                 return None
  370.             if None:
  371.                 line = mime_encode(line, 0)
  372.             continue
  373.         return None
  374.  
  375.  
  376. def mimify(infile, outfile):
  377.     if type(infile) == type(''):
  378.         ifile = open(infile)
  379.         if type(outfile) == type('') and infile == outfile:
  380.             import os
  381.             (d, f) = os.path.split(infile)
  382.             os.rename(infile, os.path.join(d, ',' + f))
  383.         
  384.     else:
  385.         ifile = infile
  386.     if type(outfile) == type(''):
  387.         ofile = open(outfile, 'w')
  388.     else:
  389.         ofile = outfile
  390.     nifile = File(ifile, None)
  391.     mimify_part(nifile, ofile, 0)
  392.     ofile.flush()
  393.  
  394. import sys
  395. if (__name__ == '__main__' or len(sys.argv) > 0) and sys.argv[0] == 'mimify':
  396.     import getopt
  397.     usage = 'Usage: mimify [-l len] -[ed] [infile [outfile]]'
  398.     decode_base64 = 0
  399.     (opts, args) = getopt.getopt(sys.argv[1:], 'l:edb')
  400.     if len(args) not in (0, 1, 2):
  401.         print usage
  402.         sys.exit(1)
  403.     if ((('-e', '') in opts) == (('-d', '') in opts) or ('-b', '') in opts) and ('-d', '') not in opts:
  404.         print usage
  405.         sys.exit(1)
  406.     for o, a in opts:
  407.         if o == '-e':
  408.             encode = mimify
  409.             continue
  410.         if o == '-d':
  411.             encode = unmimify
  412.             continue
  413.         if o == '-l':
  414.             
  415.             try:
  416.                 MAXLEN = int(a)
  417.             except (ValueError, OverflowError):
  418.                 print usage
  419.                 sys.exit(1)
  420.             
  421.  
  422.         if o == '-b':
  423.             decode_base64 = 1
  424.             continue
  425.     if len(args) == 0:
  426.         encode_args = (sys.stdin, sys.stdout)
  427.     elif len(args) == 1:
  428.         encode_args = (args[0], sys.stdout)
  429.     else:
  430.         encode_args = (args[0], args[1])
  431.     if decode_base64:
  432.         encode_args = encode_args + (decode_base64,)
  433.     encode(*encode_args)
  434.