From 9687eb3d8434a09b5f564b49eaa8bb8e88ff9d1c Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 17 Nov 2015 14:53:02 +0100 Subject: [PATCH] [FIX] translate: fix `xml_translate` to use an HTML parser as a fallback When terms are translated in the website, their values are sent as HTML (with text entities escaped). The function `xml_translate` is used to sanitize those values, and sometimes crashes because of non-closed entities like `
`. Fix it by using an HTML parser as a fallback. This is a partial revert of 6c8e53a08705b948833fa58d3c5dc182ebb889c4. --- openerp/addons/base/tests/test_translate.py | 7 ------- openerp/tools/translate.py | 9 +++++---- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/tests/test_translate.py b/openerp/addons/base/tests/test_translate.py index 95b306e1837..8aab490e0fa 100644 --- a/openerp/addons/base/tests/test_translate.py +++ b/openerp/addons/base/tests/test_translate.py @@ -50,13 +50,6 @@ class TranslationToolsTestCase(unittest.TestCase): self.assertEquals(result, source) self.assertItemsEqual(terms, [source]) - def test_translate_xml_text_entity_unescaped(self): - """ Test xml_translate() on plain text with HTML entities. """ - terms = [] - source = "Blah blah blah" - with self.assertRaises(XMLSyntaxError): - xml_translate(terms.append, source) - def test_translate_xml_text_entity(self): """ Test xml_translate() on plain text with HTML escaped entities. """ terms = [] diff --git a/openerp/tools/translate.py b/openerp/tools/translate.py index 07b587d1467..7a5f6452fa2 100644 --- a/openerp/tools/translate.py +++ b/openerp/tools/translate.py @@ -271,10 +271,11 @@ def xml_translate(callback, value): trans.process(root) return trans.get_done() except etree.ParseError: - # fallback in case it is a translated term... - root = etree.fromstring("
%s
" % encode(value)) - trans.process(root) - return trans.get_done()[5:-6] # remove tags
and
+ # fallback for translated terms: use an HTML parser and wrap the term + wrapped = "
%s
" % encode(value) + root = etree.fromstring(wrapped, etree.HTMLParser(encoding='utf-8')) + trans.process(root[0][0]) # html > body > div + return trans.get_done()[5:-6] # remove tags
and
def html_translate(callback, value): """ Translate an HTML value (string), using `callback` for translating text