| 7 |
## ISSUE: How XML and XML Namespaces conformance can (or cannot) |
## ISSUE: How XML and XML Namespaces conformance can (or cannot) |
| 8 |
## be applied to an in-memory representation (i.e. DOM)? |
## be applied to an in-memory representation (i.e. DOM)? |
| 9 |
|
|
| 10 |
|
## TODO: Conformance of an HTML document with non-html root element. |
| 11 |
|
|
| 12 |
my $HTML_NS = q<http://www.w3.org/1999/xhtml>; |
my $HTML_NS = q<http://www.w3.org/1999/xhtml>; |
| 13 |
my $XML_NS = q<http://www.w3.org/XML/1998/namespace>; |
my $XML_NS = q<http://www.w3.org/XML/1998/namespace>; |
| 14 |
my $XMLNS_NS = q<http://www.w3.org/2000/xmlns/>; |
my $XMLNS_NS = q<http://www.w3.org/2000/xmlns/>; |
| 236 |
$ElementDefault; |
$ElementDefault; |
| 237 |
if ($docel_def->{is_root}) { |
if ($docel_def->{is_root}) { |
| 238 |
# |
# |
| 239 |
|
} elsif ($docel_def->{is_xml_root}) { |
| 240 |
|
unless ($doc->manakai_is_html) { |
| 241 |
|
# |
| 242 |
|
} else { |
| 243 |
|
$onerror->(node => $docel, type => 'element not allowed:root:xml'); |
| 244 |
|
} |
| 245 |
} else { |
} else { |
| 246 |
$onerror->(node => $docel, type => 'element not allowed:root'); |
$onerror->(node => $docel, type => 'element not allowed:root'); |
| 247 |
} |
} |
| 262 |
$self->{should_level} = 's'; |
$self->{should_level} = 's'; |
| 263 |
$self->{good_level} = 'g'; |
$self->{good_level} = 'g'; |
| 264 |
|
|
| 265 |
|
$self->{pluses} = {}; |
| 266 |
$self->{minuses} = {}; |
$self->{minuses} = {}; |
| 267 |
$self->{id} = {}; |
$self->{id} = {}; |
| 268 |
$self->{term} = {}; |
$self->{term} = {}; |
| 325 |
$Element->{$nsuri}->{''} || |
$Element->{$nsuri}->{''} || |
| 326 |
$ElementDefault; |
$ElementDefault; |
| 327 |
$eldef->{attrs_checker}->($self, $todo); |
$eldef->{attrs_checker}->($self, $todo); |
| 328 |
} elsif ($todo->{type} eq 'plus') { |
} elsif ($todo->{type} eq 'plus' or $todo->{type} eq 'minus') { |
| 329 |
$self->_remove_minuses ($todo); |
$self->_remove_minuses ($todo); |
| 330 |
} elsif ($todo->{type} eq 'code') { |
} elsif ($todo->{type} eq 'code') { |
| 331 |
$todo->{code}->(); |
$todo->{code}->(); |
| 346 |
} |
} |
| 347 |
} |
} |
| 348 |
|
|
| 349 |
|
delete $self->{pluses}; |
| 350 |
delete $self->{minuses}; |
delete $self->{minuses}; |
| 351 |
delete $self->{onerror}; |
delete $self->{onerror}; |
| 352 |
delete $self->{id}; |
delete $self->{id}; |
| 371 |
return {type => 'plus', list => $r}; |
return {type => 'plus', list => $r}; |
| 372 |
} # _add_minuses |
} # _add_minuses |
| 373 |
|
|
| 374 |
|
sub _add_pluses ($@) { |
| 375 |
|
my $self = shift; |
| 376 |
|
my $r = {}; |
| 377 |
|
for my $list (@_) { |
| 378 |
|
for my $ns (keys %$list) { |
| 379 |
|
for my $ln (keys %{$list->{$ns}}) { |
| 380 |
|
unless ($self->{pluses}->{$ns}->{$ln}) { |
| 381 |
|
$self->{pluses}->{$ns}->{$ln} = 1; |
| 382 |
|
$r->{$ns}->{$ln} = 1; |
| 383 |
|
} |
| 384 |
|
} |
| 385 |
|
} |
| 386 |
|
} |
| 387 |
|
return {type => 'minus', list => $r}; |
| 388 |
|
} # _add_pluses |
| 389 |
|
|
| 390 |
sub _remove_minuses ($$) { |
sub _remove_minuses ($$) { |
| 391 |
my ($self, $todo) = @_; |
my ($self, $todo) = @_; |
| 392 |
for my $ns (keys %{$todo->{list}}) { |
if ($todo->{type} eq 'minus') { |
| 393 |
for my $ln (keys %{$todo->{list}->{$ns}}) { |
for my $ns (keys %{$todo->{list}}) { |
| 394 |
delete $self->{minuses}->{$ns}->{$ln} if $todo->{list}->{$ns}->{$ln}; |
for my $ln (keys %{$todo->{list}->{$ns}}) { |
| 395 |
|
delete $self->{pluses}->{$ns}->{$ln} if $todo->{list}->{$ns}->{$ln}; |
| 396 |
|
} |
| 397 |
} |
} |
| 398 |
|
} elsif ($todo->{type} eq 'plus') { |
| 399 |
|
for my $ns (keys %{$todo->{list}}) { |
| 400 |
|
for my $ln (keys %{$todo->{list}->{$ns}}) { |
| 401 |
|
delete $self->{minuses}->{$ns}->{$ln} if $todo->{list}->{$ns}->{$ln}; |
| 402 |
|
} |
| 403 |
|
} |
| 404 |
|
} else { |
| 405 |
|
die "$0: Unknown +- type: $todo->{type}"; |
| 406 |
} |
} |
| 407 |
1; |
1; |
| 408 |
} # _remove_minuses |
} # _remove_minuses |
| 409 |
|
|
| 410 |
|
## NOTE: Priority for "minuses" and "pluses" are currently left |
| 411 |
|
## undefined and implemented inconsistently; it is not a problem for |
| 412 |
|
## now, since no element belongs to both lists. |
| 413 |
|
|
| 414 |
sub _check_get_children ($$$) { |
sub _check_get_children ($$$) { |
| 415 |
my ($self, $node, $parent_todo) = @_; |
my ($self, $node, $parent_todo) = @_; |
| 416 |
my $new_todos = []; |
my $new_todos = []; |