mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 18:54:09 -04:00
IGN:Fix #3503 (Missing import: calibre.ebooks.lrf.input)
This commit is contained in:
parent
5d20546302
commit
61956a7dfd
75
resources/templates/lrf.xsl
Normal file
75
resources/templates/lrf.xsl
Normal file
@ -0,0 +1,75 @@
|
||||
<?xml version="1.0"?>
|
||||
<xsl:stylesheet
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:opf="http://www.idpf.org/2007/opf"
|
||||
xmlns:c="calibre"
|
||||
extension-element-prefixes="c"
|
||||
xsl:version = "1.1"
|
||||
>
|
||||
<xsl:output method="xml" indent="yes"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<package version="2.0"
|
||||
unique-identifier="calibre_id">
|
||||
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:calibre="http://calibre.kovidgoyal.net/2009/metadata">
|
||||
<xsl:call-template name="make-metadata"/>
|
||||
</metadata>
|
||||
<manifest>
|
||||
<xsl:call-template name="make-manifest"/>
|
||||
</manifest>
|
||||
<spine toc="ncx">
|
||||
<xsl:call-template name="make-spine"/>
|
||||
</spine>
|
||||
</package>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="make-metadata">
|
||||
<xsl:for-each select='//BookInformation/Info'>
|
||||
<c:metadata/>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="make-manifest">
|
||||
<xsl:for-each select='//Page'>
|
||||
<xsl:element name="item">
|
||||
<xsl:attribute name="id"><xsl:value-of select="@objid"/></xsl:attribute>
|
||||
<xsl:attribute name="media-type"><xsl:text>application/xhtml+xml</xsl:text></xsl:attribute>
|
||||
<xsl:attribute name="href"><xsl:value-of select="@objid"/><xsl:text>.xhtml</xsl:text></xsl:attribute>
|
||||
</xsl:element>
|
||||
</xsl:for-each>
|
||||
<xsl:for-each select="//ImageStream">
|
||||
<xsl:element name="item">
|
||||
<xsl:attribute name="id"><xsl:value-of select="@objid"/></xsl:attribute>
|
||||
<xsl:attribute name="media-type"><c:media-type/></xsl:attribute>
|
||||
<xsl:attribute name="href"><xsl:value-of select="@file"/></xsl:attribute>
|
||||
</xsl:element>
|
||||
</xsl:for-each>
|
||||
<xsl:for-each select="//RegistFont">
|
||||
<xsl:element name="item">
|
||||
<xsl:attribute name="id"><xsl:value-of select="@objid"/></xsl:attribute>
|
||||
<xsl:attribute name="media-type"><c:media-type/></xsl:attribute>
|
||||
<xsl:attribute name="href"><xsl:value-of select="@file"/></xsl:attribute>
|
||||
</xsl:element>
|
||||
</xsl:for-each>
|
||||
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
|
||||
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="make-spine">
|
||||
<xsl:for-each select='//Page'>
|
||||
<xsl:element name="itemref">
|
||||
<xsl:attribute name="idref"><xsl:value-of select="@objid"/></xsl:attribute>
|
||||
</xsl:element>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="*">
|
||||
<xsl:message>
|
||||
<xsl:text>no match for element: "</xsl:text>
|
||||
<xsl:value-of select="name(.)"/>
|
||||
<xsl:text>" 
</xsl:text>
|
||||
</xsl:message>
|
||||
<xsl:apply-templates/>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
72
src/calibre/ebooks/lrf/input.py
Normal file
72
src/calibre/ebooks/lrf/input.py
Normal file
@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env python
|
||||
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
||||
from __future__ import with_statement
|
||||
|
||||
__license__ = 'GPL v3'
|
||||
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||
__docformat__ = 'restructuredtext en'
|
||||
|
||||
import os
|
||||
from copy import deepcopy
|
||||
|
||||
from lxml import etree
|
||||
|
||||
from calibre.customize.conversion import InputFormatPlugin
|
||||
from calibre import guess_type
|
||||
|
||||
class MediaType(etree.XSLTExtension):
|
||||
def execute(self, context, self_node, input_node, output_parent):
|
||||
name = input_node.get('file', None)
|
||||
typ = guess_type(name)[0]
|
||||
if not typ:
|
||||
typ = 'application/octet-stream'
|
||||
output_parent.text = typ
|
||||
|
||||
class Metadata(etree.XSLTExtension):
|
||||
|
||||
def __init__(self):
|
||||
from calibre.ebooks.oeb.base import DC, OPF, DC11_NS, OPF2_NS
|
||||
self.namespaces = {'dc':DC11_NS, 'opf':OPF2_NS}
|
||||
self.DC, self.OPF = DC, OPF
|
||||
print self.namespaces
|
||||
|
||||
def execute(self, context, self_node, input_node, output_parent):
|
||||
input_node = deepcopy(input_node)
|
||||
titles = input_node.xpath('//Info//Title')
|
||||
if titles:
|
||||
tn = etree.Element(self.DC('title'), nsmap=self.namespaces)
|
||||
tn.text = titles[-1].text
|
||||
tn.set(self.OPF('file-as'), 'boo')
|
||||
output_parent.append(tn)
|
||||
|
||||
|
||||
class LRFInput(InputFormatPlugin):
|
||||
|
||||
name = 'LRF Input'
|
||||
author = 'Kovid Goyal'
|
||||
description = 'Convert LRF files to HTML'
|
||||
file_types = set(['lrf'])
|
||||
|
||||
def convert(self, stream, options, file_ext, log,
|
||||
accelerators):
|
||||
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)
|
||||
parser = etree.XMLParser(recover=True, no_network=True)
|
||||
doc = etree.fromstring(xml, parser=parser)
|
||||
self.log('Converting XML to HTML...')
|
||||
styledoc = etree.fromstring(P('templates/lrf.xsl', data=True))
|
||||
media_type, metadata = MediaType(), Metadata()
|
||||
extensions = { ('calibre', 'media-type') : media_type,
|
||||
('calibre', 'metadata'): metadata}
|
||||
transform = etree.XSLT(styledoc, extensions=extensions)
|
||||
result = transform(doc)
|
||||
with open('content.opf', 'wb') as f:
|
||||
f.write(result)
|
||||
|
||||
return os.path.abspath('content.opf')
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user