From 1ea32f1daf062bda7a1c6742ebeb1030768f2ae0 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 13 May 2015 14:32:05 +0200 Subject: [PATCH] [IMP] translate: make `xml_translate` use an HTML parser when XML parsing fails --- openerp/tools/mail.py | 2 +- openerp/tools/translate.py | 18 ++++++++++++++---- 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 = "
%s
" % value + root = etree.fromstring(wrapped, etree.HTMLParser()) + # html > body > div + trans.process(root[0][0]) + return trans.get_done()[5:-6] #