| """Utilities.""" | |
| def commonancestors(*nodes): | |
| """ | |
| Determine common ancestors of `nodes`. | |
| >>> from anytree import Node, util | |
| >>> udo = Node("Udo") | |
| >>> marc = Node("Marc", parent=udo) | |
| >>> lian = Node("Lian", parent=marc) | |
| >>> dan = Node("Dan", parent=udo) | |
| >>> jet = Node("Jet", parent=dan) | |
| >>> jan = Node("Jan", parent=dan) | |
| >>> joe = Node("Joe", parent=dan) | |
| >>> util.commonancestors(jet, joe) | |
| (Node('/Udo'), Node('/Udo/Dan')) | |
| >>> util.commonancestors(jet, marc) | |
| (Node('/Udo'),) | |
| >>> util.commonancestors(jet) | |
| (Node('/Udo'), Node('/Udo/Dan')) | |
| >>> util.commonancestors() | |
| () | |
| """ | |
| ancestors = [node.ancestors for node in nodes] | |
| common = [] | |
| for parentnodes in zip(*ancestors): | |
| parentnode = parentnodes[0] | |
| if all(parentnode is p for p in parentnodes[1:]): | |
| common.append(parentnode) | |
| else: | |
| break | |
| return tuple(common) | |
| def leftsibling(node): | |
| """ | |
| Return Left Sibling of `node`. | |
| >>> from anytree import Node, util | |
| >>> dan = Node("Dan") | |
| >>> jet = Node("Jet", parent=dan) | |
| >>> jan = Node("Jan", parent=dan) | |
| >>> joe = Node("Joe", parent=dan) | |
| >>> print(util.leftsibling(dan)) | |
| None | |
| >>> print(util.leftsibling(jet)) | |
| None | |
| >>> print(util.leftsibling(jan)) | |
| Node('/Dan/Jet') | |
| >>> print(util.leftsibling(joe)) | |
| Node('/Dan/Jan') | |
| """ | |
| if node.parent: | |
| pchildren = node.parent.children | |
| idx = pchildren.index(node) | |
| if idx: | |
| return pchildren[idx - 1] | |
| return None | |
| def rightsibling(node): | |
| """ | |
| Return Right Sibling of `node`. | |
| >>> from anytree import Node, util | |
| >>> dan = Node("Dan") | |
| >>> jet = Node("Jet", parent=dan) | |
| >>> jan = Node("Jan", parent=dan) | |
| >>> joe = Node("Joe", parent=dan) | |
| >>> print(util.rightsibling(dan)) | |
| None | |
| >>> print(util.rightsibling(jet)) | |
| Node('/Dan/Jan') | |
| >>> print(util.rightsibling(jan)) | |
| Node('/Dan/Joe') | |
| >>> print(util.rightsibling(joe)) | |
| None | |
| """ | |
| if node.parent: | |
| pchildren = node.parent.children | |
| idx = pchildren.index(node) | |
| try: | |
| return pchildren[idx + 1] | |
| except IndexError: | |
| return None | |
| else: | |
| return None | |