diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index acab68c091..5959f3a19d 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -347,13 +347,17 @@ def xml2unicode(root, pretty_print=False): def xml2text(elem): return etree.tostring(elem, method='text', encoding=unicode, with_tail=False) +def escape_cdata(root): + pat = re.compile(r'[<>&]') + for elem in root.iterdescendants('{%s}style' % XHTML_NS, '{%s}script' % XHTML_NS): + if elem.text and pat.search(elem.text) is not None: + elem.text = etree.CDATA(elem.text) + def serialize(data, media_type, pretty_print=False): if isinstance(data, etree._Element): is_oeb_doc = media_type in OEB_DOCS if is_oeb_doc: - for style in data.iterfind('.//{http://www.w3.org/1999/xhtml}style'): - if style.text and re.search(r'[<>&]', style.text) is not None: - style.text = etree.CDATA(style.text) + escape_cdata(data) ans = xml2str(data, pretty_print=pretty_print) if is_oeb_doc: # Convert self closing div|span|a|video|audio|iframe|etc tags