Mercurial > piecrust2
annotate piecrust/templating/jinjaengine.py @ 1188:a7c43131d871
bake: Fix file write flushing problem with Python 3.8+
Writing the cache files fails in Python 3.8 because it looks like flushing
behaviour has changed. We need to explicitly flush. And even then, in very
rare occurrences, it looks like it can still run into racing conditions,
so we do a very hacky and ugly "retry" loop when fetching cached data :(
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 15 Jun 2021 22:36:23 -0700 |
parents | 8adc27285d93 |
children |
rev | line source |
---|---|
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
1 import os.path |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import logging |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
851
diff
changeset
|
3 from piecrust.sources.base import AbortedSourceUseError |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
4 from piecrust.templating.base import (TemplateEngine, TemplateNotFoundError, |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
5 TemplatingError) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 logger = logging.getLogger(__name__) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 class JinjaTemplateEngine(TemplateEngine): |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
12 ENGINE_NAMES = ['jinja', 'jinja2', 'j2'] |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
13 EXTENSIONS = ['html', 'jinja', 'jinja2', 'j2'] |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 def __init__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 self.env = None |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
17 self._jinja_syntax_error = None |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
18 self._jinja_not_found = None |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 |
924
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
20 def renderSegment(self, path, segment, data): |
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
21 if not _string_needs_render(segment.content): |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
924
diff
changeset
|
22 return segment.content, False |
445
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
23 |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
24 self._ensureLoaded() |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
25 |
924
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
26 seg_path = _make_segment_path(path, segment.offset) |
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
27 self.env.loader.segments_cache[seg_path] = ( |
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
28 path, segment.content) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
29 try: |
924
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
30 tpl = self.env.get_template(seg_path) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
31 except self._jinja_syntax_error as tse: |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
32 raise self._getTemplatingError(tse, filename=path) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
33 except self._jinja_not_found: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
34 raise TemplateNotFoundError() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
35 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 try: |
989
8adc27285d93
bake: Big pass on bake performance.
Ludovic Chabant <ludovic@chabant.com>
parents:
924
diff
changeset
|
37 return tpl.render(data), True |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
38 except self._jinja_syntax_error as tse: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
39 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
|
40 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
|
41 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
42 except Exception as ex: |
715
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
662
diff
changeset
|
43 if self.app.debug: |
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
662
diff
changeset
|
44 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
45 msg = "Error rendering Jinja markup" |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
46 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
|
47 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
|
48 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 def renderFile(self, paths, data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 self._ensureLoaded() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
51 |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
52 try: |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
53 tpl = self.env.select_template(paths) |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
54 except self._jinja_syntax_error as tse: |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
55 raise self._getTemplatingError(tse) |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
56 except self._jinja_not_found: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 raise TemplateNotFoundError() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
58 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
59 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
60 return tpl.render(data) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
61 except self._jinja_syntax_error as tse: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
62 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
|
63 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
|
64 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
65 except Exception as ex: |
864
5c5b85d4f17d
debug: Raise Jinja template exceptions the same way in both render passes.
Ludovic Chabant <ludovic@chabant.com>
parents:
855
diff
changeset
|
66 if self.app.debug: |
5c5b85d4f17d
debug: Raise Jinja template exceptions the same way in both render passes.
Ludovic Chabant <ludovic@chabant.com>
parents:
855
diff
changeset
|
67 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
68 msg = "Error rendering Jinja markup" |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
69 name = getattr(tpl, 'name', '<unknown template>') |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
70 raise TemplatingError(msg, name) from ex |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
71 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
72 def _getTemplatingError(self, tse, filename=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
73 filename = tse.filename or filename |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
74 if filename and os.path.isabs(filename): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
75 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
|
76 err = TemplatingError(str(tse), filename, tse.lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
77 raise err from tse |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 def _ensureLoaded(self): |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
80 if self.env is not None: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 return |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
82 |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
83 stats = self.app.env.stats |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
84 stats.registerTimer('JinjaTemplateEngine_setup', |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
85 raise_if_registered=False) |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
86 stats.registerTimer('JinjaTemplateEngine_extensions', |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
87 raise_if_registered=False) |
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
88 with stats.timerScope('JinjaTemplateEngine_setup'): |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
89 self._load() |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
90 |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
91 def _load(self): |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
92 get_config = self.app.config.get |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
93 |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
94 # Get the list of extensions to load. |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
95 ext_names = get_config('jinja/extensions', []) |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
96 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
|
97 ext_names = [ext_names] |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
98 |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
99 # Turn on autoescape by default. |
907
3e69f18912f5
jinja: Remove Twig compatibility, add timer, improve code.
Ludovic Chabant <ludovic@chabant.com>
parents:
864
diff
changeset
|
100 autoescape = get_config('jinja/auto_escape', True) |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
101 if autoescape: |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
102 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
|
103 |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
104 # Create the final list of extensions. |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
105 from piecrust.templating.jinja.extensions import ( |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
106 PieCrustHighlightExtension, PieCrustCacheExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
107 PieCrustSpacelessExtension, PieCrustFormatExtension) |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
108 extensions = [ |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
109 PieCrustHighlightExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
110 PieCrustCacheExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
111 PieCrustSpacelessExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
112 PieCrustFormatExtension] |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
113 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
|
114 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
|
115 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
|
116 extensions.append(n) |
849
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
802
diff
changeset
|
117 for je in self.app.plugin_loader.getTemplateEngineExtensions('jinja'): |
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
802
diff
changeset
|
118 extensions.append(je) |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
119 |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
120 # 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
|
121 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
|
122 self.app.templates_dirs) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
123 from piecrust.templating.jinja.loader import PieCrustLoader |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
124 loader = PieCrustLoader(self.app.templates_dirs) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
125 from piecrust.templating.jinja.environment import PieCrustEnvironment |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 self.env = PieCrustEnvironment( |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
127 self.app, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
128 loader=loader, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
129 extensions=extensions) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
130 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
131 # Get types we need later. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
132 from jinja2 import TemplateNotFound |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
133 from jinja2.exceptions import TemplateSyntaxError |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
134 self._jinja_syntax_error = TemplateSyntaxError |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
135 self._jinja_not_found = TemplateNotFound |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
138 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
|
139 index = txt.find('{') |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
140 while index >= 0: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
141 ch = txt[index + 1] |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
142 if ch == '{' or ch == '%': |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
143 return True |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
144 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
|
145 return False |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
146 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
147 |
924
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
148 def _make_segment_path(path, start): |
1bb704434ee2
formatting: Remove segment parts, you can use template tags instead.
Ludovic Chabant <ludovic@chabant.com>
parents:
907
diff
changeset
|
149 return '$seg=%s:%d' % (path, start) |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
150 |