mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
HTMLZ Output: Various fixes
HTMLZ Output: Fix <style> tag placed inside <body> instead of <head>. See #1239530 (Htmlz conversion places <head> in <body>, not before) HTMLZ Output: Fix inline styles not escaping quotes properly. See #1239527 (Htmlz inline css doesn't single quote fonts & thus destroys html) HTMLZ Output: Fix incorrect handling of some self closing tags like <br>. See #1239555 (Htmlz conversion incorrectly handles <br/>) Merge branch 'master' of https://github.com/user-none/calibre
This commit is contained in:
commit
3348817b2e
@ -17,11 +17,13 @@ from lxml import html
|
||||
from urlparse import urldefrag
|
||||
|
||||
from calibre import prepare_string_for_xml
|
||||
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace,\
|
||||
OEB_IMAGES, XLINK, rewrite_links, urlnormalize
|
||||
from calibre.ebooks.oeb.base import (
|
||||
XHTML, XHTML_NS, barename, namespace, OEB_IMAGES, XLINK, rewrite_links, urlnormalize)
|
||||
from calibre.ebooks.oeb.stylizer import Stylizer
|
||||
from calibre.utils.logging import default_log
|
||||
|
||||
SELF_CLOSING_TAGS = {'area', 'base', 'basefont', 'br', 'hr', 'input', 'img', 'link', 'meta'}
|
||||
|
||||
class OEB2HTML(object):
|
||||
'''
|
||||
Base class. All subclasses should implement dump_text to actually transform
|
||||
@ -49,7 +51,7 @@ class OEB2HTML(object):
|
||||
return self.mlize_spine(oeb_book)
|
||||
|
||||
def mlize_spine(self, oeb_book):
|
||||
output = [u'<html><body><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /></head>']
|
||||
output = [u'<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" /></head><body>']
|
||||
for item in oeb_book.spine:
|
||||
self.log.debug('Converting %s to HTML...' % item.href)
|
||||
self.rewrite_ids(item.data, item)
|
||||
@ -183,7 +185,11 @@ class OEB2HTMLNoCSSizer(OEB2HTML):
|
||||
at += ' %s="%s"' % (k, prepare_string_for_xml(v, attribute=True))
|
||||
|
||||
# Write the tag.
|
||||
text.append('<%s%s>' % (tag, at))
|
||||
text.append('<%s%s' % (tag, at))
|
||||
if tag in SELF_CLOSING_TAGS:
|
||||
text.append(' />')
|
||||
else:
|
||||
text.append('>')
|
||||
|
||||
# Turn styles into tags.
|
||||
if style['font-weight'] in ('bold', 'bolder'):
|
||||
@ -210,6 +216,7 @@ class OEB2HTMLNoCSSizer(OEB2HTML):
|
||||
# Close all open tags.
|
||||
tags.reverse()
|
||||
for t in tags:
|
||||
if t not in SELF_CLOSING_TAGS:
|
||||
text.append('</%s>' % t)
|
||||
|
||||
# Add the text that is outside of the tag.
|
||||
@ -267,10 +274,14 @@ class OEB2HTMLInlineCSSizer(OEB2HTML):
|
||||
# Turn style into strings for putting in the tag.
|
||||
style_t = ''
|
||||
if style_a:
|
||||
style_t = ' style="%s"' % style_a
|
||||
style_t = ' style="%s"' % style_a.replace('"', "'")
|
||||
|
||||
# Write the tag.
|
||||
text.append('<%s%s%s>' % (tag, at, style_t))
|
||||
text.append('<%s%s%s' % (tag, at, style_t))
|
||||
if tag in SELF_CLOSING_TAGS:
|
||||
text.append(' />')
|
||||
else:
|
||||
text.append('>')
|
||||
|
||||
# Process tags that contain text.
|
||||
if hasattr(elem, 'text') and elem.text:
|
||||
@ -283,6 +294,7 @@ class OEB2HTMLInlineCSSizer(OEB2HTML):
|
||||
# Close all open tags.
|
||||
tags.reverse()
|
||||
for t in tags:
|
||||
if t not in SELF_CLOSING_TAGS:
|
||||
text.append('</%s>' % t)
|
||||
|
||||
# Add the text that is outside of the tag.
|
||||
@ -312,7 +324,8 @@ class OEB2HTMLClassCSSizer(OEB2HTML):
|
||||
css = u'<link href="style.css" rel="stylesheet" type="text/css" />'
|
||||
else:
|
||||
css = u'<style type="text/css">' + self.get_css(oeb_book) + u'</style>'
|
||||
output = [u'<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'] + [css] + [u'</head><body>'] + output + [u'</body></html>']
|
||||
output = [u'<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'] + \
|
||||
[css] + [u'</head><body>'] + output + [u'</body></html>']
|
||||
return ''.join(output)
|
||||
|
||||
def dump_text(self, elem, stylizer, page):
|
||||
@ -350,7 +363,11 @@ class OEB2HTMLClassCSSizer(OEB2HTML):
|
||||
at += ' %s="%s"' % (k, prepare_string_for_xml(v, attribute=True))
|
||||
|
||||
# Write the tag.
|
||||
text.append('<%s%s>' % (tag, at))
|
||||
text.append('<%s%s' % (tag, at))
|
||||
if tag in SELF_CLOSING_TAGS:
|
||||
text.append(' />')
|
||||
else:
|
||||
text.append('>')
|
||||
|
||||
# Process tags that contain text.
|
||||
if hasattr(elem, 'text') and elem.text:
|
||||
@ -363,6 +380,7 @@ class OEB2HTMLClassCSSizer(OEB2HTML):
|
||||
# Close all open tags.
|
||||
tags.reverse()
|
||||
for t in tags:
|
||||
if t not in SELF_CLOSING_TAGS:
|
||||
text.append('</%s>' % t)
|
||||
|
||||
# Add the text that is outside of the tag.
|
||||
|
Loading…
x
Reference in New Issue
Block a user