| 45 |
<body> |
<body> |
| 46 |
<h1>Web Document Conformance Checker (<em>beta</em>)</h1> |
<h1>Web Document Conformance Checker (<em>beta</em>)</h1> |
| 47 |
|
|
| 48 |
<div id="document-info" section="section"> |
<div id="document-info" class="section"> |
| 49 |
<dl> |
<dl> |
| 50 |
<dt>Document URI</dt> |
<dt>Document URI</dt> |
| 51 |
<dd><code class="URI" lang=""><<a href="@{[htescape $input_uri]}">@{[htescape $input_uri]}</a>></code></dd> |
<dd><code class="URI" lang=""><<a href="@{[htescape $input_uri]}">@{[htescape $input_uri]}</a>></code></dd> |
| 82 |
<div id="parse-errors" class="section"> |
<div id="parse-errors" class="section"> |
| 83 |
<h2>Parse Errors</h2> |
<h2>Parse Errors</h2> |
| 84 |
|
|
| 85 |
<ul> |
<dl> |
| 86 |
]; |
]; |
| 87 |
push @nav, ['#parse-errors' => 'Parse Error']; |
push @nav, ['#parse-errors' => 'Parse Error']; |
| 88 |
|
|
| 89 |
my $onerror = sub { |
my $onerror = sub { |
| 90 |
my (%opt) = @_; |
my (%opt) = @_; |
| 91 |
if ($opt{column} > 0) { |
if ($opt{column} > 0) { |
| 92 |
print STDOUT qq[<li><a href="#line-$opt{line}">Line $opt{line}</a> column $opt{column}: ]; |
print STDOUT qq[<dt><a href="#line-$opt{line}">Line $opt{line}</a> column $opt{column}</dt>\n]; |
| 93 |
} else { |
} else { |
| 94 |
$opt{line}--; |
$opt{line}--; |
| 95 |
print STDOUT qq[<li><a href="#line-$opt{line}">Line $opt{line}</a>: ]; |
print STDOUT qq[<dt><a href="#line-$opt{line}">Line $opt{line}</a></dt>\n]; |
| 96 |
} |
} |
| 97 |
print STDOUT qq[@{[htescape $opt{type}]}</li>\n]; |
print STDOUT qq[<dd>@{[htescape $opt{type}]}</dd>\n]; |
| 98 |
}; |
}; |
| 99 |
|
|
| 100 |
$doc = $dom->create_document; |
$doc = $dom->create_document; |
| 107 |
} |
} |
| 108 |
|
|
| 109 |
print STDOUT qq[ |
print STDOUT qq[ |
| 110 |
</ul> |
</dl> |
| 111 |
</div> |
</div> |
| 112 |
]; |
]; |
| 113 |
} elsif ($input_format eq 'application/xhtml+xml') { |
} elsif ($input_format eq 'application/xhtml+xml') { |
| 133 |
<div id="parse-errors" class="section"> |
<div id="parse-errors" class="section"> |
| 134 |
<h2>Parse Errors</h2> |
<h2>Parse Errors</h2> |
| 135 |
|
|
| 136 |
<ul> |
<dl> |
| 137 |
]; |
]; |
| 138 |
push @nav, ['#parse-errors' => 'Parse Error']; |
push @nav, ['#parse-errors' => 'Parse Error']; |
| 139 |
|
|
| 140 |
my $onerror = sub { |
my $onerror = sub { |
| 141 |
my $err = shift; |
my $err = shift; |
| 142 |
my $line = $err->location->line_number; |
my $line = $err->location->line_number; |
| 143 |
print STDOUT qq[<li><a href="#line-$line">Line $line</a> column ]; |
print STDOUT qq[<dt><a href="#line-$line">Line $line</a> column ]; |
| 144 |
print STDOUT $err->location->column_number, ": "; |
print STDOUT $err->location->column_number, "</dt><dd>"; |
| 145 |
print STDOUT htescape $err->text, "</li>\n"; |
print STDOUT htescape $err->text, "</dd>\n"; |
| 146 |
return 1; |
return 1; |
| 147 |
}; |
}; |
| 148 |
|
|
| 151 |
($fh => $dom, $onerror, charset => 'utf-8'); |
($fh => $dom, $onerror, charset => 'utf-8'); |
| 152 |
|
|
| 153 |
print STDOUT qq[ |
print STDOUT qq[ |
| 154 |
</ul> |
</dl> |
| 155 |
</div> |
</div> |
| 156 |
]; |
]; |
| 157 |
} else { |
} else { |
| 158 |
print STDOUT qq[ |
print STDOUT qq[ |
| 159 |
</dl> |
</dl> |
| 160 |
|
</div> |
| 161 |
|
|
| 162 |
<div id="result-summary" class="section"> |
<div id="result-summary" class="section"> |
| 163 |
<p><em>Media type <code class="MIME" lang="en">@{[htescape $input_format]}</code> is not supported!</em></p> |
<p><em>Media type <code class="MIME" lang="en">@{[htescape $input_format]}</code> is not supported!</em></p> |
| 182 |
<div id="document-errors" class="section"> |
<div id="document-errors" class="section"> |
| 183 |
<h2>Document Errors</h2> |
<h2>Document Errors</h2> |
| 184 |
|
|
| 185 |
<ul> |
<dl> |
| 186 |
]; |
]; |
| 187 |
push @nav, ['#document-errors' => 'Document Error']; |
push @nav, ['#document-errors' => 'Document Error']; |
| 188 |
|
|
| 189 |
require Whatpm::ContentChecker; |
require Whatpm::ContentChecker; |
| 190 |
my $onerror = sub { |
my $onerror = sub { |
| 191 |
my %opt = @_; |
my %opt = @_; |
| 192 |
print STDOUT qq[<li><a href="#node-@{[refaddr $opt{node}]}">], |
print STDOUT qq[<dt><a href="#node-@{[refaddr $opt{node}]}">], |
| 193 |
htescape get_node_path ($opt{node}), |
htescape get_node_path ($opt{node}), |
| 194 |
"</a>: ", htescape $opt{type}, "</li>\n"; |
"</a></dt>\n<dd>", htescape $opt{type}, "</dd>\n"; |
| 195 |
}; |
}; |
| 196 |
|
|
| 197 |
if ($el) { |
if ($el) { |
| 201 |
} |
} |
| 202 |
|
|
| 203 |
print STDOUT qq[ |
print STDOUT qq[ |
| 204 |
</ul> |
</dl> |
| 205 |
</div> |
</div> |
| 206 |
]; |
]; |
| 207 |
} |
} |
| 251 |
my $node_id = 'node-'.refaddr $child; |
my $node_id = 'node-'.refaddr $child; |
| 252 |
my $nt = $child->node_type; |
my $nt = $child->node_type; |
| 253 |
if ($nt == $child->ELEMENT_NODE) { |
if ($nt == $child->ELEMENT_NODE) { |
| 254 |
$r .= qq'<li id="$node_id"><code>' . htescape ($child->tag_name) . |
my $child_nsuri = $child->namespace_uri; |
| 255 |
|
$r .= qq[<li id="$node_id" class="tree-element"><code title="@{[defined $child_nsuri ? $child_nsuri : '']}">] . htescape ($child->tag_name) . |
| 256 |
'</code>'; ## ISSUE: case |
'</code>'; ## ISSUE: case |
| 257 |
|
|
| 258 |
if ($child->has_attributes) { |
if ($child->has_attributes) { |
| 259 |
$r .= '<ul class="attributes">'; |
$r .= '<ul class="attributes">'; |
| 260 |
for my $attr (sort {$a->[0] cmp $b->[0]} map { [$_->name, $_->value, 'node-'.refaddr $_] } |
for my $attr (sort {$a->[0] cmp $b->[0]} map { [$_->name, $_->value, $_->namespace_uri, 'node-'.refaddr $_] } |
| 261 |
@{$child->attributes}) { |
@{$child->attributes}) { |
| 262 |
$r .= qq'<li id="$attr->[2]"><code>' . htescape ($attr->[0]) . '</code> = '; ## ISSUE: case? |
$r .= qq[<li id="$attr->[3]" class="tree-attribute"><code title="@{[defined $_->[2] ? $_->[2] : '']}">] . htescape ($attr->[0]) . '</code> = '; ## ISSUE: case? |
| 263 |
$r .= '<q>' . htescape ($attr->[1]) . '</q></li>'; ## TODO: children |
$r .= '<q>' . htescape ($attr->[1]) . '</q></li>'; ## TODO: children |
| 264 |
} |
} |
| 265 |
$r .= '</ul>'; |
$r .= '</ul>'; |
| 270 |
unshift @node, @{$child->child_nodes}, '</ol>'; |
unshift @node, @{$child->child_nodes}, '</ol>'; |
| 271 |
} |
} |
| 272 |
} elsif ($nt == $child->TEXT_NODE) { |
} elsif ($nt == $child->TEXT_NODE) { |
| 273 |
$r .= qq'<li id="$node_id"><q>' . htescape ($child->data) . '</q></li>'; |
$r .= qq'<li id="$node_id" class="tree-text"><q lang="">' . htescape ($child->data) . '</q></li>'; |
| 274 |
} elsif ($nt == $child->CDATA_SECTION_NODE) { |
} elsif ($nt == $child->CDATA_SECTION_NODE) { |
| 275 |
$r .= qq'<li id="$node_id"><code><[CDATA[</code><q>' . htescape ($child->data) . '</q><code>]]></code></li>'; |
$r .= qq'<li id="$node_id" class="tree-cdata"><code><[CDATA[</code><q lang="">' . htescape ($child->data) . '</q><code>]]></code></li>'; |
| 276 |
} elsif ($nt == $child->COMMENT_NODE) { |
} elsif ($nt == $child->COMMENT_NODE) { |
| 277 |
$r .= qq'<li id="$node_id"><code><!--</code><q>' . htescape ($child->data) . '</q><code>--></code></li>'; |
$r .= qq'<li id="$node_id" class="tree-comment"><code><!--</code><q lang="">' . htescape ($child->data) . '</q><code>--></code></li>'; |
| 278 |
} elsif ($nt == $child->DOCUMENT_NODE) { |
} elsif ($nt == $child->DOCUMENT_NODE) { |
| 279 |
$r .= qq'<li id="$node_id">Document</li>'; |
$r .= qq'<li id="$node_id" class="tree-document">Document</li>'; |
| 280 |
if ($child->has_child_nodes) { |
if ($child->has_child_nodes) { |
| 281 |
$r .= '<ol>'; |
$r .= '<ol>'; |
| 282 |
unshift @node, @{$child->child_nodes}, '</ol>'; |
unshift @node, @{$child->child_nodes}, '</ol>'; |
| 283 |
} |
} |
| 284 |
} elsif ($nt == $child->DOCUMENT_TYPE_NODE) { |
} elsif ($nt == $child->DOCUMENT_TYPE_NODE) { |
| 285 |
$r .= qq'<li id="$node_id"><code><!DOCTYPE></code><ul>'; |
$r .= qq'<li id="$node_id" class="tree-doctype"><code><!DOCTYPE></code><ul>'; |
| 286 |
$r .= '<li>Name = <q>@{[htescape ($child->name)]}</q></li>'; |
$r .= '<li class="tree-doctype-name">Name = <q>@{[htescape ($child->name)]}</q></li>'; |
| 287 |
$r .= '<li>Public identifier = <q>@{[htescape ($child->public_id)]}</q></li>'; |
$r .= '<li class="tree-doctype-publicid">Public identifier = <q>@{[htescape ($child->public_id)]}</q></li>'; |
| 288 |
$r .= '<li>System identifier = <q>@{[htescape ($child->system_id)]}</q></li>'; |
$r .= '<li class="tree-doctype-systemid">System identifier = <q>@{[htescape ($child->system_id)]}</q></li>'; |
| 289 |
$r .= '</ul></li>'; |
$r .= '</ul></li>'; |
| 290 |
} elsif ($nt == $child->PROCESSING_INSTRUCTION_NODE) { |
} elsif ($nt == $child->PROCESSING_INSTRUCTION_NODE) { |
| 291 |
$r .= qq'<li id="$node_id"><code><?@{[htescape ($child->target)]}?></code>'; |
$r .= qq'<li id="$node_id" class="tree-id"><code><?@{[htescape ($child->target)]}</code> <q>@{[htescape ($child->data)]}</q><code>?></code></li>'; |
|
$r .= '<ul><li>@{[htescape ($child->data)]}</li></ul></li>'; |
|
| 292 |
} else { |
} else { |
| 293 |
$r .= qq'<li id="$node_id">@{[$child->node_type]} @{[htescape ($child->node_name)]}</li>'; # error |
$r .= qq'<li id="$node_id" class="tree-unknown">@{[$child->node_type]} @{[htescape ($child->node_name)]}</li>'; # error |
| 294 |
} |
} |
| 295 |
} |
} |
| 296 |
|
|