/[suikacvs]/test/html-whatpm/parser-manakai.cgi
Suika

Contents of /test/html-whatpm/parser-manakai.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (show annotations) (download)
Sat Apr 12 15:57:56 2008 UTC (16 years, 6 months ago) by wakaba
Branch: MAIN
Changes since 1.6: +26 -4 lines
++ ChangeLog	12 Apr 2008 15:57:44 -0000
2008-04-12  Wakaba  <wakaba@suika.fam.cx>

	* parser-manakai.cgi, parser-manakai-interface.en.html: The |innerHTML|
	output mode is split into "|innerHTML| (HTML)" and "|innerHTML| (XML)"
	output modes.

2008-03-29  Wakaba  <wakaba@suika.fam.cx>

	* cc.cgi: New "URI" section is implemented.

1 #!/usr/bin/perl
2 use strict;
3
4 use lib qw[/home/httpd/html/www/markup/html/whatpm
5 /home/wakaba/work/manakai2/lib];
6 use CGI::Carp qw[fatalsToBrowser];
7 use Time::HiRes qw/time/;
8
9 use Message::CGI::HTTP;
10 my $http = Message::CGI::HTTP->new;
11
12 ## TODO: _charset_
13
14 my @mode = split m#/#, scalar $http->get_meta_variable ('PATH_INFO'), -1;
15 shift @mode if @mode and $mode[0] == '';
16 ## TODO: decode unreserved characters
17
18 my $s = $http->get_parameter ('s');
19 if (length $s > 1000_000) {
20 print STDOUT "Status: 400 Document Too Long\nContent-Type: text/plain; charset=us-ascii\n\nToo long";
21 exit;
22 }
23 my $char_length = length $s;
24 my %time;
25 my $time1;
26 my $time2;
27
28 require Message::DOM::DOMImplementation;
29 my $dom = Message::DOM::DOMImplementation->new;
30 # $| = 1;
31 my $doc;
32 my $el;
33
34
35 if (@mode == 3 and $mode[0] eq 'html' and
36 ($mode[2] eq 'html' or $mode[2] eq 'test' or $mode[2] eq 'xml')) {
37 print STDOUT "Content-Type: text/plain; charset=utf-8\n\n";
38
39 require Encode;
40 require Whatpm::HTML;
41
42 $time1 = time;
43 $s = Encode::decode ('utf-8', $s);
44 $time2 = time;
45 $time{decode} = $time2 - $time1;
46
47
48 print STDOUT "#errors\n";
49
50 my $onerror = sub {
51 my (%opt) = @_;
52 print STDOUT "$opt{line},$opt{column},$opt{type}\n";
53 };
54
55 $doc = $dom->create_document;
56 $doc->manakai_is_html (1);
57 $time1 = time;
58 if (length $mode[1]) {
59 $el = $doc->create_element_ns
60 ('http://www.w3.org/1999/xhtml', [undef, $mode[1]]);
61 Whatpm::HTML->set_inner_html ($el, $s, $onerror);
62 } else {
63 Whatpm::HTML->parse_string ($s => $doc, $onerror);
64 }
65 $time2 = time;
66 $time{parse} = $time2 - $time1;
67
68 print "#document\n";
69
70 my $out;
71 if ($mode[2] eq 'html') {
72 $time1 = time;
73 $out = \( ($el or $doc)->inner_html );
74 $time2 = time;
75 $time{serialize_html} = $time2 - $time1;
76 } elsif ($mode[2] eq 'xml') {
77 $doc->manakai_is_html (0);
78 $time1 = time;
79 $out = \( ($el or $doc)->inner_html );
80 $time2 = time;
81 $time{serialize_xml} = $time2 - $time1;
82 $doc->manakai_is_html (1);
83 } else { # test
84 $time1 = time;
85 $out = test_serialize ($el || $doc);
86 $time2 = time;
87 $time{serialize_test} = $time2 - $time1;
88 }
89 print STDOUT Encode::encode ('utf-8', $$out);
90 print STDOUT "\n";
91 } elsif (@mode == 3 and $mode[0] eq 'xhtml' and
92 ($mode[2] eq 'html' or $mode[2] eq 'test' or $mode[2] eq 'xml')) {
93 print STDOUT "Content-Type: text/plain; charset=utf-8\n\n";
94
95 require Message::DOM::XMLParserTemp;
96 print STDOUT "#errors\n";
97
98 my $onerror = sub {
99 my $err = shift;
100 print STDOUT $err->location->line_number, ",";
101 print STDOUT $err->location->column_number, ",";
102 print STDOUT $err->text, "\n";
103 return 1;
104 };
105
106 open my $fh, '<', \$s;
107 my $time1 = time;
108 $doc = Message::DOM::XMLParserTemp->parse_byte_stream
109 ($fh => $dom, $onerror, charset => 'utf-8');
110 my $time2 = time;
111 $time{parse_xml} = $time2 - $time1;
112
113 print "#document\n";
114
115 my $out;
116 if ($mode[2] eq 'html') {
117 $doc->manakai_is_html (0);
118 $time1 = time;
119 $out = \( $doc->inner_html ); ## TODO: $el case
120 $time2 = time;
121 $time{serialize_html} = $time2 - $time1;
122 $doc->manakai_is_html (1);
123 } elsif ($mode[2] eq 'xml') {
124 $time1 = time;
125 $out = \( $doc->inner_html ); ## TODO: $el case
126 $time2 = time;
127 $time{serialize_xml} = $time2 - $time1;
128 } else { # test
129 $time1 = time;
130 $out = test_serialize ($doc);
131 $time2 = time;
132 $time{serialize_test} = $time2 - $time1;
133 }
134 print STDOUT Encode::encode ('utf-8', $$out);
135 print STDOUT "\n";
136 } elsif (@mode == 3 and $mode[0] eq 'h2h' and $mode[1] eq '' and
137 ($mode[2] eq 'html' or $mode[2] eq 'test' or $mode[2] eq 'xml')) {
138 print STDOUT "Content-Type: text/plain; charset=utf-8\n\n";
139
140 require Encode;
141 $time1 = time;
142 $s = Encode::decode ('utf-8', $s);
143 $time2 = time;
144 $time{decode} = $time2 - $time1;
145
146 require Whatpm::H2H;
147 $doc = $dom->create_document;
148 Whatpm::H2H->parse_string ($s => $doc);
149
150 print "#document\n";
151
152 my $out;
153 if ($mode[2] eq 'html') {
154 $doc->manakai_is_html (0);
155 $time1 = time;
156 $out = \( $doc->inner_html );
157 $time2 = time;
158 $time{serialize_html} = $time2 - $time1;
159 $doc->manakai_is_html (1);
160 } elsif ($mode[2] eq 'xml') {
161 $time1 = time;
162 $out = \( $doc->inner_html );
163 $time2 = time;
164 $time{serialize_xml} = $time2 - $time1;
165 } else { # test
166 $time1 = time;
167 $out = test_serialize ($doc);
168 $time2 = time;
169 $time{serialize_test} = $time2 - $time1;
170 }
171 print STDOUT Encode::encode ('utf-8', $$out);
172 print STDOUT "\n";
173 } else {
174 print STDOUT "Status: 404 Not Found\nContent-Type: text/plain; charset=us-ascii\n\n404";
175 exit;
176 }
177
178 if ($http->get_parameter ('dom5')) {
179 require Whatpm::ContentChecker;
180 my $onerror = sub {
181 my %opt = @_;
182 print STDOUT get_node_path ($opt{node}) . ';' . $opt{type} . "\n";
183 };
184 print STDOUT "#domerrors\n";
185 $time1 = time;
186 if ($el) {
187 Whatpm::ContentChecker->check_element ($el, $onerror);
188 } else {
189 Whatpm::ContentChecker->check_document ($doc, $onerror);
190 }
191 $time2 = time;
192 $time{check} = $time2 - $time1;
193 }
194
195 print STDOUT "#log\n";
196 for (qw/decode parse parse_xml serialize_html serialize_xml serialize_test
197 check/) {
198 next unless defined $time{$_};
199 print STDOUT {
200 decode => 'bytes->chars',
201 parse => 'html5(chars)->dom5',
202 parse_xml => 'xml1(chars)->dom5',
203 serialize_html => 'dom5->html5(char)',
204 serialize_xml => 'dom5->xml1(char)',
205 serialize_test => 'dom5->test(char)',
206 check => 'dom5 check',
207 }->{$_};
208 print STDOUT "\t", $time{$_}, "s\n";
209 open my $file, '>>', ".manakai-$_.txt" or die ".manakai-$_.txt: $!";
210 print $file $char_length, "\t", $time{$_}, "\n";
211 }
212
213 exit;
214
215 sub test_serialize ($) {
216 my $node = shift;
217 my $r = '';
218
219 my @node = map { [$_, ''] } @{$node->child_nodes};
220 while (@node) {
221 my $child = shift @node;
222 my $nt = $child->[0]->node_type;
223 if ($nt == $child->[0]->ELEMENT_NODE) {
224 $r .= '| ' . $child->[1] . '<' . $child->[0]->tag_name . ">\x0A"; ## ISSUE: case?
225
226 for my $attr (sort {$a->[0] cmp $b->[0]} map { [$_->name, $_->value] }
227 @{$child->[0]->attributes}) {
228 $r .= '| ' . $child->[1] . ' ' . $attr->[0] . '="'; ## ISSUE: case?
229 $r .= $attr->[1] . '"' . "\x0A";
230 }
231
232 unshift @node,
233 map { [$_, $child->[1] . ' '] } @{$child->[0]->child_nodes};
234 } elsif ($nt == $child->[0]->TEXT_NODE) {
235 $r .= '| ' . $child->[1] . '"' . $child->[0]->data . '"' . "\x0A";
236 } elsif ($nt == $child->[0]->CDATA_SECTION_NODE) {
237 $r .= '| ' . $child->[1] . '<![CDATA[' . $child->[0]->data . "]]>\x0A";
238 } elsif ($nt == $child->[0]->COMMENT_NODE) {
239 $r .= '| ' . $child->[1] . '<!-- ' . $child->[0]->data . " -->\x0A";
240 } elsif ($nt == $child->[0]->DOCUMENT_TYPE_NODE) {
241 $r .= '| ' . $child->[1] . '<!DOCTYPE ' . $child->[0]->name . ">\x0A";
242 } elsif ($nt == $child->[0]->PROCESSING_INSTRUCTION_NODE) {
243 $r .= '| ' . $child->[1] . '<?' . $child->[0]->target . ' ' .
244 $child->[0]->data . "?>\x0A";
245 } else {
246 $r .= '| ' . $child->[1] . $child->[0]->node_type . "\x0A"; # error
247 }
248 }
249
250 return \$r;
251 } # test_serialize
252
253 sub get_node_path ($) {
254 my $node = shift;
255 my @r;
256 while (defined $node) {
257 my $rs;
258 if ($node->node_type == 1) {
259 $rs = $node->manakai_local_name;
260 $node = $node->parent_node;
261 } elsif ($node->node_type == 2) {
262 $rs = '@' . $node->manakai_local_name;
263 $node = $node->owner_element;
264 } elsif ($node->node_type == 3) {
265 $rs = '"' . $node->data . '"';
266 $node = $node->parent_node;
267 } elsif ($node->node_type == 9) {
268 $rs = '';
269 $node = $node->parent_node;
270 } else {
271 $rs = '#' . $node->node_type;
272 $node = $node->parent_node;
273 }
274 unshift @r, $rs;
275 }
276 return join '/', @r;
277 } # get_node_path
278
279 =head1 AUTHOR
280
281 Wakaba <w@suika.fam.cx>.
282
283 =head1 LICENSE
284
285 Copyright 2007 Wakaba <w@suika.fam.cx>
286
287 This library is free software; you can redistribute it
288 and/or modify it under the same terms as Perl itself.
289
290 =cut
291
292 ## $Date: 2007/08/11 13:54:55 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24