[IMP] translate: make xml_translate use an HTML parser when XML parsing fails

This commit is contained in:
Raphael Collet
2015-07-06 16:58:04 +02:00
parent ad659c39b0
commit 1ea32f1daf
2 changed files with 15 additions and 5 deletions
+1 -1
View File
@@ -31,7 +31,7 @@ tags_to_remove = ['html', 'body']
allowed_tags = clean.defs.tags | frozenset('article section header footer hgroup nav aside figure main'.split() + [etree.Comment])
safe_attrs = clean.defs.safe_attrs | frozenset(
['style',
'data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-type', 'data-oe-expression', 'data-oe-translate', 'data-oe-nodeid',
'data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-type', 'data-oe-expression', 'data-oe-translation-id', 'data-oe-nodeid',
'data-publish', 'data-id', 'data-res_id', 'data-member_id', 'data-view-id'
])
+14 -4
View File
@@ -138,6 +138,7 @@ def encode(s):
return s.encode('utf8')
return s
# which elements are translated inline
TRANSLATED_ELEMENTS = {
'a', 'abbr', 'audio', 'b', 'bdi', 'bdo', 'br', 'canvas', 'cite', 'code',
'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'font', 'i', 'iframe',
@@ -147,6 +148,7 @@ TRANSLATED_ELEMENTS = {
'wbr', 'text',
}
# which attributes must be translated
TRANSLATED_ATTRS = {
'string', 'help', 'sum', 'avg', 'confirm', 'placeholder', 'alt', 'title',
}
@@ -256,15 +258,23 @@ class XMLTranslator(object):
def xml_translate(callback, value):
""" Translate an XML value (string), using `callback` for translating text
appearing in `value`.
appearing in `value`. If `value` is not XML valid, it is parsed with an HTML
parser instead, and some element wrapping is done to make the parsing work.
"""
if not value:
return value
trans = XMLTranslator(callback)
root = etree.fromstring(encode(value))
trans.process(root)
return trans.get_done()
try:
root = etree.fromstring(encode(value))
trans.process(root)
return trans.get_done()
except etree.ParseError:
wrapped = "<div>%s</div>" % value
root = etree.fromstring(wrapped, etree.HTMLParser())
# html > body > div
trans.process(root[0][0])
return trans.get_done()[5:-6]
#