home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1074 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.3 KB  |  165 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 struct
  8. import zlib
  9.  
  10. try:
  11.     from PIL import Image
  12.     Image
  13. except ImportError:
  14.     import Image
  15.  
  16. import cStringIO
  17. from calibre.ebooks.rb.rbml import RBMLizer
  18. from calibre.ebooks.rb import HEADER
  19. from calibre.ebooks.rb import unique_name
  20. from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES
  21. from calibre.constants import __appname__, __version__
  22. TEXT_RECORD_SIZE = 4096
  23.  
  24. class TocItem(object):
  25.     
  26.     def __init__(self, name, size, flags):
  27.         self.name = name
  28.         self.size = size
  29.         self.flags = flags
  30.  
  31.  
  32.  
  33. class RBWriter(object):
  34.     
  35.     def __init__(self, opts, log):
  36.         self.opts = opts
  37.         self.log = log
  38.         self.name_map = { }
  39.  
  40.     
  41.     def write_content(self, oeb_book, out_stream, metadata = None):
  42.         info = [
  43.             ('info.info', self._info_section(metadata))]
  44.         images = self._images(oeb_book.manifest)
  45.         (text_size, chuncks) = self._text(oeb_book)
  46.         chunck_sizes = [ len(x) for x in chuncks ]
  47.         text = [
  48.             ('index.html', chuncks)]
  49.         hidx = [
  50.             ('index.hidx', ' ')]
  51.         toc_items = []
  52.         page_count = 0
  53.         for name, data in info + text + hidx + images:
  54.             page_count += 1
  55.             size = len(data)
  56.             if (name, data) in text:
  57.                 flags = 8
  58.                 size = 0
  59.                 for c in chunck_sizes:
  60.                     size += c
  61.                 
  62.                 size += 8 + len(chunck_sizes) * 4
  63.             elif (name, data) in info:
  64.                 flags = 2
  65.             else:
  66.                 flags = 0
  67.             toc_items.append(TocItem(name.ljust(32, '\x00')[:32], size, flags))
  68.         
  69.         self.log.debug('Writing file header...')
  70.         out_stream.write(HEADER)
  71.         out_stream.write(struct.pack('<I', 0))
  72.         out_stream.write(struct.pack('<IH', 0, 0))
  73.         out_stream.write(struct.pack('<I', 296))
  74.         out_stream.write(struct.pack('<I', 0))
  75.         for i in range(32, 296, 4):
  76.             out_stream.write(struct.pack('<I', 0))
  77.         
  78.         out_stream.write(struct.pack('<I', page_count))
  79.         offset = out_stream.tell() + len(toc_items) * 44
  80.         for item in toc_items:
  81.             out_stream.write(item.name)
  82.             out_stream.write(struct.pack('<I', item.size))
  83.             out_stream.write(struct.pack('<I', offset))
  84.             out_stream.write(struct.pack('<I', item.flags))
  85.             offset += item.size
  86.         
  87.         out_stream.write(info[0][1])
  88.         self.log.debug('Writing compressed RB HTHML...')
  89.         out_stream.write(struct.pack('<I', len(text[0][1])))
  90.         out_stream.write(struct.pack('<I', text_size))
  91.         for size in chunck_sizes:
  92.             out_stream.write(struct.pack('<I', size))
  93.         
  94.         for chunck in text[0][1]:
  95.             out_stream.write(chunck)
  96.         
  97.         self.log.debug('Writing images...')
  98.         for item in hidx + images:
  99.             out_stream.write(item[1])
  100.         
  101.         total_size = out_stream.tell()
  102.         out_stream.seek(28)
  103.         out_stream.write(struct.pack('<I', total_size))
  104.  
  105.     
  106.     def _text(self, oeb_book):
  107.         rbmlizer = RBMLizer(self.log, name_map = self.name_map)
  108.         text = rbmlizer.extract_content(oeb_book, self.opts).encode('cp1252', 'xmlcharrefreplace')
  109.         size = len(text)
  110.         pages = []
  111.         for i in range(0, len(text) / TEXT_RECORD_SIZE + 1):
  112.             pages.append(zlib.compress(text[i * TEXT_RECORD_SIZE:i * TEXT_RECORD_SIZE + TEXT_RECORD_SIZE], 9))
  113.         
  114.         return (size, pages)
  115.  
  116.     
  117.     def _images(self, manifest):
  118.         images = []
  119.         used_names = []
  120.         for item in manifest:
  121.             if item.media_type in OEB_RASTER_IMAGES:
  122.                 
  123.                 try:
  124.                     data = ''
  125.                     im = Image.open(cStringIO.StringIO(item.data)).convert('L')
  126.                     data = cStringIO.StringIO()
  127.                     im.save(data, 'PNG')
  128.                     data = data.getvalue()
  129.                     name = '%s.png' % len(used_names)
  130.                     name = unique_name(name, used_names)
  131.                     used_names.append(name)
  132.                     self.name_map[item.href] = name
  133.                     images.append((name, data))
  134.                 except Exception:
  135.                     e = None
  136.                     self.log.error('Error: Could not include file %s becuase %s.' % (item.href, e))
  137.                 except:
  138.                     None<EXCEPTION MATCH>Exception
  139.                 
  140.  
  141.             None<EXCEPTION MATCH>Exception
  142.         
  143.         return images
  144.  
  145.     
  146.     def _info_section(self, metadata):
  147.         text = 'TYPE=2\n'
  148.         if metadata:
  149.             if len(metadata.title) >= 1:
  150.                 text += 'TITLE=%s\n' % metadata.title[0].value
  151.             
  152.             if len(metadata.creator) >= 1:
  153.                 authors_to_string = authors_to_string
  154.                 import calibre.ebooks.metadata
  155.                 authors_to_string += [] % []([ x.value for x in metadata.creator ])
  156.             
  157.         
  158.         text += 'GENERATOR=%s - %s\n' % (__appname__, __version__)
  159.         text += 'PARSE=1\n'
  160.         text += 'OUTPUT=1\n'
  161.         text += 'BODY=index.html\n'
  162.         return text
  163.  
  164.  
  165.