| 966 |
## TODO: Polytheistic slash SHOULD NOT be used. (Applied only to atheists.) |
## TODO: Polytheistic slash SHOULD NOT be used. (Applied only to atheists.) |
| 967 |
## (This requirement was dropped from HTML5 spec, unfortunately.) |
## (This requirement was dropped from HTML5 spec, unfortunately.) |
| 968 |
|
|
| 969 |
|
my $is_space = { |
| 970 |
|
0x0009 => 1, # CHARACTER TABULATION (HT) |
| 971 |
|
0x000A => 1, # LINE FEED (LF) |
| 972 |
|
#0x000B => 0, # LINE TABULATION (VT) |
| 973 |
|
0x000C => 1, # FORM FEED (FF) |
| 974 |
|
#0x000D => 1, # CARRIAGE RETURN (CR) |
| 975 |
|
0x0020 => 1, # SPACE (SP) |
| 976 |
|
}; |
| 977 |
|
|
| 978 |
sub _get_next_token ($) { |
sub _get_next_token ($) { |
| 979 |
my $self = shift; |
my $self = shift; |
| 980 |
|
|
| 1345 |
redo A; |
redo A; |
| 1346 |
} |
} |
| 1347 |
} else { # after "<{tag-name}" |
} else { # after "<{tag-name}" |
| 1348 |
unless ({ |
unless ($is_space->{$self->{nc}} or |
| 1349 |
0x0009 => 1, # HT |
{ |
|
0x000A => 1, # LF |
|
|
0x000B => 1, # VT |
|
|
0x000C => 1, # FF |
|
|
0x0020 => 1, # SP |
|
| 1350 |
0x003E => 1, # > |
0x003E => 1, # > |
| 1351 |
0x002F => 1, # / |
0x002F => 1, # / |
| 1352 |
-1 => 1, # EOF |
-1 => 1, # EOF |
| 1373 |
} |
} |
| 1374 |
} |
} |
| 1375 |
} elsif ($self->{state} == TAG_NAME_STATE) { |
} elsif ($self->{state} == TAG_NAME_STATE) { |
| 1376 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 1377 |
!!!cp (34); |
!!!cp (34); |
| 1378 |
$self->{state} = BEFORE_ATTRIBUTE_NAME_STATE; |
$self->{state} = BEFORE_ATTRIBUTE_NAME_STATE; |
| 1379 |
!!!next-input-character; |
!!!next-input-character; |
| 1445 |
redo A; |
redo A; |
| 1446 |
} |
} |
| 1447 |
} elsif ($self->{state} == BEFORE_ATTRIBUTE_NAME_STATE) { |
} elsif ($self->{state} == BEFORE_ATTRIBUTE_NAME_STATE) { |
| 1448 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 1449 |
!!!cp (45); |
!!!cp (45); |
| 1450 |
## Stay in the state |
## Stay in the state |
| 1451 |
!!!next-input-character; |
!!!next-input-character; |
| 1541 |
} |
} |
| 1542 |
}; # $before_leave |
}; # $before_leave |
| 1543 |
|
|
| 1544 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 1545 |
!!!cp (59); |
!!!cp (59); |
| 1546 |
$before_leave->(); |
$before_leave->(); |
| 1547 |
$self->{state} = AFTER_ATTRIBUTE_NAME_STATE; |
$self->{state} = AFTER_ATTRIBUTE_NAME_STATE; |
| 1624 |
redo A; |
redo A; |
| 1625 |
} |
} |
| 1626 |
} elsif ($self->{state} == AFTER_ATTRIBUTE_NAME_STATE) { |
} elsif ($self->{state} == AFTER_ATTRIBUTE_NAME_STATE) { |
| 1627 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 1628 |
!!!cp (71); |
!!!cp (71); |
| 1629 |
## Stay in the state |
## Stay in the state |
| 1630 |
!!!next-input-character; |
!!!next-input-character; |
| 1711 |
redo A; |
redo A; |
| 1712 |
} |
} |
| 1713 |
} elsif ($self->{state} == BEFORE_ATTRIBUTE_VALUE_STATE) { |
} elsif ($self->{state} == BEFORE_ATTRIBUTE_VALUE_STATE) { |
| 1714 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 1715 |
!!!cp (83); |
!!!cp (83); |
| 1716 |
## Stay in the state |
## Stay in the state |
| 1717 |
!!!next-input-character; |
!!!next-input-character; |
| 1892 |
redo A; |
redo A; |
| 1893 |
} |
} |
| 1894 |
} elsif ($self->{state} == ATTRIBUTE_VALUE_UNQUOTED_STATE) { |
} elsif ($self->{state} == ATTRIBUTE_VALUE_UNQUOTED_STATE) { |
| 1895 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # HT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 1896 |
!!!cp (107); |
!!!cp (107); |
| 1897 |
$self->{state} = BEFORE_ATTRIBUTE_NAME_STATE; |
$self->{state} = BEFORE_ATTRIBUTE_NAME_STATE; |
| 1898 |
!!!next-input-character; |
!!!next-input-character; |
| 1974 |
redo A; |
redo A; |
| 1975 |
} |
} |
| 1976 |
} elsif ($self->{state} == AFTER_ATTRIBUTE_VALUE_QUOTED_STATE) { |
} elsif ($self->{state} == AFTER_ATTRIBUTE_VALUE_QUOTED_STATE) { |
| 1977 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 1978 |
!!!cp (118); |
!!!cp (118); |
| 1979 |
$self->{state} = BEFORE_ATTRIBUTE_NAME_STATE; |
$self->{state} = BEFORE_ATTRIBUTE_NAME_STATE; |
| 1980 |
!!!next-input-character; |
!!!next-input-character; |
| 2415 |
redo A; |
redo A; |
| 2416 |
} |
} |
| 2417 |
} elsif ($self->{state} == DOCTYPE_STATE) { |
} elsif ($self->{state} == DOCTYPE_STATE) { |
| 2418 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 2419 |
!!!cp (155); |
!!!cp (155); |
| 2420 |
$self->{state} = BEFORE_DOCTYPE_NAME_STATE; |
$self->{state} = BEFORE_DOCTYPE_NAME_STATE; |
| 2421 |
!!!next-input-character; |
!!!next-input-character; |
| 2428 |
redo A; |
redo A; |
| 2429 |
} |
} |
| 2430 |
} elsif ($self->{state} == BEFORE_DOCTYPE_NAME_STATE) { |
} elsif ($self->{state} == BEFORE_DOCTYPE_NAME_STATE) { |
| 2431 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 2432 |
!!!cp (157); |
!!!cp (157); |
| 2433 |
## Stay in the state |
## Stay in the state |
| 2434 |
!!!next-input-character; |
!!!next-input-character; |
| 2462 |
} |
} |
| 2463 |
} elsif ($self->{state} == DOCTYPE_NAME_STATE) { |
} elsif ($self->{state} == DOCTYPE_NAME_STATE) { |
| 2464 |
## ISSUE: Redundant "First," in the spec. |
## ISSUE: Redundant "First," in the spec. |
| 2465 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 2466 |
!!!cp (161); |
!!!cp (161); |
| 2467 |
$self->{state} = AFTER_DOCTYPE_NAME_STATE; |
$self->{state} = AFTER_DOCTYPE_NAME_STATE; |
| 2468 |
!!!next-input-character; |
!!!next-input-character; |
| 2494 |
redo A; |
redo A; |
| 2495 |
} |
} |
| 2496 |
} elsif ($self->{state} == AFTER_DOCTYPE_NAME_STATE) { |
} elsif ($self->{state} == AFTER_DOCTYPE_NAME_STATE) { |
| 2497 |
if ($self->{nc} == 0x0009 or # HT |
if ($is_space->{$self->{nc}}) { |
|
$self->{nc} == 0x000A or # LF |
|
|
$self->{nc} == 0x000B or # VT |
|
|
$self->{nc} == 0x000C or # FF |
|
|
$self->{nc} == 0x0020) { # SP |
|
| 2498 |
!!!cp (165); |
!!!cp (165); |
| 2499 |
## Stay in the state |
## Stay in the state |
| 2500 |
!!!next-input-character; |
!!!next-input-character; |
| 2617 |
redo A; |
redo A; |
| 2618 |
} |
} |
| 2619 |
} elsif ($self->{state} == BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE) { |
} elsif ($self->{state} == BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE) { |
| 2620 |
if ({ |
if ($is_space->{$self->{nc}}) { |
|
0x0009 => 1, 0x000A => 1, 0x000B => 1, 0x000C => 1, 0x0020 => 1, |
|
|
#0x000D => 1, # HT, LF, VT, FF, SP, CR |
|
|
}->{$self->{nc}}) { |
|
| 2621 |
!!!cp (181); |
!!!cp (181); |
| 2622 |
## Stay in the state |
## Stay in the state |
| 2623 |
!!!next-input-character; |
!!!next-input-character; |
| 2744 |
redo A; |
redo A; |
| 2745 |
} |
} |
| 2746 |
} elsif ($self->{state} == AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE) { |
} elsif ($self->{state} == AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE) { |
| 2747 |
if ({ |
if ($is_space->{$self->{nc}}) { |
|
0x0009 => 1, 0x000A => 1, 0x000B => 1, 0x000C => 1, 0x0020 => 1, |
|
|
#0x000D => 1, # HT, LF, VT, FF, SP, CR |
|
|
}->{$self->{nc}}) { |
|
| 2748 |
!!!cp (195); |
!!!cp (195); |
| 2749 |
## Stay in the state |
## Stay in the state |
| 2750 |
!!!next-input-character; |
!!!next-input-character; |
| 2790 |
redo A; |
redo A; |
| 2791 |
} |
} |
| 2792 |
} elsif ($self->{state} == BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE) { |
} elsif ($self->{state} == BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE) { |
| 2793 |
if ({ |
if ($is_space->{$self->{nc}}) { |
|
0x0009 => 1, 0x000A => 1, 0x000B => 1, 0x000C => 1, 0x0020 => 1, |
|
|
#0x000D => 1, # HT, LF, VT, FF, SP, CR |
|
|
}->{$self->{nc}}) { |
|
| 2794 |
!!!cp (201); |
!!!cp (201); |
| 2795 |
## Stay in the state |
## Stay in the state |
| 2796 |
!!!next-input-character; |
!!!next-input-character; |
| 2916 |
redo A; |
redo A; |
| 2917 |
} |
} |
| 2918 |
} elsif ($self->{state} == AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE) { |
} elsif ($self->{state} == AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE) { |
| 2919 |
if ({ |
if ($is_space->{$self->{nc}}) { |
|
0x0009 => 1, 0x000A => 1, 0x000B => 1, 0x000C => 1, 0x0020 => 1, |
|
|
#0x000D => 1, # HT, LF, VT, FF, SP, CR |
|
|
}->{$self->{nc}}) { |
|
| 2920 |
!!!cp (215); |
!!!cp (215); |
| 2921 |
## Stay in the state |
## Stay in the state |
| 2922 |
!!!next-input-character; |
!!!next-input-character; |
| 3048 |
redo A; |
redo A; |
| 3049 |
} |
} |
| 3050 |
} elsif ($self->{state} == ENTITY_STATE) { |
} elsif ($self->{state} == ENTITY_STATE) { |
| 3051 |
if ({ |
if ($is_space->{$self->{nc}} or |
| 3052 |
0x0009 => 1, 0x000A => 1, 0x000B => 1, 0x000C => 1, # HT, LF, VT, FF, |
{ |
| 3053 |
0x0020 => 1, 0x003C => 1, 0x0026 => 1, -1 => 1, # SP, <, & |
0x003C => 1, 0x0026 => 1, -1 => 1, # <, & |
| 3054 |
$self->{entity_add} => 1, |
$self->{entity_add} => 1, |
| 3055 |
}->{$self->{nc}}) { |
}->{$self->{nc}}) { |
| 3056 |
!!!cp (1001); |
!!!cp (1001); |
| 3057 |
## Don't consume |
## Don't consume |
| 3058 |
## No error |
## No error |