Mercurial > piecrust2
annotate piecrust/templating/jinjaengine.py @ 274:1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Only enable backwards compatibility stuff if asked for it. Expose most Jinja
options to the user via the site configuration.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 01 Mar 2015 17:59:26 -0800 |
parents | 27d623a241c6 |
children | 078e64dba77d |
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 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 import strict_rfc3339 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 from jinja2 import Environment, FileSystemLoader, TemplateNotFound |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 from jinja2.exceptions import TemplateSyntaxError |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 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
|
10 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
|
11 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
|
12 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
|
13 from pygments import highlight |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 from pygments.formatters import HtmlFormatter |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 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
|
16 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
|
17 from piecrust.rendering import format_text |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 from piecrust.routing import CompositeRouteFunction |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
19 from piecrust.templating.base import (TemplateEngine, TemplateNotFoundError, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
20 TemplatingError) |
48
002fa58f54dc
Give the proper URL to `Paginator` in the `paginate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
21 from piecrust.uriutil import multi_replace, get_first_sub_uri |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 |
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 logger = logging.getLogger(__name__) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 |
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 class JinjaTemplateEngine(TemplateEngine): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 # 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
|
29 ENGINE_NAMES = ['jinja', 'jinja2', 'twig'] |
184
27d623a241c6
render: Don't always use a `.html` extension for layouts.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
30 EXTENSIONS = ['jinja', 'jinja2', 'twig', 'html'] |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 def __init__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 self.env = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
35 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
|
36 self._ensureLoaded() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
37 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
38 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
39 tpl = self.env.from_string(txt) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
40 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
41 raise self._getTemplatingError(tse, filename=filename) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
42 except TemplateNotFound: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
43 raise TemplateNotFoundError() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
44 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 return tpl.render(data) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 except TemplateSyntaxError as tse: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
48 raise self._getTemplatingError(tse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 def renderFile(self, paths, data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 self._ensureLoaded() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 tpl = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 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
|
54 for p in paths: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 tpl = self.env.get_template(p) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 break |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
58 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
59 raise self._getTemplatingError(tse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 except TemplateNotFound: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 pass |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
62 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 if tpl is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 raise TemplateNotFoundError() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
65 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
66 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
67 return tpl.render(data) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
68 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
69 raise self._getTemplatingError(tse) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
70 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
71 def _getTemplatingError(self, tse, filename=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
72 filename = tse.filename or filename |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
73 if filename and os.path.isabs(filename): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
74 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
|
75 err = TemplatingError(str(tse), filename, tse.lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
76 raise err from tse |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 def _ensureLoaded(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 if self.env: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 return |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
81 |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
82 autoescape = self.app.config.get('jinja/auto_escape') |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
83 if autoescape is None: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
84 autoescape = self.app.config.get('twig/auto_escape') |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
85 if autoescape is None: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
86 autoescape = True |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
87 |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
88 logger.debug("Creating Jinja environment with folders: %s" % |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
89 self.app.templates_dirs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 loader = FileSystemLoader(self.app.templates_dirs) |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
91 extensions = [ |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
92 PieCrustHighlightExtension, |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
93 PieCrustCacheExtension, |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
94 PieCrustSpacelessExtension, |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
95 PieCrustFormatExtension] |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
96 if autoescape: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
97 extensions.append('jinja2.ext.autoescape') |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 self.env = PieCrustEnvironment( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 self.app, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 loader=loader, |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
101 extensions=extensions) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 class PieCrustEnvironment(Environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 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
|
106 self.app = app |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
107 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
108 # 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
|
109 # 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
|
110 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
|
111 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
112 # 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
|
113 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
|
114 kwargs.setdefault('auto_reload', False) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
115 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
116 # 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
|
117 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
|
118 '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
|
119 '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
|
120 '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
|
121 'trim_blocks', 'lstrip_blocks', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
122 'newline_sequence', 'keep_trailing_newline']: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
123 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
|
124 if val is not None: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
125 kwargs.setdefault(name, val) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
126 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
127 # Twig trims blocks. |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
128 if twig_compatibility_mode is True: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
129 self.trim_blocks = True |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
130 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
131 # All good! Create the Environment. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 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
|
133 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
134 # Now add globals and filters. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 self.globals.update({ |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 'fail': raise_exception}) |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
137 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 self.filters.update({ |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
139 'keys': get_dict_keys, |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
140 'values': get_dict_values, |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
141 'paginate': self._paginate, |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 'formatwith': self._formatWith, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 '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
|
144 '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
|
145 'nocache': add_no_cache_parameter, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 'wordcount': get_word_count, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 'stripoutertag': strip_outer_tag, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 'stripslash': strip_slash, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 'titlecase': title_case, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 'atomdate': get_atom_date, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 'date': get_date}) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 # Backwards compatibility with Twig. |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
154 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
|
155 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
|
156 self.globals['pcfail'] = raise_exception |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 # Add route functions. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 for route in app.routes: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 name = route.template_func_name |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 func = self.globals.get(name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 if func is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 func = CompositeRouteFunction() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 func.addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 self.globals[name] = func |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 elif isinstance(func, CompositeRouteFunction): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 self.globals[name].addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 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
|
170 "existing function or template data." % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
173 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
|
174 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
|
175 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
|
176 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
|
177 "on the execution stack.") |
48
002fa58f54dc
Give the proper URL to `Paginator` in the `paginate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
178 first_uri = get_first_sub_uri(self.app, cpi.render_ctx.uri) |
002fa58f54dc
Give the proper URL to `Paginator` in the `paginate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
41
diff
changeset
|
179 return Paginator(cpi.page, value, first_uri, |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
180 page_num=cpi.render_ctx.page_num, |
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
181 items_per_page=items_per_page) |
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
182 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 def _formatWith(self, value, format_name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 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
|
185 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 def raise_exception(msg): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 raise Exception(msg) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
191 def get_dict_keys(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
192 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
193 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
|
194 return value.keys() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
195 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
196 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
197 def get_dict_values(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
198 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
199 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
|
200 return value.values() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
201 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
202 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 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
|
204 if not param_value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 param_value = time.time() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 if '?' in value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 value += '&' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 value += '?' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 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
|
211 return value |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
212 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 def get_word_count(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 return len(value.split()) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 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
|
219 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
|
220 if tag is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 tag_pattern = re.escape(tag) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 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
|
223 m = re.match(pat, value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
224 if m: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
225 return m.group(1) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
226 return value |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
227 |
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 def strip_slash(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
230 return value.rstrip('/') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
231 |
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 def title_case(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
234 return value.title() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
235 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
237 def get_atom_date(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 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
|
239 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 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
|
242 if value == 'now': |
19f3ac27c3d5
The `date` filter now supports passing `"now"` as in Twig.
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
243 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
|
244 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
|
245 suggest = 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
|
246 raise Exception("PieCrust 1 date formats won't work in PieCrust 2. " |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
247 "You probably want a format that look like '%s'. " |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
248 "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
|
249 "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
|
250 "#strftime-and-strptime-behavior" % |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
251 suggest) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
252 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
|
253 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
254 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
255 class PieCrustFormatExtension(Extension): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
256 tags = set(['pcformat']) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
257 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
258 def __init__(self, environment): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
259 super(PieCrustFormatExtension, self).__init__(environment) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
260 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
261 def parse(self, parser): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
262 lineno = next(parser.stream).lineno |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
263 args = [parser.parse_expression()] |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
264 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
|
265 return CallBlock(self.call_method('_format', args), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
266 [], [], body).set_lineno(lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
267 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
268 def _format(self, format_name, caller=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
269 body = caller() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
270 text = format_text(self.environment.app, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
271 format_name, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
272 Markup(body.rstrip()).unescape(), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
273 exact_format=True) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
274 return text |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
275 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
276 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
277 class PieCrustHighlightExtension(Extension): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 tags = set(['highlight', 'geshi']) |
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 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 super(PieCrustHighlightExtension, self).__init__(environment) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
283 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 lineno = next(parser.stream).lineno |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
286 # Extract the language name. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
287 args = [parser.parse_expression()] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 # Extract optional arguments. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 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
|
291 kwargs = {} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 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
|
293 name = parser.stream.expect('name') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 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
|
295 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
|
296 "highlighting tag." % name.value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 if kwarg_names[name.value] == 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
298 kwargs[name.value] = Const(True) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
299 elif parser.stream.skip_if('assign'): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
300 kwargs[name.value] = parser.parse_expression() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
301 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 # body of the block |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 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
|
304 drop_needle=True) |
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 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
|
307 [], [], body).set_lineno(lineno) |
3
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 _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
|
310 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
|
311 # 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
|
312 body = caller() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
314 if lang is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 lexer = guess_lexer(body) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
317 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
|
318 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
319 if css_class is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
320 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
321 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
|
322 except AttributeError: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
323 pass |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
325 if css_class is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 formatter = HtmlFormatter(cssclass=css_class, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
327 linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
328 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
329 formatter = HtmlFormatter(linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
330 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
331 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
|
332 return code |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
333 |
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 class PieCrustCacheExtension(Extension): |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
336 tags = set(['pccache', 'cache']) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
337 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 super(PieCrustCacheExtension, self).__init__(environment) |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
340 self._lock = threading.RLock() |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
341 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
342 environment.extend( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 piecrust_cache_prefix='', |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
344 piecrust_cache={} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
345 ) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
346 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 # 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
|
349 # 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
|
350 # `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
|
351 # 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
|
352 lineno = next(parser.stream).lineno |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
353 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
354 # 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
|
355 args = [parser.parse_expression()] |
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 # 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
|
358 # 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
|
359 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
|
360 drop_needle=True) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
361 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
362 # 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
|
363 # helper method on this extension. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 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
|
365 [], [], body).set_lineno(lineno) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
367 def _cache_support(self, name, caller): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 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
|
369 |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
370 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
|
371 render_ctx = exc_stack.current_page_info.render_ctx |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
372 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 # 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
|
374 # 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
|
375 # it in the cache. |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
376 pair = self.environment.piecrust_cache.get(key) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
377 if pair is not None: |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
378 render_ctx.used_source_names.update(pair[1]) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
379 return pair[0] |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
380 |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
381 with self._lock: |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
382 pair = self.environment.piecrust_cache.get(key) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
383 if pair is not None: |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
384 render_ctx.used_source_names.update(pair[1]) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
385 return pair[0] |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
386 |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
387 prev_used = render_ctx.used_source_names.copy() |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
388 rv = caller() |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
389 after_used = render_ctx.used_source_names.copy() |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
390 used_delta = after_used.difference(prev_used) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
391 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
|
392 return rv |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
394 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
395 class PieCrustSpacelessExtension(HtmlCompressor): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
396 """ 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
|
397 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
|
398 """ |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
399 def filter_stream(self, stream): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
400 ctx = StreamProcessContext(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
401 strip_depth = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
402 while 1: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
403 if stream.current.type == 'block_begin': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
404 for tk in ['strip', 'spaceless']: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
405 change = self._processToken(ctx, stream, tk) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
406 if change != 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
407 strip_depth += change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
408 if strip_depth < 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
409 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
|
410 break |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
411 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
|
412 ctx.token = stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
413 value = self.normalize(ctx) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
414 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
|
415 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
416 yield stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
417 next(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
418 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
419 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
|
420 change = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
421 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
|
422 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
|
423 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
424 if stream.current.value == test_token: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
425 change = 1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
426 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
427 change = -1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
428 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
429 if stream.current.type != 'block_end': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
430 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
|
431 describe_token(stream.current)) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
432 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
433 return change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
434 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
435 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
436 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
|
437 replacements = { |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
438 'd': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
439 'D': '%a', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
440 'j': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
441 'l': '%A', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
442 'w': '%w', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
443 'z': '%j', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
444 'W': '%W', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
445 'F': '%B', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
446 'm': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
447 'M': '%b', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
448 'n': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
449 'y': '%Y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
450 'Y': '%y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
451 'g': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
452 'G': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
453 'h': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
454 'H': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
455 'i': '%M', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
456 's': '%S', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
457 'e': '%Z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
458 'O': '%z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
459 '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
|
460 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
|
461 |