File Coverage

lib/XML/DOM/Lite/Node.pm
Criterion Covered Total %
statement 98 135 72.5
branch 34 58 58.6
condition 2 2 100.0
subroutine 22 26 84.6
pod 0 23 0.0
total 156 244 63.9


line stmt bran cond sub pod time code
1             package XML::DOM::Lite::Node;
2              
3 8     8   48 use Scalar::Util qw(weaken);
  8         14  
  8         827  
4 8     8   43 use XML::DOM::Lite::NodeList;
  8         181  
  8         178  
5 8     8   36 use XML::DOM::Lite::Constants qw(:all);
  8         12  
  8         15504  
6              
7             sub new {
8 121     121 0 231 my ($class, $proto) = @_;
9 121 50       570 unless (UNIVERSAL::isa($proto->{childNodes}, 'XML::DOM::Lite::NodeList')) {
10 121   100     1143 $proto->{childNodes} = XML::DOM::Lite::NodeList->new(
11             $proto->{childNodes} || [ ]
12             );
13             }
14 121 100       572 $proto->{attributes} = XML::DOM::Lite::NodeList->new([ ])
15             unless defined $proto->{attributes};
16              
17 121         337 my $self = bless $proto, $class;
18 121         379 return $self;
19             }
20              
21             sub childNodes {
22 137 50   137 0 175 my $self = shift; $self->{childNodes} = shift if @_;
  137         270  
23 137         549 return $self->{childNodes};
24             }
25              
26             sub parentNode {
27 41     41 0 554 my $self = shift;
28 41 100       85 if (@_) {
29 1         10 weaken($self->{parentNode} = shift());
30             } else {
31 40         166 return $self->{parentNode};
32             }
33             }
34              
35             sub documentElement {
36 0 0   0 0 0 weaken($_[0]->{documentElement} = $_[1]) if $_[1]; $_[0]->{documentElement};
  0         0  
37             }
38              
39             sub nodeType {
40 153 50   153 0 666 my $self = shift; $self->{nodeType} = shift if @_;
  153         338  
41 153         528 $self->{nodeType};
42             }
43              
44             sub nodeName {
45 26 50   26 0 49 my $self = shift; $self->{nodeName} = shift if @_;
  26         58  
46 26         136 $self->{nodeName};
47             }
48              
49             sub tagName {
50 24 50   24 0 27 my $self = shift; $self->{tagName} = shift if @_;
  24         56  
51 24         80 $self->{tagName};
52             }
53              
54             sub appendChild {
55 78     78 0 116 my ($self, $node) = @_;
56 78 100       177 if ($node->{parentNode}) {
57 3         9 $node->{parentNode}->removeChild($node);
58             }
59 78 100       151 unless ($node->nodeType == DOCUMENT_FRAGMENT_NODE) {
60 77         126 $node->{parentNode} = $self;
61 77         229 $self->{childNodes}->insertNode($node);
62             } else {
63 1         3 while ($node->childNodes->length) {
64 3         9 $self->appendChild($node->firstChild);
65             }
66             }
67              
68 78         200 return $node;
69             }
70              
71             sub previousSibling {
72 3     3 0 6 my $self = shift;
73 3 50       8 if ($self->parentNode) {
74 3         9 my $index = $self->parentNode->childNodes->nodeIndex($self);
75 3 100       13 return undef if $index == 0;
76 2         6 return $self->parentNode->childNodes->[$index - 1];
77             }
78             }
79              
80             sub nextSibling {
81 7     7 0 12 my $self = shift;
82 7 50       19 if ($self->parentNode) {
83 7         20 my $index = $self->parentNode->childNodes->nodeIndex($self);
84 7 50       15 return undef if $index == @{$self->childNodes->length} - 1;
  7         18  
85 7         21 return $self->parentNode->childNodes->[$index + 1];
86             }
87             }
88              
89             sub removeChild {
90 4     4 0 1374 my ($self, $node) = @_;
91 4 50       13 if ($node->parentNode == $self) {
92 4         9 undef($node->{parentNode});
93 4         12 return $self->childNodes->removeNode($node);
94             } else {
95 0         0 die "$node is not a child of $self";
96             }
97             }
98              
99             sub insertBefore {
100 1     1 0 3 my ($self, $node, $refNode) = @_;
101 1 50       6 die "usage error" unless (scalar(@_) == 3);
102 1 50       6 if ($node->parentNode) {
103 0         0 $node->parentNode->removeChild($node);
104             }
105 1 50       6 if ($node->nodeType == DOCUMENT_FRAGMENT_NODE) {
106 0         0 foreach my $c (@{$node->childNodes}) {
  0         0  
107 0         0 $self->insertBefore($c, $refNode);
108             }
109 0         0 return;
110             }
111 1         4 $node->parentNode($self);
112 1         3 my $index = $self->childNodes->nodeIndex($refNode);
113 1 50       6 if (defined $index) {
114 1 50       4 if ($index <= 0) {
115 0         0 $self->childNodes->insertNode($node, 0);
116             } else {
117 1         4 $self->childNodes->insertNode($node, $index);
118             }
119             } else {
120 0         0 die "$refNode is not a child of $self";
121             }
122             }
123              
124             sub replaceChild {
125 0     0 0 0 my ($self, $node, $refNode) = @_;
126 0 0       0 die "usage error" unless (scalar(@_) == 3);
127 0         0 $self->insertBefore($refNode, $node);
128 0         0 $self->removeChild($refNode);
129             }
130              
131             sub nodeValue {
132 18 50   18 0 24 my $self = shift; $self->{nodeValue} = shift if @_;
  18         52  
133 18         75 $self->{nodeValue};
134             }
135              
136             sub attributes {
137 23 50   23 0 1021 my $self = shift; $self->{attributes} = shift if @_;
  23         60  
138 23         101 return $self->{attributes};
139             }
140              
141             sub getAttribute {
142 66     66 0 516 my ($self, $attname) = @_;
143 66         226 for (my $x = 0; $x < $self->{attributes}->length; $x++) {
144 63 100       411 return $self->{attributes}->[$x]->{nodeValue}
145             if ($self->{attributes}->[$x]->{nodeName} eq $attname);
146             }
147 39         164 return undef;
148             }
149              
150             sub setAttribute {
151 1     1 0 2 my ($self, $attname, $value) = @_;
152 1         4 for (my $x = 0; $x < $self->{attributes}->length; $x++) {
153 0 0       0 if ($self->{attributes}->[$x]->{nodeName} eq $attname) {
154 0         0 $self->{attributes}->[$x]->{nodeValue} = $value;
155 0         0 return $value;
156             }
157             }
158 1         2 push @{$self->{attributes}}, XML::DOM::Lite::Node->new({
  1         7  
159             nodeType => ATTRIBUTE_NODE,
160             nodeName => $attname,
161             nodeValue => $value
162             });
163 1         5 return $value;
164              
165             }
166              
167             sub firstChild {
168 19     19 0 490 my ($self) = @_;
169 19         62 return $self->childNodes->item(0);
170             }
171              
172             sub lastChild {
173 7     7 0 17 my ($self) = @_;
174 7         22 return $self->childNodes->[$#{$self->childNodes}];
  7         25  
175             }
176              
177             sub ownerDocument {
178 84 100   84 0 102 my $self = shift; weaken($self->{ownerDocument} = shift) if @_;
  84         357  
179 84         194 $self->{ownerDocument};
180             }
181              
182             sub getElementsByTagName {
183 1     1 0 4 my ($self, $tag_name) = @_;
184 1         5 my $nlist = XML::DOM::Lite::NodeList->new([ ]);
185 1         2 my @stack = @{ $self->childNodes };
  1         8  
186 1         6 while (my $n = shift(@stack)) {
187 17 100       31 if ($n->nodeType == ELEMENT_NODE) {
188 8 100       17 if ($n->tagName eq $tag_name) {
189 2         6 $nlist->insertNode($n);
190             }
191 8         15 push @stack, @{ $n->childNodes };
  8         14  
192             }
193             }
194 1         4 return $nlist;
195             }
196              
197             sub cloneNode {
198 0     0 0   my ($self, $deep) = @_;
199              
200 0           my $copy = { };
201 0           @copy{keys %$self} = values %$self;
202 0           $copy->{childNodes} = XML::DOM::Lite::NodeList->new([ ]);
203 0           $copy->{attributes} = XML::DOM::Lite::NodeList->new([@{$self->attributes}]);
  0            
204 0           $copy->{tagName} = $self->tagName;
205 0           $copy->{nodeName} = $self->nodeName;
206 0           $copy->{nodeType} = $self->nodeType;
207 0           $copy->{ownerDocument} = $self->ownerDocument;
208              
209 0           bless $copy, ref($self);
210              
211 0 0         if ($deep) {
212 0           foreach (@{$self->childNodes}) {
  0            
213 0           $copy->childNodes->insertNode($_->cloneNode($deep));
214             }
215             }
216 0           return $copy;
217             }
218              
219             sub xml {
220 0     0 0   my $self = shift;
221 0           require XML::DOM::Lite::Serializer;
222 0           my $serializer = XML::DOM::Lite::Serializer->new();
223 0           return $serializer->serializeToString( $self );
224             }
225              
226              
227             1;
228