| 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 |
} |
} |
| 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'); |
| 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], |
| 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 = ''; |
| 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'", |
| 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'}; |
| 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'", |
| 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}, |
| 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}, |
| 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 |
}; |
}; |