Mercurial > piecrust2
annotate piecrust/rendering.py @ 651:cc2d212c3ba1 2.0.0b5
cm: Regenerate the CHANGELOG.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 16 Feb 2016 22:32:58 -0800 |
parents | 59268b4d8c71 |
children | 33ab9badfd7a |
rev | line source |
---|---|
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import re |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
3 import copy |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import logging |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
5 from werkzeug.utils import cached_property |
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
6 from piecrust.data.builder import ( |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
7 DataBuildingContext, build_page_data, build_layout_data) |
324
65e6d72f3877
bake/serve: Fix how taxonomy index pages are setup and rendered.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
8 from piecrust.data.filters import ( |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
9 PaginationFilter, SettingFilterClause, page_value_accessor) |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
10 from piecrust.sources.base import PageSource |
153
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
11 from piecrust.templating.base import TemplateNotFoundError, TemplatingError |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 logger = logging.getLogger(__name__) |
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 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 content_abstract_re = re.compile(r'^<!--\s*(more|(page)?break)\s*-->\s*$', |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 re.MULTILINE) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 class PageRenderingError(Exception): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 pass |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 |
183
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
25 class TemplateEngineNotFound(Exception): |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
26 pass |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
27 |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
28 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
29 class QualifiedPage(object): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
30 def __init__(self, page, route, route_metadata): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
31 self.page = page |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
32 self.route = route |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
33 self.route_metadata = route_metadata |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
34 |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
35 def getUri(self, sub_num=1): |
430
21e26ed867b6
internal: Create full route metadata in one place.
Ludovic Chabant <ludovic@chabant.com>
parents:
427
diff
changeset
|
36 return self.route.getUri(self.route_metadata, sub_num=sub_num) |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
37 |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
38 def __getattr__(self, name): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
39 return getattr(self.page, name) |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
40 |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
41 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
42 class RenderedSegments(object): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
43 def __init__(self, segments, render_pass_info): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
44 self.segments = segments |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
45 self.render_pass_info = render_pass_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
46 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
47 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
48 class RenderedLayout(object): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
49 def __init__(self, content, render_pass_info): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
50 self.content = content |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
51 self.render_pass_info = render_pass_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
52 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
53 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 class RenderedPage(object): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 def __init__(self, page, uri, num=1): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 self.page = page |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 self.uri = uri |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self.num = num |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 self.data = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 self.content = None |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
61 self.render_info = None |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 def app(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 return self.page.app |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
67 def copyRenderInfo(self): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
68 return copy.deepcopy(self.render_info) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
69 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
71 PASS_NONE = 0 |
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
72 PASS_FORMATTING = 1 |
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
73 PASS_RENDERING = 2 |
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
74 |
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
75 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
76 RENDER_PASSES = [PASS_FORMATTING, PASS_RENDERING] |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
77 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
78 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
79 class RenderPassInfo(object): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
80 def __init__(self): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
81 self.used_source_names = set() |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
82 self.used_taxonomy_terms = set() |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
83 self.used_pagination = False |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
84 self.pagination_has_more = False |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
85 self.used_assets = False |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
86 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
87 def merge(self, other): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
88 self.used_source_names |= other.used_source_names |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
89 self.used_taxonomy_terms |= other.used_taxonomy_terms |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
90 self.used_pagination = self.used_pagination or other.used_pagination |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
91 self.pagination_has_more = (self.pagination_has_more or |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
92 other.pagination_has_more) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
93 self.used_assets = self.used_assets or other.used_assets |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
94 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
95 def _toJson(self): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
96 data = { |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
97 'used_source_names': list(self.used_source_names), |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
98 'used_taxonomy_terms': list(self.used_taxonomy_terms), |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
99 'used_pagination': self.used_pagination, |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
100 'pagination_has_more': self.pagination_has_more, |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
101 'used_assets': self.used_assets} |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
102 return data |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
103 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
104 @staticmethod |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
105 def _fromJson(data): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
106 assert data is not None |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
107 rpi = RenderPassInfo() |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
108 rpi.used_source_names = set(data['used_source_names']) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
109 for i in data['used_taxonomy_terms']: |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
110 terms = i[2] |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
111 if isinstance(terms, list): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
112 terms = tuple(terms) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
113 rpi.used_taxonomy_terms.add((i[0], i[1], terms)) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
114 rpi.used_pagination = data['used_pagination'] |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
115 rpi.pagination_has_more = data['pagination_has_more'] |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
116 rpi.used_assets = data['used_assets'] |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
117 return rpi |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
118 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
119 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 class PageRenderingContext(object): |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
121 def __init__(self, qualified_page, page_num=1, force_render=False): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
122 self.page = qualified_page |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 self.page_num = page_num |
174
e9a3d405e18f
serve: Always force render the page being previewed.
Ludovic Chabant <ludovic@chabant.com>
parents:
158
diff
changeset
|
124 self.force_render = force_render |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 self.pagination_source = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 self.pagination_filter = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 self.custom_data = None |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
128 self._current_pass = PASS_NONE |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
129 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
130 self.render_passes = {} |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 def app(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 return self.page.app |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 @property |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 def source_metadata(self): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 return self.page.source_metadata |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 |
369
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
140 @cached_property |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
141 def uri(self): |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
142 return self.page.getUri(self.page_num) |
4b1019bb2533
serve: Giant refactor to change how we handle data when serving pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
338
diff
changeset
|
143 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
144 @property |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
145 def current_pass_info(self): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
146 return self.render_passes.get(self._current_pass) |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
147 |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
148 def setCurrentPass(self, rdr_pass): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
149 if rdr_pass != PASS_NONE: |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
150 self.render_passes.setdefault(rdr_pass, RenderPassInfo()) |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
151 self._current_pass = rdr_pass |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
152 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 def setPagination(self, paginator): |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
154 self._raiseIfNoCurrentPass() |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
155 pass_info = self.current_pass_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
156 if pass_info.used_pagination: |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 raise Exception("Pagination has already been used.") |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
158 assert paginator.is_loaded |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
159 pass_info.used_pagination = True |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
160 pass_info.pagination_has_more = paginator.has_more |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
161 self.addUsedSource(paginator._source) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
163 def addUsedSource(self, source): |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
164 self._raiseIfNoCurrentPass() |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
165 if isinstance(source, PageSource): |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
166 pass_info = self.current_pass_info |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
167 pass_info.used_source_names.add(source.name) |
23
923699e816d0
Don't try to get the name of a source that doesn't have one.
Ludovic Chabant <ludovic@chabant.com>
parents:
12
diff
changeset
|
168 |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
169 def setTaxonomyFilter(self, term_value, *, needs_slugifier=False): |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
170 if not self.page.route.is_taxonomy_route: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
171 raise Exception("The page for this context is not tied to a " |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
172 "taxonomy route: %s" % self.uri) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
173 |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
174 slugifier = None |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
175 if needs_slugifier: |
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
176 slugifier = self.page.route.slugifyTaxonomyTerm |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
177 taxonomy = self.app.getTaxonomy(self.page.route.taxonomy_name) |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
178 |
324
65e6d72f3877
bake/serve: Fix how taxonomy index pages are setup and rendered.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
179 flt = PaginationFilter(value_accessor=page_value_accessor) |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
180 flt.addClause(HasTaxonomyTermsFilterClause( |
520
bab91fcef741
bake/serve: Improve support for unicode, add slugification options.
Ludovic Chabant <ludovic@chabant.com>
parents:
515
diff
changeset
|
181 taxonomy, term_value, slugifier)) |
324
65e6d72f3877
bake/serve: Fix how taxonomy index pages are setup and rendered.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
182 self.pagination_filter = flt |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
183 |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
184 is_combination = isinstance(term_value, tuple) |
324
65e6d72f3877
bake/serve: Fix how taxonomy index pages are setup and rendered.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
185 self.custom_data = { |
334
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
186 taxonomy.term_name: term_value, |
b034f6f15e22
bake: Several bug taxonomy-related fixes for incorrect incremental bakes.
Ludovic Chabant <ludovic@chabant.com>
parents:
329
diff
changeset
|
187 'is_multiple_%s' % taxonomy.term_name: is_combination} |
324
65e6d72f3877
bake/serve: Fix how taxonomy index pages are setup and rendered.
Ludovic Chabant <ludovic@chabant.com>
parents:
184
diff
changeset
|
188 |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
189 def _raiseIfNoCurrentPass(self): |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
190 if self._current_pass == PASS_NONE: |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
191 raise Exception("No rendering pass is currently active.") |
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
192 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 |
515
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
194 class HasTaxonomyTermsFilterClause(SettingFilterClause): |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
195 def __init__(self, taxonomy, value, slugifier): |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
196 super(HasTaxonomyTermsFilterClause, self).__init__( |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
197 taxonomy.setting_name, value) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
198 self._taxonomy = taxonomy |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
199 self._slugifier = slugifier |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
200 self._is_combination = isinstance(self.value, tuple) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
201 |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
202 def pageMatches(self, fil, page): |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
203 if self._taxonomy.is_multiple: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
204 # Multiple taxonomy, i.e. it supports multiple terms, like tags. |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
205 page_values = fil.value_accessor(page, self.name) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
206 if page_values is None or not isinstance(page_values, list): |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
207 return False |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
208 |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
209 if self._slugifier is not None: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
210 page_set = set(map(self._slugifier, page_values)) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
211 else: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
212 page_set = set(page_values) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
213 |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
214 if self._is_combination: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
215 # Multiple taxonomy, and multiple terms to match. Check that |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
216 # the ones to match are all in the page's terms. |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
217 value_set = set(self.value) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
218 return value_set.issubset(page_set) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
219 else: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
220 # Multiple taxonomy, one term to match. |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
221 return self.value in page_set |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
222 |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
223 # Single taxonomy. Just compare the values. |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
224 page_value = fil.value_accessor(page, self.name) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
225 if page_value is None: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
226 return False |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
227 if self._slugifier is not None: |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
228 page_value = self._slugifier(page_value) |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
229 return page_value == self.value |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
230 |
16e705c58cae
internal: Improve handling of taxonomy term slugification.
Ludovic Chabant <ludovic@chabant.com>
parents:
457
diff
changeset
|
231 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
232 def render_page(ctx): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
233 eis = ctx.app.env.exec_info_stack |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
234 eis.pushPage(ctx.page, ctx) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
235 try: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
236 # Build the data for both segment and layout rendering. |
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
237 with ctx.app.env.timerScope("BuildRenderData"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
238 page_data = _build_render_data(ctx) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
239 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 # Render content segments. |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
241 ctx.setCurrentPass(PASS_FORMATTING) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
242 repo = ctx.app.env.rendered_segments_repository |
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
243 save_to_fs = True |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
244 if ctx.app.env.fs_cache_only_for_main_page and not eis.is_main_page: |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
245 save_to_fs = False |
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
246 with ctx.app.env.timerScope("PageRenderSegments"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
247 if repo and not ctx.force_render: |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
248 render_result = repo.get( |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
249 ctx.uri, |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
250 lambda: _do_render_page_segments(ctx.page, page_data), |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
251 fs_cache_time=ctx.page.path_mtime, |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
252 save_to_fs=save_to_fs) |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
253 else: |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
254 render_result = _do_render_page_segments(ctx.page, page_data) |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
255 if repo: |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
256 repo.put(ctx.uri, render_result, save_to_fs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
257 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
258 # Render layout. |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
259 page = ctx.page |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
260 ctx.setCurrentPass(PASS_RENDERING) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
261 layout_name = page.config.get('layout') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
262 if layout_name is None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
263 layout_name = page.source.config.get('default_layout', 'default') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 null_names = ['', 'none', 'nil'] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 if layout_name not in null_names: |
586
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
266 with ctx.app.env.timerScope("BuildRenderData"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
267 build_layout_data(page, page_data, render_result['segments']) |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
268 |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
269 with ctx.app.env.timerScope("PageRenderLayout"): |
59268b4d8c71
bake: Add new performance timers.
Ludovic Chabant <ludovic@chabant.com>
parents:
578
diff
changeset
|
270 layout_result = _do_render_layout(layout_name, page, page_data) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
271 else: |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
272 layout_result = { |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
273 'content': render_result['segments']['content'], |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
274 'pass_info': None} |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
275 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
276 rp = RenderedPage(page, ctx.uri, ctx.page_num) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
277 rp.data = page_data |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
278 rp.content = layout_result['content'] |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
279 rp.render_info = { |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
280 PASS_FORMATTING: RenderPassInfo._fromJson( |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
281 render_result['pass_info'])} |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
282 if layout_result['pass_info'] is not None: |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
283 rp.render_info[PASS_RENDERING] = RenderPassInfo._fromJson( |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
284 layout_result['pass_info']) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
285 return rp |
522
094bdf2f7c4c
serve: Say what page a rendering error happened in.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
286 except Exception as ex: |
574
bc23465ed1b4
bug: Fix a crash when some errors occur during page rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
522
diff
changeset
|
287 page_rel_path = os.path.relpath(ctx.page.path, ctx.app.root_dir) |
522
094bdf2f7c4c
serve: Say what page a rendering error happened in.
Ludovic Chabant <ludovic@chabant.com>
parents:
520
diff
changeset
|
288 raise Exception("Error rendering page: %s" % page_rel_path) from ex |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
289 finally: |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
290 ctx.setCurrentPass(PASS_NONE) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 eis.popPage() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
294 def render_page_segments(ctx): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
295 eis = ctx.app.env.exec_info_stack |
96
0445a2232de7
Improvements and fixes to incremental baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
50
diff
changeset
|
296 eis.pushPage(ctx.page, ctx) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 try: |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
298 ctx.setCurrentPass(PASS_FORMATTING) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
299 repo = ctx.app.env.rendered_segments_repository |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
300 save_to_fs = True |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
301 if ctx.app.env.fs_cache_only_for_main_page and not eis.is_main_page: |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
302 save_to_fs = False |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
303 if repo and not ctx.force_render: |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
304 render_result = repo.get( |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
305 ctx.uri, |
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
306 lambda: _do_render_page_segments_from_ctx(ctx), |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
307 fs_cache_time=ctx.page.path_mtime, |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
308 save_to_fs=save_to_fs) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
309 else: |
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
310 render_result = _do_render_page_segments_from_ctx(ctx) |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
311 if repo: |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
312 repo.put(ctx.uri, render_result, save_to_fs) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
313 finally: |
338
938be93215cb
bake: Improve render context and bake record, fix incremental bake bugs.
Ludovic Chabant <ludovic@chabant.com>
parents:
334
diff
changeset
|
314 ctx.setCurrentPass(PASS_NONE) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
315 eis.popPage() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
316 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
317 rs = RenderedSegments( |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
318 render_result['segments'], |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
319 RenderPassInfo._fromJson(render_result['pass_info'])) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
320 return rs |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
321 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
322 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
323 def _build_render_data(ctx): |
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
324 with ctx.app.env.timerScope("PageDataBuild"): |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
325 data_ctx = DataBuildingContext(ctx.page, page_num=ctx.page_num) |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
326 data_ctx.pagination_source = ctx.pagination_source |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
327 data_ctx.pagination_filter = ctx.pagination_filter |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
328 page_data = build_page_data(data_ctx) |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
329 if ctx.custom_data: |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
430
diff
changeset
|
330 page_data._appendMapping(ctx.custom_data) |
419
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
331 return page_data |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
332 |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
333 |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
334 def _do_render_page_segments_from_ctx(ctx): |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
335 page_data = _build_render_data(ctx) |
6801ad5aa1d4
internal: Optimize page segments rendering.
Ludovic Chabant <ludovic@chabant.com>
parents:
415
diff
changeset
|
336 return _do_render_page_segments(ctx.page, page_data) |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
337 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
338 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
339 def _do_render_page_segments(page, page_data): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
340 app = page.app |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
341 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
342 cpi = app.env.exec_info_stack.current_page_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
343 assert cpi is not None |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
344 assert cpi.page == page |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
345 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
346 engine_name = page.config.get('template_engine') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
347 format_name = page.config.get('format') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
348 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
349 engine = get_template_engine(app, engine_name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
350 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
351 formatted_segments = {} |
578
683be25cbdb2
internal: Rename `raw_content` to `segments` since it's what it is.
Ludovic Chabant <ludovic@chabant.com>
parents:
574
diff
changeset
|
352 for seg_name, seg in page.segments.items(): |
5 | 353 seg_text = '' |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
354 for seg_part in seg.parts: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
355 part_format = seg_part.fmt or format_name |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
356 try: |
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
357 with app.env.timerScope(engine.__class__.__name__): |
454
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
358 part_text = engine.renderSegmentPart( |
96d363e2da4b
templating: Let Jinja2 cache the parsed template for page contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
440
diff
changeset
|
359 page.path, seg_part, page_data) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
360 except TemplatingError as err: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
361 err.lineno += seg_part.line |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
362 raise err |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
363 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
364 part_text = format_text(app, part_format, part_text) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
365 seg_text += part_text |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
366 formatted_segments[seg_name] = seg_text |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
367 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
368 if seg_name == 'content': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
369 m = content_abstract_re.search(seg_text) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
370 if m: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
371 offset = m.start() |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
372 content_abstract = seg_text[:offset] |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
373 formatted_segments['content.abstract'] = content_abstract |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
374 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
375 pass_info = cpi.render_ctx.render_passes.get(PASS_FORMATTING) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
376 res = { |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
377 'segments': formatted_segments, |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
378 'pass_info': pass_info._toJson()} |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
379 return res |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
380 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
381 |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
382 def _do_render_layout(layout_name, page, layout_data): |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
383 cpi = page.app.env.exec_info_stack.current_page_info |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
384 assert cpi is not None |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
385 assert cpi.page == page |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
386 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 names = layout_name.split(',') |
427
3b658190c02b
performance: Compute default layout extensions only once.
Ludovic Chabant <ludovic@chabant.com>
parents:
419
diff
changeset
|
388 default_exts = page.app.env.default_layout_extensions |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
389 full_names = [] |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
390 for name in names: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
391 if '.' not in name: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
392 for ext in default_exts: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
393 full_names.append(name + ext) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
394 else: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
395 full_names.append(name) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
396 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
397 _, engine_name = os.path.splitext(full_names[0]) |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
398 engine_name = engine_name.lstrip('.') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
399 engine = get_template_engine(page.app, engine_name) |
183
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
400 |
153
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
401 try: |
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
402 output = engine.renderFile(full_names, layout_data) |
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
403 except TemplateNotFoundError as ex: |
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
404 msg = "Can't find template for page: %s\n" % page.path |
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
405 msg += "Looked for: %s" % ', '.join(full_names) |
1c3d229158ba
Make a nice error message when a layout hasn't been found.
Ludovic Chabant <ludovic@chabant.com>
parents:
128
diff
changeset
|
406 raise Exception(msg) from ex |
415
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
407 |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
408 pass_info = cpi.render_ctx.render_passes.get(PASS_RENDERING) |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
409 res = {'content': output, 'pass_info': pass_info._toJson()} |
0e9a94b7fdfa
bake: Improve bake record information.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
410 return res |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
411 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
412 |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
413 def get_template_engine(app, engine_name): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
414 if engine_name == 'html': |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
415 engine_name = None |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
416 engine_name = engine_name or app.config.get('site/default_template_engine') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
417 for engine in app.plugin_loader.getTemplateEngines(): |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
418 if engine_name in engine.ENGINE_NAMES: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
419 return engine |
183
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
420 raise TemplateEngineNotFound("No such template engine: %s" % engine_name) |
fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Ludovic Chabant <ludovic@chabant.com>
parents:
174
diff
changeset
|
421 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
422 |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
423 def format_text(app, format_name, txt, exact_format=False): |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
424 if exact_format and not format_name: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
425 raise Exception("You need to specify a format name.") |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
426 |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
427 format_count = 0 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
428 format_name = format_name or app.config.get('site/default_format') |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
429 for fmt in app.plugin_loader.getFormatters(): |
457
7d868afc6791
rendering: Truly skip formatters that are not enabled.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
430 if not fmt.enabled: |
7d868afc6791
rendering: Truly skip formatters that are not enabled.
Ludovic Chabant <ludovic@chabant.com>
parents:
454
diff
changeset
|
431 continue |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
432 if fmt.FORMAT_NAMES is None or format_name in fmt.FORMAT_NAMES: |
411
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
433 with app.env.timerScope(fmt.__class__.__name__): |
e7b865f8f335
bake: Enable multiprocess baking.
Ludovic Chabant <ludovic@chabant.com>
parents:
369
diff
changeset
|
434 txt = fmt.render(format_name, txt) |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
435 format_count += 1 |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
436 if fmt.OUTPUT_FORMAT is not None: |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
437 format_name = fmt.OUTPUT_FORMAT |
128
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
438 if exact_format and format_count == 0: |
28444014ce7d
Fix error reporting and counting of lines.
Ludovic Chabant <ludovic@chabant.com>
parents:
96
diff
changeset
|
439 raise Exception("No such format: %s" % format_name) |
3
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
440 return txt |
f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
441 |