Mercurial > piecrust2
annotate piecrust/templating/jinjaengine.py @ 446:4cdf6c2157a0
bug: Fix infinite loop in Jinja2 rendering.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 02 Jul 2015 23:28:24 -0700 |
parents | d8d86debea81 |
children | 96d363e2da4b |
rev | line source |
---|---|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import re |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import time |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
3 import os.path |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import logging |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
5 import threading |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
6 import email.utils |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 import strict_rfc3339 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 from jinja2 import Environment, FileSystemLoader, TemplateNotFound |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 from jinja2.exceptions import TemplateSyntaxError |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 from jinja2.ext import Extension, Markup |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
11 from jinja2.lexer import Token, describe_token |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 from jinja2.nodes import CallBlock, Const |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
13 from compressinja.html import HtmlCompressor, StreamProcessContext |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 from pygments import highlight |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 from pygments.formatters import HtmlFormatter |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 from pygments.lexers import get_lexer_by_name, guess_lexer |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
17 from piecrust.data.paginator import Paginator |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 from piecrust.rendering import format_text |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 from piecrust.routing import CompositeRouteFunction |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
20 from piecrust.templating.base import (TemplateEngine, TemplateNotFoundError, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
21 TemplatingError) |
298
b7ab1b503510
data: Fix incorrect next/previous page URLs in pagination data.
Ludovic Chabant <ludovic@chabant.com>
parents:
293
diff
changeset
|
22 from piecrust.uriutil import multi_replace, split_sub_uri |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 logger = logging.getLogger(__name__) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 class JinjaTemplateEngine(TemplateEngine): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 # Name `twig` is for backwards compatibility with PieCrust 1.x. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 ENGINE_NAMES = ['jinja', 'jinja2', 'twig'] |
395
9e25852f058b
jinja: Look for `html` extension first instead of last.
Ludovic Chabant <ludovic@chabant.com>
parents:
356
diff
changeset
|
31 EXTENSIONS = ['html', 'jinja', 'jinja2', 'twig'] |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 def __init__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 self.env = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
36 def renderString(self, txt, data, filename=None): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 self._ensureLoaded() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
38 |
445
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
39 do_render = False |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
40 index = txt.find('{') |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
41 while index >= 0: |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
42 ch = txt[index + 1] |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
43 if ch == '{' or ch == '%': |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
44 do_render = True |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
45 break |
446
4cdf6c2157a0
bug: Fix infinite loop in Jinja2 rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
445
diff
changeset
|
46 index = txt.find('{', index + 1) |
445
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
47 |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
48 if not do_render: |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
49 return txt |
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
50 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
51 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
52 tpl = self.env.from_string(txt) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
53 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
54 raise self._getTemplatingError(tse, filename=filename) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
55 except TemplateNotFound: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
56 raise TemplateNotFoundError() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
57 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 return tpl.render(data) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 except TemplateSyntaxError as tse: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
61 raise self._getTemplatingError(tse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 def renderFile(self, paths, data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 self._ensureLoaded() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 tpl = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 logger.debug("Looking for template: %s" % paths) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 for p in paths: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 tpl = self.env.get_template(p) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 break |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
71 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
72 raise self._getTemplatingError(tse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 except TemplateNotFound: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 pass |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
75 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 if tpl is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 raise TemplateNotFoundError() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
78 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
79 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
80 return tpl.render(data) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
81 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
82 raise self._getTemplatingError(tse) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
83 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
84 def _getTemplatingError(self, tse, filename=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
85 filename = tse.filename or filename |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
86 if filename and os.path.isabs(filename): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
87 filename = os.path.relpath(filename, self.env.app.root_dir) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
88 err = TemplatingError(str(tse), filename, tse.lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
89 raise err from tse |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 def _ensureLoaded(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 if self.env: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 return |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
94 |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
95 autoescape = self.app.config.get('jinja/auto_escape') |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
96 if autoescape is None: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
97 autoescape = self.app.config.get('twig/auto_escape') |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
98 if autoescape is None: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
99 autoescape = True |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
100 |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
101 logger.debug("Creating Jinja environment with folders: %s" % |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
102 self.app.templates_dirs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 loader = FileSystemLoader(self.app.templates_dirs) |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
104 extensions = [ |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
105 PieCrustHighlightExtension, |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
106 PieCrustCacheExtension, |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
107 PieCrustSpacelessExtension, |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
108 PieCrustFormatExtension] |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
109 if autoescape: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
110 extensions.append('jinja2.ext.autoescape') |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 self.env = PieCrustEnvironment( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 self.app, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 loader=loader, |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
114 extensions=extensions) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 class PieCrustEnvironment(Environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 def __init__(self, app, *args, **kwargs): |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
119 self.app = app |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
120 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
121 # Before we create the base Environement, let's figure out the options |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
122 # we want to pass to it. |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
123 twig_compatibility_mode = app.config.get('jinja/twig_compatibility') |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
124 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
125 # Disable auto-reload when we're baking. |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
126 if app.config.get('baker/is_baking'): |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
127 kwargs.setdefault('auto_reload', False) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
128 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
129 # Let the user override most Jinja options via the site config. |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
130 for name in ['block_start_string', 'block_end_string', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
131 'variable_start_string', 'variable_end_string', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
132 'comment_start_string', 'comment_end_string', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
133 'line_statement_prefix', 'line_comment_prefix', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
134 'trim_blocks', 'lstrip_blocks', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
135 'newline_sequence', 'keep_trailing_newline']: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
136 val = app.config.get('jinja/' + name) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
137 if val is not None: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
138 kwargs.setdefault(name, val) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
139 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
140 # Twig trims blocks. |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
141 if twig_compatibility_mode is True: |
288
078e64dba77d
jinja: Fix Twig compatibility for block trimming.
Ludovic Chabant <ludovic@chabant.com>
parents:
274
diff
changeset
|
142 kwargs['trim_blocks'] = True |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
143 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
144 # All good! Create the Environment. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 super(PieCrustEnvironment, self).__init__(*args, **kwargs) |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
146 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
147 # Now add globals and filters. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 self.globals.update({ |
293
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
149 'fail': raise_exception, |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
150 'highlight_css': get_highlight_css}) |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
151 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 self.filters.update({ |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
153 'keys': get_dict_keys, |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
154 'values': get_dict_values, |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
155 'paginate': self._paginate, |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 'formatwith': self._formatWith, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 'markdown': lambda v: self._formatWith(v, 'markdown'), |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 'textile': lambda v: self._formatWith(v, 'textile'), |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 'nocache': add_no_cache_parameter, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 'wordcount': get_word_count, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 'stripoutertag': strip_outer_tag, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 'stripslash': strip_slash, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 'titlecase': title_case, |
356
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
164 'atomdate': get_xml_date, |
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
165 'xmldate': get_xml_date, |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
166 'emaildate': get_email_date, |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 'date': get_date}) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 # Backwards compatibility with Twig. |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
170 if twig_compatibility_mode is True: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 self.filters['raw'] = self.filters['safe'] |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
172 self.globals['pcfail'] = raise_exception |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 # Add route functions. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 for route in app.routes: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 name = route.template_func_name |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 func = self.globals.get(name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 if func is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 func = CompositeRouteFunction() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 func.addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 self.globals[name] = func |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 elif isinstance(func, CompositeRouteFunction): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 self.globals[name].addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 raise Exception("Route function '%s' collides with an " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 "existing function or template data." % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
189 def _paginate(self, value, items_per_page=5): |
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
190 cpi = self.app.env.exec_info_stack.current_page_info |
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
191 if cpi is None or cpi.page is None or cpi.render_ctx is None: |
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
192 raise Exception("Can't paginate when no page has been pushed " |
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
193 "on the execution stack.") |
298
b7ab1b503510
data: Fix incorrect next/previous page URLs in pagination data.
Ludovic Chabant <ludovic@chabant.com>
parents:
293
diff
changeset
|
194 first_uri, _ = split_sub_uri(self.app, cpi.render_ctx.uri) |
352
498a917cd2d4
pagination: Make pagination use routes to generate proper URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
195 return Paginator(cpi.page, value, |
498a917cd2d4
pagination: Make pagination use routes to generate proper URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
196 page_num=cpi.render_ctx.page_num, |
498a917cd2d4
pagination: Make pagination use routes to generate proper URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
197 items_per_page=items_per_page) |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
198 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 def _formatWith(self, value, format_name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 return format_text(self.app, format_name, value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 def raise_exception(msg): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 raise Exception(msg) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
207 def get_dict_keys(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
208 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
209 return [i[0] for i in value] |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
210 return value.keys() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
211 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
212 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
213 def get_dict_values(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
214 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
215 return [i[1] for i in value] |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
216 return value.values() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
217 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
218 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 def add_no_cache_parameter(value, param_name='t', param_value=None): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
220 if not param_value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 param_value = time.time() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 if '?' in value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
223 value += '&' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
224 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
225 value += '?' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
226 value += '%s=%s' % (param_name, param_value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
227 return value |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
228 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
229 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
230 def get_word_count(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
231 return len(value.split()) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
232 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
233 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
234 def strip_outer_tag(value, tag=None): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
235 tag_pattern = '[a-z]+[a-z0-9]*' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 if tag is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
237 tag_pattern = re.escape(tag) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 pat = r'^\<' + tag_pattern + r'\>(.*)\</' + tag_pattern + '>$' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 m = re.match(pat, value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 if m: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 return m.group(1) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 return value |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
243 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
244 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
245 def strip_slash(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
246 return value.rstrip('/') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
247 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
248 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
249 def title_case(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
250 return value.title() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
251 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
252 |
356
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
253 def get_xml_date(value): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
254 return strict_rfc3339.timestamp_to_rfc3339_localoffset(int(value)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
255 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
256 |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
257 def get_email_date(value, localtime=False): |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
258 return email.utils.formatdate(value, localtime=localtime) |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
259 |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
260 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
261 def get_date(value, fmt): |
28
19f3ac27c3d5
The `date` filter now supports passing `"now"` as in Twig.
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
262 if value == 'now': |
19f3ac27c3d5
The `date` filter now supports passing `"now"` as in Twig.
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
263 value = time.time() |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
264 if '%' not in fmt: |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
265 suggest = php_format_to_strftime_format(fmt) |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
266 if suggest != fmt: |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
267 suggest_message = ("You probably want a format that looks " |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
268 "like: '%s'." % suggest) |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
269 else: |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
270 suggest_message = ("We can't suggest a proper date format " |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
271 "for you right now, though.") |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
272 raise Exception("PieCrust 1 date formats won't work in PieCrust 2. " |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
273 "%s\n" |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
274 "Please check the `strftime` formatting page here: " |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
275 "https://docs.python.org/3/library/datetime.html" |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
276 "#strftime-and-strptime-behavior" % |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
277 suggest_message) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 return time.strftime(fmt, time.localtime(value)) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
281 class PieCrustFormatExtension(Extension): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
282 tags = set(['pcformat']) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
283 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
284 def __init__(self, environment): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
285 super(PieCrustFormatExtension, self).__init__(environment) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
286 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
287 def parse(self, parser): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
288 lineno = next(parser.stream).lineno |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
289 args = [parser.parse_expression()] |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
290 body = parser.parse_statements(['name:endpcformat'], drop_needle=True) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
291 return CallBlock(self.call_method('_format', args), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
292 [], [], body).set_lineno(lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
293 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
294 def _format(self, format_name, caller=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
295 body = caller() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
296 text = format_text(self.environment.app, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
297 format_name, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
298 Markup(body.rstrip()).unescape(), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
299 exact_format=True) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
300 return text |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
301 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
302 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 class PieCrustHighlightExtension(Extension): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 tags = set(['highlight', 'geshi']) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 super(PieCrustHighlightExtension, self).__init__(environment) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 lineno = next(parser.stream).lineno |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
311 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
312 # Extract the language name. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 args = [parser.parse_expression()] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 # Extract optional arguments. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 kwarg_names = {'line_numbers': 0, 'use_classes': 0, 'class': 1, 'id': 1} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 kwargs = {} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 while not parser.stream.current.test('block_end'): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 name = parser.stream.expect('name') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 if name.value not in kwarg_names: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 raise Exception("'%s' is not a valid argument for the code " |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
322 "highlighting tag." % name.value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 if kwarg_names[name.value] == 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 kwargs[name.value] = Const(True) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
325 elif parser.stream.skip_if('assign'): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 kwargs[name.value] = parser.parse_expression() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
327 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
328 # body of the block |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
329 body = parser.parse_statements(['name:endhighlight', 'name:endgeshi'], |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
330 drop_needle=True) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
331 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
332 return CallBlock(self.call_method('_highlight', args, kwargs), |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
333 [], [], body).set_lineno(lineno) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
334 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
335 def _highlight(self, lang, line_numbers=False, use_classes=False, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
336 css_class=None, css_id=None, caller=None): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
337 # Try to be mostly compatible with Jinja2-highlight's settings. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 body = caller() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 if lang is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
341 lexer = guess_lexer(body) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
342 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 lexer = get_lexer_by_name(lang, stripall=False) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
345 if css_class is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
346 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 css_class = self.environment.jinja2_highlight_cssclass |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 except AttributeError: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
349 pass |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
350 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
351 if css_class is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
352 formatter = HtmlFormatter(cssclass=css_class, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
353 linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
354 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
355 formatter = HtmlFormatter(linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
356 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 code = highlight(Markup(body.rstrip()).unescape(), lexer, formatter) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
358 return code |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
360 |
293
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
361 def get_highlight_css(class_name='.highlight'): |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
362 return HtmlFormatter().get_style_defs(class_name) |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
363 |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
364 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 class PieCrustCacheExtension(Extension): |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
366 tags = set(['pccache', 'cache']) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
367 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 super(PieCrustCacheExtension, self).__init__(environment) |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
370 self._lock = threading.RLock() |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 environment.extend( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 piecrust_cache_prefix='', |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 piecrust_cache={} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
375 ) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
376 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
377 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
378 # the first token is the token that started the tag. In our case |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
379 # we only listen to ``'pccache'`` so this will be a name token with |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 # `pccache` as value. We get the line number so that we can give |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
381 # that line number to the nodes we create by hand. |
7
343d08ef5668
More PieCrust 3 fixes, and a couple of miscellaneous bug fixes.
Ludovic Chabant <ludovic@chabant.com>
parents:
5
diff
changeset
|
382 lineno = next(parser.stream).lineno |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
383 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
384 # now we parse a single expression that is used as cache key. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
385 args = [parser.parse_expression()] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
386 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 # now we parse the body of the cache block up to `endpccache` and |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
388 # drop the needle (which would always be `endpccache` in that case) |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
389 body = parser.parse_statements(['name:endpccache', 'name:endcache'], |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
390 drop_needle=True) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 # now return a `CallBlock` node that calls our _cache_support |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 # helper method on this extension. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 return CallBlock(self.call_method('_cache_support', args), |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
395 [], [], body).set_lineno(lineno) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
396 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
397 def _cache_support(self, name, caller): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
398 key = self.environment.piecrust_cache_prefix + name |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
399 |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
400 exc_stack = self.environment.app.env.exec_info_stack |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
401 render_ctx = exc_stack.current_page_info.render_ctx |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
326
diff
changeset
|
402 rdr_pass = render_ctx.current_pass_info |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
403 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
404 # try to load the block from the cache |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
405 # if there is no fragment in the cache, render it and store |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
406 # it in the cache. |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
407 pair = self.environment.piecrust_cache.get(key) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
408 if pair is not None: |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
326
diff
changeset
|
409 rdr_pass.used_source_names.update(pair[1]) |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
410 return pair[0] |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
411 |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
412 with self._lock: |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
413 pair = self.environment.piecrust_cache.get(key) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
414 if pair is not None: |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
326
diff
changeset
|
415 rdr_pass.used_source_names.update(pair[1]) |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
416 return pair[0] |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
417 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
326
diff
changeset
|
418 prev_used = rdr_pass.used_source_names.copy() |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
419 rv = caller() |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
326
diff
changeset
|
420 after_used = rdr_pass.used_source_names.copy() |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
421 used_delta = after_used.difference(prev_used) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
422 self.environment.piecrust_cache[key] = (rv, used_delta) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
423 return rv |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
424 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
425 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
426 class PieCrustSpacelessExtension(HtmlCompressor): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
427 """ A re-implementation of `SelectiveHtmlCompressor` so that we can |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
428 both use `strip` or `spaceless` in templates. |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
429 """ |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
430 def filter_stream(self, stream): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
431 ctx = StreamProcessContext(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
432 strip_depth = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
433 while 1: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
434 if stream.current.type == 'block_begin': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
435 for tk in ['strip', 'spaceless']: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
436 change = self._processToken(ctx, stream, tk) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
437 if change != 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
438 strip_depth += change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
439 if strip_depth < 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
440 ctx.fail('Unexpected tag end%s' % tk) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
441 break |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
442 if strip_depth > 0 and stream.current.type == 'data': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
443 ctx.token = stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
444 value = self.normalize(ctx) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
445 yield Token(stream.current.lineno, 'data', value) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
446 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
447 yield stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
448 next(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
449 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
450 def _processToken(self, ctx, stream, test_token): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
451 change = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
452 if (stream.look().test('name:%s' % test_token) or |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
453 stream.look().test('name:end%s' % test_token)): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
454 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
455 if stream.current.value == test_token: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
456 change = 1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
457 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
458 change = -1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
459 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
460 if stream.current.type != 'block_end': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
461 ctx.fail('expected end of block, got %s' % |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
462 describe_token(stream.current)) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
463 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
464 return change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
465 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
466 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
467 def php_format_to_strftime_format(fmt): |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
468 replacements = { |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
469 'd': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
470 'D': '%a', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
471 'j': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
472 'l': '%A', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
473 'w': '%w', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
474 'z': '%j', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
475 'W': '%W', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
476 'F': '%B', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
477 'm': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
478 'M': '%b', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
479 'n': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
480 'y': '%Y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
481 'Y': '%y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
482 'g': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
483 'G': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
484 'h': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
485 'H': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
486 'i': '%M', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
487 's': '%S', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
488 'e': '%Z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
489 'O': '%z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
490 'c': '%Y-%m-%dT%H:%M:%SZ'} |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
491 return multi_replace(fmt, replacements) |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
492 |