| 853 |
sub MD_HYPHEN_STATE () { 36 } # "markup declaration open state" in the spec |
sub MD_HYPHEN_STATE () { 36 } # "markup declaration open state" in the spec |
| 854 |
sub MD_DOCTYPE_STATE () { 37 } # "markup declaration open state" in the spec |
sub MD_DOCTYPE_STATE () { 37 } # "markup declaration open state" in the spec |
| 855 |
sub MD_CDATA_STATE () { 38 } # "markup declaration open state" in the spec |
sub MD_CDATA_STATE () { 38 } # "markup declaration open state" in the spec |
| 856 |
sub CDATA_PCDATA_CLOSE_TAG_STATE () { 39 } # "close tag open state" in the spec |
sub CDATA_RCDATA_CLOSE_TAG_STATE () { 39 } # "close tag open state" in the spec |
| 857 |
sub CDATA_SECTION_MSE1_STATE () { 40 } # "CDATA section state" in the spec |
sub CDATA_SECTION_MSE1_STATE () { 40 } # "CDATA section state" in the spec |
| 858 |
sub CDATA_SECTION_MSE2_STATE () { 41 } # "CDATA section state" in the spec |
sub CDATA_SECTION_MSE2_STATE () { 41 } # "CDATA section state" in the spec |
| 859 |
sub PUBLIC_STATE () { 42 } # "after DOCTYPE name state" in the spec |
sub PUBLIC_STATE () { 42 } # "after DOCTYPE name state" in the spec |
| 867 |
sub HEXREF_X_STATE () { 47 } |
sub HEXREF_X_STATE () { 47 } |
| 868 |
sub HEXREF_HEX_STATE () { 48 } |
sub HEXREF_HEX_STATE () { 48 } |
| 869 |
sub ENTITY_NAME_STATE () { 49 } |
sub ENTITY_NAME_STATE () { 49 } |
| 870 |
|
sub PCDATA_STATE () { 50 } # "data state" in the spec |
| 871 |
|
|
| 872 |
sub DOCTYPE_TOKEN () { 1 } |
sub DOCTYPE_TOKEN () { 1 } |
| 873 |
sub COMMENT_TOKEN () { 2 } |
sub COMMENT_TOKEN () { 2 } |
| 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 |
|
|
| 992 |
} |
} |
| 993 |
|
|
| 994 |
A: { |
A: { |
| 995 |
if ($self->{state} == DATA_STATE) { |
if ($self->{state} == PCDATA_STATE) { |
| 996 |
|
## NOTE: Same as |DATA_STATE|, but only for |PCDATA| content model. |
| 997 |
|
|
| 998 |
|
if ($self->{nc} == 0x0026) { # & |
| 999 |
|
!!!cp (0.1); |
| 1000 |
|
## NOTE: In the spec, the tokenizer is switched to the |
| 1001 |
|
## "entity data state". In this implementation, the tokenizer |
| 1002 |
|
## is switched to the |ENTITY_STATE|, which is an implementation |
| 1003 |
|
## of the "consume a character reference" algorithm. |
| 1004 |
|
$self->{entity_add} = -1; |
| 1005 |
|
$self->{prev_state} = DATA_STATE; |
| 1006 |
|
$self->{state} = ENTITY_STATE; |
| 1007 |
|
!!!next-input-character; |
| 1008 |
|
redo A; |
| 1009 |
|
} elsif ($self->{nc} == 0x003C) { # < |
| 1010 |
|
!!!cp (0.2); |
| 1011 |
|
$self->{state} = TAG_OPEN_STATE; |
| 1012 |
|
!!!next-input-character; |
| 1013 |
|
redo A; |
| 1014 |
|
} elsif ($self->{nc} == -1) { |
| 1015 |
|
!!!cp (0.3); |
| 1016 |
|
!!!emit ({type => END_OF_FILE_TOKEN, |
| 1017 |
|
line => $self->{line}, column => $self->{column}}); |
| 1018 |
|
last A; ## TODO: ok? |
| 1019 |
|
} else { |
| 1020 |
|
!!!cp (0.4); |
| 1021 |
|
# |
| 1022 |
|
} |
| 1023 |
|
|
| 1024 |
|
# Anything else |
| 1025 |
|
my $token = {type => CHARACTER_TOKEN, |
| 1026 |
|
data => chr $self->{nc}, |
| 1027 |
|
line => $self->{line}, column => $self->{column}, |
| 1028 |
|
}; |
| 1029 |
|
$self->{read_until}->($token->{data}, q[<&], length $token->{data}); |
| 1030 |
|
|
| 1031 |
|
## Stay in the state. |
| 1032 |
|
!!!next-input-character; |
| 1033 |
|
!!!emit ($token); |
| 1034 |
|
redo A; |
| 1035 |
|
} elsif ($self->{state} == DATA_STATE) { |
| 1036 |
|
$self->{s_kwd} = '' unless defined $self->{s_kwd}; |
| 1037 |
if ($self->{nc} == 0x0026) { # & |
if ($self->{nc} == 0x0026) { # & |
| 1038 |
delete $self->{s_kwd}; |
$self->{s_kwd} = ''; |
| 1039 |
if ($self->{content_model} & CM_ENTITY and # PCDATA | RCDATA |
if ($self->{content_model} & CM_ENTITY and # PCDATA | RCDATA |
| 1040 |
not $self->{escape}) { |
not $self->{escape}) { |
| 1041 |
!!!cp (1); |
!!!cp (1); |
| 1054 |
} |
} |
| 1055 |
} elsif ($self->{nc} == 0x002D) { # - |
} elsif ($self->{nc} == 0x002D) { # - |
| 1056 |
if ($self->{content_model} & CM_LIMITED_MARKUP) { # RCDATA | CDATA |
if ($self->{content_model} & CM_LIMITED_MARKUP) { # RCDATA | CDATA |
| 1057 |
if (defined $self->{s_kwd}) { |
$self->{s_kwd} .= '-'; |
| 1058 |
!!!cp (2.1); |
|
|
$self->{s_kwd} .= '-'; |
|
|
} else { |
|
|
!!!cp (2.2); |
|
|
$self->{s_kwd} = '-'; |
|
|
} |
|
|
|
|
| 1059 |
if ($self->{s_kwd} eq '<!--') { |
if ($self->{s_kwd} eq '<!--') { |
| 1060 |
!!!cp (3); |
!!!cp (3); |
| 1061 |
$self->{escape} = 1; # unless $self->{escape}; |
$self->{escape} = 1; # unless $self->{escape}; |
| 1073 |
|
|
| 1074 |
# |
# |
| 1075 |
} elsif ($self->{nc} == 0x0021) { # ! |
} elsif ($self->{nc} == 0x0021) { # ! |
| 1076 |
if (defined $self->{s_kwd}) { |
if (length $self->{s_kwd}) { |
| 1077 |
!!!cp (5.1); |
!!!cp (5.1); |
| 1078 |
$self->{s_kwd} .= '!'; |
$self->{s_kwd} .= '!'; |
| 1079 |
# |
# |
| 1080 |
} else { |
} else { |
| 1081 |
!!!cp (5.2); |
!!!cp (5.2); |
| 1082 |
|
#$self->{s_kwd} = ''; |
| 1083 |
# |
# |
| 1084 |
} |
} |
| 1085 |
# |
# |
| 1086 |
} elsif ($self->{nc} == 0x003C) { # < |
} elsif ($self->{nc} == 0x003C) { # < |
|
delete $self->{s_kwd}; |
|
| 1087 |
if ($self->{content_model} & CM_FULL_MARKUP or # PCDATA |
if ($self->{content_model} & CM_FULL_MARKUP or # PCDATA |
| 1088 |
(($self->{content_model} & CM_LIMITED_MARKUP) and # CDATA | RCDATA |
(($self->{content_model} & CM_LIMITED_MARKUP) and # CDATA | RCDATA |
| 1089 |
not $self->{escape})) { |
not $self->{escape})) { |
| 1093 |
redo A; |
redo A; |
| 1094 |
} else { |
} else { |
| 1095 |
!!!cp (7); |
!!!cp (7); |
| 1096 |
|
$self->{s_kwd} = ''; |
| 1097 |
# |
# |
| 1098 |
} |
} |
| 1099 |
} elsif ($self->{nc} == 0x003E) { # > |
} elsif ($self->{nc} == 0x003E) { # > |
| 1100 |
if ($self->{escape} and |
if ($self->{escape} and |
| 1101 |
($self->{content_model} & CM_LIMITED_MARKUP)) { # RCDATA | CDATA |
($self->{content_model} & CM_LIMITED_MARKUP)) { # RCDATA | CDATA |
| 1102 |
if (defined $self->{s_kwd} and $self->{s_kwd} eq '--') { |
if ($self->{s_kwd} eq '--') { |
| 1103 |
!!!cp (8); |
!!!cp (8); |
| 1104 |
delete $self->{escape}; |
delete $self->{escape}; |
| 1105 |
} else { |
} else { |
| 1109 |
!!!cp (10); |
!!!cp (10); |
| 1110 |
} |
} |
| 1111 |
|
|
| 1112 |
delete $self->{s_kwd}; |
$self->{s_kwd} = ''; |
| 1113 |
# |
# |
| 1114 |
} elsif ($self->{nc} == -1) { |
} elsif ($self->{nc} == -1) { |
| 1115 |
!!!cp (11); |
!!!cp (11); |
| 1116 |
delete $self->{s_kwd}; |
$self->{s_kwd} = ''; |
| 1117 |
!!!emit ({type => END_OF_FILE_TOKEN, |
!!!emit ({type => END_OF_FILE_TOKEN, |
| 1118 |
line => $self->{line}, column => $self->{column}}); |
line => $self->{line}, column => $self->{column}}); |
| 1119 |
last A; ## TODO: ok? |
last A; ## TODO: ok? |
| 1120 |
} else { |
} else { |
| 1121 |
!!!cp (12); |
!!!cp (12); |
| 1122 |
delete $self->{s_kwd}; |
$self->{s_kwd} = ''; |
| 1123 |
# |
# |
| 1124 |
} |
} |
| 1125 |
|
|
| 1130 |
}; |
}; |
| 1131 |
if ($self->{read_until}->($token->{data}, q[-!<>&], |
if ($self->{read_until}->($token->{data}, q[-!<>&], |
| 1132 |
length $token->{data})) { |
length $token->{data})) { |
| 1133 |
delete $self->{s_kwd}; |
$self->{s_kwd} = ''; |
| 1134 |
} |
} |
| 1135 |
|
|
| 1136 |
## Stay in the data state |
## Stay in the data state. |
| 1137 |
|
if ($self->{content_model} == PCDATA_CONTENT_MODEL) { |
| 1138 |
|
!!!cp (13); |
| 1139 |
|
$self->{state} = PCDATA_STATE; |
| 1140 |
|
} else { |
| 1141 |
|
!!!cp (14); |
| 1142 |
|
## Stay in the state. |
| 1143 |
|
} |
| 1144 |
!!!next-input-character; |
!!!next-input-character; |
| 1145 |
!!!emit ($token); |
!!!emit ($token); |
| 1146 |
redo A; |
redo A; |
| 1245 |
} |
} |
| 1246 |
} elsif ($self->{state} == CLOSE_TAG_OPEN_STATE) { |
} elsif ($self->{state} == CLOSE_TAG_OPEN_STATE) { |
| 1247 |
## NOTE: The "close tag open state" in the spec is implemented as |
## NOTE: The "close tag open state" in the spec is implemented as |
| 1248 |
## |CLOSE_TAG_OPEN_STATE| and |CDATA_PCDATA_CLOSE_TAG_STATE|. |
## |CLOSE_TAG_OPEN_STATE| and |CDATA_RCDATA_CLOSE_TAG_STATE|. |
| 1249 |
|
|
| 1250 |
my ($l, $c) = ($self->{line_prev}, $self->{column_prev} - 1); # "<"of"</" |
my ($l, $c) = ($self->{line_prev}, $self->{column_prev} - 1); # "<"of"</" |
| 1251 |
if ($self->{content_model} & CM_LIMITED_MARKUP) { # RCDATA | CDATA |
if ($self->{content_model} & CM_LIMITED_MARKUP) { # RCDATA | CDATA |
| 1252 |
if (defined $self->{last_stag_name}) { |
if (defined $self->{last_stag_name}) { |
| 1253 |
$self->{state} = CDATA_PCDATA_CLOSE_TAG_STATE; |
$self->{state} = CDATA_RCDATA_CLOSE_TAG_STATE; |
| 1254 |
$self->{s_kwd} = ''; |
$self->{s_kwd} = ''; |
| 1255 |
## Reconsume. |
## Reconsume. |
| 1256 |
redo A; |
redo A; |
| 1321 |
## "bogus comment state" entry. |
## "bogus comment state" entry. |
| 1322 |
redo A; |
redo A; |
| 1323 |
} |
} |
| 1324 |
} elsif ($self->{state} == CDATA_PCDATA_CLOSE_TAG_STATE) { |
} elsif ($self->{state} == CDATA_RCDATA_CLOSE_TAG_STATE) { |
| 1325 |
my $ch = substr $self->{last_stag_name}, length $self->{s_kwd}, 1; |
my $ch = substr $self->{last_stag_name}, length $self->{s_kwd}, 1; |
| 1326 |
if (length $ch) { |
if (length $ch) { |
| 1327 |
my $CH = $ch; |
my $CH = $ch; |
| 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 |
| 3650 |
!!!ack-later; |
!!!ack-later; |
| 3651 |
return; |
return; |
| 3652 |
} elsif ($token->{type} == CHARACTER_TOKEN) { |
} elsif ($token->{type} == CHARACTER_TOKEN) { |
| 3653 |
if ($token->{data} =~ s/^([\x09\x0A\x0B\x0C\x20]+)//) { # \x0D |
if ($token->{data} =~ s/^([\x09\x0A\x0C\x20]+)//) { |
| 3654 |
## Ignore the token |
## Ignore the token |
| 3655 |
|
|
| 3656 |
unless (length $token->{data}) { |
unless (length $token->{data}) { |
| 3707 |
!!!next-token; |
!!!next-token; |
| 3708 |
redo B; |
redo B; |
| 3709 |
} elsif ($token->{type} == CHARACTER_TOKEN) { |
} elsif ($token->{type} == CHARACTER_TOKEN) { |
| 3710 |
if ($token->{data} =~ s/^([\x09\x0A\x0B\x0C\x20]+)//) { # \x0D |
if ($token->{data} =~ s/^([\x09\x0A\x0C\x20]+)//) { |
| 3711 |
## Ignore the token. |
## Ignore the token. |
| 3712 |
|
|
| 3713 |
unless (length $token->{data}) { |
unless (length $token->{data}) { |
| 4521 |
|
|
| 4522 |
if ($self->{insertion_mode} & HEAD_IMS) { |
if ($self->{insertion_mode} & HEAD_IMS) { |
| 4523 |
if ($token->{type} == CHARACTER_TOKEN) { |
if ($token->{type} == CHARACTER_TOKEN) { |
| 4524 |
if ($token->{data} =~ s/^([\x09\x0A\x0B\x0C\x20]+)//) { |
if ($token->{data} =~ s/^([\x09\x0A\x0C\x20]+)//) { |
| 4525 |
unless ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
unless ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
| 4526 |
!!!cp ('t88.2'); |
!!!cp ('t88.2'); |
| 4527 |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
| 4700 |
} elsif ($token->{attributes}->{content}) { |
} elsif ($token->{attributes}->{content}) { |
| 4701 |
if ($token->{attributes}->{content}->{value} |
if ($token->{attributes}->{content}->{value} |
| 4702 |
=~ /[Cc][Hh][Aa][Rr][Ss][Ee][Tt] |
=~ /[Cc][Hh][Aa][Rr][Ss][Ee][Tt] |
| 4703 |
[\x09-\x0D\x20]*= |
[\x09\x0A\x0C\x0D\x20]*= |
| 4704 |
[\x09-\x0D\x20]*(?>"([^"]*)"|'([^']*)'| |
[\x09\x0A\x0C\x0D\x20]*(?>"([^"]*)"|'([^']*)'| |
| 4705 |
([^"'\x09-\x0D\x20][^\x09-\x0D\x20\x3B]*))/x) { |
([^"'\x09\x0A\x0C\x0D\x20] |
| 4706 |
|
[^\x09\x0A\x0C\x0D\x20\x3B]*))/x) { |
| 4707 |
!!!cp ('t107'); |
!!!cp ('t107'); |
| 4708 |
## NOTE: Whether the encoding is supported or not is handled |
## NOTE: Whether the encoding is supported or not is handled |
| 4709 |
## in the {change_encoding} callback. |
## in the {change_encoding} callback. |
| 5512 |
} elsif ($self->{insertion_mode} & TABLE_IMS) { |
} elsif ($self->{insertion_mode} & TABLE_IMS) { |
| 5513 |
if ($token->{type} == CHARACTER_TOKEN) { |
if ($token->{type} == CHARACTER_TOKEN) { |
| 5514 |
if (not $open_tables->[-1]->[1] and # tainted |
if (not $open_tables->[-1]->[1] and # tainted |
| 5515 |
$token->{data} =~ s/^([\x09\x0A\x0B\x0C\x20]+)//) { |
$token->{data} =~ s/^([\x09\x0A\x0C\x20]+)//) { |
| 5516 |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
| 5517 |
|
|
| 5518 |
unless (length $token->{data}) { |
unless (length $token->{data}) { |
| 6196 |
} |
} |
| 6197 |
} elsif ($self->{insertion_mode} == IN_COLUMN_GROUP_IM) { |
} elsif ($self->{insertion_mode} == IN_COLUMN_GROUP_IM) { |
| 6198 |
if ($token->{type} == CHARACTER_TOKEN) { |
if ($token->{type} == CHARACTER_TOKEN) { |
| 6199 |
if ($token->{data} =~ s/^([\x09\x0A\x0B\x0C\x20]+)//) { |
if ($token->{data} =~ s/^([\x09\x0A\x0C\x20]+)//) { |
| 6200 |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
| 6201 |
unless (length $token->{data}) { |
unless (length $token->{data}) { |
| 6202 |
!!!cp ('t260'); |
!!!cp ('t260'); |
| 6537 |
} |
} |
| 6538 |
} elsif ($self->{insertion_mode} & BODY_AFTER_IMS) { |
} elsif ($self->{insertion_mode} & BODY_AFTER_IMS) { |
| 6539 |
if ($token->{type} == CHARACTER_TOKEN) { |
if ($token->{type} == CHARACTER_TOKEN) { |
| 6540 |
if ($token->{data} =~ s/^([\x09\x0A\x0B\x0C\x20]+)//) { |
if ($token->{data} =~ s/^([\x09\x0A\x0C\x20]+)//) { |
| 6541 |
my $data = $1; |
my $data = $1; |
| 6542 |
## As if in body |
## As if in body |
| 6543 |
$reconstruct_active_formatting_elements->($insert_to_current); |
$reconstruct_active_formatting_elements->($insert_to_current); |
| 6554 |
if ($self->{insertion_mode} == AFTER_HTML_BODY_IM) { |
if ($self->{insertion_mode} == AFTER_HTML_BODY_IM) { |
| 6555 |
!!!cp ('t301'); |
!!!cp ('t301'); |
| 6556 |
!!!parse-error (type => 'after html:#text', token => $token); |
!!!parse-error (type => 'after html:#text', token => $token); |
| 6557 |
|
# |
|
## Reprocess in the "after body" insertion mode. |
|
| 6558 |
} else { |
} else { |
| 6559 |
!!!cp ('t302'); |
!!!cp ('t302'); |
| 6560 |
|
## "after body" insertion mode |
| 6561 |
|
!!!parse-error (type => 'after body:#text', token => $token); |
| 6562 |
|
# |
| 6563 |
} |
} |
|
|
|
|
## "after body" insertion mode |
|
|
!!!parse-error (type => 'after body:#text', token => $token); |
|
| 6564 |
|
|
| 6565 |
$self->{insertion_mode} = IN_BODY_IM; |
$self->{insertion_mode} = IN_BODY_IM; |
| 6566 |
## reprocess |
## reprocess |
| 6570 |
!!!cp ('t303'); |
!!!cp ('t303'); |
| 6571 |
!!!parse-error (type => 'after html', |
!!!parse-error (type => 'after html', |
| 6572 |
text => $token->{tag_name}, token => $token); |
text => $token->{tag_name}, token => $token); |
| 6573 |
|
# |
|
## Reprocess in the "after body" insertion mode. |
|
| 6574 |
} else { |
} else { |
| 6575 |
!!!cp ('t304'); |
!!!cp ('t304'); |
| 6576 |
|
## "after body" insertion mode |
| 6577 |
|
!!!parse-error (type => 'after body', |
| 6578 |
|
text => $token->{tag_name}, token => $token); |
| 6579 |
|
# |
| 6580 |
} |
} |
| 6581 |
|
|
|
## "after body" insertion mode |
|
|
!!!parse-error (type => 'after body', |
|
|
text => $token->{tag_name}, token => $token); |
|
|
|
|
| 6582 |
$self->{insertion_mode} = IN_BODY_IM; |
$self->{insertion_mode} = IN_BODY_IM; |
| 6583 |
!!!ack-later; |
!!!ack-later; |
| 6584 |
## reprocess |
## reprocess |
| 6589 |
!!!parse-error (type => 'after html:/', |
!!!parse-error (type => 'after html:/', |
| 6590 |
text => $token->{tag_name}, token => $token); |
text => $token->{tag_name}, token => $token); |
| 6591 |
|
|
| 6592 |
$self->{insertion_mode} = AFTER_BODY_IM; |
$self->{insertion_mode} = IN_BODY_IM; |
| 6593 |
## Reprocess in the "after body" insertion mode. |
## Reprocess. |
| 6594 |
|
next B; |
| 6595 |
} else { |
} else { |
| 6596 |
!!!cp ('t306'); |
!!!cp ('t306'); |
| 6597 |
} |
} |
| 6629 |
} |
} |
| 6630 |
} elsif ($self->{insertion_mode} & FRAME_IMS) { |
} elsif ($self->{insertion_mode} & FRAME_IMS) { |
| 6631 |
if ($token->{type} == CHARACTER_TOKEN) { |
if ($token->{type} == CHARACTER_TOKEN) { |
| 6632 |
if ($token->{data} =~ s/^([\x09\x0A\x0B\x0C\x20]+)//) { |
if ($token->{data} =~ s/^([\x09\x0A\x0C\x20]+)//) { |
| 6633 |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
$self->{open_elements}->[-1]->[0]->manakai_append_text ($1); |
| 6634 |
|
|
| 6635 |
unless (length $token->{data}) { |
unless (length $token->{data}) { |
| 6639 |
} |
} |
| 6640 |
} |
} |
| 6641 |
|
|
| 6642 |
if ($token->{data} =~ s/^[^\x09\x0A\x0B\x0C\x20]+//) { |
if ($token->{data} =~ s/^[^\x09\x0A\x0C\x20]+//) { |
| 6643 |
if ($self->{insertion_mode} == IN_FRAMESET_IM) { |
if ($self->{insertion_mode} == IN_FRAMESET_IM) { |
| 6644 |
!!!cp ('t311'); |
!!!cp ('t311'); |
| 6645 |
!!!parse-error (type => 'in frameset:#text', token => $token); |
!!!parse-error (type => 'in frameset:#text', token => $token); |
| 6816 |
} elsif ($token->{attributes}->{content}) { |
} elsif ($token->{attributes}->{content}) { |
| 6817 |
if ($token->{attributes}->{content}->{value} |
if ($token->{attributes}->{content}->{value} |
| 6818 |
=~ /[Cc][Hh][Aa][Rr][Ss][Ee][Tt] |
=~ /[Cc][Hh][Aa][Rr][Ss][Ee][Tt] |
| 6819 |
[\x09-\x0D\x20]*= |
[\x09\x0A\x0C\x0D\x20]*= |
| 6820 |
[\x09-\x0D\x20]*(?>"([^"]*)"|'([^']*)'| |
[\x09\x0A\x0C\x0D\x20]*(?>"([^"]*)"|'([^']*)'| |
| 6821 |
([^"'\x09-\x0D\x20][^\x09-\x0D\x20\x3B]*))/x) { |
([^"'\x09\x0A\x0C\x0D\x20][^\x09\x0A\x0C\x0D\x20\x3B]*)) |
| 6822 |
|
/x) { |
| 6823 |
!!!cp ('t336'); |
!!!cp ('t336'); |
| 6824 |
## NOTE: Whether the encoding is supported or not is handled |
## NOTE: Whether the encoding is supported or not is handled |
| 6825 |
## in the {change_encoding} callback. |
## in the {change_encoding} callback. |