def get_css_class_dict(node):
"""
Given an xml.dom.minidom.Node, returns a map from every "class" attribute
from it to a list of nodes with this class.
For example, for the document below:
>>> doc = xml.dom.minidom.parseString(
... '''
...
...
...
...
...
... ''')
...we will get this:
>>> d = get_css_class_dict(doc)
>>> d['a'] # doctest: +ELLIPSIS
[, ]
>>> d['b'] # doctest: +ELLIPSIS
[]
"""
css_class_dict = {}
if node.attributes is not None and 'class' in node.attributes:
css_classes = node.attributes['class'].value
for css_class in css_classes.split():
css_class_list = css_class_dict.get(css_class, [])
css_class_list.append(node)
css_class_dict[css_class] = css_class_list
childNodes = getattr(node, 'childNodes', [])
for cn in childNodes:
ccd = get_css_class_dict(cn)
for css_class, nodes_list in ccd.items():
css_class_list = css_class_dict.get(css_class, [])
css_class_list.extend(nodes_list)
css_class_dict[css_class] = css_class_list
return css_class_dict