def wrap_code_elements(tree): """ Find all the <xsdxt:code> nodes and make sure they are wrapped by <xsdxt:sample> nodes. """ # grab all the param nodes code_nodes = tree.find("xsdxt:code") for node in code_nodes: parent = node.parent sample_node = None if node.parent.name == "xsdxt:sample": continue # try to find a xsdxt:sample node on the parent for sibling in parent.children: if sibling.name == "xsdxt:sample": sample_node = sibling break # no xsdxt:sample node, so add one if sample_node is None: sample_node = BaseNode(parent, "xsdxt:sample", {}) parent.add_child(sample_node) # now move the node under the params node node.parent = sample_node sample_node.add_child(node) parent.remove_child(node)
def collapse_resources(tree): """ In the input wadl, the resource uris are split out into a nested structure with each resource slug having it's own level. For the output, we only care about the methods that can be done on resources. """ # grab all the resources nodes with method nodes under them. resource_nodes = [] resource_visitor = functools.partial(get_resource_nodes, resource_nodes) tree.visit(resource_visitor) # setup the path for each node properly for node in resource_nodes: setup_node_path(node) # remove each node from the tree for node in reversed(resource_nodes): node.parent.remove_child(node) node.parent = None resources_node = tree.find_first("resources") # if there is no <resources> node on the page, add one. if resources_node is None: resources_node = BaseNode(tree, "resources", {}) tree.add_child(resources_node) resources_node.children = [] # setup the resources nodes in their proper place for node in resource_nodes: resources_node.add_child(node) node.parent = resources_node # remove any param nodes not nested in params param_nodes = [] param_visitor = functools.partial(get_param_nodes, param_nodes) tree.visit(param_visitor) for node in set(param_nodes): node.parent.remove_child(node) node.parent = None # remove any resource nodes with no method children empty_resources = [] empty_resource_visitor = functools.partial(get_empty_resource_nodes, empty_resources) tree.visit(empty_resource_visitor) for node in empty_resources: node.parent.remove_child(node)
def start_element(self, name, attrs): if name in self.node_mapping: node = self.node_mapping[name](self.current, name, attrs) else: node = BaseNode(self.current, name, attrs) self.current.children.append(node) self.current = node
def __init__(self): self.root = BaseNode(None, "root", {}) self.current = self.root