/[suikacvs]/markup/html/whatpm/Whatpm/HTML.pm.src
Suika

Diff of /markup/html/whatpm/Whatpm/HTML.pm.src

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.233 by wakaba, Sun Sep 6 01:45:58 2009 UTC revision 1.243 by wakaba, Sun Sep 6 13:52:06 2009 UTC
# Line 194  my $el_category = { Line 194  my $el_category = {
194    h6 => HEADING_EL,    h6 => HEADING_EL,
195    head => MISC_SPECIAL_EL,    head => MISC_SPECIAL_EL,
196    header => MISC_SPECIAL_EL,    header => MISC_SPECIAL_EL,
197      hgroup => MISC_SPECIAL_EL,
198    hr => MISC_SPECIAL_EL,    hr => MISC_SPECIAL_EL,
199    html => HTML_EL,    html => HTML_EL,
200    i => FORMATTING_EL,    i => FORMATTING_EL,
# Line 248  my $el_category = { Line 249  my $el_category = {
249    u => FORMATTING_EL,    u => FORMATTING_EL,
250    ul => MISC_SPECIAL_EL,    ul => MISC_SPECIAL_EL,
251    wbr => MISC_SPECIAL_EL,    wbr => MISC_SPECIAL_EL,
252      xmp => MISC_SPECIAL_EL,
253  };  };
254    
255  my $el_category_f = {  my $el_category_f = {
# Line 648  sub parse_char_stream ($$$;$$) { Line 650  sub parse_char_stream ($$$;$$) {
650    
651    ## NOTE: |set_inner_html| copies most of this method's code    ## NOTE: |set_inner_html| copies most of this method's code
652    
653      ## Confidence: irrelevant.
654    $self->{confident} = 1 unless exists $self->{confident};    $self->{confident} = 1 unless exists $self->{confident};
655    
656    $self->{document}->input_encoding ($self->{input_encoding})    $self->{document}->input_encoding ($self->{input_encoding})
657        if defined $self->{input_encoding};        if defined $self->{input_encoding};
658  ## TODO: |{input_encoding}| is needless?  ## TODO: |{input_encoding}| is needless?
# Line 865  sub _initialize_tree_constructor ($) { Line 869  sub _initialize_tree_constructor ($) {
869    $self->{document}->manakai_is_html (1); # MUST    $self->{document}->manakai_is_html (1); # MUST
870    $self->{document}->set_user_data (manakai_source_line => 1);    $self->{document}->set_user_data (manakai_source_line => 1);
871    $self->{document}->set_user_data (manakai_source_column => 1);    $self->{document}->set_user_data (manakai_source_column => 1);
872    
873      $self->{frameset_ok} = 1;
874  } # _initialize_tree_constructor  } # _initialize_tree_constructor
875    
876  sub _terminate_tree_constructor ($) {  sub _terminate_tree_constructor ($) {
# Line 1609  sub _tree_construction_main ($) { Line 1615  sub _tree_construction_main ($) {
1615                
1616        ## Step 8        ## Step 8
1617        if ($common_ancestor_node->[1] & TABLE_ROWS_EL) {        if ($common_ancestor_node->[1] & TABLE_ROWS_EL) {
1618            ## Foster parenting.
1619          my $foster_parent_element;          my $foster_parent_element;
1620          my $next_sibling;          my $next_sibling;
1621          OE: for (reverse 0..$#{$self->{open_elements}}) {          OE: for (reverse 0..$#{$self->{open_elements}}) {
1622            if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {            if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {
1623                               my $parent = $self->{open_elements}->[$_]->[0]->parent_node;              !!!cp ('t65.2');
1624                               if (defined $parent and $parent->node_type == 1) {              $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];
1625                                 !!!cp ('t65.1');              $next_sibling = $self->{open_elements}->[$_]->[0];
1626                                 $foster_parent_element = $parent;              undef $next_sibling
1627                                 $next_sibling = $self->{open_elements}->[$_]->[0];                  unless $next_sibling->parent_node eq $foster_parent_element;
1628                               } else {              last OE;
1629                                 !!!cp ('t65.2');            }
1630                                 $foster_parent_element          } # OE
1631                                   = $self->{open_elements}->[$_ - 1]->[0];          $foster_parent_element ||= $self->{open_elements}->[0]->[0];
1632                               }  
                              last OE;  
                            }  
                          } # OE  
                          $foster_parent_element = $self->{open_elements}->[0]->[0]  
                            unless defined $foster_parent_element;  
1633          $foster_parent_element->insert_before ($last_node->[0], $next_sibling);          $foster_parent_element->insert_before ($last_node->[0], $next_sibling);
1634          $open_tables->[-1]->[1] = 1; # tainted          $open_tables->[-1]->[1] = 1; # tainted
1635        } else {        } else {
# Line 1683  sub _tree_construction_main ($) { Line 1685  sub _tree_construction_main ($) {
1685      $self->{open_elements}->[-1]->[0]->append_child ($_[0]);      $self->{open_elements}->[-1]->[0]->append_child ($_[0]);
1686    }; # $insert_to_current    }; # $insert_to_current
1687    
1688      ## Foster parenting.  Note that there are three "foster parenting"
1689      ## code in the parser: for elements (this one), for texts, and for
1690      ## elements in the AAA code.
1691    my $insert_to_foster = sub {    my $insert_to_foster = sub {
1692      my $child = shift;      my $child = shift;
1693      if ($self->{open_elements}->[-1]->[1] & TABLE_ROWS_EL) {      if ($self->{open_elements}->[-1]->[1] & TABLE_ROWS_EL) {
# Line 1691  sub _tree_construction_main ($) { Line 1696  sub _tree_construction_main ($) {
1696        my $next_sibling;        my $next_sibling;
1697        OE: for (reverse 0..$#{$self->{open_elements}}) {        OE: for (reverse 0..$#{$self->{open_elements}}) {
1698          if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {          if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {
1699                               my $parent = $self->{open_elements}->[$_]->[0]->parent_node;            !!!cp ('t71');
1700                               if (defined $parent and $parent->node_type == 1) {            $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];
1701                                 !!!cp ('t70');            $next_sibling = $self->{open_elements}->[$_]->[0];
1702                                 $foster_parent_element = $parent;            undef $next_sibling
1703                                 $next_sibling = $self->{open_elements}->[$_]->[0];                unless $next_sibling->parent_node eq $foster_parent_element;
1704                               } else {            last OE;
1705                                 !!!cp ('t71');          }
1706                                 $foster_parent_element        } # OE
1707                                   = $self->{open_elements}->[$_ - 1]->[0];        $foster_parent_element ||= $self->{open_elements}->[0]->[0];
1708                               }  
1709                               last OE;        $foster_parent_element->insert_before ($child, $next_sibling);
                            }  
                          } # OE  
                          $foster_parent_element = $self->{open_elements}->[0]->[0]  
                            unless defined $foster_parent_element;  
                          $foster_parent_element->insert_before  
                            ($child, $next_sibling);  
1710        $open_tables->[-1]->[1] = 1; # tainted        $open_tables->[-1]->[1] = 1; # tainted
1711      } else {      } else {
1712        !!!cp ('t72');        !!!cp ('t72');
# Line 1768  sub _tree_construction_main ($) { Line 1767  sub _tree_construction_main ($) {
1767            }            }
1768          }          }
1769    
1770          ## Foster parenting          ## Foster parenting.
1771          !!!parse-error (type => 'in table:#text', token => $token);          !!!parse-error (type => 'in table:#text', token => $token);
1772    
1773          ## NOTE: As if in body, but insert into the foster parent element.          ## NOTE: As if in body, but insert into the foster parent element.
# Line 1778  sub _tree_construction_main ($) { Line 1777  sub _tree_construction_main ($) {
1777            # MUST            # MUST
1778            my $foster_parent_element;            my $foster_parent_element;
1779            my $next_sibling;            my $next_sibling;
           #my $prev_sibling;  
