removed custom nodes again
authorArmin Ronacher <armin.ronacher@active-4.com>
Mon, 21 Apr 2008 05:55:52 +0000 (07:55 +0200)
committerArmin Ronacher <armin.ronacher@active-4.com>
Mon, 21 Apr 2008 05:55:52 +0000 (07:55 +0200)
--HG--
branch : trunk

jinja2/compiler.py
jinja2/i18n.py
jinja2/nodes.py

index f5e0b4886a7d90a05d60892e1bf2c98b4fa11c71..871728f48d1a82b2b0d844ed111c60ed29c2f575 100644 (file)
@@ -280,12 +280,6 @@ class CodeGenerator(NodeVisitor):
         # the current indentation
         self._indentation = 0
 
-    def get_visitor(self, node):
-        """Custom nodes have their own compilation method."""
-        if isinstance(node, nodes.CustomStmt):
-            return node.compile
-        return NodeVisitor.get_visitor(self, node)
-
     def temporary_identifier(self):
         """Get a new unique identifier."""
         self._last_identifier += 1
index ef932d975093e781b572d9dc64e98149522082fc..3e1392c7a5ecc167d5b97b57e7672c98135f9f05 100644 (file)
@@ -75,7 +75,9 @@ def babel_extract(fileobj, keywords, comment_tags, options):
         options.get('comment_start_string', '{#'),
         options.get('comment_end_string', '#}'),
         options.get('line_statement_prefix') or None,
-        options.get('trim_blocks', '').lower() in ('1', 'on', 'yes', 'true')
+        options.get('trim_blocks', '').lower() in ('1', 'on', 'yes', 'true'),
+        extensions=[x.strip() for x in options.get('extensions', '')
+                     .split(',')] + [TransExtension]
     )
     node = environment.parse(fileobj.read().decode(encoding))
     for lineno, func, message in extract_from_ast(node, keywords):
index 8c58959ed09f43bf5b8eb79d179841949ebfbb41..992752a1b197e59b630f314876d3bfc042f658af 100644 (file)
@@ -58,24 +58,12 @@ class NodeType(type):
     def __new__(cls, name, bases, d):
         for attr in 'fields', 'attributes':
             storage = []
-            for base in bases:
-                storage.extend(getattr(base, attr, ()))
+            storage.extend(getattr(bases[0], attr, ()))
             storage.extend(d.get(attr, ()))
-            assert len(storage) == len(set(storage))
+            assert len(bases) == 1, 'multiple inheritance not allowed'
+            assert len(storage) == len(set(storage)), 'layout conflict'
             d[attr] = tuple(storage)
-        rv = type.__new__(cls, name, bases, d)
-
-        # unless the node is a subclass of `CustomNode` it may not
-        # be defined in any other module than the jinja2.nodes module.
-        # the reason for this is that the we don't want users to take
-        # advantage of the fact that the parser is using the node name
-        # only as callback name for non custom nodes.  This could lead
-        # to broken code in the future and is disallowed because of this.
-        if rv.__module__ != 'jinja2.nodes' and not \
-           isinstance(rv, CustomStmt):
-            raise TypeError('non builtin node %r is not a subclass of '
-                            'CustomStmt.' % node.__class__.__name__)
-        return rv
+        return type.__new__(cls, name, bases, d)
 
 
 class Node(object):
@@ -205,15 +193,6 @@ class Helper(Node):
     """Nodes that exist in a specific context only."""
 
 
-class CustomStmt(Stmt):
-    """Custom statements must extend this node."""
-
-    def compile(self, compiler):
-        """The compiler calls this method to get the python sourcecode
-        for the statement.
-        """
-
-
 class Template(Node):
     """Node that represents a template."""
     fields = ('body',)