changeset 2108:70f23bc7859b

core (xml_tools): fixed findAll - names and namespases arguments haven been inverted to be in the same order as for domish.Element.elements - fixed bad copy of elements in recursions - check if childrens are IElements - namespaces and names can now be basestrings instead of iterables
author Goffi <goffi@goffi.org>
date Tue, 03 Jan 2017 18:51:50 +0100 (2017-01-03)
parents 2c31ddf633e5
children 85f3e12e984d
files src/plugins/plugin_blog_import.py src/tools/xml_tools.py
diffstat 2 files changed, 12 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/plugin_blog_import.py	Sun Jan 01 16:39:26 2017 +0100
+++ b/src/plugins/plugin_blog_import.py	Tue Jan 03 18:51:50 2017 +0100
@@ -282,7 +282,7 @@
         tmp_dir = tempfile.mkdtemp()
         try:
             # TODO: would be nice to also update the hyperlinks to these images, e.g. when you have <a href="{url}"><img src="{url}"></a>
-            for img_elt in xml_tools.findAll(top_elt, ['img']):
+            for img_elt in xml_tools.findAll(top_elt, names=[u'img']):
                 yield self.imgFilters(client, img_elt, options, opt_host, tmp_dir)
         finally:
             os.rmdir(tmp_dir) # XXX: tmp_dir should be empty, or something went wrong
--- a/src/tools/xml_tools.py	Sun Jan 01 16:39:26 2017 +0100
+++ b/src/tools/xml_tools.py	Tue Jan 03 18:51:50 2017 +0100
@@ -1405,19 +1405,25 @@
             data.append(child.wholeText)
     return u"".join(data)
 
-def findAll(elt, names=None, namespaces=None):
+def findAll(elt, namespaces=None, names=None, ):
     """Find child element at any depth matching criteria
 
     @param elt(domish.Element): top parent of the elements to find
-    @param names(iterable, None): names to match
+    @param names(iterable[unicode], basestring, None): names to match
         None to accept every names
-    @param namespace(unicode): URIs to match
+    @param namespace(iterable[unicode], basestring, None): URIs to match
         None to accept every namespaces
+    @return ((G)domish.Element): found elements
     """
+    if isinstance(namespaces, basestring):
+        namespaces=tuple((namespaces,))
+    if isinstance(names, basestring):
+        names=tuple((names,))
 
     for child in elt.elements():
-        if ((not names or child.name in names) and
+        if (domish.IElement.providedBy(child) and
+            (not names or child.name in names) and
             (not namespaces or child.uri in namespaces)):
             yield child
-        for found in findAll(child, names):
+        for found in findAll(child, namespaces, names):
             yield found