1780            OE: for (reverse 0..$#{$self->{open_elements}}) {            OE: for (reverse 0..$#{$self->{open_elements}}) {
1781              if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {              if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {
1782                my $parent = $self->{open_elements}->[$_]->[0]->parent_node;                !!!cp ('t197');
1783                if (defined $parent and $parent->node_type == 1) {                $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];
1784                  $foster_parent_element = $parent;                $next_sibling = $self->{open_elements}->[$_]->[0];
1785                  !!!cp ('t196');                undef $next_sibling
1786                  $next_sibling = $self->{open_elements}->[$_]->[0];                  unless $next_sibling->parent_node eq $foster_parent_element;
           #      $prev_sibling = $next_sibling->previous_sibling;  
                 #  
               } else {  
                 !!!cp ('t197');  
                 $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];  
           #      $prev_sibling = $foster_parent_element->last_child;  
                 #  
               }  
1787                last OE;                last OE;
1788              }              }
1789            } # OE            } # OE
1790            $foster_parent_element = $self->{open_elements}->[0]->[0] #and            $foster_parent_element ||= $self->{open_elements}->[0]->[0];
1791            #$prev_sibling = $foster_parent_element->last_child  
1792                unless defined $foster_parent_element;            !!!cp ('t199');
1793            #undef $prev_sibling unless $open_tables->[-1]->[2]; # ~node inserted            $foster_parent_element->insert_before
1794            #if (defined $prev_sibling and                ($self->{document}->create_text_node ($s), $next_sibling);
1795            #    $prev_sibling->node_type == 3) {  
           #  !!! cp ('t198');  
           #  $prev_sibling->manakai_append_text ($s);  
           #} else {  
             !!!cp ('t199');  
             $foster_parent_element->insert_before  
                 ($self->{document}->create_text_node ($s), $next_sibling);  
           #}  
