[ADD] tools.misc: new function append_to_html, can be used to inject blocks (html...
authorOlivier Dony <odo@openerp.com>
Fri, 31 Aug 2012 13:23:37 +0000 (15:23 +0200)
committerOlivier Dony <odo@openerp.com>
Fri, 31 Aug 2012 13:23:37 +0000 (15:23 +0200)
bzr revid: odo@openerp.com-20120831132337-of2p1wlh5l4lpvez

openerp/tests/__init__.py
openerp/tests/test_misc.py [new file with mode: 0644]
openerp/tools/misc.py

index d3ab62e..aa3055f 100644 (file)
@@ -9,7 +9,7 @@ See the :ref:`test-framework` section in the :ref:`features` list.
 """
 
 from . import test_expression, test_html_sanitize, test_ir_sequence, test_orm,\
-              test_view_validation, test_uninstall
+              test_view_validation, test_uninstall, test_misc
 
 fast_suite = [
     test_ir_sequence,
@@ -20,6 +20,7 @@ checks = [
     test_html_sanitize,
     test_orm,
     test_view_validation,
+    test_misc,
 ]
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/tests/test_misc.py b/openerp/tests/test_misc.py
new file mode 100644 (file)
index 0000000..7661f25
--- /dev/null
@@ -0,0 +1,21 @@
+# This test can be run stand-alone with something like:
+# > PYTHONPATH=. python2 openerp/tests/test_misc.py
+
+import unittest2
+
+class test_misc(unittest2.TestCase):
+    """ Test some of our generic utility functions """
+
+    def test_append_to_html(self):
+        from openerp.tools import append_content_to_html
+        test_samples = [
+            ('<!DOCTYPE...><HTML encoding="blah">some <b>content</b></HtMl>', '--\nYours truly', True,
+             '<!DOCTYPE...><html encoding="blah">some <b>content</b>\n<pre>--\nYours truly</pre>\n</html>'),
+            ('<html><body>some <b>content</b></body></html>', '<!DOCTYPE...>\n<html><body>\n<p>--</p>\n<p>Yours truly</p>\n</body>\n</html>', False,
+             '<html><body>some <b>content</b>\n\n\n<p>--</p>\n<p>Yours truly</p>\n\n\n</body></html>'),
+        ]
+        for html, content, flag, expected in test_samples:
+            self.assertEqual(append_content_to_html(html,content,flag), expected, 'append_content_to_html is broken')
+
+if __name__ == '__main__':
+    unittest2.main()
\ No newline at end of file
index e86f189..39e86b1 100644 (file)
@@ -400,6 +400,37 @@ def email_split(text):
     if not text: return []
     return re.findall(r'([^ ,<@]+@[^> ,]+)', text)
 
+def append_content_to_html(html, content, plaintext=True):
+    """Append extra content at the end of an HTML snippet, trying
+       to locate the end of the HTML document (</body>, </html>, or
+       EOF), and wrapping the provided content in a <pre/> block
+       unless ``plaintext`` is False. A side-effect of this
+       method is to coerce all HTML tags to lowercase in ``html``,
+       and strips enclosing <html> or <body> tags in content if
+       ``plaintext`` is False.
+       
+       :param str html: html tagsoup (doesn't have to be XHTML)
+       :param str content: extra content to append
+       :param bool plaintext: whether content is plaintext and should
+           be wrapped in a <pre/> tag.
+    """
+    html = ustr(html)
+    if plaintext:
+        content = u'\n<pre>%s</pre>\n' % ustr(content)
+    else:
+        content = re.sub(r'(?i)(</?html.*>|</?body.*>|<!\W*DOCTYPE.*>)', '', content)
+        content = u'\n%s\n'% ustr(content)
+    # Force all tags to lowercase
+    html = re.sub(r'(</?)\W*(\w+)([ >])',
+        lambda m: '%s%s%s' % (m.group(1),m.group(2).lower(),m.group(3)), html)
+    insert_location = html.find('</body>')
+    if insert_location == -1:
+        insert_location = html.find('</html>')
+    if insert_location == -1:
+        return '%s%s' % (html, content)
+    return '%s%s%s' % (html[:insert_location], content, html[insert_location:])  
+
+
 #----------------------------------------------------------
 # SMS
 #----------------------------------------------------------