Mercurial > piecrust2
comparison piecrust/rendering.py @ 698:33ab9badfd7a
render: Change how we store render passes info.
Previously we used a dictionary with integers as keys, which doesn't go well
with JSON serialization. Now replace with an array of fixed length with items
that are `None` by default.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 23 Mar 2016 16:39:22 -0700 |
parents | 59268b4d8c71 |
children | ab5c6a8ae90a |
comparison
equal
deleted
inserted
replaced
697:9e5393fcfab2 | 698:33ab9badfd7a |
---|---|
56 self.page = page | 56 self.page = page |
57 self.uri = uri | 57 self.uri = uri |
58 self.num = num | 58 self.num = num |
59 self.data = None | 59 self.data = None |
60 self.content = None | 60 self.content = None |
61 self.render_info = None | 61 self.render_info = [None, None] |
62 | 62 |
63 @property | 63 @property |
64 def app(self): | 64 def app(self): |
65 return self.page.app | 65 return self.page.app |
66 | 66 |
67 def copyRenderInfo(self): | 67 def copyRenderInfo(self): |
68 return copy.deepcopy(self.render_info) | 68 return copy.deepcopy(self.render_info) |
69 | 69 |
70 | 70 |
71 PASS_NONE = 0 | 71 PASS_NONE = -1 |
72 PASS_FORMATTING = 1 | 72 PASS_FORMATTING = 0 |
73 PASS_RENDERING = 2 | 73 PASS_RENDERING = 1 |
74 | 74 |
75 | 75 |
76 RENDER_PASSES = [PASS_FORMATTING, PASS_RENDERING] | 76 RENDER_PASSES = [PASS_FORMATTING, PASS_RENDERING] |
77 | 77 |
78 | 78 |
125 self.pagination_source = None | 125 self.pagination_source = None |
126 self.pagination_filter = None | 126 self.pagination_filter = None |
127 self.custom_data = None | 127 self.custom_data = None |
128 self._current_pass = PASS_NONE | 128 self._current_pass = PASS_NONE |
129 | 129 |
130 self.render_passes = {} | 130 self.render_passes = [None, None] # Same length as RENDER_PASSES |
131 | 131 |
132 @property | 132 @property |
133 def app(self): | 133 def app(self): |
134 return self.page.app | 134 return self.page.app |
135 | 135 |
141 def uri(self): | 141 def uri(self): |
142 return self.page.getUri(self.page_num) | 142 return self.page.getUri(self.page_num) |
143 | 143 |
144 @property | 144 @property |
145 def current_pass_info(self): | 145 def current_pass_info(self): |
146 return self.render_passes.get(self._current_pass) | 146 if self._current_pass != PASS_NONE: |
147 return self.render_passes[self._current_pass] | |
148 return None | |
147 | 149 |
148 def setCurrentPass(self, rdr_pass): | 150 def setCurrentPass(self, rdr_pass): |
149 if rdr_pass != PASS_NONE: | 151 if rdr_pass != PASS_NONE: |
150 self.render_passes.setdefault(rdr_pass, RenderPassInfo()) | 152 self.render_passes[rdr_pass] = RenderPassInfo() |
151 self._current_pass = rdr_pass | 153 self._current_pass = rdr_pass |
152 | 154 |
153 def setPagination(self, paginator): | 155 def setPagination(self, paginator): |
154 self._raiseIfNoCurrentPass() | 156 self._raiseIfNoCurrentPass() |
155 pass_info = self.current_pass_info | 157 pass_info = self.current_pass_info |
274 'pass_info': None} | 276 'pass_info': None} |
275 | 277 |
276 rp = RenderedPage(page, ctx.uri, ctx.page_num) | 278 rp = RenderedPage(page, ctx.uri, ctx.page_num) |
277 rp.data = page_data | 279 rp.data = page_data |
278 rp.content = layout_result['content'] | 280 rp.content = layout_result['content'] |
279 rp.render_info = { | 281 rp.render_info[PASS_FORMATTING] = RenderPassInfo._fromJson( |
280 PASS_FORMATTING: RenderPassInfo._fromJson( | 282 render_result['pass_info']) |
281 render_result['pass_info'])} | |
282 if layout_result['pass_info'] is not None: | 283 if layout_result['pass_info'] is not None: |
283 rp.render_info[PASS_RENDERING] = RenderPassInfo._fromJson( | 284 rp.render_info[PASS_RENDERING] = RenderPassInfo._fromJson( |
284 layout_result['pass_info']) | 285 layout_result['pass_info']) |
285 return rp | 286 return rp |
286 except Exception as ex: | 287 except Exception as ex: |
370 if m: | 371 if m: |
371 offset = m.start() | 372 offset = m.start() |
372 content_abstract = seg_text[:offset] | 373 content_abstract = seg_text[:offset] |
373 formatted_segments['content.abstract'] = content_abstract | 374 formatted_segments['content.abstract'] = content_abstract |
374 | 375 |
375 pass_info = cpi.render_ctx.render_passes.get(PASS_FORMATTING) | 376 pass_info = cpi.render_ctx.render_passes[PASS_FORMATTING] |
376 res = { | 377 res = { |
377 'segments': formatted_segments, | 378 'segments': formatted_segments, |
378 'pass_info': pass_info._toJson()} | 379 'pass_info': pass_info._toJson()} |
379 return res | 380 return res |
380 | 381 |
403 except TemplateNotFoundError as ex: | 404 except TemplateNotFoundError as ex: |
404 msg = "Can't find template for page: %s\n" % page.path | 405 msg = "Can't find template for page: %s\n" % page.path |
405 msg += "Looked for: %s" % ', '.join(full_names) | 406 msg += "Looked for: %s" % ', '.join(full_names) |
406 raise Exception(msg) from ex | 407 raise Exception(msg) from ex |
407 | 408 |
408 pass_info = cpi.render_ctx.render_passes.get(PASS_RENDERING) | 409 pass_info = cpi.render_ctx.render_passes[PASS_RENDERING] |
409 res = {'content': output, 'pass_info': pass_info._toJson()} | 410 res = {'content': output, 'pass_info': pass_info._toJson()} |
410 return res | 411 return res |
411 | 412 |
412 | 413 |
413 def get_template_engine(app, engine_name): | 414 def get_template_engine(app, engine_name): |