sub parse {
my $self = shift;
my $has_hack = shift;
my %declaration = @_;
my $property = $declaration{'property'};
my $value = $declaration{'value'};
my %canonical;
my @errors;
my $valid_property_or_error = sub {
my $type = shift;
my $sub = "is_${type}_value";
my $is_valid = 0;
eval {
no strict 'refs';
$is_valid = &$sub( $value );
};
if ( $is_valid ) {
$canonical{ $property } = $value;
}
else {
$type =~ s{_}{-}g;
push @errors, {
error => "invalid ${type} property: '${value}'"
};
}
return $is_valid;
};
foreach my $type qw( content quotes ) {
&$valid_property_or_error( $type )
if $type eq $property;
}
&$valid_property_or_error( 'counter_increment' )
if 'counter-increment' eq $property;
&$valid_property_or_error( 'counter_reset' )
if 'counter-reset' eq $property;
&$valid_property_or_error( 'list_style_type' )
if 'list-style-type' eq $property;
&$valid_property_or_error( 'list_style_image' )
if 'list-style-image' eq $property;
&$valid_property_or_error( 'list_style_position' )
if 'list-style-position' eq $property;
if ( 'list-style' eq $property ) {
my %types = (
'list-style-type' => $list_style_type_value,
'list-style-image' => $list_style_image_value,
'list-style-position' => $list_style_position_value,
);
%canonical = validate_any_order_shorthand( $value, %types );
push @errors, {
error => "invalid list-style property: '${value}'"
}
unless %canonical;
}
return \%canonical, \@errors;
}
sub output {
my $self = shift;
my $block = shift;
my @output;
my @properties = qw( content counter-increment counter-reset );
foreach my $property ( @properties ) {
my $value = $block->{ $property };
push @output, sprintf $self->output_format, "${property}:", $value
if defined $value;
}
if ( defined $block->{'quotes'} ) {
my $value = $block->{'quotes'};
my $quote_pairs = qr{ ( $string_value \s+ $string_value ) \s* }x;
my @values;
while ( $value =~ s{^ $quote_pairs }{}x ) {
push @values, $1;
}
$value = join $self->output_separator, @values;
push @output, sprintf $self->output_format, "quotes:", $value;
}
my @list_properties = qw(
list-style-type list-style-image list-style-position
);
my @values;
my @list;
foreach my $property ( @list_properties ) {
my $value = $block->{ $property };
if ( defined $value ) {
push @list, sprintf $self->output_format, "${property}:", $value;
push @values, $value
if $value;
}
}
if ( 3 == scalar @list ) {
my $value = join $self->output_separator, @values;
push @output, sprintf $self->output_format, 'list-style:', $value;
}
else {
push @output, @list;
}
return @output;
}
1;