summaryrefslogtreecommitdiff
path: root/src/lxml/proxy.pxi
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2019-02-06 22:22:59 +0100
committerStefan Behnel <stefan_ml@behnel.de>2019-02-06 22:22:59 +0100
commit3a8123d0115e8ed555dc1d699aab05ec67be61ed (patch)
treee13c93a280290d75c26f4461ee1af1e84b4fd52a /src/lxml/proxy.pxi
parent3806d612b8d3c8a6ce894ba3aaef213cc65d1558 (diff)
downloadpython-lxml-3a8123d0115e8ed555dc1d699aab05ec67be61ed.tar.gz
Replace obfuscated loop with a helper function that is called twice for two different things.
Diffstat (limited to 'src/lxml/proxy.pxi')
-rw-r--r--src/lxml/proxy.pxi86
1 files changed, 43 insertions, 43 deletions
diff --git a/src/lxml/proxy.pxi b/src/lxml/proxy.pxi
index bc803c22..2a365f6b 100644
--- a/src/lxml/proxy.pxi
+++ b/src/lxml/proxy.pxi
@@ -328,12 +328,8 @@ cdef int moveNodeToDocument(_Document doc, xmlDoc* c_source_doc,
cdef tree.xmlAttr* c_attr
cdef char* c_name
cdef _nscache c_ns_cache = [NULL, 0, 0]
- cdef xmlNs* c_ns
- cdef xmlNs* c_ns_next
- cdef xmlNs* c_nsdef
cdef xmlNs* c_del_ns_list = NULL
- cdef size_t i, proxy_count = 0
- cdef bint is_prefixed_attr
+ cdef proxy_count = 0
if not tree._isElementOrXInclude(c_element):
return 0
@@ -359,47 +355,21 @@ cdef int moveNodeToDocument(_Document doc, xmlDoc* c_source_doc,
# 2) make sure the namespaces of an element and its attributes
# are declared in this document (i.e. on the node or its parents)
- c_node = c_element
+ if c_element.ns is not NULL:
+ _fixCNs(doc, c_start_node, c_element, &c_ns_cache, c_del_ns_list)
+
+ c_node = <xmlNode*>c_element.properties
while c_node is not NULL:
if c_node.ns is not NULL:
- c_ns = NULL
- is_prefixed_attr = (c_node.type == tree.XML_ATTRIBUTE_NODE and c_node.ns.prefix)
- for i in range(c_ns_cache.last):
- if c_node.ns is c_ns_cache.ns_map[i].old:
- if is_prefixed_attr and not c_ns_cache.ns_map[i].new.prefix:
- # avoid dropping prefix from attributes
- continue
- c_ns = c_ns_cache.ns_map[i].new
- break
-
- if c_ns:
- c_node.ns = c_ns
- else:
- # not in cache or not acceptable
- # => find a replacement from this document
- try:
- c_ns = doc._findOrBuildNodeNs(
- c_start_node, c_node.ns.href, c_node.ns.prefix,
- c_node.type == tree.XML_ATTRIBUTE_NODE)
- c_node.ns = c_ns
- _appendToNsCache(&c_ns_cache, c_node.ns, c_ns)
- except:
- _cleanUpFromNamespaceAdaptation(c_start_node, &c_ns_cache, c_del_ns_list)
- raise
-
- if c_node is c_element:
- # after the element, continue with its attributes
- c_node = <xmlNode*>c_element.properties
- else:
- c_node = c_node.next
+ _fixCNs(doc, c_start_node, c_node, &c_ns_cache, c_del_ns_list)
- if c_node:
- # set C doc link also for properties
- c_node.doc = c_doc
- # remove attribute from ID table (see xmlSetTreeDoc() in libxml2's tree.c)
- c_attr = <tree.xmlAttr*>c_node
- if c_attr.atype == tree.XML_ATTRIBUTE_ID:
- tree.xmlRemoveID(c_source_doc, c_attr)
+ # remove attribute from ID table (see xmlSetTreeDoc() in libxml2's tree.c)
+ c_attr = <tree.xmlAttr*>c_node
+ if c_attr.atype == tree.XML_ATTRIBUTE_ID:
+ tree.xmlRemoveID(c_source_doc, c_attr)
+ # set C doc link also for attributes
+ c_node.doc = c_doc
+ c_node = c_node.next
tree.END_FOR_EACH_FROM(c_element)
@@ -431,6 +401,36 @@ cdef int moveNodeToDocument(_Document doc, xmlDoc* c_source_doc,
return 0
+cdef int _fixCNs(_Document doc, xmlNode* c_start_node, xmlNode* c_node,
+ _nscache* c_ns_cache, xmlNs* c_del_ns_list) except -1:
+ cdef xmlNs* c_ns = NULL
+ cdef bint is_prefixed_attr = (c_node.type == tree.XML_ATTRIBUTE_NODE and c_node.ns.prefix)
+
+ for ns_map in c_ns_cache.ns_map[:c_ns_cache.last]:
+ if c_node.ns is ns_map.old:
+ if is_prefixed_attr and not ns_map.new.prefix:
+ # avoid dropping prefix from attributes
+ continue
+ c_ns = ns_map.new
+ break
+
+ if c_ns:
+ c_node.ns = c_ns
+ else:
+ # not in cache or not acceptable
+ # => find a replacement from this document
+ try:
+ c_ns = doc._findOrBuildNodeNs(
+ c_start_node, c_node.ns.href, c_node.ns.prefix,
+ c_node.type == tree.XML_ATTRIBUTE_NODE)
+ c_node.ns = c_ns
+ _appendToNsCache(c_ns_cache, c_node.ns, c_ns)
+ except:
+ _cleanUpFromNamespaceAdaptation(c_start_node, c_ns_cache, c_del_ns_list)
+ raise
+ return 0
+
+
cdef void fixElementDocument(xmlNode* c_element, _Document doc,
size_t proxy_count):
cdef xmlNode* c_node = c_element