[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