1796            $open_tables->[-1]->[1] = 1; # tainted            $open_tables->[-1]->[1] = 1; # tainted
1797            $open_tables->[-1]->[2] = 1; # ~node inserted            $open_tables->[-1]->[2] = 1; # ~node inserted
1798          } else {          } else {
# Line 1951  sub _tree_construction_main ($) { Line 1934  sub _tree_construction_main ($) {
1934      } elsif ($self->{insertion_mode} & IN_FOREIGN_CONTENT_IM) {      } elsif ($self->{insertion_mode} & IN_FOREIGN_CONTENT_IM) {
1935        if ($token->{type} == CHARACTER_TOKEN) {        if ($token->{type} == CHARACTER_TOKEN) {
1936          !!!cp ('t87.1');          !!!cp ('t87.1');
1937    
1938          $self->{open_elements}->[-1]->[0]->manakai_append_text ($token->{data});          $self->{open_elements}->[-1]->[0]->manakai_append_text ($token->{data});
1939    
1940            if ($token->{data} =~ /[^\x09\x0A\x0C\x0D\x20]/) {
1941              delete $self->{frameset_ok};
1942            }
1943    
1944          !!!next-token;          !!!next-token;
1945          next B;          next B;
1946        } elsif ($token->{type} == START_TAG_TOKEN) {        } elsif ($token->{type} == START_TAG_TOKEN) {
# Line 2146  sub _tree_construction_main ($) { Line 2135  sub _tree_construction_main ($) {
2135          ## As if <body>          ## As if <body>
2136          !!!insert-element ('body',, $token);          !!!insert-element ('body',, $token);
2137          $self->{insertion_mode} = IN_BODY_IM;          $self->{insertion_mode} = IN_BODY_IM;
2138          ## reprocess          ## The "frameset-ok" flag is left unchanged in this case.
2139            ## Reporcess the token.
2140          next B;          next B;
2141        } elsif ($token->{type} == START_TAG_TOKEN) {        } elsif ($token->{type} == START_TAG_TOKEN) {
2142          if ($token->{tag_name} eq 'head') {          if ($token->{tag_name} eq 'head') {
# Line 2439  sub _tree_construction_main ($) { Line 2429  sub _tree_construction_main ($) {
2429            next B;            next B;
2430          } elsif ($token->{tag_name} eq 'body' or          } elsif ($token->{tag_name} eq 'body' or
2431                   $token->{tag_name} eq 'frameset') {                   $token->{tag_name} eq 'frameset') {
2432                if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {            if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {
2433                  !!!cp ('t122');              !!!cp ('t122');
2434                  ## As if </noscript>              ## As if </noscript>
2435                  pop @{$self->{open_elements}};              pop @{$self->{open_elements}};
2436                  !!!parse-error (type => 'in noscript',              !!!parse-error (type => 'in noscript',
2437                                  text => $token->{tag_name}, token => $token);                              text => $token->{tag_name}, token => $token);
2438                                
2439                  ## Reprocess in the "in head" insertion mode...              ## Reprocess in the "in head" insertion mode...
2440                  ## As if </head>              ## As if </head>
2441                  pop @{$self->{open_elements}};              pop @{$self->{open_elements}};
2442                                
2443                  ## Reprocess in the "after head" insertion mode...              ## Reprocess in the "after head" insertion mode...
2444                } elsif ($self->{insertion_mode} == IN_HEAD_IM) {            } elsif ($self->{insertion_mode} == IN_HEAD_IM) {
2445                  !!!cp ('t124');              !!!cp ('t124');
2446                  pop @{$self->{open_elements}};              pop @{$self->{open_elements}};
2447                                
2448                  ## Reprocess in the "after head" insertion mode...              ## Reprocess in the "after head" insertion mode...
2449                } else {            } else {
2450                  !!!cp ('t125');              !!!cp ('t125');
2451                }            }
2452    
2453                ## "after head" insertion mode            ## "after head" insertion mode
2454                !!!insert-element ($token->{tag_name}, $token->{attributes}, $token);            !!!insert-element ($token->{tag_name}, $token->{attributes}, $token);
2455                if ($token->{tag_name} eq 'body') {            if ($token->{tag_name} eq 'body') {
2456                  !!!cp ('t126');              !!!cp ('t126');
2457                  $self->{insertion_mode} = IN_BODY_IM;              delete $self->{frameset_ok};
2458                } elsif ($token->{tag_name} eq 'frameset') {              $self->{insertion_mode} = IN_BODY_IM;
2459                  !!!cp ('t127');            } elsif ($token->{tag_name} eq 'frameset') {
2460                  $self->{insertion_mode} = IN_FRAMESET_IM;              !!!cp ('t127');
2461                } else {              $self->{insertion_mode} = IN_FRAMESET_IM;
2462                  die "$0: tag name: $self->{tag_name}";            } else {
2463                }              die "$0: tag name: $self->{tag_name}";
2464                !!!nack ('t127.1');            }
2465                !!!next-token;            !!!nack ('t127.1');
2466                next B;            !!!next-token;
2467              } else {            next B;
2468                !!!cp ('t128');          } else {
2469                #            !!!cp ('t128');
2470              }            #
2471            }
2472    
2473              if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {              if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {
2474                !!!cp ('t129');                !!!cp ('t129');
# Line 2501  sub _tree_construction_main ($) { Line 2492  sub _tree_construction_main ($) {
2492                !!!cp ('t131');                !!!cp ('t131');
2493              }              }
2494    
2495              ## "after head" insertion mode          ## "after head" insertion mode
2496              ## As if <body>          ## As if <body>
2497              !!!insert-element ('body',, $token);          !!!insert-element ('body',, $token);
2498              $self->{insertion_mode} = IN_BODY_IM;          $self->{insertion_mode} = IN_BODY_IM;
2499              ## reprocess          ## The "frameset-ok" flag is not changed in this case.
2500              !!!ack-later;          ## Reprocess the token.
2501              next B;          !!!ack-later;
2502            } elsif ($token->{type} == END_TAG_TOKEN) {          next B;
2503              if ($token->{tag_name} eq 'head') {        } elsif ($token->{type} == END_TAG_TOKEN) {
2504                if ($self->{insertion_mode} == BEFORE_HEAD_IM) {          ## "Before head", "in head", and "after head" insertion modes
2505                  !!!cp ('t132');          ## ignore most of end tags.  Exceptions are "body", "html",
2506                  ## As if <head>          ## and "br" end tags.  "Before head" and "in head" insertion
2507                  !!!create-element ($self->{head_element}, $HTML_NS, 'head',, $token);          ## modes also recognize "head" end tag.  "In head noscript"
2508                  $self->{open_elements}->[-1]->[0]->append_child ($self->{head_element});          ## insertion modes ignore end tags except for "noscript" and
2509                  push @{$self->{open_elements}},          ## "br".
                     [$self->{head_element}, $el_category->{head}];  
2510    
2511                  ## Reprocess in the "in head" insertion mode...          if ($token->{tag_name} eq 'head') {
2512                  pop @{$self->{open_elements}};            if ($self->{insertion_mode} == BEFORE_HEAD_IM) {
2513                  $self->{insertion_mode} = AFTER_HEAD_IM;              !!!cp ('t132');
2514                  !!!next-token;              ## As if <head>
2515                  next B;              !!!create-element ($self->{head_element}, $HTML_NS, 'head',, $token);
2516                } elsif ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {              $self->{open_elements}->[-1]->[0]->append_child ($self->{head_element});
2517                  !!!cp ('t133');              push @{$self->{open_elements}},
2518                  ## As if </noscript>                  [$self->{head_element}, $el_category->{head}];
2519                  pop @{$self->{open_elements}};  
2520                  !!!parse-error (type => 'in noscript:/',              ## Reprocess in the "in head" insertion mode...
2521                                  text => 'head', token => $token);              pop @{$self->{open_elements}};
2522                                $self->{insertion_mode} = AFTER_HEAD_IM;
2523                  ## Reprocess in the "in head" insertion mode...              !!!next-token;
2524                  pop @{$self->{open_elements}};              next B;
2525                  $self->{insertion_mode} = AFTER_HEAD_IM;            } elsif ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {
2526                  !!!next-token;              !!!cp ('t133');
2527                  next B;              #
2528                } elsif ($self->{insertion_mode} == IN_HEAD_IM) {            } elsif ($self->{insertion_mode} == IN_HEAD_IM) {
2529                  !!!cp ('t134');              !!!cp ('t134');
2530                  pop @{$self->{open_elements}};              pop @{$self->{open_elements}};
2531                  $self->{insertion_mode} = AFTER_HEAD_IM;              $self->{insertion_mode} = AFTER_HEAD_IM;
2532                  !!!next-token;              !!!next-token;
2533                  next B;              next B;
2534                } elsif ($self->{insertion_mode} == AFTER_HEAD_IM) {            } elsif ($self->{insertion_mode} == AFTER_HEAD_IM) {
2535                  !!!cp ('t134.1');              !!!cp ('t134.1');
2536                  !!!parse-error (type => 'unmatched end tag', text => 'head',              #
2537                                  token => $token);            } else {
2538                  ## Ignore the token              die "$0: $self->{insertion_mode}: Unknown insertion mode";
2539                  !!!next-token;            }
2540                  next B;          } elsif ($token->{tag_name} eq 'noscript') {
2541                } else {            if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {
2542                  die "$0: $self->{insertion_mode}: Unknown insertion mode";              !!!cp ('t136');
2543                }              pop @{$self->{open_elements}};
2544              } elsif ($token->{tag_name} eq 'noscript') {              $self->{insertion_mode} = IN_HEAD_IM;
2545                if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {              !!!next-token;
2546                  !!!cp ('t136');              next B;
2547                  pop @{$self->{open_elements}};            } else {
2548                  $self->{insertion_mode} = IN_HEAD_IM;              !!!cp ('t138');
2549                  !!!next-token;              #
2550                  next B;            }
2551                } elsif ($self->{insertion_mode} == BEFORE_HEAD_IM or          } elsif ({
2552                         $self->{insertion_mode} == AFTER_HEAD_IM) {              body => ($self->{insertion_mode} != IN_HEAD_NOSCRIPT_IM),
2553                  !!!cp ('t137');              html => ($self->{insertion_mode} != IN_HEAD_NOSCRIPT_IM),
2554                  !!!parse-error (type => 'unmatched end tag',              br => 1,
2555                                  text => 'noscript', token => $token);          }->{$token->{tag_name}}) {
                 ## 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') {  
2556            if ($self->{insertion_mode} == BEFORE_HEAD_IM) {            if ($self->{insertion_mode} == BEFORE_HEAD_IM) {
2557              !!!cp ('t142.2');              !!!cp ('t142.2');
2558              ## (before head) as if <head>, (in head) as if </head>              ## (before head) as if <head>, (in head) as if </head>
# Line 2620  sub _tree_construction_main ($) { Line 2572  sub _tree_construction_main ($) {
2572              !!!cp ('t143.3');              !!!cp ('t143.3');
2573              ## NOTE: Two parse errors for <head><noscript></br>              ## NOTE: Two parse errors for <head><noscript></br>
2574              !!!parse-error (type => 'unmatched end tag',              !!!parse-error (type => 'unmatched end tag',
2575                              text => 'br', token => $token);                              text => $token->{tag_name}, token => $token);
2576              ## As if </noscript>              ## As if </noscript>
2577              pop @{$self->{open_elements}};              pop @{$self->{open_elements}};
2578              $self->{insertion_mode} = IN_HEAD_IM;              $self->{insertion_mode} = IN_HEAD_IM;
# Line 2638  sub _tree_construction_main ($) { Line 2590  sub _tree_construction_main ($) {
2590              die "$0: $self->{insertion_mode}: Unknown insertion mode";              die "$0: $self->{insertion_mode}: Unknown insertion mode";
2591            }            }
2592    
2593            #            ## "after head" insertion mode
2594          } else { ## Other end tags            ## As if <body>
2595                !!!cp ('t145');            !!!insert-element ('body',, $token);
2596                !!!parse-error (type => 'unmatched end tag',            $self->{insertion_mode} = IN_BODY_IM;
2597                                text => $token->{tag_name}, token => $token);            ## The "frameset-ok" flag is left unchanged in this case.
2598                ## Ignore the token            ## Reprocess the token.
2599                !!!next-token;            next B;
2600                next B;          }
             }  
   
             if ($self->{insertion_mode} == IN_HEAD_NOSCRIPT_IM) {  
               !!!cp ('t146');  
               ## As if </noscript>  
               pop @{$self->{open_elements}};  
               !!!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');  
             }  
2601    
2602              ## "after head" insertion mode          ## End tags are ignored by default.
2603              ## As if <body>          !!!cp ('t145');
2604              !!!insert-element ('body',, $token);          !!!parse-error (type => 'unmatched end tag',
2605              $self->{insertion_mode} = IN_BODY_IM;                          text => $token->{tag_name}, token => $token);
2606              ## reprocess          ## Ignore the token.
2607            !!!next-token;
2608          next B;          next B;
2609        } elsif ($token->{type} == END_OF_FILE_TOKEN) {        } elsif ($token->{type} == END_OF_FILE_TOKEN) {
2610          if ($self->{insertion_mode} == BEFORE_HEAD_IM) {          if ($self->{insertion_mode} == BEFORE_HEAD_IM) {
# Line 2736  sub _tree_construction_main ($) { Line 2658  sub _tree_construction_main ($) {
2658          ## NOTE: As if <body>          ## NOTE: As if <body>
2659          !!!insert-element ('body',, $token);          !!!insert-element ('body',, $token);
2660          $self->{insertion_mode} = IN_BODY_IM;          $self->{insertion_mode} = IN_BODY_IM;
2661          ## NOTE: Reprocess.          ## The "frameset-ok" flag is left unchanged in this case.
2662            ## Reprocess the token.
2663          next B;          next B;
2664        } else {        } else {
2665          die "$0: $token->{type}: Unknown token type";          die "$0: $token->{type}: Unknown token type";
2666        }        }
2667      } elsif ($self->{insertion_mode} & BODY_IMS) {      } elsif ($self->{insertion_mode} & BODY_IMS) {
2668            if ($token->{type} == CHARACTER_TOKEN) {        if ($token->{type} == CHARACTER_TOKEN) {
2669              !!!cp ('t150');          !!!cp ('t150');
2670              ## NOTE: There is a code clone of "character in body".          $reconstruct_active_formatting_elements->($insert_to_current);
2671              $reconstruct_active_formatting_elements->($insert_to_current);          
2672                        $self->{open_elements}->[-1]->[0]->manakai_append_text ($token->{data});
             $self->{open_elements}->[-1]->[0]->manakai_append_text ($token->{data});  
2673    
2674              !!!next-token;          if ($token->{data} =~ /[^\x09\x0A\x0C\x0D\x20]/) {
2675              next B;            delete $self->{frameset_ok};
2676            } elsif ($token->{type} == START_TAG_TOKEN) {          }
2677    
2678            !!!next-token;
2679            next B;
2680          } elsif ($token->{type} == START_TAG_TOKEN) {
2681              if ({              if ({
2682                   caption => 1, col => 1, colgroup => 1, tbody => 1,                   caption => 1, col => 1, colgroup => 1, tbody => 1,
2683                   td => 1, tfoot => 1, th => 1, thead => 1, tr => 1,                   td => 1, tfoot => 1, th => 1, thead => 1, tr => 1,
# Line 4427  sub _tree_construction_main ($) { Line 4353  sub _tree_construction_main ($) {
4353          !!!nack ('t343.1');          !!!nack ('t343.1');
4354          !!!next-token;          !!!next-token;
4355          next B;          next B;
4356          } elsif ($token->{tag_name} eq 'frameset') {
4357            !!!parse-error (type => 'in body', text => $token->{tag_name},
4358                            token => $token);
4359    
4360            if (@{$self->{open_elements}} == 1 or
4361                not ($self->{open_elements}->[1]->[1] == BODY_EL)) {
4362              !!!cp ('t343.2');
4363              ## Ignore the token.
4364            } elsif (not $self->{frameset_ok}) {
4365              !!!cp ('t343.3');
4366              ## Ignore the token.
4367            } else {
4368              !!!cp ('t343.4');
4369              
4370              ## 1. Remove the second element.
4371              my $body = $self->{open_elements}->[1]->[0];
4372              my $body_parent = $body->parent_node;
4373              $body_parent->remove_child ($body) if $body_parent;
4374    
4375              ## 2. Pop nodes.
4376              splice @{$self->{open_elements}}, 1;
4377    
4378              ## 3. Insert.
4379              !!!insert-element-t ($token->{tag_name}, $token->{attributes}, $token);
4380    
4381              ## 4. Switch.
4382              $self->{insertion_mode} = IN_FRAMESET_IM;
4383            }
4384    
4385            !!!nack ('t343.5');
4386            !!!next-token;
4387            next B;
4388        } elsif ({        } elsif ({
4389                  ## NOTE: Start tags for non-phrasing flow content elements                  ## NOTE: Start tags for non-phrasing flow content elements
4390    
# Line 4435  sub _tree_construction_main ($) { Line 4393  sub _tree_construction_main ($) {
4393                  center => 1, datagrid => 1, details => 1, dialog => 1,                  center => 1, datagrid => 1, details => 1, dialog => 1,
4394                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,
4395                  footer => 1, h1 => 1, h2 => 1, h3 => 1, h4 => 1, h5 => 1,                  footer => 1, h1 => 1, h2 => 1, h3 => 1, h4 => 1, h5 => 1,
4396                  h6 => 1, header => 1, menu => 1, nav => 1, ol => 1, p => 1,                  h6 => 1, header => 1, hgroup => 1,
4397                    menu => 1, nav => 1, ol => 1, p => 1,
4398                  section => 1, ul => 1,                  section => 1, ul => 1,
4399                  ## NOTE: As normal, but drops leading newline                  ## NOTE: As normal, but drops leading newline
4400                  pre => 1, listing => 1,                  pre => 1, listing => 1,
# Line 4501  sub _tree_construction_main ($) { Line 4460  sub _tree_construction_main ($) {
4460            } else {            } else {
4461              !!!cp ('t348');              !!!cp ('t348');
4462            }            }
4463    
4464              delete $self->{frameset_ok};
4465          } elsif ($token->{tag_name} eq 'form') {          } elsif ($token->{tag_name} eq 'form') {
4466            !!!cp ('t347.1');            !!!cp ('t347.1');
4467            $self->{form_element} = $self->{open_elements}->[-1]->[0];            $self->{form_element} = $self->{open_elements}->[-1]->[0];
# Line 4510  sub _tree_construction_main ($) { Line 4471  sub _tree_construction_main ($) {
4471          } elsif ($token->{tag_name} eq 'table') {          } elsif ($token->{tag_name} eq 'table') {
4472            !!!cp ('t382');            !!!cp ('t382');
4473            push @{$open_tables}, [$self->{open_elements}->[-1]->[0]];            push @{$open_tables}, [$self->{open_elements}->[-1]->[0]];
4474    
4475              delete $self->{frameset_ok};
4476                        
4477            $self->{insertion_mode} = IN_TABLE_IM;            $self->{insertion_mode} = IN_TABLE_IM;
4478    
# Line 4518  sub _tree_construction_main ($) { Line 4481  sub _tree_construction_main ($) {
4481          } elsif ($token->{tag_name} eq 'hr') {          } elsif ($token->{tag_name} eq 'hr') {
4482            !!!cp ('t386');            !!!cp ('t386');
4483            pop @{$self->{open_elements}};            pop @{$self->{open_elements}};
4484                      
4485            !!!nack ('t386.1');            !!!ack ('t386.1');
4486    
4487              delete $self->{frameset_ok};
4488    
4489            !!!next-token;            !!!next-token;
4490          } else {          } else {
4491            !!!nack ('t347.1');            !!!nack ('t347.1');
# Line 4542  sub _tree_construction_main ($) { Line 4508  sub _tree_construction_main ($) {
4508            ## Interpreted as <li><foo><li/></foo></li> (non-conforming):            ## Interpreted as <li><foo><li/></foo></li> (non-conforming):
4509            ## div (Fx, S)            ## div (Fx, S)
4510    
4511            ## 1. Frameset-ng
4512            delete $self->{frameset_ok};
4513    
4514          my $non_optional;          my $non_optional;
4515          my $i = -1;          my $i = -1;
4516    
4517          ## 1.          ## 2.
4518          for my $node (reverse @{$self->{open_elements}}) {          for my $node (reverse @{$self->{open_elements}}) {
4519            if ($node->[1] == LI_EL) {            if ($node->[1] == LI_EL) {
4520              ## 2. (a) As if </li>              ## 3. (a) As if </li>
4521              {              {
4522                ## If no </li> - not applied                ## If no </li> - not applied
4523                #                #
# Line 4572  sub _tree_construction_main ($) { Line 4541  sub _tree_construction_main ($) {
4541                splice @{$self->{open_elements}}, $i;                splice @{$self->{open_elements}}, $i;
4542              }              }
4543    
4544              last; ## 2. (b) goto 5.              last; ## 3. (b) goto 5.
4545            } elsif (            } elsif (
4546                     ## NOTE: not "formatting" and not "phrasing"                     ## NOTE: not "formatting" and not "phrasing"
4547                     ($node->[1] & SPECIAL_EL or                     ($node->[1] & SPECIAL_EL or
# Line 4580  sub _tree_construction_main ($) { Line 4549  sub _tree_construction_main ($) {
4549                     ## NOTE: "li", "dt", and "dd" are in |SPECIAL_EL|.                     ## NOTE: "li", "dt", and "dd" are in |SPECIAL_EL|.
4550                     (not $node->[1] & ADDRESS_DIV_P_EL)                     (not $node->[1] & ADDRESS_DIV_P_EL)
4551                    ) {                    ) {
4552              ## 3.              ## 4.
4553              !!!cp ('t357');              !!!cp ('t357');
4554              last; ## goto 5.              last; ## goto 6.
4555            } elsif ($node->[1] & END_TAG_OPTIONAL_EL) {            } elsif ($node->[1] & END_TAG_OPTIONAL_EL) {
4556              !!!cp ('t358');              !!!cp ('t358');
4557              #              #
# Line 4591  sub _tree_construction_main ($) { Line 4560  sub _tree_construction_main ($) {
4560              $non_optional ||= $node;              $non_optional ||= $node;
4561              #              #
4562            }            }
4563            ## 4.            ## 5.
4564            ## goto 2.            ## goto 3.
4565            $i--;            $i--;
4566          }          }
4567    
4568          ## 5. (a) has a |p| element in scope          ## 6. (a) has a |p| element in scope
4569          INSCOPE: for (reverse @{$self->{open_elements}}) {          INSCOPE: for (reverse @{$self->{open_elements}}) {
4570            if ($_->[1] == P_EL) {            if ($_->[1] == P_EL) {
4571              !!!cp ('t353');              !!!cp ('t353');
# Line 4613  sub _tree_construction_main ($) { Line 4582  sub _tree_construction_main ($) {
4582            }            }
4583          } # INSCOPE          } # INSCOPE
4584    
4585          ## 5. (b) insert          ## 6. (b) insert
4586          !!!insert-element-t ($token->{tag_name}, $token->{attributes}, $token);          !!!insert-element-t ($token->{tag_name}, $token->{attributes}, $token);
4587          !!!nack ('t359.1');          !!!nack ('t359.1');
4588          !!!next-token;          !!!next-token;
# Line 4622  sub _tree_construction_main ($) { Line 4591  sub _tree_construction_main ($) {
4591                 $token->{tag_name} eq 'dd') {                 $token->{tag_name} eq 'dd') {
4592          ## NOTE: As normal, but imply </dt> or </dd> when ...          ## NOTE: As normal, but imply </dt> or </dd> when ...
4593    
4594            ## 1. Frameset-ng
4595            delete $self->{frameset_ok};
4596    
4597          my $non_optional;          my $non_optional;
4598          my $i = -1;          my $i = -1;
4599    
4600          ## 1.          ## 2.
4601          for my $node (reverse @{$self->{open_elements}}) {          for my $node (reverse @{$self->{open_elements}}) {
4602            if ($node->[1] == DTDD_EL) {            if ($node->[1] == DTDD_EL) {
4603              ## 2. (a) As if </li>              ## 3. (a) As if </li>
4604              {              {
4605                ## If no </li> - not applied                ## If no </li> - not applied
4606                #                #
# Line 4652  sub _tree_construction_main ($) { Line 4624  sub _tree_construction_main ($) {
4624                splice @{$self->{open_elements}}, $i;                splice @{$self->{open_elements}}, $i;
4625              }              }
4626    
4627              last; ## 2. (b) goto 5.              last; ## 3. (b) goto 5.
4628            } elsif (            } elsif (
4629                     ## NOTE: not "formatting" and not "phrasing"                     ## NOTE: not "formatting" and not "phrasing"
4630                     ($node->[1] & SPECIAL_EL or                     ($node->[1] & SPECIAL_EL or
# Line 4661  sub _tree_construction_main ($) { Line 4633  sub _tree_construction_main ($) {
4633    
4634                     (not $node->[1] & ADDRESS_DIV_P_EL)                     (not $node->[1] & ADDRESS_DIV_P_EL)
4635                    ) {                    ) {
4636              ## 3.              ## 4.
4637              !!!cp ('t357.1');              !!!cp ('t357.1');
4638              last; ## goto 5.              last; ## goto 5.
4639            } elsif ($node->[1] & END_TAG_OPTIONAL_EL) {            } elsif ($node->[1] & END_TAG_OPTIONAL_EL) {
# Line 4672  sub _tree_construction_main ($) { Line 4644  sub _tree_construction_main ($) {
4644              $non_optional ||= $node;              $non_optional ||= $node;
4645              #              #
4646            }            }
4647            ## 4.            ## 5.
4648            ## goto 2.            ## goto 3.
4649            $i--;            $i--;
4650          }          }
4651    
4652          ## 5. (a) has a |p| element in scope          ## 6. (a) has a |p| element in scope
4653          INSCOPE: for (reverse @{$self->{open_elements}}) {          INSCOPE: for (reverse @{$self->{open_elements}}) {
4654            if ($_->[1] == P_EL) {            if ($_->[1] == P_EL) {
4655              !!!cp ('t353.1');              !!!cp ('t353.1');
# Line 4691  sub _tree_construction_main ($) { Line 4663  sub _tree_construction_main ($) {
4663            }            }
4664          } # INSCOPE          } # INSCOPE
4665    
4666          ## 5. (b) insert          ## 6. (b) insert
4667          !!!insert-element-t ($token->{tag_name}, $token->{attributes}, $token);          !!!insert-element-t ($token->{tag_name}, $token->{attributes}, $token);
4668          !!!nack ('t359.2');          !!!nack ('t359.2');
4669          !!!next-token;          !!!next-token;
# Line 4811  sub _tree_construction_main ($) { Line 4783  sub _tree_construction_main ($) {
4783    
4784          push @$active_formatting_elements, ['#marker', ''];          push @$active_formatting_elements, ['#marker', ''];
4785    
4786            delete $self->{frameset_ok};
4787    
4788          !!!nack ('t379.1');          !!!nack ('t379.1');
4789          !!!next-token;          !!!next-token;
4790          next B;          next B;
# Line 4824  sub _tree_construction_main ($) { Line 4798  sub _tree_construction_main ($) {
4798          if ($token->{tag_name} eq 'xmp') {          if ($token->{tag_name} eq 'xmp') {
4799            !!!cp ('t381');            !!!cp ('t381');
4800            $reconstruct_active_formatting_elements->($insert_to_current);            $reconstruct_active_formatting_elements->($insert_to_current);
4801    
4802              delete $self->{frameset_ok};
4803            } elsif ($token->{tag_name} eq 'iframe') {
4804              !!!cp ('t381.1');
4805              delete $self->{frameset_ok};
4806          } else {          } else {
4807            !!!cp ('t399');            !!!cp ('t399');
4808          }          }
# Line 4902  sub _tree_construction_main ($) { Line 4881  sub _tree_construction_main ($) {
4881          ## 4., 6. Insertion mode          ## 4., 6. Insertion mode
4882          $self->{insertion_mode} |= IN_CDATA_RCDATA_IM;          $self->{insertion_mode} |= IN_CDATA_RCDATA_IM;
4883    
4884          ## XXX: 5. frameset-ok flag          ## 5. Frameset-ng.
4885            delete $self->{frameset_ok};
4886    
4887          !!!nack ('t392.1');          !!!nack ('t392.1');
4888          !!!next-token;          !!!next-token;
# Line 4994  sub _tree_construction_main ($) { Line 4974  sub _tree_construction_main ($) {
4974          next B;          next B;
4975        } elsif ({        } elsif ({
4976                  caption => 1, col => 1, colgroup => 1, frame => 1,                  caption => 1, col => 1, colgroup => 1, frame => 1,
4977                  frameset => 1, head => 1,                  head => 1,
4978                  tbody => 1, td => 1, tfoot => 1, th => 1,                  tbody => 1, td => 1, tfoot => 1, th => 1,
4979                  thead => 1, tr => 1,                  thead => 1, tr => 1,
4980                 }->{$token->{tag_name}}) {                 }->{$token->{tag_name}}) {
# Line 5031  sub _tree_construction_main ($) { Line 5011  sub _tree_construction_main ($) {
5011               applet => 1, marquee => 1, object => 1,               applet => 1, marquee => 1, object => 1,
5012              }->{$token->{tag_name}}) {              }->{$token->{tag_name}}) {
5013            !!!cp ('t380');            !!!cp ('t380');
5014    
5015            push @$active_formatting_elements, ['#marker', ''];            push @$active_formatting_elements, ['#marker', ''];
5016    
5017              delete $self->{frameset_ok};
5018    
5019            !!!nack ('t380.1');            !!!nack ('t380.1');
5020          } elsif ({          } elsif ({
5021                    b => 1, big => 1, em => 1, font => 1, i => 1,                    b => 1, big => 1, em => 1, font => 1, i => 1,
# Line 5052  sub _tree_construction_main ($) { Line 5036  sub _tree_construction_main ($) {
5036                    keygen => 1,                    keygen => 1,
5037                   }->{$token->{tag_name}}) {                   }->{$token->{tag_name}}) {
5038            !!!cp ('t388.1');            !!!cp ('t388.1');
5039    
5040            pop @{$self->{open_elements}};            pop @{$self->{open_elements}};
5041    
5042              delete $self->{frameset_ok};
5043    
5044            !!!ack ('t388.3');            !!!ack ('t388.3');
5045          } elsif ($token->{tag_name} eq 'select') {          } elsif ($token->{tag_name} eq 'select') {
5046            ## TODO: associate with $self->{form_element} if defined            ## TODO: associate with $self->{form_element} if defined
5047            
5048              delete $self->{frameset_ok};
5049              
5050            if ($self->{insertion_mode} & TABLE_IMS or            if ($self->{insertion_mode} & TABLE_IMS or
5051                $self->{insertion_mode} & BODY_TABLE_IMS or                $self->{insertion_mode} & BODY_TABLE_IMS or
5052                ($self->{insertion_mode} & IM_MASK) == IN_COLUMN_GROUP_IM) {                ($self->{insertion_mode} & IM_MASK) == IN_COLUMN_GROUP_IM) {
# Line 5075  sub _tree_construction_main ($) { Line 5065  sub _tree_construction_main ($) {
5065          next B;          next B;
5066        }        }
5067      } elsif ($token->{type} == END_TAG_TOKEN) {      } elsif ($token->{type} == END_TAG_TOKEN) {
5068        if ($token->{tag_name} eq 'body') {        if ($token->{tag_name} eq 'body' or $token->{tag_name} eq 'html') {
5069    
5070          ## 1. If not "have an element in scope":          ## 1. If not "have an element in scope":
5071          ## "has a |body| element in scope"          ## "has a |body| element in scope"
# Line 5092  sub _tree_construction_main ($) { Line 5082  sub _tree_construction_main ($) {
5082              }              }
5083            }            }
5084    
5085            ## NOTE: |<marquee></body>|, |<svg><foreignobject></body>|            ## NOTE: |<marquee></body>|, |<svg><foreignobject></body>|,
5086              ## and fragment cases.
5087    
5088            !!!parse-error (type => 'unmatched end tag',            !!!parse-error (type => 'unmatched end tag',
5089                            text => $token->{tag_name}, token => $token);                            text => $token->{tag_name}, token => $token);
5090            ## NOTE: Ignore the token.            ## Ignore the token.  (</body> or </html>)
5091            !!!next-token;            !!!next-token;
5092            next B;            next B;
5093          } # INSCOPE          } # INSCOPE
# Line 5119  sub _tree_construction_main ($) { Line 5110  sub _tree_construction_main ($) {
5110    
5111          ## 3. Switch the insertion mode.          ## 3. Switch the insertion mode.
5112          $self->{insertion_mode} = AFTER_BODY_IM;          $self->{insertion_mode} = AFTER_BODY_IM;
5113          !!!next-token;          if ($token->{tag_name} eq 'body') {
         next B;  
       } elsif ($token->{tag_name} eq 'html') {  
         ## TODO: Update this code.  It seems that the code below is not  
         ## up-to-date, though it has same effect as speced.  
         if (@{$self->{open_elements}} > 1 and  
             $self->{open_elements}->[1]->[1] == BODY_EL) {  
           unless ($self->{open_elements}->[-1]->[1] == BODY_EL) {  
             !!!cp ('t406');  
             !!!parse-error (type => 'not closed',  
                             text => $self->{open_elements}->[1]->[0]  
                                 ->manakai_local_name,  
                             token => $token);  
           } else {  
             !!!cp ('t407');  
           }  
           $self->{insertion_mode} = AFTER_BODY_IM;  
           ## reprocess  
           next B;  
         } else {  
           !!!cp ('t408');  
           !!!parse-error (type => 'unmatched end tag',  
                           text => $token->{tag_name}, token => $token);  
           ## Ignore the token  
5114            !!!next-token;            !!!next-token;
5115            next B;          } else { # html
5116              ## Reprocess.
5117          }          }
5118            next B;
5119        } elsif ({        } elsif ({
5120                  ## NOTE: End tags for non-phrasing flow content elements                  ## NOTE: End tags for non-phrasing flow content elements
5121    
# Line 5153  sub _tree_construction_main ($) { Line 5123  sub _tree_construction_main ($) {
5123                  address => 1, article => 1, aside => 1, blockquote => 1,                  address => 1, article => 1, aside => 1, blockquote => 1,
5124                  center => 1, datagrid => 1, details => 1, dialog => 1,                  center => 1, datagrid => 1, details => 1, dialog => 1,
5125                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,
5126                  footer => 1, header => 1, listing => 1, menu => 1, nav => 1,                  footer => 1, header => 1, hgroup => 1,
5127                    listing => 1, menu => 1, nav => 1,
5128                  ol => 1, pre => 1, section => 1, ul => 1,                  ol => 1, pre => 1, section => 1, ul => 1,
5129    
5130                  ## NOTE: As normal, but ... optional tags                  ## NOTE: As normal, but ... optional tags
# Line 5513  sub set_inner_html ($$$$;$) { Line 5484  sub set_inner_html ($$$$;$) {
5484    my $onerror = $_[1];    my $onerror = $_[1];
5485    my $get_wrapper = $_[2] || sub ($) { return $_[0] };    my $get_wrapper = $_[2] || sub ($) { return $_[0] };
5486    
   ## ISSUE: Should {confident} be true?  
   
5487    my $nt = $node->node_type;    my $nt = $node->node_type;
5488    if ($nt == 9) { # Document (invoke the algorithm with no /context/ element)    if ($nt == 9) { # Document (invoke the algorithm with no /context/ element)
5489      # MUST      # MUST
# Line 5729  sub set_inner_html ($$$$;$) { Line 5698  sub set_inner_html ($$$$;$) {
5698        $anode = $anode->parent_node;        $anode = $anode->parent_node;
5699      } # AN      } # AN
5700    
5701        ## F.5. Set the input stream.
5702        $p->{confident} = 1; ## Confident: irrelevant.
5703    
5704      ## F.6. Start the parser.      ## F.6. Start the parser.
5705      {      {
5706        my $self = $p;        my $self = $p;

Legend:
Removed from v.1.233  
changed lines
  Added in v.1.243

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24