Changeset 947
- Timestamp:
- 10/18/05 19:19:47 (3 years ago)
- Files:
-
- django/branches/new-admin/django/core/handlers/base.py (modified) (1 diff)
- django/branches/new-admin/django/core/template/__init__.py (modified) (16 diffs)
- django/branches/new-admin/django/core/template/loader.py (modified) (3 diffs)
- django/branches/new-admin/django/middleware/template_debug.py (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/new-admin/django/core/handlers/base.py
r881 r947 75 75 if response: 76 76 return response 77 raise e77 raise 78 78 79 79 # Complain if the view returned None (a common error). django/branches/new-admin/django/core/template/__init__.py
r906 r947 108 108 pass 109 109 110 class Origin(object): 111 def __init__(self, name): 112 self.name = name 113 114 def reload(self): 115 raise NotImplementedException 116 117 def __str__(self): 118 return self.name 119 120 class StringOrigin(Origin): 121 def __init__(self, source): 122 super(StringOrigin, self).__init__(UNKNOWN_SOURCE) 123 self.source = source 124 125 def reload(self): 126 return (self.source, self.name) 127 110 128 class Template: 111 def __init__(self, template_string, filename=UNKNOWN_SOURCE):129 def __init__(self, template_string, origin=None): 112 130 "Compilation stage" 113 self.nodelist = compile_string(template_string, filename) 131 if origin == None: 132 origin = StringOrigin(template_string) 133 self.nodelist = compile_string(template_string, origin) 114 134 115 135 def __iter__(self): … … 121 141 "Display stage -- can be called many times" 122 142 return self.nodelist.render(context) 123 124 def compile_string(template_string, filename): 143 144 145 def compile_string(template_string, origin): 125 146 "Compiles template_string into NodeList ready for rendering" 126 147 if DEBUG: … … 131 152 parser_factory = Parser 132 153 133 lexer = lexer_factory(template_string, filename)154 lexer = lexer_factory(template_string, origin) 134 155 parser = parser_factory(lexer.tokenize()) 135 156 return parser.parse() … … 199 220 200 221 class Lexer(object): 201 def __init__(self, template_string, filename):222 def __init__(self, template_string, origin): 202 223 self.template_string = template_string 203 self. filename = filename224 self.origin = origin 204 225 205 226 def tokenize(self): … … 219 240 220 241 class DebugLexer(Lexer): 221 def __init__(self, template_string, filename):222 super(DebugLexer,self).__init__(template_string, filename)242 def __init__(self, template_string, origin): 243 super(DebugLexer,self).__init__(template_string, origin) 223 244 224 245 def find_linebreaks(self, template_string): … … 234 255 for match in tag_re.finditer(self.template_string): 235 256 while next_linebreak <= upto: 236 line, next_linebreak = lines.next() 257 line, next_linebreak = lines.next() 237 258 start, end = match.span() 238 259 if start > upto: … … 240 261 upto = start 241 262 while next_linebreak <= upto: 242 line, next_linebreak = lines.next() 263 line, next_linebreak = lines.next() 243 264 token_tups.append( (self.template_string[start:end], line) ) 244 265 upto = end … … 246 267 if last_bit: 247 268 token_tups.append( (last_bit, line) ) 248 return [ self.create_token(tok, (self. filename, line)) for tok, line in token_tups]269 return [ self.create_token(tok, (self.origin, line)) for tok, line in token_tups] 249 270 250 271 def create_token(self, token_string, source): … … 257 278 self.tokens = tokens 258 279 259 260 280 def parse(self, parse_until=[]): 261 nodelist = NodeList()281 nodelist = self.create_nodelist() 262 282 while self.tokens: 263 283 token = self.next_token() … … 284 304 except KeyError: 285 305 self.invalid_block_tag(token, command) 306 307 try: 308 compiled_result = compile_func(self, token) 309 except TemplateSyntaxError, e: 310 if not self.compile_function_error(token, e): 311 raise 286 312 287 self.extend_nodelist(nodelist, compile _func(self, token), token)313 self.extend_nodelist(nodelist, compiled_result, token) 288 314 self.exit_command(); 289 315 … … 293 319 return nodelist 294 320 321 def create_nodelist(self): 322 return NodeList() 323 295 324 def extend_nodelist(self, nodelist, node, token): 296 325 nodelist.append(node) … … 313 342 def unclosed_block_tag(self, token, parse_until): 314 343 raise TemplateSyntaxError, "Unclosed tags: %s " % ', '.join(parse_until) 344 345 def compile_function_error(self, token, e): 346 pass 315 347 316 348 def next_token(self): … … 335 367 self.command_stack.pop() 336 368 369 def error(self, source, msg): 370 e = TemplateSyntaxError(msg) 371 e.source = source 372 return e 373 337 374 def format_source(self, source): 338 375 return "at %s, line %d" % source 376 377 def create_nodelist(self): 378 return DebugNodeList() 339 379 340 380 def extend_nodelist(self, nodelist, node, token): … … 343 383 344 384 def empty_variable(self, token): 345 raise TemplateSyntaxError, "Empty variable tag %s" % self.format_source(token.source)385 raise self.error( token.source, "Empty variable tag %s" % self.format_source(token.source)) 346 386 347 387 def empty_block_tag(self, token): 348 raise TemplateSyntaxError, "Empty block tag %s" % self.format_source(token.source)388 raise self.error( token.source, "Empty block tag %s" % self.format_source(token.source)) 349 389 350 390 def invalid_block_tag(self, token, command): 351 raise TemplateSyntaxError, "Invalid block tag: '%s' %s" % (command, self.format_source(token.source))391 raise self.error( token.source, "Invalid block tag: '%s' %s" % (command, self.format_source(token.source))) 352 392 353 393 def unclosed_block_tag(self, token, parse_until): 354 (command, ( file,line)) = self.command_stack.pop()394 (command, (origin,line)) = self.command_stack.pop() 355 395 msg = "Unclosed tag '%s' starting at %s, line %d. Looking for one of: %s " % \ 356 (command, file, line, ', '.join(parse_until) ) 357 raise TemplateSyntaxError, msg 396 (command, origin, line, ', '.join(parse_until) ) 397 raise self.error( token.source, msg) 398 399 def compile_function_error(self, token, e): 400 if not hasattr(e, 'source'): 401 e.source = token.source 358 402 359 403 class FilterParser: … … 563 607 for node in self: 564 608 if isinstance(node, Node): 565 bits.append(node.render(context)) 609 try: 610 result = node.render(context) 611 except TemplateSyntaxError, e: 612 if not self.handle_render_error(node, e): 613 raise 614 bits.append(result) 566 615 else: 567 616 bits.append(node) … … 574 623 nodes.extend(node.get_nodes_by_type(nodetype)) 575 624 return nodes 625 626 def handle_render_error(self, node, exception): 627 pass 628 629 class DebugNodeList(NodeList): 630 def handle_render_error(self, node, exception): 631 if not hasattr(exception, 'source'): 632 exception.source = node.source 633 576 634 577 635 class TextNode(Node): django/branches/new-admin/django/core/template/loader.py
r906 r947 21 21 22 22 from django.core.exceptions import ImproperlyConfigured 23 from django.core.template import Template, Context, Node, TemplateDoesNotExist, TemplateSyntaxError, resolve_variable_with_filters, register_tag, UNKNOWN_SOURCE23 from django.core.template import Origin, StringOrigin, Template, Context, Node, TemplateDoesNotExist, TemplateSyntaxError, resolve_variable_with_filters, register_tag 24 24 from django.conf.settings import TEMPLATE_LOADERS 25 25 … … 42 42 template_source_loaders.append(func) 43 43 44 45 46 47 class LoaderOrigin(Origin): 48 def __init__(self, name, loader): 49 super(LoaderOrigin, self).__init__(name) 50 self.loader = loader 51 52 def reload(self): 53 if self.loader: 54 return self.loader() 55 else: 56 raise NotImplementedException 57 58 44 59 def find_template_source(name, dirs=None): 45 60 for loader in template_source_loaders: 46 61 try: 47 return loader(name, dirs) 62 source, display_name = loader(name, dirs) 63 64 def reload(): 65 return loader(name, dirs)[0] 66 67 return (source, LoaderOrigin(display_name, reload)) 48 68 except TemplateDoesNotExist: 49 69 pass … … 63 83 return get_template_from_string(*find_template_source(template_name)) 64 84 65 def get_template_from_string(source, filename=UNKNOWN_SOURCE):85 def get_template_from_string(source, origin=None ): 66 86 """ 67 87 Returns a compiled Template object for the given template code, 68 88 handling template inheritance recursively. 69 89 """ 70 return Template(source, filename) 90 if origin==None: 91 #Could do some crazy stack frame stuff to record where this string came from. 92 origin = StringOrigin(source) 93 return Template(source, origin) 71 94 72 95 def render_to_string(template_name, dictionary=None, context_instance=None):
