| 1740 |
|
|
| 1741 |
redo A; |
redo A; |
| 1742 |
} else { |
} else { |
| 1743 |
if ($self->{nc} == 0x003D) { # = |
if ($self->{nc} == 0x003D or $self->{nc} == 0x003C) { # =, < |
| 1744 |
|
|
| 1745 |
## XML5: Not a parse error. |
## XML5: Not a parse error. |
| 1746 |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'bad attribute value'); |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'bad attribute value'); |
| 2183 |
0x0022 => 1, # " |
0x0022 => 1, # " |
| 2184 |
0x0027 => 1, # ' |
0x0027 => 1, # ' |
| 2185 |
0x003D => 1, # = |
0x003D => 1, # = |
| 2186 |
|
0x003C => 1, # < |
| 2187 |
}->{$self->{nc}}) { |
}->{$self->{nc}}) { |
| 2188 |
|
|
| 2189 |
## XML5: Not a parse error. |
## XML5: Not a parse error. |
| 2999 |
redo A; |
redo A; |
| 3000 |
} else { |
} else { |
| 3001 |
|
|
|
## XML5: Not a parse error. |
|
|
$self->{parse_error}->(level => $self->{level}->{must}, type => 'dash in comment', |
|
|
line => $self->{line_prev}, |
|
|
column => $self->{column_prev}); |
|
| 3002 |
$self->{ct}->{data} .= '--' . chr ($self->{nc}); # comment |
$self->{ct}->{data} .= '--' . chr ($self->{nc}); # comment |
| 3003 |
$self->{state} = COMMENT_STATE; |
$self->{state} = COMMENT_STATE; |
| 3004 |
|
|
| 3030 |
} |
} |
| 3031 |
|
|
| 3032 |
redo A; |
redo A; |
| 3033 |
|
} elsif ($self->{nc} == -1) { |
| 3034 |
|
|
| 3035 |
|
$self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE'); |
| 3036 |
|
$self->{ct}->{quirks} = 1; |
| 3037 |
|
|
| 3038 |
|
$self->{state} = DATA_STATE; |
| 3039 |
|
## Reconsume. |
| 3040 |
|
return ($self->{ct}); # DOCTYPE (quirks) |
| 3041 |
|
|
| 3042 |
|
redo A; |
| 3043 |
} else { |
} else { |
| 3044 |
|
|
| 3045 |
## XML5: Unless EOF, swith to the bogus comment state. |
## XML5: Swith to the bogus comment state. |
| 3046 |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'no space before DOCTYPE name'); |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'no space before DOCTYPE name'); |
| 3047 |
$self->{state} = BEFORE_DOCTYPE_NAME_STATE; |
$self->{state} = BEFORE_DOCTYPE_NAME_STATE; |
| 3048 |
## reconsume |
## reconsume |
| 3087 |
return ($self->{ct}); # DOCTYPE (quirks) |
return ($self->{ct}); # DOCTYPE (quirks) |
| 3088 |
|
|
| 3089 |
redo A; |
redo A; |
| 3090 |
|
} elsif (0x0041 <= $self->{nc} and $self->{nc} <= 0x005A) { # A..Z |
| 3091 |
|
|
| 3092 |
|
$self->{ct}->{name} # DOCTYPE |
| 3093 |
|
= chr ($self->{nc} + ($self->{is_xml} ? 0 : 0x0020)); |
| 3094 |
|
delete $self->{ct}->{quirks}; |
| 3095 |
|
$self->{state} = DOCTYPE_NAME_STATE; |
| 3096 |
|
|
| 3097 |
|
if ($self->{char_buffer_pos} < length $self->{char_buffer}) { |
| 3098 |
|
$self->{line_prev} = $self->{line}; |
| 3099 |
|
$self->{column_prev} = $self->{column}; |
| 3100 |
|
$self->{column}++; |
| 3101 |
|
$self->{nc} |
| 3102 |
|
= ord substr ($self->{char_buffer}, $self->{char_buffer_pos}++, 1); |
| 3103 |
|
} else { |
| 3104 |
|
$self->{set_nc}->($self); |
| 3105 |
|
} |
| 3106 |
|
|
| 3107 |
|
redo A; |
| 3108 |
} elsif ($self->{nc} == -1) { |
} elsif ($self->{nc} == -1) { |
| 3109 |
|
|
| 3110 |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'no DOCTYPE name'); |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'no DOCTYPE name'); |
| 3191 |
return ($self->{ct}); # DOCTYPE |
return ($self->{ct}); # DOCTYPE |
| 3192 |
|
|
| 3193 |
redo A; |
redo A; |
| 3194 |
|
} elsif (0x0041 <= $self->{nc} and $self->{nc} <= 0x005A) { # A..Z |
| 3195 |
|
|
| 3196 |
|
$self->{ct}->{name} # DOCTYPE |
| 3197 |
|
.= chr ($self->{nc} + ($self->{is_xml} ? 0 : 0x0020)); |
| 3198 |
|
delete $self->{ct}->{quirks}; |
| 3199 |
|
## Stay in the state. |
| 3200 |
|
|
| 3201 |
|
if ($self->{char_buffer_pos} < length $self->{char_buffer}) { |
| 3202 |
|
$self->{line_prev} = $self->{line}; |
| 3203 |
|
$self->{column_prev} = $self->{column}; |
| 3204 |
|
$self->{column}++; |
| 3205 |
|
$self->{nc} |
| 3206 |
|
= ord substr ($self->{char_buffer}, $self->{char_buffer_pos}++, 1); |
| 3207 |
|
} else { |
| 3208 |
|
$self->{set_nc}->($self); |
| 3209 |
|
} |
| 3210 |
|
|
| 3211 |
|
redo A; |
| 3212 |
} elsif ($self->{nc} == -1) { |
} elsif ($self->{nc} == -1) { |
| 3213 |
|
|
| 3214 |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE'); |
$self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE'); |
| 3240 |
redo A; |
redo A; |
| 3241 |
} else { |
} else { |
| 3242 |
|
|
| 3243 |
$self->{ct}->{name} |
$self->{ct}->{name} .= chr ($self->{nc}); # DOCTYPE |
| 3244 |
.= chr ($self->{nc}); # DOCTYPE |
## Stay in the state. |
|
## Stay in the state |
|
| 3245 |
|
|
| 3246 |
if ($self->{char_buffer_pos} < length $self->{char_buffer}) { |
if ($self->{char_buffer_pos} < length $self->{char_buffer}) { |
| 3247 |
$self->{line_prev} = $self->{line}; |
$self->{line_prev} = $self->{line}; |