mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Clean up a stylizer wart and SVG rasterization side-effect.
This commit is contained in:
parent
a7753d3420
commit
c6a70c9651
@ -32,9 +32,8 @@ from calibre.ebooks.mobi.langcodes import iana2mobi
|
|||||||
from calibre.ebooks.mobi.mobiml import MBP_NS, MBP, MobiMLizer
|
from calibre.ebooks.mobi.mobiml import MBP_NS, MBP, MobiMLizer
|
||||||
|
|
||||||
# TODO:
|
# TODO:
|
||||||
# - Image scaling
|
# - Allow override CSS (?)
|
||||||
# - Clean unused files
|
# - Generate index records
|
||||||
# - Override CSS
|
|
||||||
# - Generate in-content ToC
|
# - Generate in-content ToC
|
||||||
# - Command line options, etc.
|
# - Command line options, etc.
|
||||||
|
|
||||||
@ -477,8 +476,8 @@ def main(argv=sys.argv):
|
|||||||
#writer = DirWriter()
|
#writer = DirWriter()
|
||||||
fbase = context.dest.fbase
|
fbase = context.dest.fbase
|
||||||
fkey = context.dest.fnums.values()
|
fkey = context.dest.fnums.values()
|
||||||
flattener = CSSFlattener(fbase=fbase, fkey=fkey, unfloat=True,
|
flattener = CSSFlattener(
|
||||||
untable=True)
|
fbase=fbase, fkey=fkey, unfloat=True, untable=True)
|
||||||
rasterizer = SVGRasterizer()
|
rasterizer = SVGRasterizer()
|
||||||
trimmer = ManifestTrimmer()
|
trimmer = ManifestTrimmer()
|
||||||
mobimlizer = MobiMLizer()
|
mobimlizer = MobiMLizer()
|
||||||
|
@ -281,9 +281,13 @@ class Style(object):
|
|||||||
self._style.update(self._stylizer.flatten_style(style))
|
self._style.update(self._stylizer.flatten_style(style))
|
||||||
|
|
||||||
def _has_parent(self):
|
def _has_parent(self):
|
||||||
parent = self._element.getparent()
|
return (self._element.getparent() is not None)
|
||||||
return (parent is not None) \
|
|
||||||
and (parent in self._stylizer._styles)
|
def _get_parent(self):
|
||||||
|
elem = self._element.getparent()
|
||||||
|
if elem is None:
|
||||||
|
return None
|
||||||
|
return self._stylizer.style(elem)
|
||||||
|
|
||||||
def __getitem__(self, name):
|
def __getitem__(self, name):
|
||||||
domname = cssproperties._toDOMname(name)
|
domname = cssproperties._toDOMname(name)
|
||||||
@ -298,8 +302,8 @@ class Style(object):
|
|||||||
if (result == 'inherit'
|
if (result == 'inherit'
|
||||||
or (result is None and name in INHERITED
|
or (result is None and name in INHERITED
|
||||||
and self._has_parent())):
|
and self._has_parent())):
|
||||||
styles = self._stylizer._styles
|
stylizer = self._stylizer
|
||||||
result = styles[self._element.getparent()]._get(name)
|
result = stylizer.style(self._element.getparent())._get(name)
|
||||||
if result is None:
|
if result is None:
|
||||||
result = DEFAULTS[name]
|
result = DEFAULTS[name]
|
||||||
return result
|
return result
|
||||||
@ -368,9 +372,9 @@ class Style(object):
|
|||||||
return result
|
return result
|
||||||
if self._fontSize is None:
|
if self._fontSize is None:
|
||||||
result = None
|
result = None
|
||||||
if self._has_parent():
|
parent = self._get_parent()
|
||||||
styles = self._stylizer._styles
|
if parent is not None:
|
||||||
base = styles[self._element.getparent()].fontSize
|
base = parent.fontSize
|
||||||
else:
|
else:
|
||||||
base = self._profile.fbase
|
base = self._profile.fbase
|
||||||
if 'font-size' in self._style:
|
if 'font-size' in self._style:
|
||||||
@ -386,9 +390,9 @@ class Style(object):
|
|||||||
if self._width is None:
|
if self._width is None:
|
||||||
result = None
|
result = None
|
||||||
base = None
|
base = None
|
||||||
if self._has_parent():
|
parent = self._get_parent()
|
||||||
styles = self._stylizer._styles
|
if parent is not None:
|
||||||
base = styles[self._element.getparent()].width
|
base = parent.width
|
||||||
else:
|
else:
|
||||||
base = self._profile.width
|
base = self._profile.width
|
||||||
if 'width' is self._element.attrib:
|
if 'width' is self._element.attrib:
|
||||||
@ -407,9 +411,9 @@ class Style(object):
|
|||||||
if self._height is None:
|
if self._height is None:
|
||||||
result = None
|
result = None
|
||||||
base = None
|
base = None
|
||||||
if self._has_parent():
|
parent = self._get_parent()
|
||||||
styles = self._stylizer._styles
|
if parent is not None:
|
||||||
base = styles[self._element.getparent()].height
|
base = parent.height
|
||||||
else:
|
else:
|
||||||
base = self._profile.height
|
base = self._profile.height
|
||||||
if 'height' is self._element.attrib:
|
if 'height' is self._element.attrib:
|
||||||
|
@ -90,21 +90,26 @@ class SVGRasterizer(object):
|
|||||||
for item in self.oeb.spine:
|
for item in self.oeb.spine:
|
||||||
html = item.data
|
html = item.data
|
||||||
stylizer = Stylizer(html, item.href, self.oeb, self.profile)
|
stylizer = Stylizer(html, item.href, self.oeb, self.profile)
|
||||||
self.rasterize_elem(html.find(XHTML('body')), item, stylizer)
|
self.rasterize_item(item, stylizer)
|
||||||
|
|
||||||
def rasterize_elem(self, elem, item, stylizer):
|
def rasterize_item(self, item, stylizer):
|
||||||
if not isinstance(elem.tag, basestring): return
|
html = item.data
|
||||||
style = stylizer.style(elem)
|
hrefs = self.oeb.manifest.hrefs
|
||||||
if namespace(elem.tag) == SVG_NS:
|
for elem in xpath(html, '//h:img'):
|
||||||
return self.rasterize_inline(elem, style, item)
|
src = elem.get('src', None)
|
||||||
if elem.tag in IMAGE_TAGS:
|
image = hrefs.get(item.abshref(src), None) if src else None
|
||||||
manifest = self.oeb.manifest
|
|
||||||
src = elem.get('src', None) or elem.get('data', None)
|
|
||||||
image = manifest.hrefs[item.abshref(src)] if src else None
|
|
||||||
if image and image.media_type == SVG_MIME:
|
if image and image.media_type == SVG_MIME:
|
||||||
return self.rasterize_external(elem, style, item, image)
|
style = stylizer.style(elem)
|
||||||
for child in elem:
|
self.rasterize_external(elem, style, item, image)
|
||||||
self.rasterize_elem(child, item, stylizer)
|
for elem in xpath(html, '//h:object[@type="%s"]' % SVG_MIME):
|
||||||
|
data = elem.get('data', None)
|
||||||
|
image = hrefs.get(item.abshref(data), None) if data else None
|
||||||
|
if image and image.media_type == SVG_MIME:
|
||||||
|
style = stylizer.style(elem)
|
||||||
|
self.rasterize_external(elem, style, item, image)
|
||||||
|
for elem in xpath(html, '//svg:svg'):
|
||||||
|
style = stylizer.style(elem)
|
||||||
|
self.rasterize_inline(elem, style, item)
|
||||||
|
|
||||||
def rasterize_inline(self, elem, style, item):
|
def rasterize_inline(self, elem, style, item):
|
||||||
width = style['width']
|
width = style['width']
|
||||||
@ -175,7 +180,9 @@ class SVGRasterizer(object):
|
|||||||
cover = self.oeb.manifest.ids[str(covers[0])]
|
cover = self.oeb.manifest.ids[str(covers[0])]
|
||||||
if not cover.media_type == SVG_MIME:
|
if not cover.media_type == SVG_MIME:
|
||||||
return
|
return
|
||||||
data = self.rasterize_svg(cover.data, 500, 800)
|
logger = self.oeb.logger
|
||||||
|
logger.info('Rasterizing %r to %dx%d' % (cover.href, 600, 800))
|
||||||
|
data = self.rasterize_svg(cover.data, 600, 800)
|
||||||
href = os.path.splitext(cover.href)[0] + '.png'
|
href = os.path.splitext(cover.href)[0] + '.png'
|
||||||
id, href = self.oeb.manifest.generate(cover.id, href)
|
id, href = self.oeb.manifest.generate(cover.id, href)
|
||||||
self.oeb.manifest.add(id, href, PNG_MIME, data=data)
|
self.oeb.manifest.add(id, href, PNG_MIME, data=data)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user