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}'"
};
}
};
&$valid_property_or_error( 'caption_side' )
if 'caption-side' eq $property;
&$valid_property_or_error( 'table_layout' )
if 'table-layout' eq $property;
&$valid_property_or_error( 'border_collapse' )
if 'border-collapse' eq $property;
&$valid_property_or_error( 'border_spacing' )
if 'border-spacing' eq $property;
&$valid_property_or_error( 'empty_cells' )
if 'empty-cells' eq $property;
return \%canonical, \@errors;
}
sub output {
my $self = shift;
my $block = shift;
my @output;
my @properties = qw(
caption-side table-layout border-collapse
border-spacing empty-cells
);
foreach my $property ( @properties ) {
my $value = $block->{ $property };
push @output, sprintf $self->output_format, "${property}:", $value
if defined $value;
}
return @output;
}
1;