home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1073 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  5.5 KB  |  162 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 os
  8. import struct
  9. import zlib
  10. from urllib import unquote as urlunquote
  11. from calibre import CurrentDir
  12. from calibre.ebooks.rb import HEADER
  13. from calibre.ebooks.rb import RocketBookError
  14. from calibre.ebooks.metadata.rb import get_metadata
  15. from calibre.ebooks.metadata.opf2 import OPFCreator
  16.  
  17. class RBToc(list):
  18.     
  19.     class Item(object):
  20.         
  21.         def __init__(self, name = '', size = 0, offset = 0, flags = 0):
  22.             self.name = name
  23.             self.size = size
  24.             self.offset = offset
  25.             self.flags = flags
  26.  
  27.  
  28.  
  29.  
  30. class Reader(object):
  31.     
  32.     def __init__(self, stream, log, encoding = None):
  33.         self.stream = stream
  34.         self.log = log
  35.         self.encoding = encoding
  36.         self.verify_file()
  37.         self.mi = get_metadata(self.stream)
  38.         self.toc = self.get_toc()
  39.  
  40.     
  41.     def read_i32(self):
  42.         return struct.unpack('<I', self.stream.read(4))[0]
  43.  
  44.     
  45.     def verify_file(self):
  46.         self.stream.seek(0)
  47.         if self.stream.read(14) != HEADER:
  48.             raise RocketBookError('Could not read file: %s. Does not contain a valid RocketBook Header.' % self.stream.name)
  49.         self.stream.read(14) != HEADER
  50.         self.stream.seek(28)
  51.         size = self.read_i32()
  52.         self.stream.seek(0, os.SEEK_END)
  53.         real_size = self.stream.tell()
  54.         if size != real_size:
  55.             raise RocketBookError('File is corrupt. The file size recorded in the header does not match the actual file size.')
  56.         size != real_size
  57.  
  58.     
  59.     def get_toc(self):
  60.         self.stream.seek(24)
  61.         toc_offset = self.read_i32()
  62.         self.stream.seek(toc_offset)
  63.         pages = self.read_i32()
  64.         toc = RBToc()
  65.         for i in range(pages):
  66.             name = urlunquote(self.stream.read(32).strip('\x00'))
  67.             size = self.read_i32()
  68.             offset = self.read_i32()
  69.             flags = self.read_i32()
  70.             toc.append(RBToc.Item(name = name, size = size, offset = offset, flags = flags))
  71.         
  72.         return toc
  73.  
  74.     
  75.     def get_text(self, toc_item, output_dir):
  76.         if toc_item.flags in (1, 2):
  77.             return None
  78.         output = u''
  79.         self.stream.seek(toc_item.offset)
  80.         if toc_item.flags == 8:
  81.             count = self.read_i32()
  82.             self.read_i32()
  83.             chunck_sizes = []
  84.             for i in range(count):
  85.                 chunck_sizes.append(self.read_i32())
  86.             
  87.             for size in chunck_sizes:
  88.                 cm_chunck = self.stream.read(size)
  89.                 (toc_item.flags in (1, 2)) += output(zlib.decompress(cm_chunck).decode if self.encoding is None else self.encoding, 'replace')
  90.             
  91.         elif self.encoding is None:
  92.             pass
  93.         
  94.         output += self.stream.read(toc_item.size).decode(self.encoding, 'replace')
  95.         
  96.         try:
  97.             html = _[1]
  98.             html.write(output.encode('utf-8'))
  99.         finally:
  100.             pass
  101.  
  102.  
  103.     
  104.     def get_image(self, toc_item, output_dir):
  105.         if toc_item.flags != 0:
  106.             return None
  107.         self.stream.seek(toc_item.offset)
  108.         data = self.stream.read(toc_item.size)
  109.         
  110.         try:
  111.             img = _[1]
  112.             img.write(data)
  113.         finally:
  114.             pass
  115.  
  116.  
  117.     
  118.     def extract_content(self, output_dir):
  119.         self.log.debug('Extracting content from file...')
  120.         html = []
  121.         images = []
  122.         for item in self.toc:
  123.             if item.name.lower().endswith('html'):
  124.                 self.log.debug('HTML item %s found...' % item.name)
  125.                 html.append(item.name)
  126.                 self.get_text(item, output_dir)
  127.             
  128.             if item.name.lower().endswith('png'):
  129.                 self.log.debug('PNG item %s found...' % item.name)
  130.                 images.append(item.name)
  131.                 self.get_image(item, output_dir)
  132.                 continue
  133.         
  134.         opf_path = self.create_opf(output_dir, html, images)
  135.         return opf_path
  136.  
  137.     
  138.     def create_opf(self, output_dir, pages, images):
  139.         CurrentDir(output_dir).__enter__()
  140.         
  141.         try:
  142.             opf = OPFCreator(output_dir, self.mi)
  143.             manifest = []
  144.             for page in pages + images:
  145.                 manifest.append((page, None))
  146.             
  147.             opf.create_manifest(manifest)
  148.             opf.create_spine(pages)
  149.             
  150.             try:
  151.                 opffile = _[1]
  152.                 opf.render(opffile)
  153.             finally:
  154.                 pass
  155.  
  156.         finally:
  157.             pass
  158.  
  159.         return os.path.join(output_dir, 'metadata.opf')
  160.  
  161.  
  162.