[IMP] translate: make xml_translate use an HTML parser when XML parsing fails
This commit is contained in:
@@ -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'
|
||||
])
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user