Mercurial > piecrust2
annotate piecrust/templating/jinjaengine.py @ 787:f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
* Site config now only has to declare the function name.
* Simply code for running route functions.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 01 Sep 2016 23:00:58 -0700 |
parents | b91fe30ae7aa |
children | 0da1207472d3 |
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 |
662
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
4 import hashlib |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 import logging |
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 |
528
cf3218766fe2
bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
524
diff
changeset
|
18 from piecrust.environment import AbortedSourceUseError |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 from piecrust.rendering import format_text |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 from piecrust.routing import CompositeRouteFunction |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
21 from piecrust.templating.base import (TemplateEngine, TemplateNotFoundError, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
22 TemplatingError) |
722
f0a3af3fbea2
internal: Remove unused code.
Ludovic Chabant <ludovic@chabant.com>
parents:
715
diff
changeset
|
23 from piecrust.uriutil import multi_replace |
3
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 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 logger = logging.getLogger(__name__) |
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 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 class JinjaTemplateEngine(TemplateEngine): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 # 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
|
31 ENGINE_NAMES = ['jinja', 'jinja2', 'j2', 'twig'] |
c40b7923c474
jinja: Support `.j2` file extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
32 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
|
33 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 def __init__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 self.env = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
37 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
|
38 self._ensureLoaded() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
39 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
40 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
|
41 return seg_part.content |
445
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
42 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
43 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
|
44 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
|
45 path, seg_part.content) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
46 try: |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
47 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
|
48 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
|
49 raise self._getTemplatingError(tse, filename=path) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
50 except TemplateNotFound: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
51 raise TemplateNotFoundError() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
52 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 return tpl.render(data) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 except TemplateSyntaxError as tse: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
56 raise self._getTemplatingError(tse) |
528
cf3218766fe2
bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
524
diff
changeset
|
57 except AbortedSourceUseError: |
cf3218766fe2
bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
524
diff
changeset
|
58 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
59 except Exception as ex: |
715
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
662
diff
changeset
|
60 if self.app.debug: |
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
662
diff
changeset
|
61 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
62 msg = "Error rendering Jinja markup" |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
63 rel_path = os.path.relpath(path, self.app.root_dir) |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
64 raise TemplatingError(msg, rel_path) from ex |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 def renderFile(self, paths, data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 self._ensureLoaded() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 tpl = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 logger.debug("Looking for template: %s" % paths) |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
70 rendered_path = None |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 for p in paths: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 tpl = self.env.get_template(p) |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
74 rendered_path = p |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 break |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
76 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
77 raise self._getTemplatingError(tse) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 except TemplateNotFound: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 pass |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
80 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 if tpl is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 raise TemplateNotFoundError() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
83 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
84 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
85 return tpl.render(data) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
86 except TemplateSyntaxError as tse: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
87 raise self._getTemplatingError(tse) |
528
cf3218766fe2
bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
524
diff
changeset
|
88 except AbortedSourceUseError: |
cf3218766fe2
bug: Of course I broke something. Some exceptions need to pass through Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
524
diff
changeset
|
89 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
90 except Exception as ex: |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
91 msg = "Error rendering Jinja markup" |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
92 rel_path = os.path.relpath(rendered_path, self.app.root_dir) |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
93 raise TemplatingError(msg, rel_path) from ex |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
94 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
95 def _getTemplatingError(self, tse, filename=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
96 filename = tse.filename or filename |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
97 if filename and os.path.isabs(filename): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
98 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
|
99 err = TemplatingError(str(tse), filename, tse.lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
100 raise err from tse |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 def _ensureLoaded(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 if self.env: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 return |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
105 |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
106 # Get the list of extensions to load. |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
107 ext_names = self.app.config.get('jinja/extensions', []) |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
108 if not isinstance(ext_names, list): |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
109 ext_names = [ext_names] |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
110 |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
111 # Turn on autoescape by default. |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
112 autoescape = self.app.config.get('twig/auto_escape') |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
113 if autoescape is not None: |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
114 logger.warning("The `twig/auto_escape` setting is now called " |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
115 "`jinja/auto_escape`.") |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
116 else: |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
117 autoescape = self.app.config.get('jinja/auto_escape', True) |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
118 if autoescape: |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
119 ext_names.append('autoescape') |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
120 |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
121 # Create the final list of extensions. |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
122 extensions = [ |
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
123 PieCrustHighlightExtension, |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
124 PieCrustCacheExtension, |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
125 PieCrustSpacelessExtension, |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
126 PieCrustFormatExtension] |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
127 for n in ext_names: |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
128 if '.' not in n: |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
129 n = 'jinja2.ext.' + n |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
130 extensions.append(n) |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
131 |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
132 # Create the Jinja environment. |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
133 logger.debug("Creating Jinja environment with folders: %s" % |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
134 self.app.templates_dirs) |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
135 loader = PieCrustLoader(self.app.templates_dirs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 self.env = PieCrustEnvironment( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 self.app, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 loader=loader, |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
139 extensions=extensions) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
142 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
|
143 index = txt.find('{') |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
144 while index >= 0: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
145 ch = txt[index + 1] |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
146 if ch == '{' or ch == '%': |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
147 return True |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
148 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
|
149 return False |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
150 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
151 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
152 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
|
153 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
|
154 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
155 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
156 class PieCrustLoader(FileSystemLoader): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
157 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
|
158 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
|
159 self.segment_parts_cache = {} |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
160 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
161 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
|
162 if template.startswith('$part='): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
163 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
|
164 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
165 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
|
166 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
167 def uptodate(): |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
168 try: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
169 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
|
170 except OSError: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
171 return False |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
172 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
173 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
|
174 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
175 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
|
176 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
177 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 class PieCrustEnvironment(Environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 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
|
180 self.app = app |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
181 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
182 # 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
|
183 # 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
|
184 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
|
185 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
186 # 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
|
187 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
|
188 kwargs.setdefault('auto_reload', False) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
189 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
190 # 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
|
191 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
|
192 '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
|
193 '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
|
194 '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
|
195 'trim_blocks', 'lstrip_blocks', |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
196 'newline_sequence', 'keep_trailing_newline']: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
197 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
|
198 if val is not None: |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
199 kwargs.setdefault(name, val) |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
200 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
201 # Twig trims blocks. |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
202 if twig_compatibility_mode is True: |
288
078e64dba77d
jinja: Fix Twig compatibility for block trimming.
Ludovic Chabant <ludovic@chabant.com>
parents:
274
diff
changeset
|
203 kwargs['trim_blocks'] = True |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
204 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
205 # All good! Create the Environment. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 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
|
207 |
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
208 # Now add globals and filters. |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 self.globals.update({ |
531
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
210 'now': get_now_date(), |
293
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
211 'fail': raise_exception, |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
212 '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
|
213 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 self.filters.update({ |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
215 'keys': get_dict_keys, |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
216 'values': get_dict_values, |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
217 'paginate': self._paginate, |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 'formatwith': self._formatWith, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 '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
|
220 '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
|
221 'nocache': add_no_cache_parameter, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 'wordcount': get_word_count, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
223 'stripoutertag': strip_outer_tag, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
224 'stripslash': strip_slash, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
225 'titlecase': title_case, |
662
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
226 'md5': make_md5, |
356
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
227 'atomdate': get_xml_date, |
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
228 '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
|
229 'emaildate': get_email_date, |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
230 'date': get_date}) |
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 # Backwards compatibility with Twig. |
274
1163bd034dc5
jinja: Provide a more "standard" Jinja configuration by default.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
233 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
|
234 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
|
235 self.globals['pcfail'] = raise_exception |
3
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 # Add route functions. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
238 for route in app.routes: |
787
f6f9a284a5f3
routing: Simplify how route functions are declared and handled.
Ludovic Chabant <ludovic@chabant.com>
parents:
738
diff
changeset
|
239 name = route.func_name |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 func = self.globals.get(name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
241 if func is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 func = CompositeRouteFunction() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
243 func.addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
244 self.globals[name] = func |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
245 elif isinstance(func, CompositeRouteFunction): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
246 self.globals[name].addFunc(route) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
247 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
248 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
|
249 "existing function or template data." % |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
250 name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
251 |
19
dc72a288921f
Add the `paginate` filter to Jinja, activate `auto_reload`.
Ludovic Chabant <ludovic@chabant.com>
parents:
7
diff
changeset
|
252 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
|
253 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
|
254 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
|
255 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
|
256 "on the execution stack.") |
352
498a917cd2d4
pagination: Make pagination use routes to generate proper URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
257 return Paginator(cpi.page, value, |
498a917cd2d4
pagination: Make pagination use routes to generate proper URLs.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
258 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
|
259 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
|
260 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
261 def _formatWith(self, value, format_name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
262 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
|
263 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 def raise_exception(msg): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
266 raise Exception(msg) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
269 def get_dict_keys(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
270 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
271 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
|
272 return value.keys() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
273 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
274 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
275 def get_dict_values(value): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
276 if isinstance(value, list): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
277 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
|
278 return value.values() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
279 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
280 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
281 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
|
282 if not param_value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
283 param_value = time.time() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
284 if '?' in value: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 value += '&' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
286 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
287 value += '?' |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
288 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
|
289 return value |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
290 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 def get_word_count(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 return len(value.split()) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
296 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
|
297 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
|
298 if tag is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
299 tag_pattern = re.escape(tag) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
300 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
|
301 m = re.match(pat, value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 if m: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 return m.group(1) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 return value |
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 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 def strip_slash(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 return value.rstrip('/') |
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 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
311 def title_case(value): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
312 return value.title() |
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 |
662
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
315 def make_md5(value): |
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
316 return hashlib.md5(value.lower().encode('utf8')).hexdigest() |
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
317 |
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
318 |
356
019d274e6713
data: Also expose XML date formatting as `xmldate` in Jinja.
Ludovic Chabant <ludovic@chabant.com>
parents:
352
diff
changeset
|
319 def get_xml_date(value): |
662
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
320 """ Formats timestamps like 1985-04-12T23:20:50.52Z |
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
321 """ |
537
7df0a959791c
templating: Make more date functions accept 'now' as an input.
Ludovic Chabant <ludovic@chabant.com>
parents:
531
diff
changeset
|
322 if value == 'now': |
7df0a959791c
templating: Make more date functions accept 'now' as an input.
Ludovic Chabant <ludovic@chabant.com>
parents:
531
diff
changeset
|
323 value = time.time() |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
324 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
|
325 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
326 |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
327 def get_email_date(value, localtime=False): |
662
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
328 """ Formats timestamps like Fri, 09 Nov 2001 01:08:47 -0000 |
cbd5cdec0695
jinja: Add `md5` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
537
diff
changeset
|
329 """ |
537
7df0a959791c
templating: Make more date functions accept 'now' as an input.
Ludovic Chabant <ludovic@chabant.com>
parents:
531
diff
changeset
|
330 if value == 'now': |
7df0a959791c
templating: Make more date functions accept 'now' as an input.
Ludovic Chabant <ludovic@chabant.com>
parents:
531
diff
changeset
|
331 value = time.time() |
326
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
332 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
|
333 |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
334 |
531
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
335 def get_now_date(): |
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
336 return time.time() |
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
337 |
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
338 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 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
|
340 if value == 'now': |
19f3ac27c3d5
The `date` filter now supports passing `"now"` as in Twig.
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
341 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
|
342 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
|
343 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
|
344 if suggest != fmt: |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
345 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
|
346 "like: '%s'." % suggest) |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
347 else: |
1ecc0c16ba64
data: Better error message for old date formats, add `emaildate` filter.
Ludovic Chabant <ludovic@chabant.com>
parents:
298
diff
changeset
|
348 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
|
349 "for you right now, though.") |
531
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
350 raise Exception("Got incorrect date format: '%s\n" |
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
351 "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
|
352 "%s\n" |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
353 "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
|
354 "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
|
355 "#strftime-and-strptime-behavior" % |
531
63ae5eae90ca
templating: Add `now` global to Jinja, improve date error message.
Ludovic Chabant <ludovic@chabant.com>
parents:
528
diff
changeset
|
356 (fmt, suggest_message)) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
357 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
|
358 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
359 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
360 class PieCrustFormatExtension(Extension): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
361 tags = set(['pcformat']) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
362 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
363 def __init__(self, environment): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
364 super(PieCrustFormatExtension, self).__init__(environment) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
365 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
366 def parse(self, parser): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
367 lineno = next(parser.stream).lineno |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
368 args = [parser.parse_expression()] |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
369 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
|
370 return CallBlock(self.call_method('_format', args), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
371 [], [], body).set_lineno(lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
372 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
373 def _format(self, format_name, caller=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
374 body = caller() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
375 text = format_text(self.environment.app, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
376 format_name, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
377 Markup(body.rstrip()).unescape(), |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
378 exact_format=True) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
379 return text |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
380 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
381 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
382 class PieCrustHighlightExtension(Extension): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
383 tags = set(['highlight', 'geshi']) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
384 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
385 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
386 super(PieCrustHighlightExtension, self).__init__(environment) |
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 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
389 lineno = next(parser.stream).lineno |
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 # Extract the language name. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 args = [parser.parse_expression()] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 # Extract optional arguments. |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
395 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
|
396 'id': 1} |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
397 kwargs = {} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
398 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
|
399 name = parser.stream.expect('name') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
400 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
|
401 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
|
402 "highlighting tag." % name.value) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
403 if kwarg_names[name.value] == 0: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
404 kwargs[name.value] = Const(True) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
405 elif parser.stream.skip_if('assign'): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
406 kwargs[name.value] = parser.parse_expression() |
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 # body of the block |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
409 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
|
410 drop_needle=True) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
411 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
412 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
|
413 [], [], body).set_lineno(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 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
|
416 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
|
417 # 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
|
418 body = caller() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
419 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
420 if lang is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
421 lexer = guess_lexer(body) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
422 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
423 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
|
424 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
425 if css_class is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
426 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
427 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
|
428 except AttributeError: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
429 pass |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
430 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
431 if css_class is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
432 formatter = HtmlFormatter(cssclass=css_class, |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
433 linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
434 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
435 formatter = HtmlFormatter(linenos=line_numbers) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
436 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
437 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
|
438 return code |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
439 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
440 |
506
6ca1b6fb9964
templating: `highlight_css` can be passed the name of a Pygments style.
Ludovic Chabant <ludovic@chabant.com>
parents:
487
diff
changeset
|
441 def get_highlight_css(style_name='default', class_name='.highlight'): |
6ca1b6fb9964
templating: `highlight_css` can be passed the name of a Pygments style.
Ludovic Chabant <ludovic@chabant.com>
parents:
487
diff
changeset
|
442 return HtmlFormatter(style=style_name).get_style_defs(class_name) |
293
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
443 |
d013cc191922
jinja: Add a global function to render Pygments' CSS styles.
Ludovic Chabant <ludovic@chabant.com>
parents:
288
diff
changeset
|
444 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
445 class PieCrustCacheExtension(Extension): |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
446 tags = set(['pccache', 'cache']) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
447 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
448 def __init__(self, environment): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
449 super(PieCrustCacheExtension, self).__init__(environment) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
450 environment.extend( |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
451 piecrust_cache_prefix='', |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
452 piecrust_cache={} |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
453 ) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
454 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
455 def parse(self, parser): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
456 # 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
|
457 # 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
|
458 # `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
|
459 # 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
|
460 lineno = next(parser.stream).lineno |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
461 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
462 # 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
|
463 args = [parser.parse_expression()] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
464 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
465 # 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
|
466 # 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
|
467 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
|
468 drop_needle=True) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
469 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
470 # 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
|
471 # helper method on this extension. |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
472 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
|
473 [], [], body).set_lineno(lineno) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
474 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
475 def _cache_support(self, name, caller): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
476 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
|
477 |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
478 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
|
479 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
|
480 rdr_pass = render_ctx.current_pass_info |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
481 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
482 # 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
|
483 # 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
|
484 # it in the cache. |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
485 pair = self.environment.piecrust_cache.get(key) |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
486 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
|
487 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
|
488 return pair[0] |
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
489 |
738
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
490 pair = self.environment.piecrust_cache.get(key) |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
491 if pair is not None: |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
492 rdr_pass.used_source_names.update(pair[1]) |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
493 return pair[0] |
89
e771c202583a
Fixes to the `cache` Jinja tag.
Ludovic Chabant <ludovic@chabant.com>
parents:
65
diff
changeset
|
494 |
738
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
495 prev_used = rdr_pass.used_source_names.copy() |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
496 rv = caller() |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
497 after_used = rdr_pass.used_source_names.copy() |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
498 used_delta = after_used.difference(prev_used) |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
499 self.environment.piecrust_cache[key] = (rv, used_delta) |
b91fe30ae7aa
internal: Remove threading stuff we don't need anymore.
Ludovic Chabant <ludovic@chabant.com>
parents:
722
diff
changeset
|
500 return rv |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
501 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
502 |
65
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
503 class PieCrustSpacelessExtension(HtmlCompressor): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
504 """ 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
|
505 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
|
506 """ |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
507 def filter_stream(self, stream): |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
508 ctx = StreamProcessContext(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
509 strip_depth = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
510 while 1: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
511 if stream.current.type == 'block_begin': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
512 for tk in ['strip', 'spaceless']: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
513 change = self._processToken(ctx, stream, tk) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
514 if change != 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
515 strip_depth += change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
516 if strip_depth < 0: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
517 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
|
518 break |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
519 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
|
520 ctx.token = stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
521 value = self.normalize(ctx) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
522 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
|
523 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
524 yield stream.current |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
525 next(stream) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
526 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
527 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
|
528 change = 0 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
529 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
|
530 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
|
531 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
532 if stream.current.value == test_token: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
533 change = 1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
534 else: |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
535 change = -1 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
536 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
537 if stream.current.type != 'block_end': |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
538 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
|
539 describe_token(stream.current)) |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
540 stream.skip() |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
541 return change |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
542 |
071cc99b1779
Jinja templating now has `spaceless`, `|keys` and `|values`.
Ludovic Chabant <ludovic@chabant.com>
parents:
59
diff
changeset
|
543 |
41
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
544 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
|
545 replacements = { |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
546 'd': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
547 'D': '%a', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
548 'j': '%d', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
549 'l': '%A', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
550 'w': '%w', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
551 'z': '%j', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
552 'W': '%W', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
553 'F': '%B', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
554 'm': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
555 'M': '%b', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
556 'n': '%m', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
557 'y': '%Y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
558 'Y': '%y', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
559 'g': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
560 'G': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
561 'h': '%I', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
562 'H': '%H', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
563 'i': '%M', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
564 's': '%S', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
565 'e': '%Z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
566 'O': '%z', |
1a30e3d7ee47
Error out if `date` filter is used with PHP date formats.
Ludovic Chabant <ludovic@chabant.com>
parents:
28
diff
changeset
|
567 '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
|
568 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
|
569 |