Skip to content

Commit

Permalink
[#2501] custom url_for tag added
Browse files Browse the repository at this point in the history
  • Loading branch information
tobes committed Jun 8, 2012
1 parent 253267a commit 90d757f
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
4 changes: 3 additions & 1 deletion ckan/config/environment.py
Expand Up @@ -195,7 +195,9 @@ def template_loaded(template):
env = config['pylons.app_globals'].jinja_env = Environment(
loader=PackageLoader('ckan', 'templates'),
autoescape=True,
extensions=['jinja2.ext.i18n', 'jinja2.ext.do', lib.jinja_tags.SnippetExtension]
extensions=['jinja2.ext.i18n', 'jinja2.ext.do',
lib.jinja_tags.SnippetExtension,
lib.jinja_tags.UrlForExtension]
)
env.install_gettext_callables(_, N_, newstyle=True)
config['pylons.app_globals'].jinja_env = env
Expand Down
40 changes: 39 additions & 1 deletion ckan/lib/jinja_tags.py
Expand Up @@ -2,12 +2,13 @@
from jinja2.ext import Extension

import lib.base as base
import lib.helpers as h


class SnippetExtension(Extension):
''' Custom snippet tag
{% snippet template_name> [, <keyword>=<value>].. %}
{% snippet <template_name> [, <keyword>=<value>].. %}
This is mostly magic..
'''
Expand Down Expand Up @@ -40,3 +41,40 @@ def make_call_node(*kw):
def _render(cls, template_name, kwargs):
return base.render_snippet(template_name, **kwargs)




class UrlForExtension(Extension):

tags = set(['url_for'])

def parse(self, parser):
stream = parser.stream
tag = stream.next()
# get arguments
args = []
kwargs = []
stream.expect('lparen')
while stream.current.type != 'rparen':
if args or kwargs:
stream.expect('comma')
if stream.current.test('name') and stream.look().test('assign'):
key = nodes.Const(stream.next().value)
stream.skip()
value = parser.parse_expression()
kwargs.append(nodes.Pair(key, value, lineno=key.lineno))
else:
args.append(parser.parse_expression())
stream.expect('rparen')

def make_call_node(*kw):
return self.call_method('_url_for', args=[
nodes.List(args),
nodes.Dict(kwargs),
], kwargs=kw)

return nodes.Output([make_call_node()]).set_lineno(tag.lineno)

@classmethod
def _url_for(cls, args, kwargs):
return h.url_for(*args, **kwargs)

0 comments on commit 90d757f

Please sign in to comment.