/[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.52 by wakaba, Sun Jan 27 07:19:05 2008 UTC revision 1.53 by wakaba, Sun Jan 27 08:09:12 2008 UTC
# Line 2197  $Prop->{'letter-spacing'} = { Line 2197  $Prop->{'letter-spacing'} = {
2197      ## NOTE: Used also for 'word-spacing', '-manakai-border-spacing-x',      ## NOTE: Used also for 'word-spacing', '-manakai-border-spacing-x',
2198      ## and '-manakai-border-spacing-y'.      ## and '-manakai-border-spacing-y'.
2199    
2200        my $has_sign;
2201      my $sign = 1;      my $sign = 1;
2202      if ($t->{type} == MINUS_TOKEN) {      if ($t->{type} == MINUS_TOKEN) {
2203        $t = $tt->get_next_token;        $t = $tt->get_next_token;
2204          $has_sign = 1;
2205        $sign = -1;        $sign = -1;
2206        } elsif ($t->{type} == PLUS_TOKEN) {
2207          $t = $tt->get_next_token;
2208          $has_sign = 1;
2209      }      }
2210      my $allow_negative = $Prop->{$prop_name}->{allow_negative};      my $allow_negative = $Prop->{$prop_name}->{allow_negative};
2211    
2212      if ($t->{type} == DIMENSION_TOKEN) {      if ($t->{type} == DIMENSION_TOKEN) {
2213        my $value = $t->{number} * $sign;        my $value = $t->{number} * $sign;
2214        my $unit = lc $t->{value}; ## TODO: case        my $unit = lc $t->{value}; ## TODO: case
       $t = $tt->get_next_token;  
2215        if ($length_unit->{$unit} and ($allow_negative or $value >= 0)) {        if ($length_unit->{$unit} and ($allow_negative or $value >= 0)) {
2216            $t = $tt->get_next_token;
2217          return ($t, {$prop_name => ['DIMENSION', $value, $unit]});          return ($t, {$prop_name => ['DIMENSION', $value, $unit]});
2218        }        }
2219      } elsif ($t->{type} == NUMBER_TOKEN and      } elsif ($t->{type} == NUMBER_TOKEN and
2220               ($self->{unitless_px} or $t->{number} == 0)) {               ($self->{unitless_px} or $t->{number} == 0)) {
2221        my $value = $t->{number} * $sign;        my $value = $t->{number} * $sign;
2222        $t = $tt->get_next_token;        if ($allow_negative or $value >= 0) {
2223        return ($t, {$prop_name => ['DIMENSION', $value, 'px']})          $t = $tt->get_next_token;
2224            if $allow_negative or $value >= 0;          return ($t, {$prop_name => ['DIMENSION', $value, 'px']});
2225      } elsif ($sign > 0 and $t->{type} == IDENT_TOKEN) {        }
2226        } elsif (not $has_sign and $t->{type} == IDENT_TOKEN) {
2227        my $value = lc $t->{value}; ## TODO: case        my $value = lc $t->{value}; ## TODO: case
       $t = $tt->get_next_token;  
2228        if ($Prop->{$prop_name}->{keyword}->{$value}) {        if ($Prop->{$prop_name}->{keyword}->{$value}) {
2229            $t = $tt->get_next_token;
2230          return ($t, {$prop_name => ['KEYWORD', $value]});                  return ($t, {$prop_name => ['KEYWORD', $value]});        
2231        } elsif ($value eq 'inherit') {        } elsif ($value eq 'inherit') {
2232            $t = $tt->get_next_token;
2233          return ($t, {$prop_name => ['INHERIT']});          return ($t, {$prop_name => ['INHERIT']});
2234        }        }
2235      }      }
# Line 2269  $Prop->{'-manakai-border-spacing-x'} = { Line 2276  $Prop->{'-manakai-border-spacing-x'} = {
2276    serialize_multiple => sub {    serialize_multiple => sub {
2277      my $self = shift;      my $self = shift;
2278            
     local $Error::Depth = $Error::Depth + 1;  
2279      my $x = $self->_manakai_border_spacing_x;      my $x = $self->_manakai_border_spacing_x;
2280      my $y = $self->_manakai_border_spacing_y;      my $y = $self->_manakai_border_spacing_y;
2281      my $xi = $self->get_property_priority ('-manakai-border-spacing-x');      my $xi = $self->get_property_priority ('-manakai-border-spacing-x');
# Line 2280  $Prop->{'-manakai-border-spacing-x'} = { Line 2286  $Prop->{'-manakai-border-spacing-x'} = {
2286            if ($x eq $y) {            if ($x eq $y) {
2287              return {'border-spacing' => [$x, $xi]};              return {'border-spacing' => [$x, $xi]};
2288            } else {            } else {
2289              return {'border-spacing' => [$x . ' ' . $y, $xi]};              if ($x eq 'inherit' or $y eq 'inherit') {
2290                  return {'-manakai-border-spacing-x' => [$x, $xi],
2291                          '-manakai-border-spacing-y' => [$y, $yi]};
2292                } else {
2293                  return {'border-spacing' => [$x . ' ' . $y, $xi]};
2294                }
2295            }            }
2296          } else {          } else {
2297            return {'-manakai-border-spacing-x' => [$x, $xi],            return {'-manakai-border-spacing-x' => [$x, $xi],
# Line 3411  $Prop->{'font-family'} = { Line 3422  $Prop->{'font-family'} = {
3422      ## NOTE: See <http://suika.fam.cx/gate/2005/sw/font-family> for      ## NOTE: See <http://suika.fam.cx/gate/2005/sw/font-family> for
3423      ## how chaotic browsers are!      ## how chaotic browsers are!
3424    
3425        ## NOTE: Opera 9 allows NUMBER and DIMENSION as part of
3426        ## <font-family>, while Firefox 2 does not.
3427    
3428      my @prop_value;      my @prop_value;
3429    
3430      my $font_name = '';      my $font_name = '';
# Line 4620  $Prop->{'border-spacing'} = { Line 4634  $Prop->{'border-spacing'} = {
4634      my ($self, $prop_name, $tt, $t, $onerror) = @_;      my ($self, $prop_name, $tt, $t, $onerror) = @_;
4635    
4636      my %prop_value;      my %prop_value;
4637        my $has_sign;
4638      my $sign = 1;      my $sign = 1;
4639      if ($t->{type} == MINUS_TOKEN) {      if ($t->{type} == MINUS_TOKEN) {
4640        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4641          $has_sign = 1;
4642        $sign = -1;        $sign = -1;
4643        } elsif ($t->{type} == PLUS_TOKEN) {
4644          $t = $tt->get_next_token;
4645          $has_sign = 1;
4646      }      }
4647    
4648      if ($t->{type} == DIMENSION_TOKEN) {      if ($t->{type} == DIMENSION_TOKEN) {
4649        my $value = $t->{number} * $sign;        my $value = $t->{number} * $sign;
4650        my $unit = lc $t->{value}; ## TODO: case        my $unit = lc $t->{value}; ## TODO: case
       $t = $tt->get_next_token;  
4651        if ($length_unit->{$unit} and $value >= 0) {        if ($length_unit->{$unit} and $value >= 0) {
4652            $t = $tt->get_next_token;
4653          $prop_value{'-manakai-border-spacing-x'} = ['DIMENSION', $value, $unit];          $prop_value{'-manakai-border-spacing-x'} = ['DIMENSION', $value, $unit];
4654        } else {        } else {
4655          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => "syntax error:'$prop_name'",
# Line 4643  $Prop->{'border-spacing'} = { Line 4661  $Prop->{'border-spacing'} = {
4661      } elsif ($t->{type} == NUMBER_TOKEN and      } elsif ($t->{type} == NUMBER_TOKEN and
4662               ($self->{unitless_px} or $t->{number} == 0)) {               ($self->{unitless_px} or $t->{number} == 0)) {
4663        my $value = $t->{number} * $sign;        my $value = $t->{number} * $sign;
       $t = $tt->get_next_token;  
4664        $prop_value{'-manakai-border-spacing-x'} = ['DIMENSION', $value, 'px'];        $prop_value{'-manakai-border-spacing-x'} = ['DIMENSION', $value, 'px'];
4665        unless ($value >= 0) {        if ($value >= 0) {
4666            $t = $tt->get_next_token;
4667          } else {
4668          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => "syntax error:'$prop_name'",
4669                     level => $self->{must_level},                     level => $self->{must_level},
4670                     uri => \$self->{href},                     uri => \$self->{href},
4671                     token => $t);                     token => $t);
4672          return ($t, undef);          return ($t, undef);
4673        }        }
4674      } elsif ($sign > 0 and $t->{type} == IDENT_TOKEN) {      } elsif (not $has_sign and $t->{type} == IDENT_TOKEN) {
4675        my $prop_value = lc $t->{value}; ## TODO: case folding        my $prop_value = lc $t->{value}; ## TODO: case folding
       $t = $tt->get_next_token;  
4676        if ($prop_value eq 'inherit') {        if ($prop_value eq 'inherit') {
4677            $t = $tt->get_next_token;
4678          $prop_value{'-manakai-border-spacing-x'} = ['INHERIT'];          $prop_value{'-manakai-border-spacing-x'} = ['INHERIT'];
4679          $prop_value{'-manakai-border-spacing-y'}          $prop_value{'-manakai-border-spacing-y'}
4680              = $prop_value{'-manakai-border-spacing-x'};              = $prop_value{'-manakai-border-spacing-x'};
# Line 4678  $Prop->{'border-spacing'} = { Line 4697  $Prop->{'border-spacing'} = {
4697          = $prop_value{'-manakai-border-spacing-x'};          = $prop_value{'-manakai-border-spacing-x'};
4698    
4699      $t = $tt->get_next_token while $t->{type} == S_TOKEN;      $t = $tt->get_next_token while $t->{type} == S_TOKEN;
4700        undef $has_sign;
4701      $sign = 1;      $sign = 1;
4702      if ($t->{type} == MINUS_TOKEN) {      if ($t->{type} == MINUS_TOKEN) {
4703        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4704          $has_sign = 1;
4705        $sign = -1;        $sign = -1;
4706        } elsif ($t->{type} == PLUS_TOKEN) {
4707          $t = $tt->get_next_token;
4708          $has_sign = 1;
4709      }      }
4710    
4711      if ($t->{type} == DIMENSION_TOKEN) {      if ($t->{type} == DIMENSION_TOKEN) {
4712        my $value = $t->{number} * $sign;        my $value = $t->{number} * $sign;
4713        my $unit = lc $t->{value}; ## TODO: case        my $unit = lc $t->{value}; ## TODO: case
       $t = $tt->get_next_token;  
4714        if ($length_unit->{$unit} and $value >= 0) {        if ($length_unit->{$unit} and $value >= 0) {
4715            $t = $tt->get_next_token;
4716          $prop_value{'-manakai-border-spacing-y'} = ['DIMENSION', $value, $unit];          $prop_value{'-manakai-border-spacing-y'} = ['DIMENSION', $value, $unit];
4717        } else {        } else {
4718          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => "syntax error:'$prop_name'",
# Line 4700  $Prop->{'border-spacing'} = { Line 4724  $Prop->{'border-spacing'} = {
4724      } elsif ($t->{type} == NUMBER_TOKEN and      } elsif ($t->{type} == NUMBER_TOKEN and
4725               ($self->{unitless_px} or $t->{number} == 0)) {               ($self->{unitless_px} or $t->{number} == 0)) {
4726        my $value = $t->{number} * $sign;        my $value = $t->{number} * $sign;
       $t = $tt->get_next_token;  
4727        $prop_value{'-manakai-border-spacing-y'} = ['DIMENSION', $value, 'px'];        $prop_value{'-manakai-border-spacing-y'} = ['DIMENSION', $value, 'px'];
4728        unless ($value >= 0) {        if ($value >= 0) {
4729            $t = $tt->get_next_token;
4730          } else {
4731          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => "syntax error:'$prop_name'",
4732                     level => $self->{must_level},                     level => $self->{must_level},
4733                     uri => \$self->{href},                     uri => \$self->{href},
# Line 4710  $Prop->{'border-spacing'} = { Line 4735  $Prop->{'border-spacing'} = {
4735          return ($t, undef);          return ($t, undef);
4736        }        }
4737      } else {      } else {
4738        if ($sign < 0) {        if ($has_sign) {
4739          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => "syntax error:'$prop_name'",
4740                     level => $self->{must_level},                     level => $self->{must_level},
4741                     uri => \$self->{href},                     uri => \$self->{href},
# Line 4722  $Prop->{'border-spacing'} = { Line 4747  $Prop->{'border-spacing'} = {
4747    
4748      return ($t, \%prop_value);      return ($t, \%prop_value);
4749    },    },
   serialize => sub {  
     my ($self, $prop_name, $value) = @_;  
       
     local $Error::Depth = $Error::Depth + 1;  
     my @v;  
     push @v, $self->_manakai_border_spacing_x;  
     return '' unless length $v[-1];  
     push @v, $self->_manakai_border_spacing_y;  
     return '' unless length $v[-1];  
   
     pop @v if $v[0] eq $v[1];  
     return join ' ', @v;  
   },  
4750    serialize_multiple => $Prop->{'-manakai-border-spacing-x'}    serialize_multiple => $Prop->{'-manakai-border-spacing-x'}
4751        ->{serialize_multiple},        ->{serialize_multiple},
4752  };  };

Legend:
Removed from v.1.52  
changed lines
  Added in v.1.53

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24