home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1022 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  6.1 KB  |  180 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 os
  8. import struct
  9. from calibre import CurrentDir
  10. from calibre.ebooks.metadata.opf2 import OPFCreator
  11. from calibre.ebooks.pdb.formatreader import FormatReader
  12. from calibre.ebooks.pdb.ereader import EreaderError
  13.  
  14. class HeaderRecord(object):
  15.     
  16.     def __init__(self, raw):
  17.         (self.version,) = struct.unpack('>H', raw[0:2])
  18.         (self.non_text_offset,) = struct.unpack('>H', raw[8:10])
  19.         self.num_text_pages = self.non_text_offset - 1
  20.  
  21.  
  22.  
  23. class Reader202(FormatReader):
  24.     
  25.     def __init__(self, header, stream, log, options):
  26.         self.log = log
  27.         self.encoding = options.input_encoding
  28.         self.log.debug('202 byte header version found.')
  29.         self.sections = []
  30.         for i in range(header.num_sections):
  31.             self.sections.append(header.section_data(i))
  32.         
  33.         self.header_record = HeaderRecord(self.section_data(0))
  34.         if self.header_record.version not in (2, 4):
  35.             raise EreaderError('Unknown book version %i.' % self.header_record.version)
  36.         self.header_record.version not in (2, 4)
  37.         get_metadata = get_metadata
  38.         import calibre.ebooks.metadata.pdb
  39.         self.mi = get_metadata(stream, False)
  40.  
  41.     
  42.     def section_data(self, number):
  43.         return self.sections[number]
  44.  
  45.     
  46.     def decompress_text(self, number):
  47.         decompress_doc = decompress_doc
  48.         import calibre.ebooks.compression.palmdoc
  49.         return ''.join([]([]([ chr(ord(x) ^ 165) for x in self.section_data(number) ])).decode if self.encoding is None else self.encoding, 'replace')
  50.  
  51.     
  52.     def get_image(self, number):
  53.         name = None
  54.         img = None
  55.         data = self.section_data(number)
  56.         if data.startswith('PNG'):
  57.             name = data[4:36].strip('\x00')
  58.             img = data[62:]
  59.         
  60.         return (name, img)
  61.  
  62.     
  63.     def get_text_page(self, number):
  64.         if number not in range(1, self.header_record.num_text_pages + 1):
  65.             return ''
  66.         return self.decompress_text(number)
  67.  
  68.     
  69.     def extract_content(self, output_dir):
  70.         pml_to_html = pml_to_html
  71.         import calibre.ebooks.pml.pmlconverter
  72.         output_dir = os.path.abspath(output_dir)
  73.         if not os.path.exists(output_dir):
  74.             os.makedirs(output_dir)
  75.         
  76.         pml = u''
  77.         for i in range(1, self.header_record.num_text_pages + 1):
  78.             self.log.debug('Extracting text page %i' % i)
  79.             pml += self.get_text_page(i)
  80.         
  81.         title = self.mi.title
  82.         if not isinstance(title, unicode):
  83.             title = title.decode('utf-8', 'replace')
  84.         
  85.         html = u'<html><head><title>%s</title></head><body>%s</body></html>' % (title, pml_to_html(pml))
  86.         CurrentDir(output_dir).__enter__()
  87.         
  88.         try:
  89.             
  90.             try:
  91.                 index = _[1]
  92.                 self.log.debug('Writing text to index.html')
  93.                 index.write(html.encode('utf-8'))
  94.             finally:
  95.                 pass
  96.  
  97.         finally:
  98.             pass
  99.  
  100.         images = []
  101.         CurrentDir(os.path.join(output_dir, 'images/')).__enter__()
  102.         
  103.         try:
  104.             for i in range(self.header_record.non_text_offset, len(self.sections)):
  105.                 (name, img) = self.get_image(i)
  106.                 if name:
  107.                     images.append(name)
  108.                     
  109.                     try:
  110.                         imgf = _[2]
  111.                         self.log.debug('Writing image %s to images/' % name)
  112.                         imgf.write(img)
  113.                     finally:
  114.                         pass
  115.  
  116.                     continue
  117.                 open(name, 'wb').__exit__
  118.         finally:
  119.             pass
  120.  
  121.         opf_path = self.create_opf(output_dir, images)
  122.         return opf_path
  123.  
  124.     
  125.     def create_opf(self, output_dir, images):
  126.         CurrentDir(output_dir).__enter__()
  127.         
  128.         try:
  129.             opf = OPFCreator(output_dir, self.mi)
  130.             manifest = [
  131.                 ('index.html', None)]
  132.             for i in images:
  133.                 manifest.append((os.path.join('images/', i), None))
  134.             
  135.             opf.create_manifest(manifest)
  136.             opf.create_spine([
  137.                 'index.html'])
  138.             
  139.             try:
  140.                 opffile = _[1]
  141.                 opf.render(opffile)
  142.             finally:
  143.                 pass
  144.  
  145.         finally:
  146.             pass
  147.  
  148.         return os.path.join(output_dir, 'metadata.opf')
  149.  
  150.     
  151.     def dump_pml(self):
  152.         pml = ''
  153.         for i in range(1, self.header_record.num_text_pages + 1):
  154.             pml += self.get_text_page(i)
  155.         
  156.         return pml
  157.  
  158.     
  159.     def dump_images(self, output_dir):
  160.         if not os.path.exists(output_dir):
  161.             os.makedirs(output_dir)
  162.         
  163.         CurrentDir(output_dir).__enter__()
  164.         
  165.         try:
  166.             for i in range(0, self.header_record.num_image_pages):
  167.                 (name, img) = self.get_image(self.header_record.image_data_offset + i)
  168.                 
  169.                 try:
  170.                     imgf = _[1]
  171.                     imgf.write(img)
  172.                 finally:
  173.                     pass
  174.  
  175.         finally:
  176.             pass
  177.  
  178.  
  179.  
  180.