home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1021 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  8.3 KB  |  230 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 re
  9. import struct
  10. import zlib
  11. from calibre import CurrentDir
  12. from calibre.ebooks import DRMError
  13. from calibre.ebooks.metadata.opf2 import OPFCreator
  14. from calibre.ebooks.pdb.ereader import EreaderError
  15. from calibre.ebooks.pdb.formatreader import FormatReader
  16.  
  17. class HeaderRecord(object):
  18.     
  19.     def __init__(self, raw):
  20.         (self.compression,) = struct.unpack('>H', raw[0:2])
  21.         (self.non_text_offset,) = struct.unpack('>H', raw[12:14])
  22.         (self.chapter_count,) = struct.unpack('>H', raw[14:16])
  23.         (self.image_count,) = struct.unpack('>H', raw[20:22])
  24.         (self.link_count,) = struct.unpack('>H', raw[22:24])
  25.         (self.has_metadata,) = struct.unpack('>H', raw[24:26])
  26.         (self.footnote_count,) = struct.unpack('>H', raw[28:30])
  27.         (self.sidebar_count,) = struct.unpack('>H', raw[30:32])
  28.         (self.chapter_offset,) = struct.unpack('>H', raw[32:34])
  29.         (self.small_font_page_offset,) = struct.unpack('>H', raw[36:38])
  30.         (self.large_font_page_offset,) = struct.unpack('>H', raw[38:40])
  31.         (self.image_data_offset,) = struct.unpack('>H', raw[40:42])
  32.         (self.link_offset,) = struct.unpack('>H', raw[42:44])
  33.         (self.metadata_offset,) = struct.unpack('>H', raw[44:46])
  34.         (self.footnote_offset,) = struct.unpack('>H', raw[48:50])
  35.         (self.sidebar_offset,) = struct.unpack('>H', raw[50:52])
  36.         (self.last_data_offset,) = struct.unpack('>H', raw[52:54])
  37.         self.num_text_pages = self.non_text_offset - 1
  38.         self.num_image_pages = self.metadata_offset - self.image_data_offset
  39.  
  40.  
  41.  
  42. class Reader132(FormatReader):
  43.     
  44.     def __init__(self, header, stream, log, options):
  45.         self.log = log
  46.         self.encoding = options.input_encoding
  47.         self.log.debug('132 byte header version found.')
  48.         self.sections = []
  49.         for i in range(header.num_sections):
  50.             self.sections.append(header.section_data(i))
  51.         
  52.         self.header_record = HeaderRecord(self.section_data(0))
  53.         if self.header_record.compression not in (2, 10):
  54.             if self.header_record.compression in (260, 272):
  55.                 raise DRMError('eReader DRM is not supported.')
  56.             self.header_record.compression in (260, 272)
  57.             raise EreaderError('Unknown book compression %i.' % self.header_record.compression)
  58.         self.header_record.compression not in (2, 10)
  59.         get_metadata = get_metadata
  60.         import calibre.ebooks.metadata.pdb
  61.         self.mi = get_metadata(stream, False)
  62.  
  63.     
  64.     def section_data(self, number):
  65.         return self.sections[number]
  66.  
  67.     
  68.     def decompress_text(self, number):
  69.         if self.header_record.compression == 2:
  70.             decompress_doc = decompress_doc
  71.             import calibre.ebooks.compression.palmdoc
  72.             return None(decompress_doc(self.section_data(number)).decode if self.encoding is None else self.encoding, 'replace')
  73.         if self.header_record.compression == 10:
  74.             return self.header_record.compression == 2(zlib.decompress(self.section_data(number)).decode if self.encoding is None else self.encoding, 'replace')
  75.  
  76.     
  77.     def get_image(self, number):
  78.         if number < self.header_record.image_data_offset or number > self.header_record.image_data_offset + self.header_record.num_image_pages - 1:
  79.             return ('empty', '')
  80.         data = self.section_data(number)
  81.         name = data[4:36].strip('\x00')
  82.         img = data[62:]
  83.         return (name, img)
  84.  
  85.     
  86.     def get_text_page(self, number):
  87.         if number not in range(1, self.header_record.num_text_pages + 1):
  88.             return ''
  89.         return self.decompress_text(number)
  90.  
  91.     
  92.     def extract_content(self, output_dir):
  93.         footnote_to_html = footnote_to_html
  94.         sidebar_to_html = sidebar_to_html
  95.         import calibre.ebooks.pml.pmlconverter
  96.         PML_HTMLizer = PML_HTMLizer
  97.         import calibre.ebooks.pml.pmlconverter
  98.         output_dir = os.path.abspath(output_dir)
  99.         if not os.path.exists(output_dir):
  100.             os.makedirs(output_dir)
  101.         
  102.         title = self.mi.title
  103.         if not isinstance(title, unicode):
  104.             title = title.decode('utf-8', 'replace')
  105.         
  106.         html = u'<html><head><title>%s</title></head><body>' % title
  107.         pml = u''
  108.         for i in range(1, self.header_record.num_text_pages + 1):
  109.             self.log.debug('Extracting text page %i' % i)
  110.             pml += self.get_text_page(i)
  111.         
  112.         hizer = PML_HTMLizer()
  113.         html += hizer.parse_pml(pml, 'index.html')
  114.         toc = hizer.get_toc()
  115.         if self.header_record.footnote_count > 0:
  116.             html += '<br /><h1>%s</h1>' % _('Footnotes')
  117.             footnoteids = None(re.findall, '\\w+(?=\x00)'(self.section_data(self.header_record.footnote_offset).decode if self.encoding is None else self.encoding))
  118.             for fid, i in enumerate(range(self.header_record.footnote_offset + 1, self.header_record.footnote_offset + self.header_record.footnote_count)):
  119.                 self.log.debug('Extracting footnote page %i' % i)
  120.                 html += footnote_to_html(footnoteids[fid], self.decompress_text(i))
  121.             
  122.         
  123.         if self.header_record.sidebar_count > 0:
  124.             html += '<br /><h1>%s</h1>' % _('Sidebar')
  125.             sidebarids = None(re.findall, '\\w+(?=\x00)'(self.section_data(self.header_record.sidebar_offset).decode if self.encoding is None else self.encoding))
  126.             for sid, i in enumerate(range(self.header_record.sidebar_offset + 1, self.header_record.sidebar_offset + self.header_record.sidebar_count)):
  127.                 self.log.debug('Extracting sidebar page %i' % i)
  128.                 html += sidebar_to_html(sidebarids[sid], self.decompress_text(i))
  129.             
  130.         
  131.         html += '</body></html>'
  132.         CurrentDir(output_dir).__enter__()
  133.         
  134.         try:
  135.             
  136.             try:
  137.                 index = _[1]
  138.                 self.log.debug('Writing text to index.html')
  139.                 index.write(html.encode('utf-8'))
  140.             finally:
  141.                 pass
  142.  
  143.         finally:
  144.             pass
  145.  
  146.         images = []
  147.         CurrentDir(os.path.join(output_dir, 'images/')).__enter__()
  148.         
  149.         try:
  150.             for i in range(0, self.header_record.num_image_pages):
  151.                 (name, img) = self.get_image(self.header_record.image_data_offset + i)
  152.                 images.append(name)
  153.                 
  154.                 try:
  155.                     imgf = _[2]
  156.                     self.log.debug('Writing image %s to images/' % name)
  157.                     imgf.write(img)
  158.                 finally:
  159.                     pass
  160.  
  161.         finally:
  162.             pass
  163.  
  164.         opf_path = self.create_opf(output_dir, images, toc)
  165.         return opf_path
  166.  
  167.     
  168.     def create_opf(self, output_dir, images, toc):
  169.         CurrentDir(output_dir).__enter__()
  170.         
  171.         try:
  172.             opf = OPFCreator(output_dir, self.mi)
  173.             manifest = [
  174.                 ('index.html', None)]
  175.             for i in images:
  176.                 manifest.append((os.path.join('images', i), None))
  177.             
  178.             opf.create_manifest(manifest)
  179.             opf.create_spine([
  180.                 'index.html'])
  181.             opf.set_toc(toc)
  182.             
  183.             try:
  184.                 opffile = _[1]
  185.                 
  186.                 try:
  187.                     tocfile = _[2]
  188.                     opf.render(opffile, tocfile, 'toc.ncx')
  189.                 finally:
  190.                     pass
  191.  
  192.             finally:
  193.                 pass
  194.  
  195.         finally:
  196.             pass
  197.  
  198.         return os.path.join(output_dir, 'metadata.opf')
  199.  
  200.     
  201.     def dump_pml(self):
  202.         pml = ''
  203.         for i in range(1, self.header_record.num_text_pages + 1):
  204.             pml += self.get_text_page(i)
  205.         
  206.         return pml
  207.  
  208.     
  209.     def dump_images(self, output_dir):
  210.         if not os.path.exists(output_dir):
  211.             os.makedirs(output_dir)
  212.         
  213.         CurrentDir(output_dir).__enter__()
  214.         
  215.         try:
  216.             for i in range(0, self.header_record.num_image_pages):
  217.                 (name, img) = self.get_image(self.header_record.image_data_offset + i)
  218.                 
  219.                 try:
  220.                     imgf = _[1]
  221.                     imgf.write(img)
  222.                 finally:
  223.                     pass
  224.  
  225.         finally:
  226.             pass
  227.  
  228.  
  229.  
  230.