/[suikacvs]/markup/html/whatpm/Whatpm/CSS/Parser.pm
Suika

Diff of /markup/html/whatpm/Whatpm/CSS/Parser.pm

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

revision 1.6 by wakaba, Mon Dec 31 07:26:35 2007 UTC revision 1.7 by wakaba, Mon Dec 31 09:09:23 2007 UTC
# Line 338  sub parse_char_string ($$) { Line 338  sub parse_char_string ($$) {
338          redo S;          redo S;
339        }        }
340    
341        if ($prop_value) {        my $important = (defined $prop_flag and $prop_flag eq 'important');
342          $$current_decls->{$prop_def->{key}} = [$prop_value, $prop_flag];        for my $set_prop_name (keys %{$prop_value or {}}) {
343            my $set_prop_def = $Prop->{$set_prop_name};
344            $$current_decls->{$set_prop_def->{key}}
345                = [$prop_value->{$set_prop_name}, $prop_flag]
346                if $important or
347                    not $$current_decls->{$set_prop_def->{key}} or
348                    not defined $$current_decls->{$set_prop_def->{key}}->[1];
349        }        }
350        redo S;        redo S;
351      } elsif ($state == IGNORED_STATEMENT_STATE or      } elsif ($state == IGNORED_STATEMENT_STATE or
# Line 434  $Prop->{color} = { Line 440  $Prop->{color} = {
440      if ($t->{type} == IDENT_TOKEN) {      if ($t->{type} == IDENT_TOKEN) {
441        if (lc $t->{value} eq 'blue') { ## TODO: case folding        if (lc $t->{value} eq 'blue') { ## TODO: case folding
442          $t = $tt->get_next_token;          $t = $tt->get_next_token;
443          return ($t, ["RGBA", 0, 0, 255, 1]);          return ($t, {$prop_name => ["RGBA", 0, 0, 255, 1]});
444        } else {        } else {
445          #          #
446        }        }
# Line 468  my $one_keyword_parser = sub { Line 474  my $one_keyword_parser = sub {
474      $t = $tt->get_next_token;      $t = $tt->get_next_token;
475      if ($Prop->{$prop_name}->{keyword}->{$prop_value} and      if ($Prop->{$prop_name}->{keyword}->{$prop_value} and
476          $self->{prop_value}->{$prop_name}->{$prop_value}) {          $self->{prop_value}->{$prop_name}->{$prop_value}) {
477        return ($t, ["KEYWORD", $prop_value]);        return ($t, {$prop_name => ["KEYWORD", $prop_value]});
478      } elsif ($prop_value eq 'inherit') {      } elsif ($prop_value eq 'inherit') {
479        return ($t, ["KEYWORD", $prop_value]);        return ($t, {$prop_name => ["KEYWORD", $prop_value]});
480      }      }
481    }    }
482        
483    $onerror->(type => 'syntax error:keyword',    $onerror->(type => 'syntax error:keyword:'.$prop_name,
484               level => $self->{must_level},               level => $self->{must_level},
485               token => $t);               token => $t);
486    return ($t, undef);    return ($t, undef);
# Line 572  $Prop->{'unicode-bidi'} = { Line 578  $Prop->{'unicode-bidi'} = {
578  $Attr->{unicode_bidi} = $Prop->{'unicode-bidi'};  $Attr->{unicode_bidi} = $Prop->{'unicode-bidi'};
579  $Key->{unicode_bidi} = $Prop->{'unicode-bidi'};  $Key->{unicode_bidi} = $Prop->{'unicode-bidi'};
580    
581    my $border_style_keyword = {
582      none => 1, hidden => 1, dotted => 1, dashed => 1, solid => 1,
583      double => 1, groove => 1, ridge => 1, inset => 1, outset => 1,
584    };
585    
586    $Prop->{'border-top-style'} = {
587      css => 'border-top-style',
588      dom => 'border_top_style',
589      key => 'border_top_style',
590      parse => $one_keyword_parser,
591      serialize => $one_keyword_serializer,
592      keyword => $border_style_keyword,
593    };
594    $Attr->{border_top_style} = $Prop->{'border-top-style'};
595    $Key->{border_top_style} = $Prop->{'border-top-style'};
596    
597    $Prop->{'border-right-style'} = {
598      css => 'border-right-style',
599      dom => 'border_right_style',
600      key => 'border_right_style',
601      parse => $one_keyword_parser,
602      serialize => $one_keyword_serializer,
603      keyword => $border_style_keyword,
604    };
605    $Attr->{border_right_style} = $Prop->{'border-right-style'};
606    $Key->{border_right_style} = $Prop->{'border-right-style'};
607    
608    $Prop->{'border-bottom-style'} = {
609      css => 'border-bottom-style',
610      dom => 'border_bottom_style',
611      key => 'border_bottom_style',
612      parse => $one_keyword_parser,
613      serialize => $one_keyword_serializer,
614      keyword => $border_style_keyword,
615    };
616    $Attr->{border_bottom_style} = $Prop->{'border-bottom-style'};
617    $Key->{border_bottom_style} = $Prop->{'border-bottom-style'};
618    
619    $Prop->{'border-left-style'} = {
620      css => 'border-left-style',
621      dom => 'border_left_style',
622      key => 'border_left_style',
623      parse => $one_keyword_parser,
624      serialize => $one_keyword_serializer,
625      keyword => $border_style_keyword,
626    };
627    $Attr->{border_left_style} = $Prop->{'border-left-style'};
628    $Key->{border_left_style} = $Prop->{'border-left-style'};
629    
630    $Prop->{'border-style'} = {
631      css => 'border-style',
632      dom => 'border_style',
633      parse => sub {
634        my ($self, $prop_name, $tt, $t, $onerror) = @_;
635    
636        my %prop_value;
637        my $has_inherit;
638        if ($t->{type} == IDENT_TOKEN) {
639          my $prop_value = lc $t->{value}; ## TODO: case folding
640          $t = $tt->get_next_token;
641          if ($border_style_keyword->{$prop_value} and
642              $self->{prop_value}->{'border-top-style'}->{$prop_value}) {
643            $prop_value{'border-top-style'} = ["KEYWORD", $prop_value];
644          } elsif ($prop_value eq 'inherit') {
645            $prop_value{'border-top-style'} = ["KEYWORD", $prop_value];
646            $has_inherit = 1;
647          } else {
648            $onerror->(type => 'syntax error:keyword:'.$prop_name,
649                       level => $self->{must_level},
650                       token => $t);
651            return ($t, undef);
652          }
653          $prop_value{'border-right-style'} = $prop_value{'border-top-style'};
654          $prop_value{'border-bottom-style'} = $prop_value{'border-top-style'};
655          $prop_value{'border-left-style'} = $prop_value{'border-right-style'};
656        } else {
657          $onerror->(type => 'syntax error:keyword:'.$prop_name,
658                     level => $self->{must_level},
659                     token => $t);
660          return ($t, undef);
661        }
662    
663        $t = $tt->get_next_token while $t->{type} == S_TOKEN;
664        if ($t->{type} == IDENT_TOKEN) {
665          my $prop_value = lc $t->{value}; ## TODO: case folding
666          $t = $tt->get_next_token;
667          if (not $has_inherit and
668              $border_style_keyword->{$prop_value} and
669              $self->{prop_value}->{'border-right-style'}->{$prop_value}) {
670            $prop_value{'border-right-style'} = ["KEYWORD", $prop_value];
671          } else {
672            $onerror->(type => 'syntax error:keyword:'.$prop_name,
673                       level => $self->{must_level},
674                       token => $t);
675            return ($t, undef);
676          }
677          $prop_value{'border-left-style'} = $prop_value{'border-right-style'};
678    
679          $t = $tt->get_next_token while $t->{type} == S_TOKEN;
680          if ($t->{type} == IDENT_TOKEN) {
681            my $prop_value = lc $t->{value}; ## TODO: case folding
682            $t = $tt->get_next_token;
683            if ($border_style_keyword->{$prop_value} and
684                $self->{prop_value}->{'border-bottom-style'}->{$prop_value}) {
685              $prop_value{'border-bottom-style'} = ["KEYWORD", $prop_value];
686            } else {
687              $onerror->(type => 'syntax error:keyword:'.$prop_name,
688                         level => $self->{must_level},
689                         token => $t);
690              return ($t, undef);
691            }
692            
693            $t = $tt->get_next_token while $t->{type} == S_TOKEN;
694            if ($t->{type} == IDENT_TOKEN) {
695              my $prop_value = lc $t->{value}; ## TODO: case folding
696              $t = $tt->get_next_token;
697              if ($border_style_keyword->{$prop_value} and
698                  $self->{prop_value}->{'border-left-style'}->{$prop_value}) {
699                $prop_value{'border-left-style'} = ["KEYWORD", $prop_value];
700              } else {
701                $onerror->(type => 'syntax error:keyword:'.$prop_name,
702                           level => $self->{must_level},
703                           token => $t);
704                return ($t, undef);
705              }
706            }
707          }
708        }        
709    
710        return ($t, \%prop_value);
711      },
712      serialize => sub {
713        my ($self, $prop_name, $value) = @_;
714        
715        local $Error::Depth = $Error::Depth + 1;
716        my @v;
717        push @v, $self->border_top_style;
718        return undef unless defined $v[-1];
719        push @v, $self->border_right_style;
720        return undef unless defined $v[-1];
721        push @v, $self->border_bottom_style;
722        return undef unless defined $v[-1];
723        push @v, $self->border_bottom_style;
724        return undef unless defined $v[-1];
725    
726        pop @v if $v[1] eq $v[3];
727        pop @v if $v[0] eq $v[2];
728        pop @v if $v[0] eq $v[1];
729        return join ' ', @v;
730      },
731    };
732    $Attr->{border_style} = $Prop->{'border-style'};
733    
734  1;  1;
735  ## $Date$  ## $Date$

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24