my
$get_border_radius_value
=
qr{
(?'h1' $individual_border_radius_value )
(?: \s+ (?'h2' $individual_border_radius_value ) )?
(?: \s+ (?'h3' $individual_border_radius_value ) )?
(?: \s+ (?'h4' $individual_border_radius_value ) )?
(?:
\s* / \s*
(?'v1' $individual_border_radius_value )
(?: \s+ (?'v2' $individual_border_radius_value ) )?
(?: \s+ (?'v3' $individual_border_radius_value ) )?
(?: \s+ (?'v4' $individual_border_radius_value ) )?
)?
}
x;
sub
expand {
my
$self
=
shift
;
my
$property
=
shift
;
my
$value
=
shift
;
foreach
my
$corner
(
@standard_corners
) {
if
(
"-cp-border-${corner}-radius"
eq
$property
) {
return
expand_vendor_properties(
$corner
,
$value
);
}
}
if
(
'-cp-border-radius'
eq
$property
) {
if
(
$value
=~ m{^
$get_border_radius_value
$}x ) {
my
%match
= %+;
my
@matches
;
map
{
push
@matches
,
$match
{
$_
}
if
defined
$match
{
$_
} }
qw( h1 h2 h3 h4 )
;
my
@horizontal
= expand_corner_values(
@matches
);
undef
@matches
;
map
{
push
@matches
,
$match
{
$_
}
if
defined
$match
{
$_
} }
qw( v1 v2 v3 v4 )
;
my
@vertical
= expand_corner_values(
@matches
);
my
@return
;
foreach
my
$corner
(
@standard_corners
) {
my
$value
=
shift
(
@horizontal
)
. (
defined
$vertical
[0]
?
' '
.
shift
(
@vertical
)
:
''
);
my
$values
= expand_vendor_properties(
$corner
,
$value
);
push
@return
,
@$values
;
}
return
\
@return
;
}
}
return
;
}
sub
output {
my
$self
=
shift
;
my
$block
=
shift
;
my
@output
;
my
@radii
;
foreach
my
$corner
(
@standard_corners
) {
my
$moz_corner
=
$corner
;
$moz_corner
=~ s{-}{};
my
$key
=
"-moz-border-radius-${moz_corner}"
;
my
$value
=
$block
->{
$key
};
push
@radii
,
sprintf
$self
->output_format,
"${key}:"
,
$value
if
defined
$value
;
}
if
( 4 ==
scalar
@radii
) {
my
(
$h_array
,
$v_array
) = get_corner_values(
$block
,
'moz'
);
my
$horizontal
= collapse_corner_values(
@$h_array
);
my
$vertical
= collapse_corner_values(
@$v_array
);
my
$value
=
$horizontal
. (
$vertical
?
" / ${vertical}"
:
''
);
push
@output
,
sprintf
$self
->output_format,
"-moz-border-radius:"
,
$value
;
}
else
{
push
@output
,
@radii
;
}
undef
@radii
;
foreach
my
$corner
(
@standard_corners
) {
my
$key
=
"-webkit-border-${corner}-radius"
;
my
$value
=
$block
->{
$key
};
push
@radii
,
sprintf
$self
->output_format,
"${key}:"
,
$value
if
defined
$value
;
}
if
( 4 ==
scalar
@radii
) {
my
(
$h_array
,
$v_array
) = get_corner_values(
$block
,
'webkit'
);
my
$horizontal
= collapse_corner_values(
@$h_array
);
my
$vertical
= collapse_corner_values(
@$v_array
);
my
$value
=
$horizontal
. (
$vertical
?
" / ${vertical}"
:
''
);
push
@output
,
sprintf
$self
->output_format,
"-webkit-border-radius:"
,
$value
;
}
else
{
push
@output
,
@radii
;
}
foreach
my
$corner
(
@standard_corners
) {
my
$moz_corner
=
$corner
;
$moz_corner
=~ s{-}{};
delete
$block
->{
"-moz-border-radius-${moz_corner}"
};
delete
$block
->{
"-webkit-border-${corner}-radius"
};
}
return
@output
;
}
sub
parse {}
sub
expand_vendor_properties {
my
$corner
=
shift
;
my
$value
=
shift
;
my
$moz_corner
=
$corner
;
$moz_corner
=~ s{-}{};
return
[
{
property
=>
"-webkit-border-${corner}-radius"
,
value
=>
$value
,
},
{
property
=>
"-moz-border-radius-${moz_corner}"
,
value
=>
$value
,
},
{
property
=>
"border-${corner}-radius"
,
value
=>
$value
,
},
];
}
1;
=pod
=head1 -cp-border-radius
The meta-properties C<-cp-border-radius>, C<-cp-border-top-left-radius>,
C<-cp-border-top-right-radius>, C<-cp-border-bottom-right-radius> and
C<-cp-border-bottom-left-radius> will be expanded to the appropriate
declarations
for
the three properties C<border-radius>, C<-moz-border-radius>
and C<-webkit-border-radius>. For example, an input of:
will be output as:
border-top-left-radius: 5px 2px;
-moz-border-radius-topleft: 5px 2px;
-webkit-border-top-left-radius: 5px 2px;
}