Armin Ronacher | 0553093 | 2008-04-20 13:27:49 +0200 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
| 2 | """ |
| 3 | jinja2.ext |
| 4 | ~~~~~~~~~~ |
| 5 | |
| 6 | Jinja extensions (EXPERIMENAL) |
| 7 | |
| 8 | The plan: i18n and caching becomes a parser extension. cache/endcache |
| 9 | as well as trans/endtrans are not keyword and don't have nodes but |
| 10 | translate into regular jinja nodes so that the person who writes such |
| 11 | custom tags doesn't have to generate python code himself. |
| 12 | |
| 13 | :copyright: Copyright 2008 by Armin Ronacher. |
| 14 | :license: BSD. |
| 15 | """ |
| 16 | from jinja2 import nodes |
| 17 | |
| 18 | |
| 19 | class Extension(object): |
| 20 | """Instances of this class store parser extensions.""" |
| 21 | |
| 22 | #: if this extension parses this is the list of tags it's listening to. |
| 23 | tags = set() |
| 24 | |
| 25 | def __init__(self, environment): |
| 26 | self.environment = environment |
| 27 | |
| 28 | def update_globals(self, globals): |
| 29 | """Called to inject runtime variables into the globals.""" |
| 30 | pass |
| 31 | |
| 32 | def parse(self, parser): |
| 33 | """Called if one of the tags matched.""" |
| 34 | |
| 35 | |
| 36 | class CacheExtension(Extension): |
Armin Ronacher | 2b60fe5 | 2008-04-21 08:23:59 +0200 | [diff] [blame] | 37 | """An example extension that adds cacheable blocks.""" |
Armin Ronacher | 0553093 | 2008-04-20 13:27:49 +0200 | [diff] [blame] | 38 | tags = set(['cache']) |
| 39 | |
| 40 | def parse(self, parser): |
| 41 | lineno = parser.stream.next().lineno |
| 42 | args = [parser.parse_expression()] |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 43 | if parser.stream.current.type is 'comma': |
| 44 | parser.stream.next() |
Armin Ronacher | 0553093 | 2008-04-20 13:27:49 +0200 | [diff] [blame] | 45 | args.append(parser.parse_expression()) |
| 46 | body = parser.parse_statements(('name:endcache',), drop_needle=True) |
| 47 | return nodes.CallBlock( |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 48 | nodes.Call(nodes.Name('cache_support', 'load'), args, [], None, None), |
Armin Ronacher | 0553093 | 2008-04-20 13:27:49 +0200 | [diff] [blame] | 49 | [], [], body |
| 50 | ) |