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