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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2009, John Schember <john@nachtimwald.com>'
  6. __docformat__ = 'restructuredtext en'
  7. import re
  8. import struct
  9. import zlib
  10.  
  11. try:
  12.     from PIL import Image
  13.     Image
  14. except ImportError:
  15.     import Image
  16.  
  17. import cStringIO
  18. from calibre.ebooks.pdb.formatwriter import FormatWriter
  19. from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES
  20. from calibre.ebooks.pdb.header import PdbHeaderBuilder
  21. from calibre.ebooks.pml.pmlml import PMLMLizer
  22. IDENTITY = 'PNRdPPrs'
  23. MAX_RECORD_SIZE = 8192
  24.  
  25. class Writer(FormatWriter):
  26.     
  27.     def __init__(self, opts, log):
  28.         self.opts = opts
  29.         self.log = log
  30.  
  31.     
  32.     def write_content(self, oeb_book, out_stream, metadata = None):
  33.         pmlmlizer = PMLMLizer(self.log)
  34.         pml = unicode(pmlmlizer.extract_content(oeb_book, self.opts)).encode('cp1252', 'replace')
  35.         (text, text_sizes) = self._text(pml)
  36.         chapter_index = self._index_item('(?s)\\\\C(?P<val>[0-4])="(?P<text>.+?)"', pml)
  37.         chapter_index += self._index_item('(?s)\\\\X(?P<val>[0-4])(?P<text>.+?)\\\\X[0-4]', pml)
  38.         chapter_index += self._index_item('(?s)\\\\x(?P<text>.+?)\\\\x', pml)
  39.         link_index = self._index_item('(?s)\\\\Q="(?P<text>.+?)"', pml)
  40.         images = self._images(oeb_book.manifest, pmlmlizer.image_hrefs)
  41.         metadata = [
  42.             self._metadata(metadata)]
  43.         hr = [
  44.             self._header_record(len(text), len(chapter_index), len(link_index), len(images))]
  45.         sections = hr + text + chapter_index + link_index + images + metadata + [
  46.             text_sizes] + [
  47.             'MeTaInFo\x00']
  48.         lengths = [ _[1] if i not in images else len(i[0]) + len(i[1]) for i in sections ]
  49.         pdbHeaderBuilder = PdbHeaderBuilder(IDENTITY, metadata[0].partition('\x00')[0])
  50.         pdbHeaderBuilder.build_header(lengths, out_stream)
  51.         for item in sections:
  52.             if item in images:
  53.                 out_stream.write(item[0])
  54.                 out_stream.write(item[1])
  55.                 continue
  56.             []
  57.             out_stream.write(item)
  58.         
  59.  
  60.     
  61.     def _text(self, pml):
  62.         pml_pages = []
  63.         text_sizes = ''
  64.         index = 0
  65.         while index < len(pml):
  66.             split = pml.rfind(' ', index, MAX_RECORD_SIZE)
  67.             if split == -1:
  68.                 len_end = len(pml[index:])
  69.                 if len_end > MAX_RECORD_SIZE:
  70.                     split = MAX_RECORD_SIZE
  71.                 else:
  72.                     split = len_end
  73.             
  74.             if split == 0:
  75.                 split = 1
  76.             
  77.             pml_pages.append(zlib.compress(pml[index:index + split]))
  78.             text_sizes += struct.pack('>H', split)
  79.             index += split
  80.         return (pml_pages, text_sizes)
  81.  
  82.     
  83.     def _index_item(self, regex, pml):
  84.         index = []
  85.         for mo in re.finditer(regex, pml):
  86.             item = ''
  87.             if 'text' in mo.groupdict().keys():
  88.                 item += struct.pack('>L', mo.start())
  89.                 text = mo.group('text')
  90.                 text = re.sub('\\\\U[0-9a-z]{4}', '', text)
  91.                 text = re.sub('\\\\a\\d{3}', '', text)
  92.                 text = re.sub('\\\\.', '', text)
  93.                 if 'val' in mo.groupdict().keys():
  94.                     text = '%s%s' % ('    ' * int(mo.group('val')), text)
  95.                 
  96.                 item += text
  97.                 item += '\x00'
  98.             
  99.             if item:
  100.                 index.append(item)
  101.                 continue
  102.         
  103.         return index
  104.  
  105.     
  106.     def _images(self, manifest, image_hrefs):
  107.         images = []
  108.         for item in manifest:
  109.             if item.media_type in OEB_RASTER_IMAGES and item.href in image_hrefs.keys():
  110.                 
  111.                 try:
  112.                     im = Image.open(cStringIO.StringIO(item.data)).convert('P')
  113.                     im.thumbnail((300, 300), Image.ANTIALIAS)
  114.                     data = cStringIO.StringIO()
  115.                     im.save(data, 'PNG')
  116.                     data = data.getvalue()
  117.                     header = 'PNG '
  118.                     header += image_hrefs[item.href].ljust(32, '\x00')[:32]
  119.                     header = header.ljust(58, '\x00')
  120.                     header += struct.pack('>HH', im.size[0], im.size[1])
  121.                     header = header.ljust(62, '\x00')
  122.                     if len(data) + len(header) < 65505:
  123.                         images.append((header, data))
  124.                 except Exception:
  125.                     e = None
  126.                     self.log.error('Error: Could not include file %s becuase %s.' % (item.href, e))
  127.                 except:
  128.                     None<EXCEPTION MATCH>Exception
  129.                 
  130.  
  131.             None<EXCEPTION MATCH>Exception
  132.         
  133.         return images
  134.  
  135.     
  136.     def _metadata(self, metadata):
  137.         title = _('Unknown')
  138.         author = _('Unknown')
  139.         copyright = ''
  140.         publisher = ''
  141.         isbn = ''
  142.         if metadata:
  143.             if len(metadata.title) >= 1:
  144.                 title = metadata.title[0].value
  145.             
  146.             if len(metadata.rights) >= 1:
  147.                 copyright = metadata.rights[0].value
  148.             
  149.             if len(metadata.publisher) >= 1:
  150.                 publisher = metadata.publisher[0].value
  151.             
  152.         
  153.         return '%s\x00%s\x00%s\x00%s\x00%s\x00' % (title, author, copyright, publisher, isbn)
  154.  
  155.     
  156.     def _header_record(self, text_count, chapter_count, link_count, image_count):
  157.         compression = 10
  158.         non_text_offset = text_count + 1
  159.         chapter_offset = non_text_offset
  160.         link_offset = chapter_offset + chapter_count
  161.         if image_count > 0:
  162.             image_data_offset = link_offset + link_count
  163.             meta_data_offset = image_data_offset + image_count
  164.             last_data_offset = meta_data_offset + 1
  165.         else:
  166.             meta_data_offset = link_offset + link_count
  167.             last_data_offset = meta_data_offset + 1
  168.             image_data_offset = last_data_offset
  169.         if chapter_count == 0:
  170.             chapter_offset = last_data_offset
  171.         
  172.         if link_count == 0:
  173.             link_offset = last_data_offset
  174.         
  175.         record = ''
  176.         record += struct.pack('>H', compression)
  177.         record += struct.pack('>H', 0)
  178.         record += struct.pack('>H', 0)
  179.         record += struct.pack('>H', 25152)
  180.         record += struct.pack('>H', 0)
  181.         record += struct.pack('>H', 0)
  182.         record += struct.pack('>H', non_text_offset)
  183.         record += struct.pack('>H', chapter_count)
  184.         record += struct.pack('>H', 0)
  185.         record += struct.pack('>H', 0)
  186.         record += struct.pack('>H', image_count)
  187.         record += struct.pack('>H', link_count)
  188.         record += struct.pack('>H', 1)
  189.         record += struct.pack('>H', 0)
  190.         record += struct.pack('>H', 0)
  191.         record += struct.pack('>H', 0)
  192.         record += struct.pack('>H', chapter_offset)
  193.         record += struct.pack('>H', 2560)
  194.         record += struct.pack('>H', last_data_offset)
  195.         record += struct.pack('>H', last_data_offset)
  196.         record += struct.pack('>H', image_data_offset)
  197.         record += struct.pack('>H', link_offset)
  198.         record += struct.pack('>H', meta_data_offset)
  199.         record += struct.pack('>H', 0)
  200.         record += struct.pack('>H', last_data_offset)
  201.         record += struct.pack('>H', last_data_offset)
  202.         record += struct.pack('>H', last_data_offset)
  203.         for i in range(54, 132, 2):
  204.             record += struct.pack('>H', 0)
  205.         
  206.         return record
  207.  
  208.  
  209.