X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/f7ea1694cd74b49f8220e422291830a758521824..91ff82666d936433802979e3051a363ae131ce13:/utils.py diff --git a/utils.py b/utils.py index deb009c..a968ac8 100644 --- a/utils.py +++ b/utils.py @@ -124,27 +124,31 @@ setattr(ExtendsNode, LOADED_TEMPLATE_ATTR, property(get_extended)) setattr(ConstantIncludeNode, LOADED_TEMPLATE_ATTR, property(get_included)) -def nodelist_crawl(nodelist, callback): - """This function crawls through a template's nodelist and the nodelists of any included or extended - templates, as determined by the presence and value of on a node. Each node - will also be passed to a callback function for additional processing.""" - results = [] +def default_callback(node, result_list): + result_list.append(node) + + if hasattr(node, 'child_nodelists'): + for nodelist_name in node.child_nodelists: + if hasattr(node, nodelist_name): + nodelist_crawl(getattr(node, nodelist_name), default_callback) + + # LOADED_TEMPLATE_ATTR contains the name of an attribute philo uses to declare a + # node as rendering an additional template. Philo monkeypatches the attribute onto + # the relevant default nodes and declares it on any native nodes. + if hasattr(node, LOADED_TEMPLATE_ATTR): + loaded_template = getattr(node, LOADED_TEMPLATE_ATTR) + if loaded_template: + nodelist_crawl(loaded_template.nodelist, default_callback) + + +def nodelist_crawl(nodelist, callback=default_callback, *args, **kwargs): + """This function crawls through a template's nodelist and the + nodelists of any included or extended templates, as determined by + the presence and value of on a node. Each + node will also be passed to a callback function for additional + processing, along with any additional args and kwargs.""" for node in nodelist: try: - if hasattr(node, 'child_nodelists'): - for nodelist_name in node.child_nodelists: - if hasattr(node, nodelist_name): - results.extend(nodelist_crawl(getattr(node, nodelist_name), callback)) - - # LOADED_TEMPLATE_ATTR contains the name of an attribute philo uses to declare a - # node as rendering an additional template. Philo monkeypatches the attribute onto - # the relevant default nodes and declares it on any native nodes. - if hasattr(node, LOADED_TEMPLATE_ATTR): - loaded_template = getattr(node, LOADED_TEMPLATE_ATTR) - if loaded_template: - results.extend(nodelist_crawl(loaded_template.nodelist, callback)) - - callback(node, results) + callback(node, *args, **kwargs) except: - raise # fail for this node - return results \ No newline at end of file + raise # fail for this node \ No newline at end of file