11cimport cython
22from cpython.exc cimport PyErr_SetNone
33
4+ import logging
5+
46_TAG_TO_NAME = {
57 0x0005 : " - doctype" ,
68 0x0002 : " -text" ,
@@ -292,9 +294,9 @@ cdef class LexborNode:
292294 raise SelectolaxError(" Decomposing the root node is not allowed." )
293295
294296 if recursive:
295- lxb_dom_node_destroy_deep (< lxb_dom_node_t * > self .node)
297+ node_remove_deep (< lxb_dom_node_t * > self .node)
296298 else :
297- lxb_dom_node_destroy (< lxb_dom_node_t * > self .node)
299+ lxb_dom_node_remove (< lxb_dom_node_t * > self .node)
298300
299301 def strip_tags (self , list tags , bool recursive = False ):
300302 """ Remove specified tags from the HTML tree.
@@ -438,6 +440,8 @@ cdef class LexborNode:
438440 def unwrap (self , bint delete_empty = False ):
439441 """ Replace node with whatever is inside this node.
440442
443+ Does nothing if you perform unwrapping second time on the same node.
444+
441445 Parameters
442446 ----------
443447 delete_empty : bool, default False
@@ -453,9 +457,14 @@ cdef class LexborNode:
453457
454458 Note: by default, empty tags are ignored, use "delete_empty" to change this.
455459 """
460+
461+ if node_is_removed(< lxb_dom_node_t * > self .node) == 1 :
462+ logging.error(" Attempt to unwrap removed node. Does nothing." )
463+ return
464+
456465 if self .node.first_child == NULL :
457466 if delete_empty:
458- lxb_dom_node_destroy (< lxb_dom_node_t * > self .node)
467+ lxb_dom_node_remove (< lxb_dom_node_t * > self .node)
459468 return
460469 cdef lxb_dom_node_t* next_node
461470 cdef lxb_dom_node_t* current_node
@@ -470,7 +479,7 @@ cdef class LexborNode:
470479 current_node = next_node
471480 else :
472481 lxb_dom_node_insert_before(self .node, self .node.first_child)
473- lxb_dom_node_destroy (< lxb_dom_node_t * > self .node)
482+ lxb_dom_node_remove (< lxb_dom_node_t * > self .node)
474483
475484 def unwrap_tags (self , list tags , bint delete_empty = False ):
476485 """ Unwraps specified tags from the HTML tree.
@@ -610,7 +619,7 @@ cdef class LexborNode:
610619 if new_node == NULL :
611620 raise SelectolaxError(" Can't create a new node" )
612621 lxb_dom_node_insert_before(self .node, new_node)
613- lxb_dom_node_destroy (< lxb_dom_node_t * > self .node)
622+ lxb_dom_node_remove (< lxb_dom_node_t * > self .node)
614623 elif isinstance (value, LexborNode):
615624 new_node = lxb_dom_document_import_node(
616625 & self .parser.document.dom_document,
@@ -620,7 +629,7 @@ cdef class LexborNode:
620629 if new_node == NULL :
621630 raise SelectolaxError(" Can't create a new node" )
622631 lxb_dom_node_insert_before(self .node, < lxb_dom_node_t * > new_node)
623- lxb_dom_node_destroy (< lxb_dom_node_t * > self .node)
632+ lxb_dom_node_remove (< lxb_dom_node_t * > self .node)
624633 else :
625634 raise SelectolaxError(" Expected a string or LexborNode instance, but %s found" % type (value).__name__)
626635
0 commit comments