changeset 1817:7ef0f5f90862

core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
author Goffi <goffi@goffi.org>
date Fri, 22 Jan 2016 20:24:17 +0100
parents 2a030a830ebd
children 7e6342de71fb
files src/plugins/plugin_xep_0277.py src/tools/xml_tools.py
diffstat 2 files changed, 25 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/plugin_xep_0277.py	Tue Jan 19 14:59:13 2016 +0100
+++ b/src/plugins/plugin_xep_0277.py	Fri Jan 22 20:24:17 2016 +0100
@@ -361,20 +361,18 @@
                     elem = entry_elt.addElement(elem_name)
                     if type_:
                         if type_ == '_rich':  # convert input from current syntax to XHTML
-                            converted = yield synt.convert(data[attr], synt.getCurrentSyntax(profile), "XHTML")
+                            xml_content = yield synt.convert(data[attr], synt.getCurrentSyntax(profile), "XHTML")
                             if '{}_xhtml'.format(elem_name) in data:
                                 raise failure.Failure(exceptions.DataError(_("Can't have xhtml and rich content at the same time")))
+                        else:
+                            xml_content = data[attr]
 
-                        xml_content = u'<div xmlns="{ns}">{converted}</div>'.format(
-                                        ns=NS_XHTML,
-                                        converted=converted)
-                        div_elt = xml_tools.ElementParser()(xml_content)
-                        if len(div_elt.children) == 1:
-                            # if we have two <div> wrapping the content,
-                            # we remove the one we have just added
-                            child = div_elt.children[0]
-                            if child.name == 'div' and not child.attributes and child.uri == div_elt.uri:
-                                div_elt = child
+                        div_elt = xml_tools.ElementParser()(xml_content, namespace=NS_XHTML)
+                        if div_elt.name != 'div' or div_elt.uri != NS_XHTML or div_elt.attributes:
+                            # we need a wrapping <div/> at the top with XHTML namespace
+                            wrap_div_elt = domish.Element((NS_XHTML, 'div'))
+                            wrap_div_elt.addChild(div_elt)
+                            div_elt = wrap_div_elt
                         elem.addChild(div_elt)
                         elem['type'] = 'xhtml'
                         if elem_name not in data:
--- a/src/tools/xml_tools.py	Tue Jan 19 14:59:13 2016 +0100
+++ b/src/tools/xml_tools.py	Fri Jan 22 20:24:17 2016 +0100
@@ -1326,11 +1326,19 @@
     (c) Karl Anderson
     """
 
-    def __call__(self, raw_xml, force_spaces=False):
+    def __call__(self, raw_xml, force_spaces=False, namespace=None):
         """
         @param raw_xml(unicode): the raw XML
-        @param force_spaces: if True, replace occurrences of '\n' and '\t' with ' '.
+        @param force_spaces (bool): if True, replace occurrences of '\n' and '\t' with ' '.
+        @param namespace(unicode, None): if set, use this namespace for the wrapping element
         """
+        # we need to wrap element in case
+        # there is not a unique one on the top
+        if namespace is not None:
+            raw_xml = u"<div xmlns='{}'>{}</div>".format(namespace, raw_xml)
+        else:
+            raw_xml = u"<div>{}</div>".format(raw_xml)
+
         self.result = None
 
         def onStart(elem):
@@ -1351,7 +1359,12 @@
             raw_xml = raw_xml.replace('\n', ' ').replace('\t', ' ')
         tmp.addRawXml(raw_xml)
         parser.parse(tmp.toXml().encode('utf-8'))
-        return self.result.firstChildElement()
+        top_elt = self.result.firstChildElement()
+        # we now can check if there was a unique element on the top
+        # and remove our wrapping <div/> is this was the case
+        if len(top_elt.children) == 1:
+            top_elt = top_elt.firstChildElement()
+        return top_elt
 
 
 # FIXME: this method is duplicated from frontends.tools.xmlui.getText