| 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 |
| 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 |
} |
} |
| 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); |
| 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$ |