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) { |