Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@lundberg
Created December 17, 2013 11:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lundberg/8003494 to your computer and use it in GitHub Desktop.
Save lundberg/8003494 to your computer and use it in GitHub Desktop.
Djedi CMS jinja2 node tag
# coding=utf-8
from string import strip
import textwrap
import cio
from djedi.templatetags.djedi_tags import render_node
from jinja2 import nodes
from jinja2.ext import Extension
from jinja2.filters import do_mark_safe
from jinja2.nodes import Name, Const
class DjediNodeExtension(Extension):
tags = set(['node', 'blocknode'])
def parse(self, parser):
tag_name = parser.stream.current.value
lineno = parser.stream.next().lineno
args, kwargs = self.parse_args(parser)
uri = args[0]
body = []
if tag_name == 'blocknode':
body = parser.parse_statements(['name:endblocknode'], drop_needle=True)
default = body[0].nodes[0].data
default = default.strip('\n\r')
default = textwrap.dedent(default)
const_body = Const(default)
kwargs.append(nodes.Keyword('default', const_body, lineno=const_body.lineno))
call_method = self.call_method('_render', args=[uri], kwargs=kwargs).set_lineno(lineno)
return nodes.CallBlock(call_method, [], [], body)
def parse_args(self, parser):
args = []
kwargs = []
require_comma = False
while parser.stream.current.type != 'block_end':
if require_comma:
parser.stream.expect('comma')
if parser.stream.current.type == 'name' and parser.stream.look().type == 'assign':
key = parser.stream.current.value
parser.stream.skip(2)
value = parser.parse_expression()
kwargs.append(nodes.Keyword(key, value, lineno=value.lineno))
else:
if kwargs:
parser.fail('Invalid argument syntax for Djedi tag',
parser.stream.current.lineno)
args.append(parser.parse_expression())
require_comma = True
return args, kwargs
def _render(self, uri, caller=None, **kwargs):
default = kwargs.get('default')
node = cio.get(uri, default=default)
edit = kwargs.pop('edit', True)
return do_mark_safe(render_node(node, context=kwargs, edit=edit))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment