SPVM-Eg
view release on metacpan or search on metacpan
lib/SPVM/Eg/Node.spvm view on Meta::CPAN
case &TYPE_COMMENT_NODE :
case &TYPE_TEXT_NODE :
{
my $node_value_buffer = $self->{node_value_buffer};
if ($node_value_buffer) {
$node_value = $node_value_buffer->to_string;
}
}
case &TYPE_ELEMENT_NODE :
case &TYPE_ATTRIBUTE_NODE :
case &TYPE_DOCUMENT_NODE :
case &TYPE_DOCUMENT_TYPE_NODE :
case &TYPE_DOCUMENT_FRAGMENT_NODE :
{
# undef
}
case &TYPE_PROCESSING_INSTRUCTION_NODE : {
die "ProcessingInstruction is not supported.";
}
default : {
die "The type of the node is unexpected type";
}
}
return $node_value;
}
method get_root_node : Eg::Node () {
my $current_node = $self;
my $root_node = (Eg::Node)undef;
while (1) {
my $parent_node = $current_node->{parent_node};
if ($parent_node) {
$current_node = $parent_node;
}
else {
$root_node = $current_node;
last;
}
}
return $root_node;
}
method node_name : string () {
my $node_type = $self->{node_type};
my $node_name = (string)undef;
switch ($node_type) {
case &TYPE_ATTRIBUTE_NODE: {
$node_name = $self->(Eg::Node::Attr)->name;
}
case &TYPE_CDATA_SECTION_NODE: {
$node_name = "#cdata-section";
}
case &TYPE_COMMENT_NODE: {
$node_name = "#comment";
}
case &TYPE_DOCUMENT_NODE: {
$node_name = "#document";
}
case &TYPE_DOCUMENT_FRAGMENT_NODE: {
$node_name = "#document-fragment";
}
case &TYPE_DOCUMENT_TYPE_NODE: {
$node_name = $self->(Eg::Node::DocumentType)->name;
}
case &TYPE_ELEMENT_NODE: {
$node_name = $self->(Eg::Node::Element)->tag_name;
}
case &TYPE_PROCESSING_INSTRUCTION_NODE: {
$node_name = $self->(Eg::Node::ProcessingInstruction)->target;
}
case &TYPE_TEXT_NODE: {
$node_name = "#text";
}
default: {
die "[Unexpected Error]Unknown node type.";
}
}
return $node_name;
}
method remove_child : Eg::Node ($child_node : Eg::Node) {
unless ($child_node) {
die "\$child_node must be defined.";
}
my $node_root = (Eg::Node)$self;
my $node_cur = $node_root;
my $finish = 0;
while ($node_cur) {
# [START]Preorder traversal position
if ($node_cur->first_child) {
$node_cur = (Eg::Node)$node_cur->first_child;
}
else {
while (1) {
# [START]Postorder traversal position
unless ($node_cur == $self) {
if ($node_cur == $child_node) {
my $parent = $child_node->{parent_node};
$child_node->{parent_node} = undef;
my $next_sibling = $child_node->{next_sibling};
my $previous_sibling = $child_node->{previous_sibling};
if ($next_sibling) {
$next_sibling->{previous_sibling} = $child_node->{previous_sibling};
( run in 1.622 second using v1.01-cache-2.11-cpan-5837b0d9d2c )