class RenderWorker(QThread): def __init__(self, parent, lrf_stream, logger, opts): QThread.__init__(self, parent) self.stream, self.logger, self.opts = lrf_stream, logger, opts self.aborted = False self.lrf = None self.document = None self.exception = None def run(self): try: self.lrf = LRFDocument(self.stream) self.lrf.parse() self.stream.close() self.stream = None if self.aborted: self.lrf = None except Exception as err: self.lrf, self.stream = None, None self.exception = err self.formatted_traceback = traceback.format_exc() def abort(self): if self.lrf is not None: self.aborted = True self.lrf.keep_parsing = False
def run(self): try: self.lrf = LRFDocument(self.stream) self.lrf.parse() self.stream.close() self.stream = None if self.aborted: self.lrf = None except Exception as err: self.lrf, self.stream = None, None self.exception = err self.formatted_traceback = traceback.format_exc()
def process_file(lrfpath, opts, logger=None): if logger is None: level = logging.DEBUG if opts.verbose else logging.INFO logger = logging.getLogger('lrf2html') setup_cli_handlers(logger, level) if opts.out is None: opts.out = os.getcwdu() else: opts.out = os.path.abspath(opts.out) if not os.path.isdir(opts.out): raise ConversionError(opts.out + ' is not a directory') if not os.path.exists(opts.out): os.makedirs(opts.out) document = LRFDocument(open(lrfpath, 'rb')) LRFConverter(document, opts, logger)
def convert(self, stream, options, file_ext, log, accelerators): from lxml import etree from calibre.ebooks.lrf.input import (MediaType, Styles, TextBlock, Canvas, ImageBlock, RuledLine) self.log = log self.log('Generating XML') from calibre.ebooks.lrf.lrfparser import LRFDocument d = LRFDocument(stream) d.parse() xml = d.to_xml(write_files=True) if options.verbose > 2: open(u'lrs.xml', 'wb').write(xml.encode('utf-8')) parser = etree.XMLParser(no_network=True, huge_tree=True) try: doc = etree.fromstring(xml, parser=parser) except: self.log.warn('Failed to parse XML. Trying to recover') parser = etree.XMLParser(no_network=True, huge_tree=True, recover=True) doc = etree.fromstring(xml, parser=parser) char_button_map = {} for x in doc.xpath('//CharButton[@refobj]'): ro = x.get('refobj') jump_button = doc.xpath('//*[@objid="%s"]' % ro) if jump_button: jump_to = jump_button[0].xpath( 'descendant::JumpTo[@refpage and @refobj]') if jump_to: char_button_map[ro] = '%s.xhtml#%s' % ( jump_to[0].get('refpage'), jump_to[0].get('refobj')) plot_map = {} for x in doc.xpath('//Plot[@refobj]'): ro = x.get('refobj') image = doc.xpath('//Image[@objid="%s" and @refstream]' % ro) if image: imgstr = doc.xpath('//ImageStream[@objid="%s" and @file]' % image[0].get('refstream')) if imgstr: plot_map[ro] = imgstr[0].get('file') self.log('Converting XML to HTML...') styledoc = etree.fromstring(P('templates/lrf.xsl', data=True)) media_type = MediaType() styles = Styles() text_block = TextBlock(styles, char_button_map, plot_map, log) canvas = Canvas(doc, styles, text_block, log) image_block = ImageBlock(canvas) ruled_line = RuledLine() extensions = { ('calibre', 'media-type'): media_type, ('calibre', 'text-block'): text_block, ('calibre', 'ruled-line'): ruled_line, ('calibre', 'styles'): styles, ('calibre', 'canvas'): canvas, ('calibre', 'image-block'): image_block, } transform = etree.XSLT(styledoc, extensions=extensions) try: result = transform(doc) except RuntimeError: sys.setrecursionlimit(5000) result = transform(doc) with open('content.opf', 'wb') as f: f.write(result) styles.write() return os.path.abspath(u'content.opf')
def convert(self, stream, options, file_ext, log, accelerators): from lxml import etree from calibre.ebooks.lrf.input import (MediaType, Styles, TextBlock, Canvas, ImageBlock, RuledLine) self.log = log self.log('Generating XML') from calibre.ebooks.lrf.lrfparser import LRFDocument d = LRFDocument(stream) d.parse() xml = d.to_xml(write_files=True) if options.verbose > 2: open(u'lrs.xml', 'wb').write(xml.encode('utf-8')) parser = etree.XMLParser(no_network=True, huge_tree=True) try: doc = etree.fromstring(xml, parser=parser) except: self.log.warn('Failed to parse XML. Trying to recover') parser = etree.XMLParser(no_network=True, huge_tree=True, recover=True) doc = etree.fromstring(xml, parser=parser) char_button_map = {} for x in doc.xpath('//CharButton[@refobj]'): ro = x.get('refobj') jump_button = doc.xpath('//*[@objid="%s"]'%ro) if jump_button: jump_to = jump_button[0].xpath('descendant::JumpTo[@refpage and @refobj]') if jump_to: char_button_map[ro] = '%s.xhtml#%s'%(jump_to[0].get('refpage'), jump_to[0].get('refobj')) plot_map = {} for x in doc.xpath('//Plot[@refobj]'): ro = x.get('refobj') image = doc.xpath('//Image[@objid="%s" and @refstream]'%ro) if image: imgstr = doc.xpath('//ImageStream[@objid="%s" and @file]'% image[0].get('refstream')) if imgstr: plot_map[ro] = imgstr[0].get('file') self.log('Converting XML to HTML...') styledoc = etree.fromstring(P('templates/lrf.xsl', data=True)) media_type = MediaType() styles = Styles() text_block = TextBlock(styles, char_button_map, plot_map, log) canvas = Canvas(doc, styles, text_block, log) image_block = ImageBlock(canvas) ruled_line = RuledLine() extensions = { ('calibre', 'media-type') : media_type, ('calibre', 'text-block') : text_block, ('calibre', 'ruled-line') : ruled_line, ('calibre', 'styles') : styles, ('calibre', 'canvas') : canvas, ('calibre', 'image-block'): image_block, } transform = etree.XSLT(styledoc, extensions=extensions) try: result = transform(doc) except RuntimeError: sys.setrecursionlimit(5000) result = transform(doc) with open('content.opf', 'wb') as f: f.write(result) styles.write() return os.path.abspath('content.opf')