[Lxml-checkins] r43352 - in lxml/trunk/src/lxml: . tests

scoder at codespeak.net scoder at codespeak.net
Mon May 14 10:34:49 CEST 2007


Author: scoder
Date: Mon May 14 10:34:48 2007
New Revision: 43352

Modified:
   lxml/trunk/src/lxml/classlookup.pxi
   lxml/trunk/src/lxml/tests/test_classlookup.py
Log:
cleanup, support custom PI/comment classes as fallback

Modified: lxml/trunk/src/lxml/classlookup.pxi
==============================================================================
--- lxml/trunk/src/lxml/classlookup.pxi	(original)
+++ lxml/trunk/src/lxml/classlookup.pxi	Mon May 14 10:34:48 2007
@@ -79,6 +79,9 @@
 cdef class ElementDefaultClassLookup(ElementClassLookup):
     """Element class lookup scheme that always returns the default Element
     class.
+
+    The keyword arguments ``element``, ``comment`` and ``pi`` accept the
+    respective Element classes.
     """
     cdef readonly object element_class
     cdef readonly object comment_class
@@ -86,21 +89,21 @@
     def __init__(self, element=None, comment=None, pi=None):
         self._lookup_function = _lookupDefaultElementClass
         if element is None:
-            self.element_class = _Element
+            self.element_class = None
         elif issubclass(element, ElementBase):
             self.element_class = element
         else:
             raise TypeError, "element class must be subclass of ElementBase"
 
         if comment is None:
-            self.comment_class = _Comment
+            self.comment_class = None
         elif issubclass(comment, CommentBase):
             self.comment_class = comment
         else:
             raise TypeError, "comment class must be subclass of CommentBase"
 
         if pi is None:
-            self.pi_class = _ProcessingInstruction
+            self.pi_class = None
         elif issubclass(pi, PIBase):
             self.pi_class = pi
         else:
@@ -109,17 +112,23 @@
 cdef object _lookupDefaultElementClass(state, _Document _doc, xmlNode* c_node):
     "Trivial class lookup function that always returns the default class."
     if c_node.type == tree.XML_ELEMENT_NODE:
-        if state is None:
+        if state is not None:
+            cls =  (<ElementDefaultClassLookup>state).element_class
+        if cls is None:
             return _Element
         else:
-            return (<ElementDefaultClassLookup>state).element_class
+            return cls
     elif c_node.type == tree.XML_COMMENT_NODE:
-        if state is None:
+        if state is not None:
+            cls = (<ElementDefaultClassLookup>state).comment_class
+        if cls is None:
             return _Comment
         else:
-            return (<ElementDefaultClassLookup>state).comment_class
+            return cls
     elif c_node.type == tree.XML_PI_NODE:
-        if state is None:
+        if state is not None:
+            cls = (<ElementDefaultClassLookup>state).pi_class
+        if cls is None:
             # special case XSLT-PI
             if c_node.name is not NULL and c_node.content is not NULL:
                 if cstd.strcmp(c_node.name, "xml-stylesheet") == 0:
@@ -128,7 +137,7 @@
                         return _XSLTProcessingInstruction
             return _ProcessingInstruction
         else:
-            return (<ElementDefaultClassLookup>state).pi_class
+            return cls
     else:
         assert 0, "Unknown node type: %s" % c_node.type
 
@@ -145,9 +154,9 @@
     dictionary.  
 
     Arguments:
-    * attribute name ('{ns}name' style string)
-    * class mapping  (Python dict mapping attribute values to Element classes)
-    * fallback       (optional fallback lookup mechanism)
+    * attribute name - '{ns}name' style string
+    * class mapping  - Python dict mapping attribute values to Element classes
+    * fallback       - optional fallback lookup mechanism
 
     A None key in the class mapping will be checked if the attribute is
     missing.
@@ -194,10 +203,9 @@
 cdef object _parser_class_lookup(state, _Document doc, xmlNode* c_node):
     cdef FallbackElementClassLookup lookup
     lookup = <FallbackElementClassLookup>state
-    if c_node.type == tree.XML_ELEMENT_NODE:
-        if doc._parser._class_lookup is not None:
-            return doc._parser._class_lookup._lookup_function(
-                doc._parser._class_lookup, doc, c_node)
+    if doc._parser._class_lookup is not None:
+        return doc._parser._class_lookup._lookup_function(
+            doc._parser._class_lookup, doc, c_node)
     return lookup._callFallback(doc, c_node)
 
 

Modified: lxml/trunk/src/lxml/tests/test_classlookup.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_classlookup.py	(original)
+++ lxml/trunk/src/lxml/tests/test_classlookup.py	Mon May 14 10:34:48 2007
@@ -51,6 +51,31 @@
 
     def test_default_class_lookup(self):
         class TestElement(etree.ElementBase):
+            FIND_ME = "default element"
+        class TestComment(etree.CommentBase):
+            FIND_ME = "default comment"
+        class TestPI(etree.PIBase):
+            FIND_ME = "default pi"
+
+        parser = etree.XMLParser()
+
+        lookup = etree.ElementDefaultClassLookup(
+            element=TestElement, comment=TestComment, pi=TestPI)
+        parser.setElementClassLookup(lookup)
+
+        root = etree.XML("""<?xml version='1.0'?>
+        <root>
+          <?myPI?>
+          <!-- hi -->
+        </root>
+        """, parser)
+
+        self.assertEquals("default element", root.FIND_ME)
+        self.assertEquals("default pi", root[0].FIND_ME)
+        self.assertEquals("default comment", root[1].FIND_ME)
+
+    def test_default_class_lookup_is_not_nslookup(self):
+        class TestElement(etree.ElementBase):
             FIND_ME = "namespace class"
 
         ns = etree.Namespace("myNS")


More information about the lxml-checkins mailing list