| 2489 |
## reprocess |
## reprocess |
| 2490 |
!!!ack-later; |
!!!ack-later; |
| 2491 |
next B; |
next B; |
| 2492 |
} elsif ($token->{type} == END_TAG_TOKEN) { |
} elsif ($token->{type} == END_TAG_TOKEN) { |
| 2493 |
if ($token->{tag_name} eq 'head') { |
## "Before head", "in head", and "after head" insertion modes |
| 2494 |
if ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
## ignore most of end tags. Exceptions are "body", "html", |
| 2495 |
!!!cp ('t132'); |
## and "br" end tags. "Before head" and "in head" insertion |
| 2496 |
## As if <head> |
## modes also recognize "head" end tag. "In head noscript" |
| 2497 |
!!!create-element ($self->{head_element}, $HTML_NS, 'head',, $token); |
## insertion modes ignore end tags except for "noscript" and |
| 2498 |
$self->{open_elements}->[-1]->[0]->append_child ($self->{head_element}); |
## "br". |
| 2499 |
push @{$self->{open_elements}}, |
|
| 2500 |
[$self->{head_element}, $el_category->{head}]; |
if ($token->{tag_name} eq 'head') { |
| 2501 |
|
if ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
| 2502 |
## Reprocess in the "in head" insertion mode... |
!!!cp ('t132'); |
| 2503 |
pop @{$self->{open_elements}}; |
## As if <head> |
| 2504 |
$self->{insertion_mode} = AFTER_HEAD_IM; |
!!!create-element ($self->{head_element}, $HTML_NS, 'head',, $token); |
| 2505 |
!!!next-token; |
$self->{open_elements}->[-1]->[0]->append_child ($self->{head_element}); |
| 2506 |
next B; |
push @{$self->{open_elements}}, |
| 2507 |
} elsif ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) { |
[$self->{head_element}, $el_category->{head}]; |
| 2508 |
!!!cp ('t133'); |
|
| 2509 |
## As if </noscript> |
## Reprocess in the "in head" insertion mode... |
| 2510 |
pop @{$self->{open_elements}}; |
pop @{$self->{open_elements}}; |
| 2511 |
!!!parse-error (type => 'in noscript:/', |
$self->{insertion_mode} = AFTER_HEAD_IM; |
| 2512 |
text => 'head', token => $token); |
!!!next-token; |
| 2513 |
|
next B; |
| 2514 |
## Reprocess in the "in head" insertion mode... |
} elsif ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) { |
| 2515 |
pop @{$self->{open_elements}}; |
!!!cp ('t133'); |
| 2516 |
$self->{insertion_mode} = AFTER_HEAD_IM; |
# |
| 2517 |
!!!next-token; |
} elsif ($self->{insertion_mode} == IN_HEAD_IM) { |
| 2518 |
next B; |
!!!cp ('t134'); |
| 2519 |
} elsif ($self->{insertion_mode} == IN_HEAD_IM) { |
pop @{$self->{open_elements}}; |
| 2520 |
!!!cp ('t134'); |
$self->{insertion_mode} = AFTER_HEAD_IM; |
| 2521 |
pop @{$self->{open_elements}}; |
!!!next-token; |
| 2522 |
$self->{insertion_mode} = AFTER_HEAD_IM; |
next B; |
| 2523 |
!!!next-token; |
} elsif ($self->{insertion_mode} == AFTER_HEAD_IM) { |
| 2524 |
next B; |
!!!cp ('t134.1'); |
| 2525 |
} elsif ($self->{insertion_mode} == AFTER_HEAD_IM) { |
# |
| 2526 |
!!!cp ('t134.1'); |
} else { |
| 2527 |
!!!parse-error (type => 'unmatched end tag', text => 'head', |
die "$0: $self->{insertion_mode}: Unknown insertion mode"; |
| 2528 |
token => $token); |
} |
| 2529 |
## Ignore the token |
} elsif ($token->{tag_name} eq 'noscript') { |
| 2530 |
!!!next-token; |
if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) { |
| 2531 |
next B; |
!!!cp ('t136'); |
| 2532 |
} else { |
pop @{$self->{open_elements}}; |
| 2533 |
die "$0: $self->{insertion_mode}: Unknown insertion mode"; |
$self->{insertion_mode} = IN_HEAD_IM; |
| 2534 |
} |
!!!next-token; |
| 2535 |
} elsif ($token->{tag_name} eq 'noscript') { |
next B; |
| 2536 |
if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) { |
} else { |
| 2537 |
!!!cp ('t136'); |
!!!cp ('t138'); |
| 2538 |
pop @{$self->{open_elements}}; |
# |
| 2539 |
$self->{insertion_mode} = IN_HEAD_IM; |
} |
| 2540 |
!!!next-token; |
} elsif ({ |
| 2541 |
next B; |
body => ($self->{insertion_mode} != IN_HEAD_NOSCRIPT_IM), |
| 2542 |
} elsif ($self->{insertion_mode} == BEFORE_HEAD_IM or |
html => ($self->{insertion_mode} != IN_HEAD_NOSCRIPT_IM), |
| 2543 |
$self->{insertion_mode} == AFTER_HEAD_IM) { |
br => 1, |
| 2544 |
!!!cp ('t137'); |
}->{$token->{tag_name}}) { |
|
!!!parse-error (type => 'unmatched end tag', |
|
|
text => 'noscript', token => $token); |
|
|
## Ignore the token ## ISSUE: An issue in the spec. |
|
|
!!!next-token; |
|
|
next B; |
|
|
} else { |
|
|
!!!cp ('t138'); |
|
|
# |
|
|
} |
|
|
} elsif ({ |
|
|
body => 1, html => 1, |
|
|
}->{$token->{tag_name}}) { |
|
|
## TODO: This branch is entirely redundant. |
|
|
if ($self->{insertion_mode} == BEFORE_HEAD_IM or |
|
|
$self->{insertion_mode} == IN_HEAD_IM or |
|
|
$self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) { |
|
|
!!!cp ('t140'); |
|
|
!!!parse-error (type => 'unmatched end tag', |
|
|
text => $token->{tag_name}, token => $token); |
|
|
## Ignore the token |
|
|
!!!next-token; |
|
|
next B; |
|
|
} elsif ($self->{insertion_mode} == AFTER_HEAD_IM) { |
|
|
!!!cp ('t140.1'); |
|
|
!!!parse-error (type => 'unmatched end tag', |
|
|
text => $token->{tag_name}, token => $token); |
|
|
## Ignore the token |
|
|
!!!next-token; |
|
|
next B; |
|
|
} else { |
|
|
die "$0: $self->{insertion_mode}: Unknown insertion mode"; |
|
|
} |
|
|
} elsif ($token->{tag_name} eq 'p') { |
|
|
!!!cp ('t142'); |
|
|
!!!parse-error (type => 'unmatched end tag', |
|
|
text => $token->{tag_name}, token => $token); |
|
|
## Ignore the token |
|
|
!!!next-token; |
|
|
next B; |
|
|
} elsif ($token->{tag_name} eq 'br') { |
|
| 2545 |
if ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
if ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
| 2546 |
!!!cp ('t142.2'); |
!!!cp ('t142.2'); |
| 2547 |
## (before head) as if <head>, (in head) as if </head> |
## (before head) as if <head>, (in head) as if </head> |
| 2561 |
!!!cp ('t143.3'); |
!!!cp ('t143.3'); |
| 2562 |
## NOTE: Two parse errors for <head><noscript></br> |
## NOTE: Two parse errors for <head><noscript></br> |
| 2563 |
!!!parse-error (type => 'unmatched end tag', |
!!!parse-error (type => 'unmatched end tag', |
| 2564 |
text => 'br', token => $token); |
text => $token->{tag_name}, token => $token); |
| 2565 |
## As if </noscript> |
## As if </noscript> |
| 2566 |
pop @{$self->{open_elements}}; |
pop @{$self->{open_elements}}; |
| 2567 |
$self->{insertion_mode} = IN_HEAD_IM; |
$self->{insertion_mode} = IN_HEAD_IM; |
| 2579 |
die "$0: $self->{insertion_mode}: Unknown insertion mode"; |
die "$0: $self->{insertion_mode}: Unknown insertion mode"; |
| 2580 |
} |
} |
| 2581 |
|
|
| 2582 |
# |
## "after head" insertion mode |
| 2583 |
} else { ## Other end tags |
## As if <body> |
| 2584 |
!!!cp ('t145'); |
!!!insert-element ('body',, $token); |
| 2585 |
!!!parse-error (type => 'unmatched end tag', |
$self->{insertion_mode} = IN_BODY_IM; |
| 2586 |
text => $token->{tag_name}, token => $token); |
## Reprocess. |
| 2587 |
## Ignore the token |
next B; |
| 2588 |
!!!next-token; |
} |
| 2589 |
next B; |
|
| 2590 |
} |
## End tags are ignored by default. |
| 2591 |
|
!!!cp ('t145'); |
| 2592 |
if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) { |
!!!parse-error (type => 'unmatched end tag', |
| 2593 |
!!!cp ('t146'); |
text => $token->{tag_name}, token => $token); |
| 2594 |
## As if </noscript> |
## Ignore the token. |
| 2595 |
pop @{$self->{open_elements}}; |
!!!next-token; |
|
!!!parse-error (type => 'in noscript:/', |
|
|
text => $token->{tag_name}, token => $token); |
|
|
|
|
|
## Reprocess in the "in head" insertion mode... |
|
|
## As if </head> |
|
|
pop @{$self->{open_elements}}; |
|
|
|
|
|
## Reprocess in the "after head" insertion mode... |
|
|
} elsif ($self->{insertion_mode} == IN_HEAD_IM) { |
|
|
!!!cp ('t147'); |
|
|
## As if </head> |
|
|
pop @{$self->{open_elements}}; |
|
|
|
|
|
## Reprocess in the "after head" insertion mode... |
|
|
} elsif ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
|
|
## ISSUE: This case cannot be reached? |
|
|
!!!cp ('t148'); |
|
|
!!!parse-error (type => 'unmatched end tag', |
|
|
text => $token->{tag_name}, token => $token); |
|
|
## Ignore the token ## ISSUE: An issue in the spec. |
|
|
!!!next-token; |
|
|
next B; |
|
|
} else { |
|
|
!!!cp ('t149'); |
|
|
} |
|
|
|
|
|
## "after head" insertion mode |
|
|
## As if <body> |
|
|
!!!insert-element ('body',, $token); |
|
|
$self->{insertion_mode} = IN_BODY_IM; |
|
|
## reprocess |
|
| 2596 |
next B; |
next B; |
| 2597 |
} elsif ($token->{type} == END_OF_FILE_TOKEN) { |
} elsif ($token->{type} == END_OF_FILE_TOKEN) { |
| 2598 |
if ($self->{insertion_mode} == BEFORE_HEAD_IM) { |
if ($self->{insertion_mode} == BEFORE_HEAD_IM) { |