home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_629 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  10.3 KB  |  481 lines

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