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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (hide annotations) (download)
Sun Jul 8 09:25:17 2007 UTC (17 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.4: +104 -6 lines
++ manakai/t/ChangeLog	8 Jul 2007 09:25:11 -0000
	* DOM-StringExtended.t: New test script.

2007-07-08  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/DOM/ChangeLog	8 Jul 2007 09:24:53 -0000
	* StringExtended.pm: New Perl module.

	* DOMCharacterData.pm (length, append_data, delete_data,
	insert_data, replace_data, substring_data): Implemented.

	* DOMException.pm (INDEX_SIZE_ERR): Implemented.

	* Text.pm (is_element_content_whitespace, whole_text,
	split_text): Implemented.

2007-07-08  Wakaba  <wakaba@suika.fam.cx>

1 wakaba 1.1 package Message::DOM::Text;
2     use strict;
3 wakaba 1.5 our $VERSION=do{my @r=(q$Revision: 1.4 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
4 wakaba 1.1 push our @ISA, 'Message::DOM::CharacterData', 'Message::IF::Text';
5     require Message::DOM::DOMCharacterData; ## TODO: Change to new module name
6    
7     sub AUTOLOAD {
8     my $method_name = our $AUTOLOAD;
9     $method_name =~ s/.*:://;
10     return if $method_name eq 'DESTROY';
11    
12     if ({
13     ## Read-only attributes (trivial accessors)
14     }->{$method_name}) {
15     no strict 'refs';
16     eval qq{
17     sub $method_name (\$) {
18     if (\@_ > 1) {
19     require Carp;
20     Carp::croak (qq<Can't modify read-only attribute>);
21     }
22     return \${\$_[0]}->{$method_name};
23     }
24     };
25     goto &{ $AUTOLOAD };
26     } elsif ({
27     ## Read-write attributes (DOMString, trivial accessors)
28     }->{$method_name}) {
29     no strict 'refs';
30     eval qq{
31     sub $method_name (\$) {
32     if (\@_ > 1) {
33     \${\$_[0]}->{$method_name} = ''.$_[1];
34     }
35     return \${\$_[0]}->{$method_name};
36     }
37     };
38     goto &{ $AUTOLOAD };
39     } else {
40     require Carp;
41     Carp::croak (qq<Can't locate method "$AUTOLOAD">);
42     }
43     } # AUTOLOAD
44    
45 wakaba 1.3 ## |Node| attributes
46 wakaba 1.1
47 wakaba 1.3 sub node_name () { '#text' }
48 wakaba 1.2
49 wakaba 1.3 sub node_type { 3 } # TEXT_NODE
50 wakaba 1.2
51 wakaba 1.5 ## |Text| attributes
52    
53 wakaba 1.3 sub is_element_content_whitespace ($;$) {
54 wakaba 1.5 if (@_ > 1) {
55     ## TODO: Document how setter work
56     if (${$_[0]}->{manakai_read_only}) {
57     report Message::DOM::DOMException
58     -object => $_[0],
59     -type => 'NO_MODIFICATION_ALLOWED_ERR',
60     -subtype => 'READ_ONLY_NODE_ERR';
61     }
62    
63     if ($_[1]) {
64     ${$_[0]}->{is_element_content_whitespace} = 1;
65     } else {
66     delete ${$_[0]}->{is_element_content_whitespace};
67     }
68     }
69     return ${$_[0]}->{is_element_content_whitespace};
70 wakaba 1.3 } # is_element_content_whitespace
71 wakaba 1.1
72 wakaba 1.5 sub whole_text ($) {
73     require Message::DOM::Traversal;
74     local $Error::Depth = $Error::Depth + 1;
75     my $doc = $_[0]->owner_document;
76     my $tw1 = $doc->create_tree_walker
77     ($doc, 0xFFFFFFFF, sub { # SHOW_ALL ENTITY_REFERENCE_NODE
78     ($_[1]->node_type == 5) ? 3 : 1; # FILTER_SKIP FILTER_ACCEPT
79     }, 1);
80     $tw1->current_node ($_[0]);
81    
82     my $tw2 = $tw1->clone;
83     my $r = $_[0]->node_value;
84    
85     S: while (defined (my $node = $tw1->previous_sibling)) {
86     my $nt = $node->node_type;
87     if ($nt == 3 or $nt == 4) { # TEXT_NODE CDATA_SECTION_NODE
88     $r = $node->node_value . $r;
89     } else {
90     last S;
91     }
92     } # S
93    
94     S: while (defined (my $node = $tw2->next_sibling)) {
95     my $nt = $node->node_type;
96     if ($nt == 3 or $nt == 4) { # TEXT_NODE CDATA_SECTION_NODE
97     $r .= $node->node_value;
98     } else {
99     last S;
100     }
101     } # S
102    
103     return $r;
104    
105     ## TODO: Skipping |DocumentType| is manakai-extension. Document it!
106     } # whole_text
107    
108     ## |Text| methods
109    
110     sub split_text ($;$) {
111     my $parent = $_[0]->parent_node;
112     if (${${$_[0]}->{owner_document}}->{strict_error_checking}) {
113     if (${$_[0]}->{manakai_read_only}) {
114     report Message::DOM::DOMException
115     -object => $_[0],
116     -type => 'NO_MODIFICATION_ALLOWED_ERR',
117     -subtype => 'READ_ONLY_NODE_ERR';
118     }
119    
120     if (defined $parent and $$parent->{manakai_read_only}) {
121     report Message::DOM::DOMException
122     -object => $_[0],
123     -type => 'NO_MODIFICATION_ALLOWED_ERR',
124     -subtype => 'READ_ONLY_NODE_ERR';
125     }
126     }
127    
128     require Message::DOM::StringExtended;
129     local $Error::Depth = $Error::Depth + 1;
130     my $offset32 = Message::DOM::StringExtended::find_offset32
131     (${$_[0]}->{data}, $_[1]);
132     my $data2 = substr ${$_[0]}->{data}, $offset32;
133    
134     my $r = $_[0]->node_type == 3 # TEXT_NODE
135     ? ${$_[0]}->{owner_document}->create_text_node ($data2)
136     : ${$_[0]}->{owner_document}->create_cdata_section ($data2);
137     $r->is_element_content_whitespace ($_[0]->is_element_content_whitespace);
138     substr (${$_[0]}->{data}, $offset32) = '';
139    
140     if (defined $parent) {
141     $parent->insert_before ($r, $_[0]->next_sibling);
142     }
143    
144     return $r;
145     } # split_text
146    
147 wakaba 1.1 package Message::IF::Text;
148    
149     package Message::DOM::Document;
150    
151     sub create_text_node ($$) {
152     return Message::DOM::Text->____new ($_[0], $_[1]);
153     } # create_text_node
154    
155 wakaba 1.5 =head1 LICENSE
156    
157     Copyright 2007 Wakaba <w@suika.fam.cx>
158    
159     This program is free software; you can redistribute it and/or
160     modify it under the same terms as Perl itself.
161    
162     =cut
163    
164 wakaba 1.1 1;
165 wakaba 1.5 ## $Date: 2007/07/07 11:11:34 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24