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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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