home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_923 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  8.3 KB  |  202 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
  6. import sys
  7. import array
  8. import os
  9. import re
  10. import codecs
  11. import logging
  12. from calibre import setup_cli_handlers, sanitize_file_name
  13. from calibre.utils.config import OptionParser
  14. from calibre.ebooks.lrf.meta import LRFMetaFile
  15. from calibre.ebooks.lrf.objects import get_object, PageTree, StyleObject, Font, Text, TOCObject, BookAttr, ruby_tags
  16.  
  17. class LRFDocument(LRFMetaFile):
  18.     
  19.     class temp(object):
  20.         pass
  21.  
  22.     
  23.     def __init__(self, stream):
  24.         LRFMetaFile.__init__(self, stream)
  25.         self.scramble_key = self.xor_key
  26.         self.page_trees = []
  27.         self.font_map = { }
  28.         self.image_map = { }
  29.         self.toc = ''
  30.         self.keep_parsing = True
  31.  
  32.     
  33.     def parse(self):
  34.         self._parse_objects()
  35.         self.metadata = LRFDocument.temp()
  36.         for a in ('title', 'title_reading', 'author', 'author_reading', 'book_id', 'classification', 'free_text', 'publisher', 'label', 'category'):
  37.             setattr(self.metadata, a, getattr(self, a))
  38.         
  39.         self.doc_info = LRFDocument.temp()
  40.         for a in ('thumbnail', 'language', 'creator', 'producer', 'page'):
  41.             setattr(self.doc_info, a, getattr(self, a))
  42.         
  43.         self.doc_info.thumbnail_extension = self.thumbail_extension()
  44.         self.device_info = LRFDocument.temp()
  45.         for a in ('dpi', 'width', 'height'):
  46.             setattr(self.device_info, a, getattr(self, a))
  47.         
  48.  
  49.     
  50.     def _parse_objects(self):
  51.         self.objects = { }
  52.         self._file.seek(self.object_index_offset)
  53.         obj_array = array.array('I', self._file.read(16 * self.number_of_objects))
  54.         if ord(array.array('i', [
  55.             1]).tostring()[0]) == 0:
  56.             obj_array.byteswap()
  57.         
  58.         for i in range(self.number_of_objects):
  59.             if not self.keep_parsing:
  60.                 break
  61.             
  62.             (objid, objoff, objsize) = obj_array[i * 4:i * 4 + 3]
  63.             self._parse_object(objid, objoff, objsize)
  64.         
  65.         for obj in self.objects.values():
  66.             if not self.keep_parsing:
  67.                 break
  68.             
  69.             if hasattr(obj, 'initialize'):
  70.                 obj.initialize()
  71.                 continue
  72.         
  73.  
  74.     
  75.     def _parse_object(self, objid, objoff, objsize):
  76.         obj = get_object(self, self._file, objid, objoff, objsize, self.scramble_key)
  77.         self.objects[objid] = obj
  78.         if isinstance(obj, PageTree):
  79.             self.page_trees.append(obj)
  80.         elif isinstance(obj, TOCObject):
  81.             self.toc = obj
  82.         elif isinstance(obj, BookAttr):
  83.             self.ruby_tags = { }
  84.             for h in ruby_tags.values():
  85.                 attr = h[0]
  86.                 if hasattr(obj, attr):
  87.                     self.ruby_tags[attr] = getattr(obj, attr)
  88.                     continue
  89.             
  90.         
  91.  
  92.     
  93.     def __iter__(self):
  94.         for pt in self.page_trees:
  95.             yield pt
  96.         
  97.  
  98.     
  99.     def write_files(self):
  100.         for obj in self.image_map.values() + self.font_map.values():
  101.             open(obj.file, 'wb').write(obj.stream)
  102.         
  103.  
  104.     
  105.     def to_xml(self, write_files = True):
  106.         bookinfo = u'<BookInformation>\n<Info version="1.1">\n<BookInfo>\n'
  107.         bookinfo += u'<Title reading="%s">%s</Title>\n' % (self.metadata.title_reading, self.metadata.title)
  108.         bookinfo += u'<Author reading="%s">%s</Author>\n' % (self.metadata.author_reading, self.metadata.author)
  109.         bookinfo += u'<BookID>%s</BookID>\n' % (self.metadata.book_id,)
  110.         bookinfo += u'<Publisher reading="">%s</Publisher>\n' % (self.metadata.publisher,)
  111.         bookinfo += u'<Label reading="">%s</Label>\n' % (self.metadata.label,)
  112.         bookinfo += u'<Category reading="">%s</Category>\n' % (self.metadata.category,)
  113.         bookinfo += u'<Classification reading="">%s</Classification>\n' % (self.metadata.classification,)
  114.         bookinfo += u'<FreeText reading="">%s</FreeText>\n</BookInfo>\n<DocInfo>\n' % (self.metadata.free_text,)
  115.         th = self.doc_info.thumbnail
  116.         if th:
  117.             prefix = sanitize_file_name(self.metadata.title, as_unicode = True)
  118.             bookinfo += u'<CThumbnail file="%s" />\n' % (prefix + '_thumbnail.' + self.doc_info.thumbnail_extension,)
  119.             if write_files:
  120.                 open(prefix + '_thumbnail.' + self.doc_info.thumbnail_extension, 'wb').write(th)
  121.             
  122.         
  123.         bookinfo += u'<Language reading="">%s</Language>\n' % (self.doc_info.language,)
  124.         bookinfo += u'<Creator reading="">%s</Creator>\n' % (self.doc_info.creator,)
  125.         bookinfo += u'<Producer reading="">%s</Producer>\n' % (self.doc_info.producer,)
  126.         bookinfo += u'<SumPage>%s</SumPage>\n</DocInfo>\n</Info>\n%s</BookInformation>\n' % (self.doc_info.page, self.toc)
  127.         pages = u''
  128.         done_main = False
  129.         pt_id = -1
  130.         for page_tree in self:
  131.             if not done_main:
  132.                 done_main = True
  133.                 pages += u'<Main>\n'
  134.                 close = u'</Main>\n'
  135.                 pt_id = page_tree.id
  136.             else:
  137.                 pages += u'<PageTree objid="%d">\n' % (page_tree.id,)
  138.                 close = u'</PageTree>\n'
  139.             for page in page_tree:
  140.                 pages += unicode(page)
  141.             
  142.             pages += close
  143.         
  144.         traversed_objects = [ int(i) for i in re.findall('objid="(\\w+)"', pages) ] + [
  145.             pt_id]
  146.         objects = u'\n<Objects>\n'
  147.         styles = u'\n<Style>\n'
  148.         for obj in self.objects:
  149.             obj = self.objects[obj]
  150.             if isinstance(obj, (Font, Text, TOCObject)):
  151.                 continue
  152.             
  153.             if isinstance(obj, StyleObject):
  154.                 styles += unicode(obj)
  155.                 continue
  156.             objects += unicode(obj)
  157.         
  158.         styles += '</Style>\n'
  159.         objects += '</Objects>\n'
  160.         if write_files:
  161.             self.write_files()
  162.         
  163.         return '<BBeBXylog version="1.0">\n' + bookinfo + pages + styles + objects + '</BBeBXylog>'
  164.  
  165.  
  166.  
  167. def option_parser():
  168.     parser = OptionParser(usage = _('%prog book.lrf\nConvert an LRF file into an LRS (XML UTF-8 encoded) file'))
  169.     parser.add_option('--output', '-o', default = None, help = _('Output LRS file'), dest = 'out')
  170.     parser.add_option('--dont-output-resources', default = True, action = 'store_false', help = _('Do not save embedded image and font files to disk'), dest = 'output_resources')
  171.     parser.add_option('--verbose', default = False, action = 'store_true', dest = 'verbose')
  172.     return parser
  173.  
  174.  
  175. def main(args = sys.argv, logger = None):
  176.     parser = option_parser()
  177.     (opts, args) = parser.parse_args(args)
  178.     if logger is None:
  179.         level = None if opts.verbose else logging.INFO
  180.         logger = logging.getLogger('lrf2lrs')
  181.         setup_cli_handlers(logger, level)
  182.     
  183.     if len(args) != 2:
  184.         parser.print_help()
  185.         return 1
  186.     if opts.out is None:
  187.         opts.out = os.path.join(os.path.dirname(args[1]), os.path.splitext(os.path.basename(args[1]))[0] + '.lrs')
  188.     
  189.     o = codecs.open(os.path.abspath(os.path.expanduser(opts.out)), 'wb', 'utf-8')
  190.     o.write(u'<?xml version="1.0" encoding="UTF-8"?>\n')
  191.     logger.info(_('Parsing LRF...'))
  192.     d = LRFDocument(open(args[1], 'rb'))
  193.     d.parse()
  194.     logger.info(_('Creating XML...'))
  195.     o.write(d.to_xml(write_files = opts.output_resources))
  196.     logger.info(_('LRS written to ') + opts.out)
  197.     return 0
  198.  
  199. if __name__ == '__main__':
  200.     sys.exit(main())
  201.  
  202.