/[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.229 by wakaba, Sat Sep 5 13:30:43 2009 UTC revision 1.237 by wakaba, Sun Sep 6 08:29:32 2009 UTC
# Line 179  my $el_category = { Line 179  my $el_category = {
179    dt => DTDD_EL,    dt => DTDD_EL,
180    em => FORMATTING_EL,    em => FORMATTING_EL,
181    embed => MISC_SPECIAL_EL,    embed => MISC_SPECIAL_EL,
   eventsource => MISC_SPECIAL_EL,  
182    fieldset => MISC_SPECIAL_EL,    fieldset => MISC_SPECIAL_EL,
183    figure => MISC_SPECIAL_EL,    figure => MISC_SPECIAL_EL,
184    font => FORMATTING_EL,    font => FORMATTING_EL,
# Line 195  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 203  my $el_category = { Line 203  my $el_category = {
203    #image => MISC_SPECIAL_EL, ## NOTE: Commented out in the spec.    #image => MISC_SPECIAL_EL, ## NOTE: Commented out in the spec.
204    input => MISC_SPECIAL_EL,    input => MISC_SPECIAL_EL,
205    isindex => MISC_SPECIAL_EL,    isindex => MISC_SPECIAL_EL,
206      ## XXX keygen? (Whether a void element is in Special or not does not
207      ## affect to the processing, however.)
208    li => LI_EL,    li => LI_EL,
209    link => MISC_SPECIAL_EL,    link => MISC_SPECIAL_EL,
210    listing => MISC_SPECIAL_EL,    listing => MISC_SPECIAL_EL,
# Line 247  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 647  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 1608  sub _tree_construction_main ($) { Line 1613  sub _tree_construction_main ($) {
1613                
1614        ## Step 8        ## Step 8
1615        if ($common_ancestor_node->[1] & TABLE_ROWS_EL) {        if ($common_ancestor_node->[1] & TABLE_ROWS_EL) {
1616            ## Foster parenting.
1617          my $foster_parent_element;          my $foster_parent_element;
1618          my $next_sibling;          my $next_sibling;
1619          OE: for (reverse 0..$#{$self->{open_elements}}) {          OE: for (reverse 0..$#{$self->{open_elements}}) {
1620            if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {            if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {
1621                               my $parent = $self->{open_elements}->[$_]->[0]->parent_node;              !!!cp ('t65.2');
1622                               if (defined $parent and $parent->node_type == 1) {              $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];
1623                                 !!!cp ('t65.1');              $next_sibling = $self->{open_elements}->[$_]->[0];
1624                                 $foster_parent_element = $parent;              undef $next_sibling
1625                                 $next_sibling = $self->{open_elements}->[$_]->[0];                  unless $next_sibling->parent_node eq $foster_parent_element;
1626                               } else {              last OE;
1627                                 !!!cp ('t65.2');            }
1628                                 $foster_parent_element          } # OE
1629                                   = $self->{open_elements}->[$_ - 1]->[0];          $foster_parent_element ||= $self->{open_elements}->[0]->[0];
1630                               }  
                              last OE;  
                            }  
                          } # OE  
                          $foster_parent_element = $self->{open_elements}->[0]->[0]  
                            unless defined $foster_parent_element;  
1631          $foster_parent_element->insert_before ($last_node->[0], $next_sibling);          $foster_parent_element->insert_before ($last_node->[0], $next_sibling);
1632          $open_tables->[-1]->[1] = 1; # tainted          $open_tables->[-1]->[1] = 1; # tainted
1633        } else {        } else {
# Line 1682  sub _tree_construction_main ($) { Line 1683  sub _tree_construction_main ($) {
1683      $self->{open_elements}->[-1]->[0]->append_child ($_[0]);      $self->{open_elements}->[-1]->[0]->append_child ($_[0]);
1684    }; # $insert_to_current    }; # $insert_to_current
1685    
1686      ## Foster parenting.  Note that there are three "foster parenting"
1687      ## code in the parser: for elements (this one), for texts, and for
1688      ## elements in the AAA code.
1689    my $insert_to_foster = sub {    my $insert_to_foster = sub {
1690      my $child = shift;      my $child = shift;
1691      if ($self->{open_elements}->[-1]->[1] & TABLE_ROWS_EL) {      if ($self->{open_elements}->[-1]->[1] & TABLE_ROWS_EL) {
# Line 1690  sub _tree_construction_main ($) { Line 1694  sub _tree_construction_main ($) {
1694        my $next_sibling;        my $next_sibling;
1695        OE: for (reverse 0..$#{$self->{open_elements}}) {        OE: for (reverse 0..$#{$self->{open_elements}}) {
1696          if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {          if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {
1697                               my $parent = $self->{open_elements}->[$_]->[0]->parent_node;            !!!cp ('t71');
1698                               if (defined $parent and $parent->node_type == 1) {            $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];
1699                                 !!!cp ('t70');            $next_sibling = $self->{open_elements}->[$_]->[0];
1700                                 $foster_parent_element = $parent;            undef $next_sibling
1701                                 $next_sibling = $self->{open_elements}->[$_]->[0];                unless $next_sibling->parent_node eq $foster_parent_element;
1702                               } else {            last OE;
1703                                 !!!cp ('t71');          }
1704                                 $foster_parent_element        } # OE
1705                                   = $self->{open_elements}->[$_ - 1]->[0];        $foster_parent_element ||= $self->{open_elements}->[0]->[0];
1706                               }  
1707                               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);  
1708        $open_tables->[-1]->[1] = 1; # tainted        $open_tables->[-1]->[1] = 1; # tainted
1709      } else {      } else {
1710        !!!cp ('t72');        !!!cp ('t72');
# Line 1734  sub _tree_construction_main ($) { Line 1732  sub _tree_construction_main ($) {
1732    ## document.write ("b")</script>|    ## document.write ("b")</script>|
1733    
1734    B: while (1) {    B: while (1) {
1735    
1736        ## The "in table text" insertion mode.
1737        if ($self->{insertion_mode} & TABLE_IMS and
1738            not $self->{insertion_mode} & IN_FOREIGN_CONTENT_IM and
1739            not $self->{insertion_mode} & IN_CDATA_RCDATA_IM) {
1740          C: {
1741            my $s;
1742            if ($token->{type} == CHARACTER_TOKEN) {
1743              !!!cp ('t194');
1744              $self->{pending_chars} ||= [];
1745              push @{$self->{pending_chars}}, $token;
1746              !!!next-token;
1747              next B;
1748            } else {
1749              if ($self->{pending_chars}) {
1750                $s = join '', map { $_->{data} } @{$self->{pending_chars}};
1751                delete $self->{pending_chars};
1752                if ($s =~ /[^\x09\x0A\x0C\x0D\x20]/) {
1753                  !!!cp ('t195');
1754                  #
1755                } else {
1756                  !!!cp ('t195.1');
1757                  #$self->{open_elements}->[-1]->[0]->manakai_append_text ($s);
1758                  $self->{open_elements}->[-1]->[0]->append_child
1759                      ($self->{document}->create_text_node ($s));
1760                  last C;
1761                }
1762              } else {
1763                !!!cp ('t195.2');
1764                last C;
1765              }
1766            }
1767    
1768            ## Foster parenting.
1769            !!!parse-error (type => 'in table:#text', token => $token);
1770    
1771            ## NOTE: As if in body, but insert into the foster parent element.
1772            $reconstruct_active_formatting_elements->($insert_to_foster);
1773                
1774            if ($self->{open_elements}->[-1]->[1] & TABLE_ROWS_EL) {
1775              # MUST
1776              my $foster_parent_element;
1777              my $next_sibling;
1778              OE: for (reverse 0..$#{$self->{open_elements}}) {
1779                if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {
1780                  !!!cp ('t197');
1781                  $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];
1782                  $next_sibling = $self->{open_elements}->[$_]->[0];
1783                  undef $next_sibling
1784                    unless $next_sibling->parent_node eq $foster_parent_element;
1785                  last OE;
1786                }
1787              } # OE
1788              $foster_parent_element ||= $self->{open_elements}->[0]->[0];
1789    
1790              !!!cp ('t199');
1791              $foster_parent_element->insert_before
1792                  ($self->{document}->create_text_node ($s), $next_sibling);
1793    
1794              $open_tables->[-1]->[1] = 1; # tainted
1795              $open_tables->[-1]->[2] = 1; # ~node inserted
1796            } else {
1797              ## NOTE: Fragment case or in a foster parent'ed element
1798              ## (e.g. |<table><span>a|).  In fragment case, whether the
1799              ## character is appended to existing node or a new node is
1800              ## created is irrelevant, since the foster parent'ed nodes
1801              ## are discarded and fragment parsing does not invoke any
1802              ## script.
1803              !!!cp ('t200');
1804              $self->{open_elements}->[-1]->[0]->manakai_append_text ($s);
1805            }
1806          } # C
1807        } # TABLE_IMS
1808    
1809      if ($token->{type} == DOCTYPE_TOKEN) {      if ($token->{type} == DOCTYPE_TOKEN) {
1810        !!!cp ('t73');        !!!cp ('t73');
1811        !!!parse-error (type => 'in html:#DOCTYPE', token => $token);        !!!parse-error (type => 'in html:#DOCTYPE', token => $token);
# Line 2152  sub _tree_construction_main ($) { Line 2224  sub _tree_construction_main ($) {
2224            !!!ack ('t103.1');            !!!ack ('t103.1');
2225            !!!next-token;            !!!next-token;
2226            next B;            next B;
2227          } elsif ($token->{tag_name} eq 'command' or          } elsif ($token->{tag_name} eq 'command') {
                  $token->{tag_name} eq 'eventsource') {  
2228            if ($self->{insertion_mode} == IN_HEAD_IM) {            if ($self->{insertion_mode} == IN_HEAD_IM) {
2229              ## NOTE: If the insertion mode at the time of the emission              ## NOTE: If the insertion mode at the time of the emission
2230              ## of the token was "before head", $self->{insertion_mode}              ## of the token was "before head", $self->{insertion_mode}
# Line 3021  sub _tree_construction_main ($) { Line 3092  sub _tree_construction_main ($) {
3092        $insert = $insert_to_current;        $insert = $insert_to_current;
3093        #        #
3094      } elsif ($self->{insertion_mode} & TABLE_IMS) {      } elsif ($self->{insertion_mode} & TABLE_IMS) {
       C: {  
         my $s;  
         if ($token->{type} == CHARACTER_TOKEN) {  
           !!!cp ('t194');  
           $self->{pending_chars} ||= [];  
           push @{$self->{pending_chars}}, $token;  
           !!!next-token;  
           next B;  
         } else {  
           if ($self->{pending_chars}) {  
             $s = join '', map { $_->{data} } @{$self->{pending_chars}};  
             delete $self->{pending_chars};  
             if ($s =~ /[^\x09\x0A\x0C\x0D\x20]/) {  
               !!!cp ('t195');  
               #  
             } else {  
               !!!cp ('t195.1');  
               #$self->{open_elements}->[-1]->[0]->manakai_append_text ($s);  
               $self->{open_elements}->[-1]->[0]->append_child  
                   ($self->{document}->create_text_node ($s));  
               last C;  
             }  
           } else {  
             !!!cp ('t195.2');  
             last C;  
           }  
         }  
   
         ## Foster parenting  
         !!!parse-error (type => 'in table:#text', token => $token);  
   
         ## NOTE: As if in body, but insert into the foster parent element.  
         $reconstruct_active_formatting_elements->($insert_to_foster);  
               
         if ($self->{open_elements}->[-1]->[1] & TABLE_ROWS_EL) {  
           # MUST  
           my $foster_parent_element;  
           my $next_sibling;  
           #my $prev_sibling;  
           OE: for (reverse 0..$#{$self->{open_elements}}) {  
             if ($self->{open_elements}->[$_]->[1] == TABLE_EL) {  
               my $parent = $self->{open_elements}->[$_]->[0]->parent_node;  
               if (defined $parent and $parent->node_type == 1) {  
                 $foster_parent_element = $parent;  
                 !!!cp ('t196');  
                 $next_sibling = $self->{open_elements}->[$_]->[0];  
           #      $prev_sibling = $next_sibling->previous_sibling;  
                 #  
               } else {  
                 !!!cp ('t197');  
                 $foster_parent_element = $self->{open_elements}->[$_ - 1]->[0];  
           #      $prev_sibling = $foster_parent_element->last_child;  
                 #  
               }  
               last OE;  
             }  
           } # OE  
           $foster_parent_element = $self->{open_elements}->[0]->[0] #and  
           #$prev_sibling = $foster_parent_element->last_child  
               unless defined $foster_parent_element;  
           #undef $prev_sibling unless $open_tables->[-1]->[2]; # ~node inserted  
           #if (defined $prev_sibling and  
           #    $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);  
           #}  
           $open_tables->[-1]->[1] = 1; # tainted  
           $open_tables->[-1]->[2] = 1; # ~node inserted  
         } else {  
           ## NOTE: Fragment case or in a foster parent'ed element  
           ## (e.g. |<table><span>a|).  In fragment case, whether the  
           ## character is appended to existing node or a new node is  
           ## created is irrelevant, since the foster parent'ed nodes  
           ## are discarded and fragment parsing does not invoke any  
           ## script.  
           !!!cp ('t200');  
           $self->{open_elements}->[-1]->[0]->manakai_append_text ($s);  
         }  
       } # C  
   
3095        if ($token->{type} == START_TAG_TOKEN) {        if ($token->{type} == START_TAG_TOKEN) {
3096          if ({          if ({
3097               tr => (($self->{insertion_mode} & IM_MASK) != IN_ROW_IM),               tr => (($self->{insertion_mode} & IM_MASK) != IN_ROW_IM),
# Line 3373  sub _tree_construction_main ($) { Line 3360  sub _tree_construction_main ($) {
3360            !!!ack-later;            !!!ack-later;
3361            next B;            next B;
3362          } elsif ($token->{tag_name} eq 'style') {          } elsif ($token->{tag_name} eq 'style') {
3363            if (not $open_tables->[-1]->[1]) { # tainted            !!!cp ('t227.8');
3364              !!!cp ('t227.8');            ## NOTE: This is a "as if in head" code clone.
3365              ## NOTE: This is a "as if in head" code clone.            $parse_rcdata->(CDATA_CONTENT_MODEL);
3366              $parse_rcdata->(CDATA_CONTENT_MODEL);            $open_tables->[-1]->[2] = 0 if @$open_tables; # ~node inserted
3367              $open_tables->[-1]->[2] = 0 if @$open_tables; # ~node inserted            next B;
             next B;  
           } else {  
             !!!cp ('t227.7');  
             #  
           }  
3368          } elsif ($token->{tag_name} eq 'script') {          } elsif ($token->{tag_name} eq 'script') {
3369            if (not $open_tables->[-1]->[1]) { # tainted            !!!cp ('t227.6');
3370              !!!cp ('t227.6');            ## NOTE: This is a "as if in head" code clone.
3371              ## NOTE: This is a "as if in head" code clone.            $script_start_tag->();
3372              $script_start_tag->();            $open_tables->[-1]->[2] = 0 if @$open_tables; # ~node inserted
3373              $open_tables->[-1]->[2] = 0 if @$open_tables; # ~node inserted            next B;
             next B;  
           } else {  
             !!!cp ('t227.5');  
             #  
           }  
3374          } elsif ($token->{tag_name} eq 'input') {          } elsif ($token->{tag_name} eq 'input') {
3375            if (not $open_tables->[-1]->[1]) { # tainted            if ($token->{attributes}->{type}) {
3376              if ($token->{attributes}->{type}) { ## TODO: case              my $type = $token->{attributes}->{type}->{value};
3377                my $type = lc $token->{attributes}->{type}->{value};              $type =~ tr/A-Z/a-z/; ## ASCII case-insensitive.
3378                if ($type eq 'hidden') {              if ($type eq 'hidden') {
3379                  !!!cp ('t227.3');                !!!cp ('t227.3');
3380                  !!!parse-error (type => 'in table',                !!!parse-error (type => 'in table',
3381                                  text => $token->{tag_name}, token => $token);                                text => $token->{tag_name}, token => $token);
3382    
3383                  !!!insert-element ($token->{tag_name}, $token->{attributes}, $token);                !!!insert-element ($token->{tag_name}, $token->{attributes}, $token);
3384                  $open_tables->[-1]->[2] = 0 if @$open_tables; # ~node inserted                $open_tables->[-1]->[2] = 0 if @$open_tables; # ~node inserted
3385    
3386                  ## TODO: form element pointer                ## TODO: form element pointer
3387    
3388                  pop @{$self->{open_elements}};                pop @{$self->{open_elements}};
3389    
3390                  !!!next-token;                !!!next-token;
3391                  !!!ack ('t227.2.1');                !!!ack ('t227.2.1');
3392                  next B;                next B;
               } else {  
                 !!!cp ('t227.2');  
                 #  
               }  
3393              } else {              } else {
3394                !!!cp ('t227.1');                !!!cp ('t227.1');
3395                #                #
# Line 4345  sub _tree_construction_main ($) { Line 4318  sub _tree_construction_main ($) {
4318          $parse_rcdata->(CDATA_CONTENT_MODEL);          $parse_rcdata->(CDATA_CONTENT_MODEL);
4319          next B;          next B;
4320        } elsif ({        } elsif ({
4321                  base => 1, command => 1, eventsource => 1, link => 1,                  base => 1, command => 1, link => 1,
4322                 }->{$token->{tag_name}}) {                 }->{$token->{tag_name}}) {
4323          !!!cp ('t334');          !!!cp ('t334');
4324          ## NOTE: This is an "as if in head" code clone, only "-t" differs          ## NOTE: This is an "as if in head" code clone, only "-t" differs
# Line 4443  sub _tree_construction_main ($) { Line 4416  sub _tree_construction_main ($) {
4416                  center => 1, datagrid => 1, details => 1, dialog => 1,                  center => 1, datagrid => 1, details => 1, dialog => 1,
4417                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,
4418                  footer => 1, h1 => 1, h2 => 1, h3 => 1, h4 => 1, h5 => 1,                  footer => 1, h1 => 1, h2 => 1, h3 => 1, h4 => 1, h5 => 1,
4419                  h6 => 1, header => 1, menu => 1, nav => 1, ol => 1, p => 1,                  h6 => 1, header => 1, hgroup => 1,
4420                    menu => 1, nav => 1, ol => 1, p => 1,
4421                  section => 1, ul => 1,                  section => 1, ul => 1,
4422                  ## NOTE: As normal, but drops leading newline                  ## NOTE: As normal, but drops leading newline
4423                  pre => 1, listing => 1,                  pre => 1, listing => 1,
# Line 5057  sub _tree_construction_main ($) { Line 5031  sub _tree_construction_main ($) {
5031          } elsif ({          } elsif ({
5032                    area => 1, basefont => 1, bgsound => 1, br => 1,                    area => 1, basefont => 1, bgsound => 1, br => 1,
5033                    embed => 1, img => 1, spacer => 1, wbr => 1,                    embed => 1, img => 1, spacer => 1, wbr => 1,
5034                      keygen => 1,
5035                   }->{$token->{tag_name}}) {                   }->{$token->{tag_name}}) {
5036            !!!cp ('t388.1');            !!!cp ('t388.1');
5037            pop @{$self->{open_elements}};            pop @{$self->{open_elements}};
# Line 5160  sub _tree_construction_main ($) { Line 5135  sub _tree_construction_main ($) {
5135                  address => 1, article => 1, aside => 1, blockquote => 1,                  address => 1, article => 1, aside => 1, blockquote => 1,
5136                  center => 1, datagrid => 1, details => 1, dialog => 1,                  center => 1, datagrid => 1, details => 1, dialog => 1,
5137                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,                  dir => 1, div => 1, dl => 1, fieldset => 1, figure => 1,
5138                  footer => 1, header => 1, listing => 1, menu => 1, nav => 1,                  footer => 1, header => 1, hgroup => 1,
5139                    listing => 1, menu => 1, nav => 1,
5140                  ol => 1, pre => 1, section => 1, ul => 1,                  ol => 1, pre => 1, section => 1, ul => 1,
5141    
5142                  ## NOTE: As normal, but ... optional tags                  ## NOTE: As normal, but ... optional tags
# Line 5520  sub set_inner_html ($$$$;$) { Line 5496  sub set_inner_html ($$$$;$) {
5496    my $onerror = $_[1];    my $onerror = $_[1];
5497    my $get_wrapper = $_[2] || sub ($) { return $_[0] };    my $get_wrapper = $_[2] || sub ($) { return $_[0] };
5498    
   ## ISSUE: Should {confident} be true?  
   
5499    my $nt = $node->node_type;    my $nt = $node->node_type;
5500    if ($nt == 9) { # Document (invoke the algorithm with no /context/ element)    if ($nt == 9) { # Document (invoke the algorithm with no /context/ element)
5501      # MUST      # MUST
# Line 5736  sub set_inner_html ($$$$;$) { Line 5710  sub set_inner_html ($$$$;$) {
5710        $anode = $anode->parent_node;        $anode = $anode->parent_node;
5711      } # AN      } # AN
5712    
5713        ## F.5. Set the input stream.
5714        $p->{confident} = 1; ## Confident: irrelevant.
5715    
5716      ## F.6. Start the parser.      ## F.6. Start the parser.
5717      {      {
5718        my $self = $p;        my $self = $p;

Legend:
Removed from v.1.229  
changed lines
  Added in v.1.237

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24