summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@openerp.com>2015-05-13 14:32:05 +0200
committerRaphael Collet <rco@openerp.com>2015-07-06 16:58:04 +0200
commit1ea32f1daf062bda7a1c6742ebeb1030768f2ae0 (patch)
tree02ff11a63d2ded733664511e1471a911b1adb561
parentad659c39b0812a2947b358466a33f9ee0f78f522 (diff)
[IMP] translate: make `xml_translate` use an HTML parser when XML parsing fails
-rw-r--r--openerp/tools/mail.py2
-rw-r--r--openerp/tools/translate.py18
2 files changed, 15 insertions, 5 deletions
diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py
index 43d51705349..697a0301a06 100644
--- a/openerp/tools/mail.py
+++ b/openerp/tools/mail.py
@@ -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'
])
diff --git a/openerp/tools/translate.py b/openerp/tools/translate.py
index 8517e39108c..5b65f3a57cc 100644
--- a/openerp/tools/translate.py
+++ b/openerp/tools/translate.py
@@ -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]
#