CSS-Adaptor-Whitelist
view release on metacpan or search on metacpan
lib/CSS/Adaptor/Whitelist.pm view on Meta::CPAN
'font-family' => qr/^$re_font_family$/,
'font-size' => qr/^$re_font_size$/,
'font-style' => qr/^$re_font_style$/,
'font-variant' => qr/^$re_font_variant$/,
'font-weight' => qr/^$re_font_weight$/,
'list-style' => sub {
space_sep_res(shift, $re_list_style_type, $re_list_style_position, $re_image)
},
'list-style-image' => qr/^$re_image$/,
'list-style-type' => qr/^$re_list_style_type$/,
'list-style-position' => qr/^$re_list_style_position$/,
position => list2hash(qw/absolute fixed relative static/),
top => qr/^$re_ndim$/,
bottom => qr/^$re_ndim$/,
left => qr/^$re_ndim$/,
right => qr/^$re_ndim$/,
display => qr/^(?: (?:
none | block | inline(?:-block|-table)? | list-item | run-in
| table(?:- (:? caption | cell | (?:footer|header)-group | (?:column|row)(?:-group)? ) )?
) \b )$/x,
visibility => list2hash(qw(visible hidden collapse)),
overflow => list2hash(qw(visible hidden scroll auto)),
float => list2hash(qw(left right none)),
clear => list2hash(qw(left right none both)),
clip => qr/^(?:auto\b|rect\(\s*$re_dim(?:\s*,\s*$re_dim){3}\s*\))$/,
cursor => qr/^$re_cursor$/,
direction => list2hash(qw(ltr trl)),
height => qr/^(?:auto\b|$re_ndim)$/,
width => qr/^(?:auto\b|$re_ndim)$/,
'min-width' => qr/^$re_ndim$/,
'min-height' => qr/^$re_ndim$/,
'max-width' => qr/^$re_ndim$/,
'max-height' => qr/^$re_ndim$/,
'line-height' => qr/^(?:normal\b|$re_frac|$re_dim)$/,
'text-align' => list2hash(qw(left right center justify)),
'text-decoration' => sub {
my $str = shift;
if ($str !~ /\S/) { return 0 }
if ($str eq 'none') { return 1 }
my %vals = %{ list2hash(qw(underline overline line-through blink)) };
for (split /\s+/, $str) {
if (not $vals{$_}) { return 0 }
}
return 1
},
'text-indent' => qr/^$re_ndim$/,
'text-shadow' => qr/^ $re_ndim \s+ $re_ndim (?: \s+ $re_dim )? (?: \s+ $re_color )? $/x,
'text-transform' => list2hash(qw(none capitalize uppercase lowercase)),
'letter-spacing' => qr/^(?:normal\b|$re_ndim)$/,
'word-spacing' => qr/^(?:normal\b|$re_ndim)$/,
'caption-side' => list2hash(qw(top bottom)),
'empty-cells' => list2hash(qw(hide show)),
'table-layout' => list2hash(qw(auto fixed)),
'unicode-bidi' => list2hash(qw(normal embed bidi-override)),
'vertical-align' => qr/^(?: $re_ndim | baseline \b | middle \b | su(?:b|per) \b | (?:text-)?(?:top|bottom) \b )$/x,
'white-space' => list2hash(qw(normal nowrap pre pre-line pre-wrap)),
'z-index' => qr/^(?: auto \b | -?\d+ \b )$/x,
orphans => qr/^\d+\b$/,
widows => qr/^\d+\b$/,
'page-break-after' => list2hash(qw(auto always avoid left right)),
'page-break-before' => list2hash(qw(auto always avoid left right)),
'page-break-inside' => list2hash(qw(auto avoid)),
);
sub value_ok {
my ($value, $property) = @_;
$value =~ s/\s+!important$//;
if ($value eq 'inherit') { return 1 }
my $w = $whitelist{ $property };
if (ref $w eq 'Regexp') {
return $value =~ $w
}
elsif (ref $w eq 'HASH') {
return exists($w->{$value}) && $w->{$value}
}
elsif (ref $w eq 'CODE') {
return $w->($value)
}
else {
return 0
}
}
sub output_rule {
my ($self, $rule) = @_;
my $s = $rule->selectors;
return "$s {\n".$rule->properties."}\n";
}
sub output_properties {
my ($self, $assignments) = @_;
my @out;
for my $assignment (@$assignments) {
my $property = $assignment->{property};
if ( $whitelist{$property} ) {
my $values = $assignment->values;
if (value_ok($values, $property)) {
push @out, " $property: $values;\n";
}
else {
$self->log("filtered out value: $property: $values;");
}
}
else {
$self->log("filtered out property: $property;");
}
}
return join '', @out;
}
sub output_values {
my ($self, $values) = @_;
my @out;
for my $value (map $_->{value}, @$values) {
push @out, $value
}
( run in 0.749 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )