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
This commit is contained in:
Goffi 2017-01-03 18:51:50 +01:00
commit 791be3a4ad
2 changed files with 12 additions and 6 deletions

View file

@ -282,7 +282,7 @@ class BlogImportPlugin(object):
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

View file

@ -1405,19 +1405,25 @@ def getText(node):
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