diff options
| author | Raphael Collet <rco@openerp.com> | 2015-05-13 14:32:05 +0200 |
|---|---|---|
| committer | Raphael Collet <rco@openerp.com> | 2015-07-06 16:58:04 +0200 |
| commit | 1ea32f1daf062bda7a1c6742ebeb1030768f2ae0 (patch) | |
| tree | 02ff11a63d2ded733664511e1471a911b1adb561 | |
| parent | ad659c39b0812a2947b358466a33f9ee0f78f522 (diff) | |
[IMP] translate: make `xml_translate` use an HTML parser when XML parsing fails
| -rw-r--r-- | openerp/tools/mail.py | 2 | ||||
| -rw-r--r-- | 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 = "<div>%s</div>" % value + root = etree.fromstring(wrapped, etree.HTMLParser()) + # html > body > div + trans.process(root[0][0]) + return trans.get_done()[5:-6] # |
