/[suikacvs]/messaging/manakai/lib/Message/DOM/NodeList.pm
Suika

Contents of /messaging/manakai/lib/Message/DOM/NodeList.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Sat Jun 16 08:05:48 2007 UTC (19 years, 1 month ago) by wakaba
Branch: MAIN
++ manakai/t/ChangeLog	16 Jun 2007 08:01:18 -0000
	* DOM-NodeList.t: New test.

2007-06-16  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/DOM/ChangeLog	16 Jun 2007 08:05:30 -0000
	* Attr.pm, AttributeDefinition.pm, DocumentFragment.pm,
	DocumentType.pm, Entity.pm,
	EntityReference.pm (____new): Initialize |child_nodes| by an empty list.

	* Node.pm, DOMCharacterData.pm, ElementTypeDefinition.pm,
	Notation.pm, ProcessingInstruction.pm (child_nodes): Implemetned.

	* DOMDocument.pm (AUTOLOAD): Typo fixed.

	* Node.pm (==, !=): Implemented.
	(manakai_read_only): Implemented.
	(is_same_node): Implemented.
	(is_equal_node): Alpha version.
	(manakai_set_read_only): Alpha version.
	(child_nodes, first_child, last_child, previous_sibling): Duplicate
	definitions are removed.

2007-06-16  Wakaba  <wakaba@suika.fam.cx>

1 wakaba 1.1 package Message::DOM::NodeList;
2     use strict;
3     our $VERSION=do{my @r=(q$Revision: 1.3 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
4     push our @ISA, 'Message::IF::NodeList';
5     require Message::DOM::DOMException;
6    
7     use overload
8     '@{}' => sub {
9     tie my @list, ref $_[0], $_[0];
10     return \@list;
11     },
12     eq => sub {
13     return 0 unless UNIVERSAL::isa ($_[1], 'Message::DOM::NodeList');
14     return $${$_[0]} eq $${$_[1]};
15     },
16     ne => sub {
17     return not ($_[0] eq $_[1]);
18     },
19     '==' => sub {
20     return 0 unless UNIVERSAL::isa ($_[1], 'Message::IF::NodeList');
21    
22     local $Error::Depth = $Error::Depth + 1;
23     my $l1 = $_[0]->length;
24     my $l2 = $_[1]->length;
25     return 0 unless $l1 == $l2;
26    
27     for my $i (0 .. ($l1-1)) {
28     return 0 unless $_[0]->item ($i) == $_[1]->item ($i);
29     }
30    
31     return 1;
32     },
33     '!=' => sub {
34     return not ($_[0] == $_[1]);
35     },
36     fallback => 1;
37    
38     sub TIEARRAY ($$) { $_[1] }
39    
40     package Message::DOM::NodeList::ChildNodeList;
41     push our @ISA, 'Message::DOM::NodeList';
42    
43     sub ___report_error ($$) {
44     $_[1]->throw;
45     } # ___report_error
46    
47     ## |NodeList| attributes
48    
49     sub EXISTS ($$) {
50     return exists ${$${$_[0]}}->{child_nodes}->[$_[1]];
51     } # EXISTS
52    
53     sub length ($) {
54     return scalar @{${$${$_[0]}}->{child_nodes}};
55     } # length
56    
57     *FETCHSIZE = \&length;
58    
59     sub STORESIZE ($$) {
60     my $node = $${$_[0]};
61     my $list = $$node->{child_nodes};
62     my $current_length = @{$list};
63     my $count = $_[1];
64    
65     local $Error::Depth = $Error::Depth + 1;
66     if ($current_length > $count) {
67     for (my $i = $current_length - 1; $i >= $count; $i--) {
68     $node->remove_child ($list->[$i]);
69     }
70     }
71     } # STORESIZE
72    
73     sub manakai_read_only ($) {
74     local $Error::Depth = $Error::Depth + 1;
75     return $${$_[0]}->manakai_read_only;
76     } # manakai_read_only
77    
78     ## |NodeList| methods
79    
80     sub item ($$) {
81     my $index = 0+$_[1];
82     return undef if $index < 0;
83     return ${$${$_[0]}}->{child_nodes}->[$index];
84     } # item
85    
86     sub FETCH ($$) {
87     return ${$${$_[0]}}->{child_nodes}->[$_[1]];
88     } # FETCH
89    
90     sub STORE ($$$) {
91     my $self = $_[0];
92     my $list = ${$$$self}->{child_nodes};
93     my $index = $_[1];
94    
95     local $Error::Depth = $Error::Depth + 1;
96     if (exists $list->[$index]) {
97     $$$self->replace_child ($_[2], $list->[$index]);
98     } else {
99     $$$self->append_child ($_[2]);
100     }
101     } # STORE
102    
103     sub DELETE ($$) {
104     my $self = $_[0];
105     my $list = ${$$$self}->{child_nodes};
106     my $index = $_[1];
107    
108     if (exists $list->[$index]) {
109     local $Error::Depth = $Error::Depth + 1;
110     return $$$self->remove_child ($list->[$index]);
111     } else {
112     return undef;
113     }
114     } # DELETE
115    
116     sub CLEAR ($) {
117     my $self = $_[0];
118     my $list = ${$$$self}->{child_nodes};
119    
120     local $Error::Depth = $Error::Depth + 1;
121     for (@$list) {
122     $$$self->remove_child ($_);
123     }
124     } # CLEAR
125    
126     package Message::DOM::NodeList::EmptyNodeList;
127     push our @ISA, 'Message::DOM::NodeList';
128    
129     sub ___report_error ($$) {
130     $_[1]->throw;
131     } # ___report_error
132    
133     ## |NodeList| attributes
134    
135     sub EXISTS ($$) { 0 }
136    
137     sub length ($) { 0 }
138    
139     *FETCHSIZE = \&length;
140    
141     sub STORESIZE ($$) {
142     report Message::DOM::DOMException
143     -object => $_[0],
144     -type => 'NO_MODIFICATION_ALLOWED_ERR',
145     -subtype => 'READ_ONLY_NODE_LIST_ERR'
146     unless $_[1] == 0;
147     } # STORESIZE
148    
149     sub manakai_read_only ($) { 1 }
150    
151     ## |NodeList| methods
152    
153     sub item ($$) { undef }
154    
155     *FETCH = \&item;
156    
157     sub STORE ($$$) {
158     report Message::DOM::DOMException
159     -object => $_[0],
160     -type => 'NO_MODIFICATION_ALLOWED_ERR',
161     -subtype => 'READ_ONLY_NODE_LIST_ERR';
162     } # STORE
163    
164     *DELETE = \&STORE;
165    
166     *CLEAR = \&STORE;
167    
168     package Message::IF::NodeList;
169    
170     =head1 LICENSE
171    
172     Copyright 2007 Wakaba <[email protected]>
173    
174     This program is free software; you can redistribute it and/or
175     modify it under the same terms as Perl itself.
176    
177     =cut
178    
179     1;
180     ## $Date: 2007/06/15 16:12:28 $

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24