Clean up a stylizer wart and SVG rasterization side-effect.

This commit is contained in:
Marshall T. Vandegrift 2009-01-08 22:17:22 -05:00
parent a7753d3420
commit c6a70c9651
3 changed files with 43 additions and 33 deletions

View File

@ -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()

View File

@ -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:

View File

@ -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)