Mercurial > piecrust2
annotate piecrust/templating/jinjaengine.py @ 485:c40b7923c474
jinja: Support `.j2` file extensions.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 22 Jul 2015 00:07:57 -0700 |
parents | 96d363e2da4b |
children | 61508ae67488 |
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. |
485
c40b7923c474
jinja: Support `.j2` file extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
30 ENGINE_NAMES = ['jinja', 'jinja2', 'j2', 'twig'] |
c40b7923c474
jinja: Support `.j2` file extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
31 EXTENSIONS = ['html', 'jinja', 'jinja2', 'j2', '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 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
36 def renderSegmentPart(self, path, seg_part, data): |
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 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
39 if not _string_needs_render(seg_part.content): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
40 return seg_part.content |
445
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
41 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
42 part_path = _make_segment_part_path(path, seg_part.offset) |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
43 self.env.loader.segment_parts_cache[part_path] = ( |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
44 path, seg_part.content) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
45 try: |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
46 tpl = self.env.get_template(part_path) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
47 except TemplateSyntaxError as tse: |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
48 raise self._getTemplatingError(tse, filename=path) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
49 except TemplateNotFound: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
50 raise TemplateNotFoundError() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
51 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 return tpl.render(data) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 except TemplateSyntaxError as tse: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
55 raise self._getTemplatingError(tse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 def renderFile(self, paths, data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self._ensureLoaded() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 tpl = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 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
|
61 for p in paths: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 tpl = self.env.get_template(p) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 break |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
65 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
66 raise self._getTemplatingError(tse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 except TemplateNotFound: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 pass |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
69 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 if tpl is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 raise TemplateNotFoundError() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
72 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
73 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
74 return tpl.render(data) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
75 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
76 raise self._getTemplatingError(tse) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
77 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
78 def _getTemplatingError(self, tse, filename=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
79 filename = tse.filename or filename |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
80 if filename and os.path.isabs(filename): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
81 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
|
82 err = TemplatingError(str(tse), filename, tse.lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
83 raise err from tse |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 def _ensureLoaded(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 if self.env: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 return |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
88 |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
89 autoescape = self.app.config.get('jinja/auto_escape') |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
90 if autoescape is None: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
91 autoescape = self.app.config.get('twig/auto_escape') |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
92 if autoescape is None: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
93 autoescape = True |
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 logger.debug("Creating Jinja environment with folders: %s" % |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
96 self.app.templates_dirs) |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
97 loader = PieCrustLoader(self.app.templates_dirs) |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
98 extensions = [ |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
99 PieCrustHighlightExtension, |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
100 PieCrustCacheExtension, |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
101 PieCrustSpacelessExtension, |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
102 PieCrustFormatExtension] |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
103 if autoescape: |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
104 extensions.append('jinja2.ext.autoescape') |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 self.env = PieCrustEnvironment( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 self.app, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 loader=loader, |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
108 extensions=extensions) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
111 def _string_needs_render(txt): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
112 index = txt.find('{') |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
113 while index >= 0: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
114 ch = txt[index + 1] |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
115 if ch == '{' or ch == '%': |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
116 return True |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
117 index = txt.find('{', index + 1) |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
118 return False |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
119 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
120 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
121 def _make_segment_part_path(path, start): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
122 return '$part=%s:%d' % (path, start) |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
123 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
124 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
125 class PieCrustLoader(FileSystemLoader): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
126 def __init__(self, searchpath, encoding='utf-8'): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
127 super(PieCrustLoader, self).__init__(searchpath, encoding) |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
128 self.segment_parts_cache = {} |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
129 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
130 def get_source(self, environment, template): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
131 if template.startswith('$part='): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
132 filename, seg_part = self.segment_parts_cache[template] |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
133 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
134 mtime = os.path.getmtime(filename) |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
135 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
136 def uptodate(): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
137 try: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
138 return os.path.getmtime(filename) == mtime |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
139 except OSError: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
140 return False |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
141 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
142 return seg_part, filename, uptodate |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
143 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
144 return super(PieCrustLoader, self).get_source(environment, template) |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
145 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
146 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 class PieCrustEnvironment(Environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 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
|
149 self.app = app |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
150 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
151 # 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
|
152 # 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
|
153 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
|
154 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
155 # 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
|
156 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
|
157 kwargs.setdefault('auto_reload', False) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
158 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
159 # 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
|
160 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
|
161 '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
|
162 '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
|
163 '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
|
164 'trim_blocks', 'lstrip_blocks', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
165 'newline_sequence', 'keep_trailing_newline']: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
166 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
|
167 if val is not None: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
168 kwargs.setdefault(name, val) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
169 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
170 # Twig trims blocks. |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
171 if twig_compatibility_mode is True: |
288
078e64dba77d
jinja: Fix Twig compatibility for block trimming.
Ludovic Chabant <ludovic@chabant.com>
parents:
274
diff
changeset
|
172 kwargs['trim_blocks'] = True |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
173 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
174 # All good! Create the Environment. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 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
|
176 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
177 # Now add globals and filters. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 self.globals.update({ |
293
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
179 'fail': raise_exception, |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
180 '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
|
181 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 self.filters.update({ |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
183 'keys': get_dict_keys, |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
184 'values': get_dict_values, |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
185 'paginate': self._paginate, |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 'formatwith': self._formatWith, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 '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
|
188 '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
|
189 'nocache': add_no_cache_parameter, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 'wordcount': get_word_count, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 'stripoutertag': strip_outer_tag, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 'stripslash': strip_slash, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 'titlecase': title_case, |
356
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
194 'atomdate': get_xml_date, |
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
195 '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
|
196 'emaildate': get_email_date, |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 'date': get_date}) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 # Backwards compatibility with Twig. |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
200 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
|
201 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
|
202 self.globals['pcfail'] = raise_exception |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 # Add route functions. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 for route in app.routes: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 name = route.template_func_name |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 func = self.globals.get(name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 if func is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 func = CompositeRouteFunction() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 func.addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
211 self.globals[name] = func |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
212 elif isinstance(func, CompositeRouteFunction): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 self.globals[name].addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 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
|
216 "existing function or template data." % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
219 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
|
220 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
|
221 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
|
222 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
|
223 "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
|
224 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
|
225 return Paginator(cpi.page, value, |
498a917cd2d4
pagination: Make pagination use routes to generate proper URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
226 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
|
227 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
|
228 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
229 def _formatWith(self, value, format_name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
230 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
|
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 raise_exception(msg): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
234 raise Exception(msg) |
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 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
237 def get_dict_keys(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
238 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
239 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
|
240 return value.keys() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
241 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
242 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
243 def get_dict_values(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
244 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
245 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
|
246 return value.values() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
247 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
248 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
249 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
|
250 if not param_value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
251 param_value = time.time() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
252 if '?' in value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
253 value += '&' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
254 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
255 value += '?' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
256 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
|
257 return value |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
258 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
259 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
260 def get_word_count(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
261 return len(value.split()) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
262 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
263 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 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
|
265 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
|
266 if tag is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 tag_pattern = re.escape(tag) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 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
|
269 m = re.match(pat, value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
270 if m: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
271 return m.group(1) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
272 return value |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
273 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
274 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
275 def strip_slash(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
276 return value.rstrip('/') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
277 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
278 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
279 def title_case(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
280 return value.title() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
282 |
356
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
283 def get_xml_date(value): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 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
|
285 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
286 |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
287 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
|
288 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
|
289 |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
290 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 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
|
292 if value == 'now': |
19f3ac27c3d5
The `date` filter now supports passing `"now"` as in Twig.
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
293 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
|
294 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
|
295 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
|
296 if suggest != fmt: |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
297 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
|
298 "like: '%s'." % suggest) |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
299 else: |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
300 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
|
301 "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
|
302 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
|
303 "%s\n" |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
304 "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
|
305 "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
|
306 "#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
|
307 suggest_message) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 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
|
309 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
311 class PieCrustFormatExtension(Extension): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
312 tags = set(['pcformat']) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
313 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
314 def __init__(self, environment): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
315 super(PieCrustFormatExtension, self).__init__(environment) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
316 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
317 def parse(self, parser): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
318 lineno = next(parser.stream).lineno |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
319 args = [parser.parse_expression()] |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
320 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
|
321 return CallBlock(self.call_method('_format', args), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
322 [], [], body).set_lineno(lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
323 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
324 def _format(self, format_name, caller=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
325 body = caller() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
326 text = format_text(self.environment.app, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
327 format_name, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
328 Markup(body.rstrip()).unescape(), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
329 exact_format=True) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
330 return text |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
331 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
332 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
333 class PieCrustHighlightExtension(Extension): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
334 tags = set(['highlight', 'geshi']) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
335 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
336 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
337 super(PieCrustHighlightExtension, self).__init__(environment) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 lineno = next(parser.stream).lineno |
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 # Extract the language name. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
343 args = [parser.parse_expression()] |
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 # Extract optional arguments. |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
346 kwarg_names = {'line_numbers': 0, 'use_classes': 0, 'class': 1, |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
347 'id': 1} |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 kwargs = {} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
349 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
|
350 name = parser.stream.expect('name') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
351 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
|
352 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
|
353 "highlighting tag." % name.value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
354 if kwarg_names[name.value] == 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
355 kwargs[name.value] = Const(True) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
356 elif parser.stream.skip_if('assign'): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 kwargs[name.value] = parser.parse_expression() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
358 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 # body of the block |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
360 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
|
361 drop_needle=True) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
362 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
363 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
|
364 [], [], body).set_lineno(lineno) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
366 def _highlight(self, lang, line_numbers=False, use_classes=False, |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
367 css_class=None, css_id=None, caller=None): |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 # 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
|
369 body = caller() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 if lang is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 lexer = guess_lexer(body) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
373 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 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
|
375 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
376 if css_class is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
377 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
378 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
|
379 except AttributeError: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 pass |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
381 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
382 if css_class is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
383 formatter = HtmlFormatter(cssclass=css_class, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
384 linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
385 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
386 formatter = HtmlFormatter(linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
388 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
|
389 return code |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
390 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 |
293
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
392 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
|
393 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
|
394 |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
395 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
396 class PieCrustCacheExtension(Extension): |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
397 tags = set(['pccache', 'cache']) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
398 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
399 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
400 super(PieCrustCacheExtension, self).__init__(environment) |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
401 self._lock = threading.RLock() |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
402 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
403 environment.extend( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
404 piecrust_cache_prefix='', |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
405 piecrust_cache={} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
406 ) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
407 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
408 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
409 # 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
|
410 # 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
|
411 # `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
|
412 # 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
|
413 lineno = next(parser.stream).lineno |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
414 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
415 # 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
|
416 args = [parser.parse_expression()] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
417 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
418 # 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
|
419 # 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
|
420 body = parser.parse_statements(['name:endpccache', 'name:endcache'], |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
421 drop_needle=True) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
422 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
423 # 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
|
424 # helper method on this extension. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
425 return CallBlock(self.call_method('_cache_support', args), |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
426 [], [], body).set_lineno(lineno) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
427 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
428 def _cache_support(self, name, caller): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
429 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
|
430 |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
431 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
|
432 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
|
433 rdr_pass = render_ctx.current_pass_info |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
434 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
435 # 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
|
436 # 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
|
437 # it in the cache. |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
438 pair = self.environment.piecrust_cache.get(key) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
439 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
|
440 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
|
441 return pair[0] |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
442 |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
443 with self._lock: |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
444 pair = self.environment.piecrust_cache.get(key) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
445 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
|
446 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
|
447 return pair[0] |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
448 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
326
diff
changeset
|
449 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
|
450 rv = caller() |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
326
diff
changeset
|
451 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
|
452 used_delta = after_used.difference(prev_used) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
453 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
|
454 return rv |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
455 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
456 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
457 class PieCrustSpacelessExtension(HtmlCompressor): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
458 """ 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
|
459 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
|
460 """ |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
461 def filter_stream(self, stream): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
462 ctx = StreamProcessContext(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
463 strip_depth = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
464 while 1: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
465 if stream.current.type == 'block_begin': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
466 for tk in ['strip', 'spaceless']: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
467 change = self._processToken(ctx, stream, tk) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
468 if change != 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
469 strip_depth += change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
470 if strip_depth < 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
471 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
|
472 break |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
473 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
|
474 ctx.token = stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
475 value = self.normalize(ctx) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
476 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
|
477 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
478 yield stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
479 next(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
480 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
481 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
|
482 change = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
483 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
|
484 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
|
485 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
486 if stream.current.value == test_token: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
487 change = 1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
488 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
489 change = -1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
490 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
491 if stream.current.type != 'block_end': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
492 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
|
493 describe_token(stream.current)) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
494 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
495 return change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
496 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
497 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
498 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
|
499 replacements = { |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
500 'd': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
501 'D': '%a', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
502 'j': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
503 'l': '%A', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
504 'w': '%w', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
505 'z': '%j', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
506 'W': '%W', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
507 'F': '%B', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
508 'm': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
509 'M': '%b', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
510 'n': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
511 'y': '%Y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
512 'Y': '%y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
513 'g': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
514 'G': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
515 'h': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
516 'H': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
517 'i': '%M', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
518 's': '%S', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
519 'e': '%Z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
520 'O': '%z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
521 '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
|
522 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
|
523 |