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
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):
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