Mercurial > piecrust2
comparison piecrust/rendering.py @ 183:fff195335d0a
render: When a template engine can't be found, show the correct name in the error.
Raise the exception related to a template engine not being found when we still
have the actual name we were looking for.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Sun, 04 Jan 2015 14:57:37 -0800 |
| parents | e9a3d405e18f |
| children | 27d623a241c6 |
comparison
equal
deleted
inserted
replaced
| 182:a54d3c0b5f4a | 183:fff195335d0a |
|---|---|
| 14 content_abstract_re = re.compile(r'^<!--\s*(more|(page)?break)\s*-->\s*$', | 14 content_abstract_re = re.compile(r'^<!--\s*(more|(page)?break)\s*-->\s*$', |
| 15 re.MULTILINE) | 15 re.MULTILINE) |
| 16 | 16 |
| 17 | 17 |
| 18 class PageRenderingError(Exception): | 18 class PageRenderingError(Exception): |
| 19 pass | |
| 20 | |
| 21 | |
| 22 class TemplateEngineNotFound(Exception): | |
| 19 pass | 23 pass |
| 20 | 24 |
| 21 | 25 |
| 22 class RenderedPage(object): | 26 class RenderedPage(object): |
| 23 def __init__(self, page, uri, num=1): | 27 def __init__(self, page, uri, num=1): |
| 157 app = page.app | 161 app = page.app |
| 158 engine_name = page.config.get('template_engine') | 162 engine_name = page.config.get('template_engine') |
| 159 format_name = page.config.get('format') | 163 format_name = page.config.get('format') |
| 160 | 164 |
| 161 engine = get_template_engine(app, engine_name) | 165 engine = get_template_engine(app, engine_name) |
| 162 if engine is None: | |
| 163 raise PageRenderingError("Can't find template engine '%s'." % engine_name) | |
| 164 | 166 |
| 165 formatted_content = {} | 167 formatted_content = {} |
| 166 for seg_name, seg in page.raw_content.items(): | 168 for seg_name, seg in page.raw_content.items(): |
| 167 seg_text = '' | 169 seg_text = '' |
| 168 for seg_part in seg.parts: | 170 for seg_part in seg.parts: |
| 190 | 192 |
| 191 | 193 |
| 192 def render_layout(layout_name, page, layout_data): | 194 def render_layout(layout_name, page, layout_data): |
| 193 names = layout_name.split(',') | 195 names = layout_name.split(',') |
| 194 default_template_engine = get_template_engine(page.app, None) | 196 default_template_engine = get_template_engine(page.app, None) |
| 195 default_exts = ['.' + e.lstrip('.') for e in default_template_engine.EXTENSIONS] | 197 default_exts = ['.' + e.lstrip('.') |
| 198 for e in default_template_engine.EXTENSIONS] | |
| 196 full_names = [] | 199 full_names = [] |
| 197 for name in names: | 200 for name in names: |
| 198 if '.' not in name: | 201 if '.' not in name: |
| 199 full_names.append(name + '.html') | 202 full_names.append(name + '.html') |
| 200 for ext in default_exts: | 203 for ext in default_exts: |
| 203 full_names.append(name) | 206 full_names.append(name) |
| 204 | 207 |
| 205 _, engine_name = os.path.splitext(full_names[0]) | 208 _, engine_name = os.path.splitext(full_names[0]) |
| 206 engine_name = engine_name.lstrip('.') | 209 engine_name = engine_name.lstrip('.') |
| 207 engine = get_template_engine(page.app, engine_name) | 210 engine = get_template_engine(page.app, engine_name) |
| 208 if engine is None: | 211 |
| 209 raise PageRenderingError("No such template engine: %s" % engine_name) | |
| 210 try: | 212 try: |
| 211 output = engine.renderFile(full_names, layout_data) | 213 output = engine.renderFile(full_names, layout_data) |
| 212 except TemplateNotFoundError as ex: | 214 except TemplateNotFoundError as ex: |
| 213 msg = "Can't find template for page: %s\n" % page.path | 215 msg = "Can't find template for page: %s\n" % page.path |
| 214 msg += "Looked for: %s" % ', '.join(full_names) | 216 msg += "Looked for: %s" % ', '.join(full_names) |
| 221 engine_name = None | 223 engine_name = None |
| 222 engine_name = engine_name or app.config.get('site/default_template_engine') | 224 engine_name = engine_name or app.config.get('site/default_template_engine') |
| 223 for engine in app.plugin_loader.getTemplateEngines(): | 225 for engine in app.plugin_loader.getTemplateEngines(): |
| 224 if engine_name in engine.ENGINE_NAMES: | 226 if engine_name in engine.ENGINE_NAMES: |
| 225 return engine | 227 return engine |
| 226 return None | 228 raise TemplateEngineNotFound("No such template engine: %s" % engine_name) |
| 229 | |
| 227 | 230 |
| 228 def format_text(app, format_name, txt, exact_format=False): | 231 def format_text(app, format_name, txt, exact_format=False): |
| 229 if exact_format and not format_name: | 232 if exact_format and not format_name: |
| 230 raise Exception("You need to specify a format name.") | 233 raise Exception("You need to specify a format name.") |
| 231 | 234 |
