Mercurial > piecrust2
annotate piecrust/templating/jinjaengine.py @ 895:accfe8fc8440
admin: Add a Micropub endpoint.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 02 Jul 2017 22:23:12 -0700 |
parents | 5c5b85d4f17d |
children | 3e69f18912f5 |
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): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 # 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
|
13 ENGINE_NAMES = ['jinja', 'jinja2', 'j2', 'twig'] |
c40b7923c474
jinja: Support `.j2` file extensions.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
14 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
|
15 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 def __init__(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 self.env = None |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
18 self._jinja_syntax_error = None |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
19 self._jinja_not_found = None |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
21 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
|
22 self._ensureLoaded() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
23 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
24 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
|
25 return seg_part.content |
445
d8d86debea81
performance: Only use Jinja2 for rendering text if necessary.
Ludovic Chabant <ludovic@chabant.com>
parents:
395
diff
changeset
|
26 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
27 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
|
28 self.env.loader.segment_parts_cache[part_path] = ( |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
29 path, seg_part.content) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
30 try: |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
31 tpl = self.env.get_template(part_path) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
32 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
|
33 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
|
34 except self._jinja_not_found: |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
35 raise TemplateNotFoundError() |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
36 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 return tpl.render(data) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
39 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
|
40 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
|
41 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
|
42 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
43 except Exception as ex: |
715
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
662
diff
changeset
|
44 if self.app.debug: |
a14371c5cda7
debug: Pass the exceptions untouched when debugging.
Ludovic Chabant <ludovic@chabant.com>
parents:
662
diff
changeset
|
45 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
46 msg = "Error rendering Jinja markup" |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
47 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
|
48 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
|
49 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 def renderFile(self, paths, data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 self._ensureLoaded() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 tpl = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 logger.debug("Looking for template: %s" % paths) |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
54 rendered_path = None |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 for p in paths: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 tpl = self.env.get_template(p) |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
58 rendered_path = p |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 break |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
60 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
|
61 raise self._getTemplatingError(tse) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
62 except self._jinja_not_found: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 pass |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
64 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 if tpl is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 raise TemplateNotFoundError() |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
67 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
68 try: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
69 return tpl.render(data) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
70 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
|
71 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
|
72 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
|
73 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
74 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
|
75 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
|
76 raise |
524
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
77 msg = "Error rendering Jinja markup" |
4bca25f99463
serve: Improve Jinja rendering error reporting.
Ludovic Chabant <ludovic@chabant.com>
parents:
506
diff
changeset
|
78 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
|
79 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
|
80 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
81 def _getTemplatingError(self, tse, filename=None): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
82 filename = tse.filename or filename |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
83 if filename and os.path.isabs(filename): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
84 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
|
85 err = TemplatingError(str(tse), filename, tse.lineno) |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
89
diff
changeset
|
86 raise err from tse |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 def _ensureLoaded(self): |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
89 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
|
90 return |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
91 |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
92 stats = self.app.env.stats |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
93 stats.registerTimer('JinjaTemplateEngineEnvironmentSetup', |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
94 raise_if_registered=False) |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
95 with stats.timerScope('JinjaTemplateEngineEnvironmentSetup'): |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
96 self._load() |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
97 |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
98 def _load(self): |
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
99 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
|
100 |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
101 # 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
|
102 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
|
103 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
|
104 ext_names = [ext_names] |
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 # Turn on autoescape by default. |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
107 autoescape = get_config('twig/auto_escape') |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
108 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
|
109 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
|
110 "`jinja/auto_escape`.") |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
111 else: |
855
448710d84121
refactor: Get the taxonomy support back to a functional state.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
112 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
|
113 if autoescape: |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
114 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
|
115 |
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
116 # 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
|
117 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
|
118 PieCrustHighlightExtension, PieCrustCacheExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
119 PieCrustSpacelessExtension, PieCrustFormatExtension) |
59
e3e3de44377c
Better handling of Jinja configuration.
Ludovic Chabant <ludovic@chabant.com>
parents:
48
diff
changeset
|
120 extensions = [ |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
121 PieCrustHighlightExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
122 PieCrustCacheExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
123 PieCrustSpacelessExtension, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
124 PieCrustFormatExtension] |
487
61508ae67488
templating: Make Jinja support arbitrary extension, show warning for old stuff.
Ludovic Chabant <ludovic@chabant.com>
parents:
485
diff
changeset
|
125 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
|
126 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
|
127 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
|
128 extensions.append(n) |
849
8f8bbb2e70e1
templating: Template engines can now load extensions directly from plugins.
Ludovic Chabant <ludovic@chabant.com>
parents:
802
diff
changeset
|
129 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
|
130 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
|
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) |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
135 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
|
136 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
|
137 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
|
138 self.env = PieCrustEnvironment( |
851
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
139 self.app, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
140 loader=loader, |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
141 extensions=extensions) |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
142 |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
143 # Get types we need later. |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
144 from jinja2 import TemplateNotFound |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
145 from jinja2.exceptions import TemplateSyntaxError |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
146 self._jinja_syntax_error = TemplateSyntaxError |
2c7e57d80bba
optimize: Don't load Jinja unless we need to.
Ludovic Chabant <ludovic@chabant.com>
parents:
849
diff
changeset
|
147 self._jinja_not_found = TemplateNotFound |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
150 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
|
151 index = txt.find('{') |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
152 while index >= 0: |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
153 ch = txt[index + 1] |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
154 if ch == '{' or ch == '%': |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
155 return True |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
156 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
|
157 return False |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
158 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
159 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
160 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
|
161 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
|
162 |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
446
diff
changeset
|
163 |