home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __license__ = 'GPL v3'
- __copyright__ = '2009, John Schember <john@nachtimwald.com>'
- __docformat__ = 'restructuredtext en'
- import re
- import struct
- import zlib
-
- try:
- from PIL import Image
- Image
- except ImportError:
- import Image
-
- import cStringIO
- from calibre.ebooks.pdb.formatwriter import FormatWriter
- from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES
- from calibre.ebooks.pdb.header import PdbHeaderBuilder
- from calibre.ebooks.pml.pmlml import PMLMLizer
- IDENTITY = 'PNRdPPrs'
- MAX_RECORD_SIZE = 8192
-
- class Writer(FormatWriter):
-
- def __init__(self, opts, log):
- self.opts = opts
- self.log = log
-
-
- def write_content(self, oeb_book, out_stream, metadata = None):
- pmlmlizer = PMLMLizer(self.log)
- pml = unicode(pmlmlizer.extract_content(oeb_book, self.opts)).encode('cp1252', 'replace')
- (text, text_sizes) = self._text(pml)
- chapter_index = self._index_item('(?s)\\\\C(?P<val>[0-4])="(?P<text>.+?)"', pml)
- chapter_index += self._index_item('(?s)\\\\X(?P<val>[0-4])(?P<text>.+?)\\\\X[0-4]', pml)
- chapter_index += self._index_item('(?s)\\\\x(?P<text>.+?)\\\\x', pml)
- link_index = self._index_item('(?s)\\\\Q="(?P<text>.+?)"', pml)
- images = self._images(oeb_book.manifest, pmlmlizer.image_hrefs)
- metadata = [
- self._metadata(metadata)]
- hr = [
- self._header_record(len(text), len(chapter_index), len(link_index), len(images))]
- sections = hr + text + chapter_index + link_index + images + metadata + [
- text_sizes] + [
- 'MeTaInFo\x00']
- lengths = [ _[1] if i not in images else len(i[0]) + len(i[1]) for i in sections ]
- pdbHeaderBuilder = PdbHeaderBuilder(IDENTITY, metadata[0].partition('\x00')[0])
- pdbHeaderBuilder.build_header(lengths, out_stream)
- for item in sections:
- if item in images:
- out_stream.write(item[0])
- out_stream.write(item[1])
- continue
- []
- out_stream.write(item)
-
-
-
- def _text(self, pml):
- pml_pages = []
- text_sizes = ''
- index = 0
- while index < len(pml):
- split = pml.rfind(' ', index, MAX_RECORD_SIZE)
- if split == -1:
- len_end = len(pml[index:])
- if len_end > MAX_RECORD_SIZE:
- split = MAX_RECORD_SIZE
- else:
- split = len_end
-
- if split == 0:
- split = 1
-
- pml_pages.append(zlib.compress(pml[index:index + split]))
- text_sizes += struct.pack('>H', split)
- index += split
- return (pml_pages, text_sizes)
-
-
- def _index_item(self, regex, pml):
- index = []
- for mo in re.finditer(regex, pml):
- item = ''
- if 'text' in mo.groupdict().keys():
- item += struct.pack('>L', mo.start())
- text = mo.group('text')
- text = re.sub('\\\\U[0-9a-z]{4}', '', text)
- text = re.sub('\\\\a\\d{3}', '', text)
- text = re.sub('\\\\.', '', text)
- if 'val' in mo.groupdict().keys():
- text = '%s%s' % (' ' * int(mo.group('val')), text)
-
- item += text
- item += '\x00'
-
- if item:
- index.append(item)
- continue
-
- return index
-
-
- def _images(self, manifest, image_hrefs):
- images = []
- for item in manifest:
- if item.media_type in OEB_RASTER_IMAGES and item.href in image_hrefs.keys():
-
- try:
- im = Image.open(cStringIO.StringIO(item.data)).convert('P')
- im.thumbnail((300, 300), Image.ANTIALIAS)
- data = cStringIO.StringIO()
- im.save(data, 'PNG')
- data = data.getvalue()
- header = 'PNG '
- header += image_hrefs[item.href].ljust(32, '\x00')[:32]
- header = header.ljust(58, '\x00')
- header += struct.pack('>HH', im.size[0], im.size[1])
- header = header.ljust(62, '\x00')
- if len(data) + len(header) < 65505:
- images.append((header, data))
- except Exception:
- e = None
- self.log.error('Error: Could not include file %s becuase %s.' % (item.href, e))
- except:
- None<EXCEPTION MATCH>Exception
-
-
- None<EXCEPTION MATCH>Exception
-
- return images
-
-
- def _metadata(self, metadata):
- title = _('Unknown')
- author = _('Unknown')
- copyright = ''
- publisher = ''
- isbn = ''
- if metadata:
- if len(metadata.title) >= 1:
- title = metadata.title[0].value
-
- if len(metadata.rights) >= 1:
- copyright = metadata.rights[0].value
-
- if len(metadata.publisher) >= 1:
- publisher = metadata.publisher[0].value
-
-
- return '%s\x00%s\x00%s\x00%s\x00%s\x00' % (title, author, copyright, publisher, isbn)
-
-
- def _header_record(self, text_count, chapter_count, link_count, image_count):
- compression = 10
- non_text_offset = text_count + 1
- chapter_offset = non_text_offset
- link_offset = chapter_offset + chapter_count
- if image_count > 0:
- image_data_offset = link_offset + link_count
- meta_data_offset = image_data_offset + image_count
- last_data_offset = meta_data_offset + 1
- else:
- meta_data_offset = link_offset + link_count
- last_data_offset = meta_data_offset + 1
- image_data_offset = last_data_offset
- if chapter_count == 0:
- chapter_offset = last_data_offset
-
- if link_count == 0:
- link_offset = last_data_offset
-
- record = ''
- record += struct.pack('>H', compression)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', 25152)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', non_text_offset)
- record += struct.pack('>H', chapter_count)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', image_count)
- record += struct.pack('>H', link_count)
- record += struct.pack('>H', 1)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', chapter_offset)
- record += struct.pack('>H', 2560)
- record += struct.pack('>H', last_data_offset)
- record += struct.pack('>H', last_data_offset)
- record += struct.pack('>H', image_data_offset)
- record += struct.pack('>H', link_offset)
- record += struct.pack('>H', meta_data_offset)
- record += struct.pack('>H', 0)
- record += struct.pack('>H', last_data_offset)
- record += struct.pack('>H', last_data_offset)
- record += struct.pack('>H', last_data_offset)
- for i in range(54, 132, 2):
- record += struct.pack('>H', 0)
-
- return record
-
-
-