CSS-Flip
view release on metacpan or search on metacpan
lib/CSS/Janus.pm view on Meta::CPAN
sub fixBackgroundPosition {
my $self = shift;
my $line = shift;
$line =~ s{$BG_HORIZONTAL_PERCENTAGE_RE}{
calculateNewBackgroundPosition($&, $1, $2, $3, $4, $5)
}eg;
$line =~ s{$BG_HORIZONTAL_PERCENTAGE_X_RE}{
calculateNewBackgroundPositionX($&, $1, $2)
}eg;
$line =~ s{$BG_HORIZONTAL_LENGTH_RE}{
$self->calculateNewBackgroundLengthPosition($&, $1, $2, $3, $4, $5)
}eg;
$line =~ s{$BG_HORIZONTAL_LENGTH_X_RE}{
$self->calculateNewBackgroundLengthPositionX($&, $1, $2)
}eg;
return $line;
}
# Takes a list of zero to four border radius parts and returns a string of
# them reordered for bidi mirroring.
sub reorderBorderRadiusPart {
my @part = @_;
# Remove any piece which may be 'None'
@part = grep { defined $_ and length $_ } @part;
if (scalar @part == 4) {
return "$part[1] $part[0] $part[3] $part[2]";
} elsif (scalar @part == 3) {
return "$part[1] $part[0] $part[1] $part[2]";
} elsif (scalar @part == 2) {
return "$part[1] $part[0]";
} elsif (scalar @part == 1) {
return $part[0];
} elsif (scalar @part == 0) {
return '';
} else {
croak "This can't happen!";
}
}
# Receives a match object for a border-radius element and reorders it pieces.
sub reorderBorderRadius {
my @m = @_;
my $first_group = reorderBorderRadiusPart(@m[3 .. 6]);
my $second_group = reorderBorderRadiusPart(@m[7 .. $#m]);
if ($second_group eq '') {
return sprintf '%sborder-radius%s%s', $_[1], $_[2], $first_group;
} else {
return sprintf '%sborder-radius%s%s / %s', $_[1], $_[2],
$first_group, $second_group;
}
}
# calculateNewBackgroundPosition ($&, $1, $2, $3, $4, $5)
#
# Changes horizontal background-position percentages, e.g.:
# 'background-position: 75% 50%' => 'background-position: 25% 50%'
sub calculateNewBackgroundPosition {
my @m = @_;
my $new_x;
my $position_string;
# The flipped value is the offset from 100%
$new_x = 100 - int($m[4]);
# Since m.group(1) may very well be None type and we need a string..
if ($m[1]) {
$position_string = $m[1];
} else {
$position_string = '';
}
return sprintf 'background%s%s%s%s%%%s',
$position_string, $m[2], $m[3], $new_x, $m[5];
}
# calculateNewBackgroundPositionX ($&, $1, $2)
#
# Fixes percent based background-position-x, e.g.:
# 'background-position-x: 75%' => 'background-position-x: 25%'
sub calculateNewBackgroundPositionX {
my @m = @_;
my $new_x;
# The flipped value is the offset from 100%
$new_x = 100 - int($m[2]);
return sprintf 'background-position-x%s%s%%', $m[1], $new_x;
}
my $BACKGROUND_POSITION_ERROR_MESSAGE =
"Unmirrorable horizonal value \"%s\": %s\n";
sub warnForBackgroundPosition {
my $self = shift;
my $bad_length = shift;
my $whole_value = shift;
my $msg = sprintf $BACKGROUND_POSITION_ERROR_MESSAGE, $bad_length,
$whole_value;
if ($self->{'ignore_bad_bgp'}) {
$@ = $msg;
carp $msg;
} else {
croak $msg;
}
}
# calculateNewBackgroundLengthPosition ($&, $1, $2, $3, $4, $5)
#
# Changes horizontal background-position lengths, e.g.:
# 'background-position: 0px 10px' => 'background-position: 100% 10px'
#
# If value is not replaceable, croak it (by default) or carp it (if
# 'ignore_bad_bgp' option is set).
sub calculateNewBackgroundLengthPosition {
my $self = shift;
my @m = @_;
my $position_string;
# croak if the length is not zero-valued
unless ($m[4] =~ m{^$ZERO_LENGTH}) {
$self->warnForBackgroundPosition($m[4], $m[0]);
return $m[0];
}
if (defined $m[1] and length $m[1]) {
$position_string = $m[1];
} else {
$position_string = '';
}
return sprintf 'background%s%s%s100%%%s',
$position_string, $m[2], $m[3], $m[5];
}
# calculateNewBackgroundLengthPositionX ($&, $1, $2)
( run in 0.665 second using v1.01-cache-2.11-cpan-39bf76dae61 )