| 232 |
if ($nt == 1) { |
if ($nt == 1) { |
| 233 |
## NOTE: |minuses| list is not checked since redundant |
## NOTE: |minuses| list is not checked since redundant |
| 234 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 235 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 236 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 237 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 238 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 261 |
if ($nt == 1) { |
if ($nt == 1) { |
| 262 |
## NOTE: |minuses| list is not checked since redundant |
## NOTE: |minuses| list is not checked since redundant |
| 263 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 264 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 265 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 266 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 267 |
} elsif ($nt == 5) { |
} elsif ($nt == 5) { |
| 301 |
} |
} |
| 302 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 303 |
if $not_allowed; |
if $not_allowed; |
| 304 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 305 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 306 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 307 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 336 |
unless $HTMLBlockLevelElements->{$node_ns}->{$node_ln}; |
unless $HTMLBlockLevelElements->{$node_ns}->{$node_ln}; |
| 337 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 338 |
if $not_allowed; |
if $not_allowed; |
| 339 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 340 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 341 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 342 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 372 |
$HTMLStructuredInlineLevelElements->{$node_ns}->{$node_ln}; |
$HTMLStructuredInlineLevelElements->{$node_ns}->{$node_ln}; |
| 373 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 374 |
if $not_allowed; |
if $not_allowed; |
| 375 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 376 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 377 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 378 |
} elsif ($nt == 5) { |
} elsif ($nt == 5) { |
| 410 |
unless $HTMLStrictlyInlineLevelElements->{$node_ns}->{$node_ln}; |
unless $HTMLStrictlyInlineLevelElements->{$node_ns}->{$node_ln}; |
| 411 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 412 |
if $not_allowed; |
if $not_allowed; |
| 413 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 414 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 415 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 416 |
} elsif ($nt == 5) { |
} elsif ($nt == 5) { |
| 455 |
} |
} |
| 456 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 457 |
if $not_allowed; |
if $not_allowed; |
| 458 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 459 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 460 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 461 |
} elsif ($nt == 5) { |
} elsif ($nt == 5) { |
| 517 |
} |
} |
| 518 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 519 |
if $not_allowed; |
if $not_allowed; |
| 520 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 521 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 522 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 523 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 600 |
} |
} |
| 601 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 602 |
if $not_allowed; |
if $not_allowed; |
| 603 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 604 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 605 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 606 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 752 |
## A space separated list of one or more URIs (or IRIs) |
## A space separated list of one or more URIs (or IRIs) |
| 753 |
my $HTMLSpaceURIsAttrChecker = sub { |
my $HTMLSpaceURIsAttrChecker = sub { |
| 754 |
my ($self, $attr) = @_; |
my ($self, $attr) = @_; |
| 755 |
## TODO: URI or IRI check |
my $i = 0; |
| 756 |
|
for my $value (split /[\x09-\x0D\x20]+/, $attr->value) { |
| 757 |
|
Whatpm::URIChecker->check_iri_reference ($value, sub { |
| 758 |
|
my %opt = @_; |
| 759 |
|
$self->{onerror}->(node => $attr, |
| 760 |
|
type => 'URI['.$i.']:'.$opt{level}.':'. |
| 761 |
|
(defined $opt{position} ? $opt{position} : '').':'. |
| 762 |
|
$opt{type}); |
| 763 |
|
}); |
| 764 |
|
$i++; |
| 765 |
|
} |
| 766 |
## ISSUE: Relative references? |
## ISSUE: Relative references? |
| 767 |
## ISSUE: Leading or trailing white spaces are conformant? |
## ISSUE: Leading or trailing white spaces are conformant? |
| 768 |
## ISSUE: A sequence of white space characters are conformant? |
## ISSUE: A sequence of white space characters are conformant? |
| 770 |
## NOTE: Duplication seems not an error. |
## NOTE: Duplication seems not an error. |
| 771 |
}; # $HTMLSpaceURIsAttrChecker |
}; # $HTMLSpaceURIsAttrChecker |
| 772 |
|
|
| 773 |
|
my $HTMLDatetimeAttrChecker = sub { |
| 774 |
|
my ($self, $attr) = @_; |
| 775 |
|
my $value = $attr->value; |
| 776 |
|
## ISSUE: "space", not "space character" (in parsing algorihtm, "space character") |
| 777 |
|
if ($value =~ /\A([0-9]{4})-([0-9]{2})-([0-9]{2})(?>[\x09-\x0D\x20]+(?>T[\x09-\x0D\x20]*)?|T[\x09-\x0D\x20]*)([0-9]{2}):([0-9]{2})(?>:([0-9]{2}))?(?>\.([0-9]+))?[\x09-\x0D\x20]*(?>Z|[+-]([0-9]{2}):([0-9]{2}))\z/) { |
| 778 |
|
my ($y, $M, $d, $h, $m, $s, $f, $zh, $zm) |
| 779 |
|
= ($1, $2, $3, $4, $5, $6, $7, $8, $9); |
| 780 |
|
if (0 < $M and $M < 13) { ## ISSUE: This is not explicitly specified (though in parsing algorithm) |
| 781 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad day') |
| 782 |
|
if $d < 1 or |
| 783 |
|
$d > [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]->[$M]; |
| 784 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad day') |
| 785 |
|
if $M == 2 and $d == 29 and |
| 786 |
|
not ($y % 400 == 0 or ($y % 4 == 0 and $y % 100 != 0)); |
| 787 |
|
} else { |
| 788 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad month'); |
| 789 |
|
} |
| 790 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad hour') if $h > 23; |
| 791 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad minute') if $m > 59; |
| 792 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad second') |
| 793 |
|
if defined $s and $s > 59; |
| 794 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad timezone hour') |
| 795 |
|
if $zh > 23; |
| 796 |
|
$self->{onerror}->(node => $attr, type => 'datetime:bad timezone minute') |
| 797 |
|
if $zm > 59; |
| 798 |
|
## ISSUE: Maybe timezone -00:00 should have same semantics as in RFC 3339. |
| 799 |
|
} else { |
| 800 |
|
$self->{onerror}->(node => $attr, type => 'datetime syntax error'); |
| 801 |
|
} |
| 802 |
|
}; # $HTMLDatetimeAttrChecker |
| 803 |
|
|
| 804 |
my $HTMLIntegerAttrChecker = sub { |
my $HTMLIntegerAttrChecker = sub { |
| 805 |
my ($self, $attr) = @_; |
my ($self, $attr) = @_; |
| 806 |
my $value = $attr->value; |
my $value = $attr->value; |
| 958 |
dir => $GetHTMLEnumeratedAttrChecker->({ltr => 1, rtl => 1}), |
dir => $GetHTMLEnumeratedAttrChecker->({ltr => 1, rtl => 1}), |
| 959 |
class => $HTMLUnorderedSetOfSpaceSeparatedTokensAttrChecker, |
class => $HTMLUnorderedSetOfSpaceSeparatedTokensAttrChecker, |
| 960 |
irrelevant => $GetHTMLBooleanAttrChecker->('irrelevant'), |
irrelevant => $GetHTMLBooleanAttrChecker->('irrelevant'), |
| 961 |
## TODO: tabindex |
tabindex => $HTMLIntegerAttrChecker, |
| 962 |
}; |
}; |
| 963 |
|
|
| 964 |
for (qw/ |
for (qw/ |
| 1054 |
} |
} |
| 1055 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 1056 |
if $not_allowed; |
if $not_allowed; |
| 1057 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 1058 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 1059 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 1060 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 1133 |
} |
} |
| 1134 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 1135 |
if $not_allowed; |
if $not_allowed; |
| 1136 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 1137 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 1138 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 1139 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 1341 |
|
|
| 1342 |
$Element->{$HTML_NS}->{h1} = { |
$Element->{$HTML_NS}->{h1} = { |
| 1343 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1344 |
checker => $HTMLSignificantStrictlyInlineChecker, |
checker => sub { |
| 1345 |
|
my ($self, $todo) = @_; |
| 1346 |
|
$todo->{flag}->{has_heading}->[0] = 1; |
| 1347 |
|
return $HTMLSignificantStrictlyInlineChecker->($self, $todo); |
| 1348 |
|
}, |
| 1349 |
}; |
}; |
| 1350 |
|
|
| 1351 |
$Element->{$HTML_NS}->{h2} = { |
$Element->{$HTML_NS}->{h2} = { |
| 1352 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1353 |
checker => $HTMLSignificantStrictlyInlineChecker, |
checker => $Element->{$HTML_NS}->{h1}->{checker}, |
| 1354 |
}; |
}; |
| 1355 |
|
|
| 1356 |
$Element->{$HTML_NS}->{h3} = { |
$Element->{$HTML_NS}->{h3} = { |
| 1357 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1358 |
checker => $HTMLSignificantStrictlyInlineChecker, |
checker => $Element->{$HTML_NS}->{h1}->{checker}, |
| 1359 |
}; |
}; |
| 1360 |
|
|
| 1361 |
$Element->{$HTML_NS}->{h4} = { |
$Element->{$HTML_NS}->{h4} = { |
| 1362 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1363 |
checker => $HTMLSignificantStrictlyInlineChecker, |
checker => $Element->{$HTML_NS}->{h1}->{checker}, |
| 1364 |
}; |
}; |
| 1365 |
|
|
| 1366 |
$Element->{$HTML_NS}->{h5} = { |
$Element->{$HTML_NS}->{h5} = { |
| 1367 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1368 |
checker => $HTMLSignificantStrictlyInlineChecker, |
checker => $Element->{$HTML_NS}->{h1}->{checker}, |
| 1369 |
}; |
}; |
| 1370 |
|
|
| 1371 |
$Element->{$HTML_NS}->{h6} = { |
$Element->{$HTML_NS}->{h6} = { |
| 1372 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1373 |
checker => $HTMLSignificantStrictlyInlineChecker, |
checker => $Element->{$HTML_NS}->{h1}->{checker}, |
| 1374 |
}; |
}; |
| 1375 |
|
|
| 1376 |
## TODO: header |
$Element->{$HTML_NS}->{header} = { |
| 1377 |
|
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1378 |
|
checker => sub { |
| 1379 |
|
my ($self, $todo) = @_; |
| 1380 |
|
my $old_flag = $todo->{flag}->{has_heading} || []; |
| 1381 |
|
my $new_flag = []; |
| 1382 |
|
local $todo->{flag}->{has_heading} = $new_flag; |
| 1383 |
|
my $node = $todo->{node}; |
| 1384 |
|
|
| 1385 |
|
my $end = $self->_add_minuses |
| 1386 |
|
({$HTML_NS => {qw/header 1 footer 1/}}, |
| 1387 |
|
$HTMLSectioningElements); |
| 1388 |
|
my ($new_todos, $ch) = $HTMLBlockChecker->($self, $todo); |
| 1389 |
|
push @$new_todos, $end, |
| 1390 |
|
{type => 'code', code => sub { |
| 1391 |
|
if ($new_flag->[0]) { |
| 1392 |
|
$old_flag->[0] = 1; |
| 1393 |
|
} else { |
| 1394 |
|
$self->{onerror}->(node => $node, type => 'element missing:hn'); |
| 1395 |
|
} |
| 1396 |
|
}}; |
| 1397 |
|
return ($new_todos, $ch); |
| 1398 |
|
}, |
| 1399 |
|
}; |
| 1400 |
|
|
| 1401 |
$Element->{$HTML_NS}->{footer} = { |
$Element->{$HTML_NS}->{footer} = { |
| 1402 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1453 |
} |
} |
| 1454 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 1455 |
if $not_allowed; |
if $not_allowed; |
| 1456 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 1457 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 1458 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 1459 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 1547 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 1548 |
} |
} |
| 1549 |
} |
} |
| 1550 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 1551 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 1552 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 1553 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 1593 |
unless ($node_ns eq $HTML_NS and $node_ln eq 'li') { |
unless ($node_ns eq $HTML_NS and $node_ln eq 'li') { |
| 1594 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 1595 |
} |
} |
| 1596 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 1597 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 1598 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 1599 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 1692 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 1693 |
} |
} |
| 1694 |
} |
} |
| 1695 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 1696 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 1697 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 1698 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 1813 |
checker => $HTMLInlineOrStrictlyInlineChecker, |
checker => $HTMLInlineOrStrictlyInlineChecker, |
| 1814 |
}; |
}; |
| 1815 |
|
|
| 1816 |
$Element->{$HTML_NS}->{dfn} = { ## TODO: term duplication |
$Element->{$HTML_NS}->{dfn} = { |
| 1817 |
attrs_checker => $GetHTMLAttrsChecker->({}), |
attrs_checker => $GetHTMLAttrsChecker->({}), |
| 1818 |
checker => sub { |
checker => sub { |
| 1819 |
my ($self, $todo) = @_; |
my ($self, $todo) = @_; |
| 1821 |
my $end = $self->_add_minuses ({$HTML_NS => {dfn => 1}}); |
my $end = $self->_add_minuses ({$HTML_NS => {dfn => 1}}); |
| 1822 |
my ($sib, $ch) = $HTMLStrictlyInlineChecker->($self, $todo); |
my ($sib, $ch) = $HTMLStrictlyInlineChecker->($self, $todo); |
| 1823 |
push @$sib, $end; |
push @$sib, $end; |
| 1824 |
|
|
| 1825 |
|
my $node = $todo->{node}; |
| 1826 |
|
my $term = $node->get_attribute_ns (undef, 'title'); |
| 1827 |
|
unless (defined $term) { |
| 1828 |
|
for my $child (@{$node->child_nodes}) { |
| 1829 |
|
if ($child->node_type == 1) { # ELEMENT_NODE |
| 1830 |
|
if (defined $term) { |
| 1831 |
|
undef $term; |
| 1832 |
|
last; |
| 1833 |
|
} elsif ($child->manakai_local_name eq 'abbr') { |
| 1834 |
|
my $nsuri = $child->namespace_uri; |
| 1835 |
|
if (defined $nsuri and $nsuri eq $HTML_NS) { |
| 1836 |
|
my $attr = $child->get_attribute_node_ns (undef, 'title'); |
| 1837 |
|
if ($attr) { |
| 1838 |
|
$term = $attr->value; |
| 1839 |
|
} |
| 1840 |
|
} |
| 1841 |
|
} |
| 1842 |
|
} elsif ($child->node_type == 3 or $child->node_type == 4) { |
| 1843 |
|
## TEXT_NODE or CDATA_SECTION_NODE |
| 1844 |
|
if ($child->data =~ /\A[\x09-\x0D\x20]+\z/) { # Inter-element whitespace |
| 1845 |
|
next; |
| 1846 |
|
} |
| 1847 |
|
undef $term; |
| 1848 |
|
last; |
| 1849 |
|
} |
| 1850 |
|
} |
| 1851 |
|
unless (defined $term) { |
| 1852 |
|
$term = $node->text_content; |
| 1853 |
|
} |
| 1854 |
|
} |
| 1855 |
|
if ($self->{term}->{$term}) { |
| 1856 |
|
$self->{onerror}->(node => $node, type => 'duplicate term'); |
| 1857 |
|
} else { |
| 1858 |
|
$self->{term}->{$term} = 1; |
| 1859 |
|
} |
| 1860 |
|
|
| 1861 |
return ($sib, $ch); |
return ($sib, $ch); |
| 1862 |
}, |
}, |
| 1863 |
}; |
}; |
| 1967 |
$Element->{$HTML_NS}->{ins} = { |
$Element->{$HTML_NS}->{ins} = { |
| 1968 |
attrs_checker => $GetHTMLAttrsChecker->({ |
attrs_checker => $GetHTMLAttrsChecker->({ |
| 1969 |
cite => $HTMLURIAttrChecker, |
cite => $HTMLURIAttrChecker, |
| 1970 |
## TODO: datetime |
datetime => $HTMLDatetimeAttrChecker, |
| 1971 |
}), |
}), |
| 1972 |
checker => $HTMLTransparentChecker, |
checker => $HTMLTransparentChecker, |
| 1973 |
}; |
}; |
| 1975 |
$Element->{$HTML_NS}->{del} = { |
$Element->{$HTML_NS}->{del} = { |
| 1976 |
attrs_checker => $GetHTMLAttrsChecker->({ |
attrs_checker => $GetHTMLAttrsChecker->({ |
| 1977 |
cite => $HTMLURIAttrChecker, |
cite => $HTMLURIAttrChecker, |
| 1978 |
## TODO: datetime |
datetime => $HTMLDatetimeAttrChecker, |
| 1979 |
}), |
}), |
| 1980 |
checker => sub { |
checker => sub { |
| 1981 |
my ($self, $todo) = @_; |
my ($self, $todo) = @_; |
| 2416 |
} else { # after tfoot |
} else { # after tfoot |
| 2417 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 2418 |
} |
} |
| 2419 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 2420 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 2421 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 2422 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 2471 |
unless ($node_ns eq $HTML_NS and $node_ln eq 'col') { |
unless ($node_ns eq $HTML_NS and $node_ln eq 'col') { |
| 2472 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 2473 |
} |
} |
| 2474 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 2475 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 2476 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 2477 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 2517 |
} else { |
} else { |
| 2518 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 2519 |
} |
} |
| 2520 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 2521 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 2522 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 2523 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 2569 |
} else { |
} else { |
| 2570 |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
$self->{onerror}->(node => $node, type => 'element not allowed'); |
| 2571 |
} |
} |
| 2572 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 2573 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 2574 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 2575 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 2605 |
checker => $HTMLBlockOrInlineChecker, |
checker => $HTMLBlockOrInlineChecker, |
| 2606 |
}; |
}; |
| 2607 |
|
|
|
## TODO: table model error checking |
|
|
|
|
| 2608 |
## TODO: forms |
## TODO: forms |
| 2609 |
|
|
| 2610 |
$Element->{$HTML_NS}->{script} = { |
$Element->{$HTML_NS}->{script} = { |
| 2729 |
} |
} |
| 2730 |
$self->{onerror}->(node => $node, type => 'element not allowed') |
$self->{onerror}->(node => $node, type => 'element not allowed') |
| 2731 |
if $not_allowed; |
if $not_allowed; |
| 2732 |
my ($sib, $ch) = $self->_check_get_children ($node); |
my ($sib, $ch) = $self->_check_get_children ($node, $todo); |
| 2733 |
unshift @nodes, @$sib; |
unshift @nodes, @$sib; |
| 2734 |
push @$new_todos, @$ch; |
push @$new_todos, @$ch; |
| 2735 |
} elsif ($nt == 3 or $nt == 4) { |
} elsif ($nt == 3 or $nt == 4) { |
| 2825 |
|
|
| 2826 |
$self->{minuses} = {}; |
$self->{minuses} = {}; |
| 2827 |
$self->{id} = {}; |
$self->{id} = {}; |
| 2828 |
|
$self->{term} = {}; |
| 2829 |
$self->{usemap} = []; |
$self->{usemap} = []; |
| 2830 |
$self->{map} = {}; |
$self->{map} = {}; |
| 2831 |
$self->{has_link_type} = {}; |
$self->{has_link_type} = {}; |
| 2865 |
$eldef->{attrs_checker}->($self, $todo); |
$eldef->{attrs_checker}->($self, $todo); |
| 2866 |
} elsif ($todo->{type} eq 'plus') { |
} elsif ($todo->{type} eq 'plus') { |
| 2867 |
$self->_remove_minuses ($todo); |
$self->_remove_minuses ($todo); |
| 2868 |
|
} elsif ($todo->{type} eq 'code') { |
| 2869 |
|
$todo->{code}->(); |
| 2870 |
|
} else { |
| 2871 |
|
die "$0: Internal error: Unsupported checking action type |$todo->{type}|"; |
| 2872 |
} |
} |
| 2873 |
} |
} |
| 2874 |
|
|
| 2911 |
1; |
1; |
| 2912 |
} # _remove_minuses |
} # _remove_minuses |
| 2913 |
|
|
| 2914 |
sub _check_get_children ($$) { |
sub _check_get_children ($$$) { |
| 2915 |
my ($self, $node) = @_; |
my ($self, $node, $parent_todo) = @_; |
| 2916 |
my $new_todos = []; |
my $new_todos = []; |
| 2917 |
my $sib = []; |
my $sib = []; |
| 2918 |
TP: { |
TP: { |
| 2960 |
} |
} |
| 2961 |
push @$new_todos, {type => 'element', node => $node}; |
push @$new_todos, {type => 'element', node => $node}; |
| 2962 |
} # TP |
} # TP |
| 2963 |
|
|
| 2964 |
|
for my $new_todo (@$new_todos) { |
| 2965 |
|
$new_todo->{flag} = {%{$parent_todo->{flag} or {}}}; |
| 2966 |
|
} |
| 2967 |
|
|
| 2968 |
return ($sib, $new_todos); |
return ($sib, $new_todos); |
| 2969 |
} # _check_get_children |
} # _check_get_children |
| 2970 |
|
|