--- test/html-whatpm/parser.cgi 2007/05/01 09:25:31 1.1 +++ test/html-whatpm/parser.cgi 2007/05/25 14:24:31 1.5 @@ -1,7 +1,9 @@ #!/usr/bin/perl use strict; -use lib qw[.. /home/wakaba/public_html/-temp/wiki/lib]; +use lib qw[/home/httpd/html/www/markup/html/whatpm + /home/wakaba/public_html/-temp/wiki/lib]; +use CGI::Carp qw[fatalsToBrowser]; use SuikaWiki::Input::HTTP; ## TODO: Use some better CGI module @@ -12,10 +14,10 @@ my $mode = $http->meta_variable ('PATH_INFO'); ## TODO: decode unreserved characters -if ($mode eq '/html' or $mode eq '/error-and-html') { +if ($mode eq '/html' or $mode eq '/test') { require Encode; - require What::HTML; - require What::NanoDOM; + require Whatpm::HTML; + require Whatpm::NanoDOM; my $s = $http->parameter ('s'); if (length $s > 1000_000) { @@ -27,19 +29,121 @@ print STDOUT "Content-Type: text/plain; charset=utf-8\n\n"; - my $onerror = $mode eq '/error-and-html' ? sub { - print STDOUT "0,0,", $_[0], "\n"; - } : sub { }; + print STDOUT "#errors\n"; - my $doc = What::HTML->parse_string - ($s => What::NanoDOM::Document->new, $onerror); - - if ($mode eq '/error-and-html') { - print "--\n"; + my $onerror = sub { + my (%opt) = @_; + print STDOUT "$opt{line},$opt{column},$opt{type}\n"; + }; + + my $doc = Whatpm::HTML->parse_string + ($s => Whatpm::NanoDOM::Document->new, $onerror); + + print "#document\n"; + + my $out; + if ($mode eq '/html') { + $out = Whatpm::HTML->get_inner_html ($doc); + } else { # test + $out = test_serialize ($doc); } + print STDOUT Encode::encode ('utf-8', $$out); + print STDOUT "\n"; - my $html = What::HTML->get_inner_html ($doc); - print STDOUT Encode::encode ('utf-8', $$html); + if ($http->parameter ('dom5')) { + require Whatpm::ContentChecker; + print STDOUT "#domerrors\n"; + my $docel = $doc->document_element; + my $docel_nsuri = $docel->namespace_uri; + if (defined $docel_nsuri and + $docel_nsuri eq q and + $docel->manakai_local_name eq 'html') { + # + } else { + print STDOUT get_node_path ($docel) . ";element not allowed\n"; + } + my $cc = Whatpm::ContentChecker->new; + $cc->check_element ($docel, sub { + my %opt = @_; + print STDOUT get_node_path ($opt{node}) . ';' . $opt{type} . "\n"; + }); + } } else { print STDOUT "Status: 404 Not Found\nContent-Type: text/plain; charset=us-ascii\n\n404"; } + +exit; + +sub test_serialize ($) { + my $node = shift; + my $r = ''; + + my @node = map { [$_, ''] } @{$node->child_nodes}; + while (@node) { + my $child = shift @node; + my $nt = $child->[0]->node_type; + if ($nt == $child->[0]->ELEMENT_NODE) { + $r .= '| ' . $child->[1] . '<' . $child->[0]->tag_name . ">\x0A"; ## ISSUE: case? + + for my $attr (sort {$a->[0] cmp $b->[0]} map { [$_->name, $_->value] } + @{$child->[0]->attributes}) { + $r .= '| ' . $child->[1] . ' ' . $attr->[0] . '="'; ## ISSUE: case? + $r .= $attr->[1] . '"' . "\x0A"; + } + + unshift @node, + map { [$_, $child->[1] . ' '] } @{$child->[0]->child_nodes}; + } elsif ($nt == $child->[0]->TEXT_NODE) { + $r .= '| ' . $child->[1] . '"' . $child->[0]->data . '"' . "\x0A"; + } elsif ($nt == $child->[0]->COMMENT_NODE) { + $r .= '| ' . $child->[1] . '\x0A"; + } elsif ($nt == $child->[0]->DOCUMENT_TYPE_NODE) { + $r .= '| ' . $child->[1] . '[0]->name . ">\x0A"; + } else { + $r .= '| ' . $child->[1] . $child->[0]->node_type . "\x0A"; # error + } + } + + return \$r; +} # test_serialize + +sub get_node_path ($) { + my $node = shift; + my @r; + while (defined $node) { + my $rs; + if ($node->node_type == 1) { + $rs = $node->manakai_local_name; + $node = $node->parent_node; + } elsif ($node->node_type == 2) { + $rs = '@' . $node->manakai_local_name; + $node = $node->owner_element; + } elsif ($node->node_type == 3) { + $rs = '"' . $node->data . '"'; + $node = $node->parent_node; + } elsif ($node->node_type == 9) { + $rs = ''; + $node = $node->parent_node; + } else { + $rs = '#' . $node->node_type; + $node = $node->parent_node; + } + unshift @r, $rs; + } + return join '/', @r; +} # get_node_path + +=head1 AUTHOR + +Wakaba . + +=head1 LICENSE + +Copyright 2007 Wakaba + +This library is free software; you can redistribute it +and/or modify it under the same terms as Perl itself. + +=cut + +## $Date: 2007/05/25 14:24:31 $