django-navtag-2.1.2/0000755000175000017500000000000013160621452014476 5ustar chrischris00000000000000django-navtag-2.1.2/setup.cfg0000664000175000017500000000010313160621452016313 0ustar chrischris00000000000000[bdist_wheel] universal = 1 [egg_info] tag_build = tag_date = 0 django-navtag-2.1.2/django_navtag/0000755000175000017500000000000013160621452017300 5ustar chrischris00000000000000django-navtag-2.1.2/django_navtag/templatetags/0000755000175000017500000000000013160621452021772 5ustar chrischris00000000000000django-navtag-2.1.2/django_navtag/templatetags/navtag.py0000644000175000017500000001224413160615712023631 0ustar chrischris00000000000000from django import template from django.utils import six, safestring from django.utils.encoding import smart_str, python_2_unicode_compatible register = template.Library() @python_2_unicode_compatible class Nav(object): def __init__(self, tree=None, root=None): self._root = root or self self._tree = tree or {} def __getitem__(self, key): return Nav(self._tree[key], root=self._root) def __str__(self): return safestring.mark_safe(six.text_type(self._text)) def __nonzero__(self): return bool(self._tree) # Python 3 equivalent. __bool__ = __nonzero__ def _get_text(self): if hasattr(self._root, '_text_value'): return self._root._text_value return self._tree def _set_text(self, value): self._root._text_value = value _text = property(_get_text, _set_text) def clear(self): self._tree = {} def update(self, *args, **kwargs): self._tree.update(*args, **kwargs) class NavNode(template.Node): def __init__(self, item=None, var_for=None, var_text=None): self.item = item self.var_name = var_for or 'nav' self.text = var_text def render(self, context): first_context_stack = context.dicts[0] nav = first_context_stack.get(self.var_name) if nav is not context.get(self.var_name): raise template.TemplateSyntaxError( "'{0}' variable has been altered in current context" .format(self.var_name)) if not isinstance(nav, Nav): nav = Nav() # Copy the stack to avoid leaking into other contexts. new_first_context_stack = first_context_stack.copy() new_first_context_stack[self.var_name] = nav context.dicts[0] = new_first_context_stack if self.text: nav._text = self.text.resolve(context) return '' # If self.item was blank then there's nothing else to do here. if not self.item: return '' if nav: # If the nav variable is already set, don't do anything. return '' item = self.item.resolve(context) item = item and smart_str(item) value = True if not item: item = '' for part in reversed(item.split('.')): new_item = {} new_item[part] = value value = new_item nav.clear() nav.update(new_item) return '' def __repr__(self): return "