--- test/html-webhacc/cc.cgi 2008/02/10 03:11:06 1.34
+++ test/html-webhacc/cc.cgi 2008/02/10 04:08:04 1.35
@@ -20,6 +20,11 @@
return $s;
} # htescape
+ my @nav;
+ my %time;
+ require Message::DOM::DOMImplementation;
+ my $dom = Message::DOM::DOMImplementation->new;
+{
use Message::CGI::HTTP;
my $http = Message::CGI::HTTP->new;
@@ -31,12 +36,8 @@
binmode STDOUT, ':utf8';
$| = 1;
- require Message::DOM::DOMImplementation;
- my $dom = Message::DOM::DOMImplementation->new;
-
load_text_catalog ('en'); ## TODO: conneg
- my @nav;
print STDOUT qq[Content-Type: text/html; charset=utf-8
@@ -53,7 +54,6 @@
$| = 0;
my $input = get_input_document ($http, $dom);
my $char_length = 0;
- my %time;
print qq[
@@ -88,6 +88,8 @@
];
+ $input->{id_prefix} = '';
+ #$input->{nested} = 0;
my $result = {conforming_min => 1, conforming_max => 1};
check_and_print ($input => $result);
print_result_section ($result);
@@ -116,6 +118,7 @@
}
exit;
+}
sub add_error ($$$) {
my ($layer, $err, $result) = @_;
@@ -147,20 +150,21 @@
sub check_and_print ($$) {
my ($input, $result) = @_;
- $input->{id_prefix} = '';
- #$input->{nested} = 1/0;
print_http_header_section ($input, $result);
my $doc;
my $el;
+ my $cssom;
my $manifest;
my @subdoc;
if ($input->{media_type} eq 'text/html') {
($doc, $el) = print_syntax_error_html_section ($input, $result);
print_source_string_section
- (\($input->{s}), $input->{charset} || $doc->input_encoding);
+ ($input,
+ \($input->{s}),
+ $input->{charset} || $doc->input_encoding);
} elsif ({
'text/xml' => 1,
'application/atom+xml' => 1,
@@ -170,11 +174,19 @@
'application/xml' => 1,
}->{$input->{media_type}}) {
($doc, $el) = print_syntax_error_xml_section ($input, $result);
- print_source_string_section (\($input->{s}), $doc->input_encoding);
+ print_source_string_section ($input,
+ \($input->{s}),
+ $doc->input_encoding);
+ } elsif ($input->{media_type} eq 'text/css') {
+ $cssom = print_syntax_error_css_section ($input, $result);
+ print_source_string_section
+ ($input, \($input->{s}),
+ $cssom->manakai_input_encoding);
} elsif ($input->{media_type} eq 'text/cache-manifest') {
## TODO: MUST be text/cache-manifest
$manifest = print_syntax_error_manifest_section ($input, $result);
- print_source_string_section (\($input->{s}), 'utf-8');
+ print_source_string_section ($input, \($input->{s}),
+ 'utf-8');
} else {
## TODO: Change HTTP status code??
print_result_unknown_type_section ($input, $result);
@@ -198,6 +210,9 @@
print_listing_section ({
id => 'classes', label => 'Classes', heading => 'Classes',
}, $input, $elements->{class}) if keys %{$elements->{class}};
+ } elsif (defined $cssom) {
+ print_structure_dump_cssom_section ($input, $cssom);
+ ## TODO: CSSOM validation
} elsif (defined $manifest) {
print_structure_dump_manifest_section ($input, $manifest);
print_structure_error_manifest_section ($input, $manifest, $result);
@@ -223,6 +238,7 @@
<$ebaseuri>
];
+ $subinput->{id_prefix} .= '-';
check_and_print ($subinput => $result);
print STDOUT qq[];
@@ -280,10 +296,10 @@
my (%opt) = @_;
my ($type, $cls, $msg) = get_text ($opt{type}, $opt{level});
if ($opt{column} > 0) {
- print STDOUT qq[Line $opt{line} column $opt{column}\n];
+ print STDOUT qq[Line $opt{line} column $opt{column}\n];
} else {
$opt{line} = $opt{line} - 1 || 1;
- print STDOUT qq[Line $opt{line}\n];
+ print STDOUT qq[Line $opt{line}\n];
}
$type =~ tr/ /-/;
$type =~ s/\|/%7C/g;
@@ -296,7 +312,7 @@
my $doc = $dom->create_document;
my $el;
- my $inner_html_element = $http->get_parameter ('e');
+ my $inner_html_element = $input->{inner_html_element};
if (defined $inner_html_element and length $inner_html_element) {
$input->{charset} ||= 'windows-1252'; ## TODO: for now.
my $time1 = time;
@@ -337,7 +353,7 @@
my $onerror = sub {
my $err = shift;
my $line = $err->location->line_number;
- print STDOUT qq[Line $line column ];
+ print STDOUT qq[Line $line column ];
print STDOUT $err->location->column_number, "";
print STDOUT htescape $err->text, "\n";
@@ -364,6 +380,222 @@
return ($doc, undef);
} # print_syntax_error_xml_section
+sub get_css_parser () {
+ our $CSSParser;
+ return $CSSParser if $CSSParser;
+
+ require Whatpm::CSS::Parser;
+ my $p = Whatpm::CSS::Parser->new;
+
+# if ($parse_mode eq 'q') {
+# $p->{unitless_px} = 1;
+# $p->{hashless_color} = 1;
+# }
+
+ $p->{prop}->{$_} = 1 for qw/
+ background background-attachment background-color background-image
+ background-position background-position-x background-position-y
+ background-repeat border border-bottom border-bottom-color
+ border-bottom-style border-bottom-width border-collapse border-color
+ border-left border-left-color
+ border-left-style border-left-width border-right border-right-color
+ border-right-style border-right-width
+ border-spacing -manakai-border-spacing-x -manakai-border-spacing-y
+ border-style border-top border-top-color border-top-style border-top-width
+ border-width bottom
+ caption-side clear clip color content counter-increment counter-reset
+ cursor direction display empty-cells float font
+ font-family font-size font-size-adjust font-stretch
+ font-style font-variant font-weight height left
+ letter-spacing line-height
+ list-style list-style-image list-style-position list-style-type
+ margin margin-bottom margin-left margin-right margin-top marker-offset
+ marks max-height max-width min-height min-width opacity -moz-opacity
+ orphans outline outline-color outline-style outline-width overflow
+ overflow-x overflow-y
+ padding padding-bottom padding-left padding-right padding-top
+ page page-break-after page-break-before page-break-inside
+ position quotes right size table-layout
+ text-align text-decoration text-indent text-transform
+ top unicode-bidi vertical-align visibility white-space width widows
+ word-spacing z-index
+ /;
+ $p->{prop_value}->{display}->{$_} = 1 for qw/
+ block clip inline inline-block inline-table list-item none
+ table table-caption table-cell table-column table-column-group
+ table-header-group table-footer-group table-row table-row-group
+ compact marker
+ /;
+ $p->{prop_value}->{position}->{$_} = 1 for qw/
+ absolute fixed relative static
+ /;
+ $p->{prop_value}->{float}->{$_} = 1 for qw/
+ left right none
+ /;
+ $p->{prop_value}->{clear}->{$_} = 1 for qw/
+ left right none both
+ /;
+ $p->{prop_value}->{direction}->{ltr} = 1;
+ $p->{prop_value}->{direction}->{rtl} = 1;
+ $p->{prop_value}->{marks}->{crop} = 1;
+ $p->{prop_value}->{marks}->{cross} = 1;
+ $p->{prop_value}->{'unicode-bidi'}->{$_} = 1 for qw/
+ normal bidi-override embed
+ /;
+ for my $prop_name (qw/overflow overflow-x overflow-y/) {
+ $p->{prop_value}->{$prop_name}->{$_} = 1 for qw/
+ visible hidden scroll auto -webkit-marquee -moz-hidden-unscrollable
+ /;
+ }
+ $p->{prop_value}->{visibility}->{$_} = 1 for qw/
+ visible hidden collapse
+ /;
+ $p->{prop_value}->{'list-style-type'}->{$_} = 1 for qw/
+ disc circle square decimal decimal-leading-zero
+ lower-roman upper-roman lower-greek lower-latin
+ upper-latin armenian georgian lower-alpha upper-alpha none
+ hebrew cjk-ideographic hiragana katakana hiragana-iroha
+ katakana-iroha
+ /;
+ $p->{prop_value}->{'list-style-position'}->{outside} = 1;
+ $p->{prop_value}->{'list-style-position'}->{inside} = 1;
+ $p->{prop_value}->{'page-break-before'}->{$_} = 1 for qw/
+ auto always avoid left right
+ /;
+ $p->{prop_value}->{'page-break-after'}->{$_} = 1 for qw/
+ auto always avoid left right
+ /;
+ $p->{prop_value}->{'page-break-inside'}->{auto} = 1;
+ $p->{prop_value}->{'page-break-inside'}->{avoid} = 1;
+ $p->{prop_value}->{'background-repeat'}->{$_} = 1 for qw/
+ repeat repeat-x repeat-y no-repeat
+ /;
+ $p->{prop_value}->{'background-attachment'}->{scroll} = 1;
+ $p->{prop_value}->{'background-attachment'}->{fixed} = 1;
+ $p->{prop_value}->{'font-size'}->{$_} = 1 for qw/
+ xx-small x-small small medium large x-large xx-large
+ -manakai-xxx-large -webkit-xxx-large
+ larger smaller
+ /;
+ $p->{prop_value}->{'font-style'}->{normal} = 1;
+ $p->{prop_value}->{'font-style'}->{italic} = 1;
+ $p->{prop_value}->{'font-style'}->{oblique} = 1;
+ $p->{prop_value}->{'font-variant'}->{normal} = 1;
+ $p->{prop_value}->{'font-variant'}->{'small-caps'} = 1;
+ $p->{prop_value}->{'font-stretch'}->{$_} = 1 for
+ qw/normal wider narrower ultra-condensed extra-condensed
+ condensed semi-condensed semi-expanded expanded
+ extra-expanded ultra-expanded/;
+ $p->{prop_value}->{'text-align'}->{$_} = 1 for qw/
+ left right center justify begin end
+ /;
+ $p->{prop_value}->{'text-transform'}->{$_} = 1 for qw/
+ capitalize uppercase lowercase none
+ /;
+ $p->{prop_value}->{'white-space'}->{$_} = 1 for qw/
+ normal pre nowrap pre-line pre-wrap
+ /;
+ $p->{prop_value}->{'text-decoration'}->{$_} = 1 for qw/
+ none blink underline overline line-through
+ /;
+ $p->{prop_value}->{'caption-side'}->{$_} = 1 for qw/
+ top bottom left right
+ /;
+ $p->{prop_value}->{'table-layout'}->{auto} = 1;
+ $p->{prop_value}->{'table-layout'}->{fixed} = 1;
+ $p->{prop_value}->{'border-collapse'}->{collapase} = 1;
+ $p->{prop_value}->{'border-collapse'}->{separate} = 1;
+ $p->{prop_value}->{'empty-cells'}->{show} = 1;
+ $p->{prop_value}->{'empty-cells'}->{hide} = 1;
+ $p->{prop_value}->{cursor}->{$_} = 1 for qw/
+ auto crosshair default pointer move e-resize ne-resize nw-resize n-resize
+ se-resize sw-resize s-resize w-resize text wait help progress
+ /;
+ for my $prop (qw/border-top-style border-left-style
+ border-bottom-style border-right-style outline-style/) {
+ $p->{prop_value}->{$prop}->{$_} = 1 for qw/
+ none hidden dotted dashed solid double groove ridge inset outset
+ /;
+ }
+ for my $prop (qw/color background-color
+ border-bottom-color border-left-color border-right-color
+ border-top-color border-color/) {
+ $p->{prop_value}->{$prop}->{transparent} = 1;
+ $p->{prop_value}->{$prop}->{flavor} = 1;
+ $p->{prop_value}->{$prop}->{'-manakai-default'} = 1;
+ }
+ $p->{prop_value}->{'outline-color'}->{invert} = 1;
+ $p->{prop_value}->{'outline-color'}->{'-manakai-invert-or-currentcolor'} = 1;
+ $p->{pseudo_class}->{$_} = 1 for qw/
+ active checked disabled empty enabled first-child first-of-type
+ focus hover indeterminate last-child last-of-type link only-child
+ only-of-type root target visited
+ lang nth-child nth-last-child nth-of-type nth-last-of-type not
+ -manakai-contains -manakai-current
+ /;
+ $p->{pseudo_element}->{$_} = 1 for qw/
+ after before first-letter first-line
+ /;
+
+ return $CSSParser = $p;
+} # get_css_parser
+
+sub print_syntax_error_css_section ($$) {
+ my ($input, $result) = @_;
+
+ print STDOUT qq[
+];
+
+ return $cssom;
+} # print_syntax_error_css_section
+
sub print_syntax_error_manifest_section ($$) {
my ($input, $result) = @_;
@@ -400,12 +632,19 @@
return $manifest;
} # print_syntax_error_manifest_section
-sub print_source_string_section ($$) {
- require Encode;
- my $enc = Encode::find_encoding ($_[1]); ## TODO: charset name -> Perl name
- return unless $enc;
+sub print_source_string_section ($$$) {
+ my $input = shift;
+ my $s;
+ unless ($input->{is_char_string}) {
+ require Encode;
+ my $enc = Encode::find_encoding ($_[1]); ## TODO: charset name -> Perl name
+ return unless $enc;
+
+ $s = \($enc->decode (${$_[0]}));
+ } else {
+ $s = $_[0];
+ }
- my $s = \($enc->decode (${$_[0]}));
my $i = 1;
push @nav, ['#source-string' => 'Source'] unless $input->{nested};
print STDOUT qq[
@@ -427,8 +666,9 @@
print STDOUT "
";
} # print_input_string_section
-sub print_document_tree ($) {
- my $node = shift;
+sub print_document_tree ($$) {
+ my ($input, $node) = @_;
+
my $r = '';
my @node = ($node);
@@ -526,13 +766,30 @@
Document Tree
];
- push @nav, ['#document-tree' => 'Tree'] unless $input->{nested};
+ push @nav, [qq[#$input->{id_prefix}document-tree] => 'Tree']
+ unless $input->{nested};
- print_document_tree ($el || $doc);
+ print_document_tree ($input, $el || $doc);
print STDOUT qq[];
} # print_structure_dump_dom_section
+sub print_structure_dump_cssom_section ($$) {
+ my ($input, $cssom) = @_;
+
+ print STDOUT qq[
+];
+} # print_structure_dump_cssom_section
+
sub print_structure_dump_manifest_section ($$) {
my ($input, $manifest) = @_;
@@ -540,7 +797,8 @@