Parent Directory
|
Revision Log
|
Patch
| revision 1.31 by wakaba, Sat Jun 30 14:13:19 2007 UTC | revision 1.47 by wakaba, Sat Jul 21 09:12:43 2007 UTC | |
|---|---|---|
| # | Line 150 sub new ($) { | Line 150 sub new ($) { |
| 150 | return $self; | return $self; |
| 151 | } # new | } # new |
| 152 | ||
| 153 | sub CM_ENTITY () { 0b001 } # & markup in data | |
| 154 | sub CM_LIMITED_MARKUP () { 0b010 } # < markup in data (limited) | |
| 155 | sub CM_FULL_MARKUP () { 0b100 } # < markup in data (any) | |
| 156 | ||
| 157 | sub PLAINTEXT_CONTENT_MODEL () { 0 } | |
| 158 | sub CDATA_CONTENT_MODEL () { CM_LIMITED_MARKUP } | |
| 159 | sub RCDATA_CONTENT_MODEL () { CM_ENTITY | CM_LIMITED_MARKUP } | |
| 160 | sub PCDATA_CONTENT_MODEL () { CM_ENTITY | CM_FULL_MARKUP } | |
| 161 | ||
| 162 | ## Implementations MUST act as if state machine in the spec | ## Implementations MUST act as if state machine in the spec |
| 163 | ||
| 164 | sub _initialize_tokenizer ($) { | sub _initialize_tokenizer ($) { |
| 165 | my $self = shift; | my $self = shift; |
| 166 | $self->{state} = 'data'; # MUST | $self->{state} = 'data'; # MUST |
| 167 | $self->{content_model_flag} = 'PCDATA'; # be | $self->{content_model} = PCDATA_CONTENT_MODEL; # be |
| 168 | undef $self->{current_token}; # start tag, end tag, comment, or DOCTYPE | undef $self->{current_token}; # start tag, end tag, comment, or DOCTYPE |
| 169 | undef $self->{current_attribute}; | undef $self->{current_attribute}; |
| 170 | undef $self->{last_emitted_start_tag_name}; | undef $self->{last_emitted_start_tag_name}; |
| # | Line 194 sub _get_next_token ($) { | Line 203 sub _get_next_token ($) { |
| 203 | A: { | A: { |
| 204 | if ($self->{state} eq 'data') { | if ($self->{state} eq 'data') { |
| 205 | if ($self->{next_input_character} == 0x0026) { # & | if ($self->{next_input_character} == 0x0026) { # & |
| 206 | if ($self->{content_model_flag} eq 'PCDATA' or | if ($self->{content_model} & CM_ENTITY) { # PCDATA | RCDATA |
| $self->{content_model_flag} eq 'RCDATA') { | ||
| 207 | $self->{state} = 'entity data'; | $self->{state} = 'entity data'; |
| 208 | !!!next-input-character; | !!!next-input-character; |
| 209 | redo A; | redo A; |
| # | Line 203 sub _get_next_token ($) { | Line 211 sub _get_next_token ($) { |
| 211 | # | # |
| 212 | } | } |
| 213 | } elsif ($self->{next_input_character} == 0x002D) { # - | } elsif ($self->{next_input_character} == 0x002D) { # - |
| 214 | if ($self->{content_model_flag} eq 'RCDATA' or | if ($self->{content_model} & CM_LIMITED_MARKUP) { # RCDATA | CDATA |
| $self->{content_model_flag} eq 'CDATA') { | ||
| 215 | unless ($self->{escape}) { | unless ($self->{escape}) { |
| 216 | if ($self->{prev_input_character}->[0] == 0x002D and # - | if ($self->{prev_input_character}->[0] == 0x002D and # - |
| 217 | $self->{prev_input_character}->[1] == 0x0021 and # ! | $self->{prev_input_character}->[1] == 0x0021 and # ! |
| # | Line 216 sub _get_next_token ($) { | Line 223 sub _get_next_token ($) { |
| 223 |