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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL 3'
  5. __copyright__ = '2009, John Schember <john@nachtimwald.com>'
  6. __docformat__ = 'restructuredtext en'
  7. import re
  8.  
  9. def decompress(stream):
  10.     txt = []
  11.     stream.seek(0)
  12.     if stream.read(9) != '!!8-Bit!!':
  13.         raise ValueError('File %s contaions an invalid TCR header.' % stream.name)
  14.     stream.read(9) != '!!8-Bit!!'
  15.     entries = []
  16.     for i in xrange(256):
  17.         entry_len = ord(stream.read(1))
  18.         entries.append(stream.read(entry_len))
  19.     
  20.     entry_loc = stream.read(1)
  21.     while entry_loc != '':
  22.         txt.append(entries[ord(entry_loc)])
  23.         entry_loc = stream.read(1)
  24.     return ''.join(txt)
  25.  
  26.  
  27. def compress(txt, level = 5):
  28.     codes = list(set(re.findall('(?msu).', txt)))
  29.     for i in range(len(codes), 256):
  30.         codes.append('')
  31.     
  32.     if level <= 1:
  33.         new_length = 256
  34.     
  35.     if level >= 10:
  36.         new_length = 1
  37.     else:
  38.         new_length = int(256 * (10 - level) * 0.1)
  39.     new_length = None if new_length < 1 else new_length
  40.     coded_txt = ''
  41.     for c in txt:
  42.         coded_txt += chr(codes.index(c))
  43.     
  44.     txt = coded_txt
  45.     new = True
  46.     merged = True
  47.     while new or merged:
  48.         merge = []
  49.         merged = False
  50.         for i in xrange(256):
  51.             if codes[i] != '':
  52.                 fall = list(set(re.findall('(?msu)%s.' % re.escape(chr(i)), txt)))
  53.                 if len(fall) == 1:
  54.                     j = ord(fall[0][1:2])
  55.                     if len(codes[i]) + len(codes[j]) < 256:
  56.                         merge.append((i, j))
  57.                     
  58.                 
  59.             len(fall) == 1
  60.         
  61.         if merge:
  62.             merged = True
  63.             for i, j in merge:
  64.                 if i == j:
  65.                     codes[i] = codes[i] + codes[i]
  66.                 else:
  67.                     codes[i] = codes[i] + codes[j]
  68.                 txt = txt.replace(chr(i) + chr(j), chr(i))
  69.                 if chr(j) not in txt:
  70.                     codes[j] = ''
  71.                     continue
  72.             
  73.         
  74.         new = False
  75.         if '' in codes:
  76.             new_codes = []
  77.             for c in list(set(re.findall('(?msu)..', txt))):
  78.                 i = ord(c[0:1])
  79.                 j = ord(c[1:2])
  80.                 if codes[i] + codes[j] in codes:
  81.                     continue
  82.                 
  83.                 savings = txt.count(chr(i) + chr(j)) - len(codes[i]) - len(codes[j])
  84.                 if savings > 2 and len(codes[i]) + len(codes[j]) < 256:
  85.                     new_codes.append((savings, i, j, codes[i], codes[j]))
  86.                     continue
  87.             
  88.             if new_codes:
  89.                 new = True
  90.                 new_codes.sort((lambda x, y: if x[0] > y[0]:
  91. -1if x[0] < y[0]:
  92. 10))
  93.                 new_codes = new_codes[:new_length]
  94.                 for code in new_codes:
  95.                     if '' not in codes:
  96.                         break
  97.                     
  98.                     c = codes.index('')
  99.                     codes[c] = code[3] + code[4]
  100.                     txt = txt.replace(chr(code[1]) + chr(code[2]), chr(c))
  101.                 
  102.             
  103.         new_codes
  104.     header = []
  105.     for code in codes:
  106.         header.append(chr(len(code)) + code)
  107.     
  108.     for i in xrange(len(header), 256):
  109.         header.append(chr(0))
  110.     
  111.     return '!!8-Bit!!' + ''.join(header) + txt
  112.  
  113.