BBCode-Parser
view release on metacpan or search on metacpan
extra/future-css3.diff view on Meta::CPAN
+ $hi = 72 if not defined $hi;
s/\s+/ /g;
s/^\s|\s$//g;
- if(/^ (\d+ (?: \. \d+ )? ) \s? ([a-z]{2}) $/ix) {
- my($n,$unit) = (0+$1,lc $2);
- if(exists $conv{$unit}) {
- my $n2 = $n / $conv{$unit};
- if($n2 < 8) {
- $n = POSIX::floor(0.5 + 8 * $conv{$unit});
- } elsif($n2 > 72) {
- $n = POSIX::floor(0.5 + 72 * $conv{$unit});
- }
- return "$n$unit";
- }
- }
-
+ # CSS 2.1 15.7 <absolute-size>
if(/^( (?:xx?-)? (?:large|small) | medium )$/ix) {
return lc $1;
}
+ # CSS 2.1 15.7 <relative-size>
+ # Note: Since [FONT] is nestable and not readily computable before HTML
+ # rendering, this can allow a malicious user to escape the
+ # admin-defined font size limits
if(/^ ( larger | smaller ) $/ix) {
return lc $1;
}
+ # CSS 2.1 4.3.2 <length>
+ if(/^ ( [\s\d._+-]+ ) ( [a-z]+ ) $/ix) {
+ my($n,$unit) = ($1,lc $2);
+ $n = parseNum $n;
+ if(defined $n and $n > 0) {
+ my $conv;
+ if(exists $conv{$unit}) {
+ $conv = $conv{$unit};
+ } elsif($unit =~ /^em$/i) {
+ $conv = $base;
+ } elsif($unit =~ /^ex$/i) {
+ $conv = $base * 0.5;
+ } else {
+ return undef;
+ }
+ my $n2 = $n * $conv;
+ if(defined $lo and $n2 < $lo) {
+ $n = $lo / $conv;
+ } elsif(defined $hi and $n2 > $hi) {
+ $n = $hi / $conv;
+ }
+ $n = sprintf "%.3f", $n;
+ $n =~ s/0+$//;
+ $n =~ s/\.$//;
+ return "$n$unit";
+ } else {
+ return undef;
+ }
+ }
+
+ # CSS 2.1 4.3.3 <percentage>
+ # Note: The same concerns apply as for <relative-size>
+ if(/^ ( [\s\d._+-]+ ) % $/x) {
+ my $n = parseNum $1;
+ if(defined $n and $n > 0) {
+ $n *= 0.01;
+ my $n2 = $n * $base;
+ if(defined $lo and $n2 < $lo) {
+ $n = $lo / $base;
+ } elsif(defined $hi and $n2 > $hi) {
+ $n = $hi / $base;
+ }
+ $n *= 100;
+ $n = sprintf "%.3f", $n;
+ $n =~ s/0+$//;
+ $n =~ s/\.$//;
+ return "$n%";
+ } else {
+ return undef;
+ }
+ }
+
+ # HTML 3.2 <font size="number">
+ # See <URL:http://www.w3.org/TR/REC-html32#font>
if(/^ (\d+) $/x) {
my $n = 0+$1;
if($n >= 0 and $n < @compat) {
return $compat[$n];
} else {
- return parseFontSize("$n pt");
+ return parseFontSize("$n pt",$base,$lo,$hi);
}
}
+ # HTML 3.2 <font size="+number">
if(/^ \+ (\d+) $/x) {
- # Roughly equivalent to CSS 2.1 "larger"
- return parseFontSize sprintf "%d%%", 100 * (1.25 ** $1);
+ # "+1" is roughly equivalent to CSS 2.1 "larger"
+ my $n = sprintf "%f%%", 100 * (1.25 ** $1);
+ return parseFontSize($n,$base,$lo,$hi);
}
+ # HTML 3.2 <font size="-number">
if(/^ - (\d+) $/x) {
- # Roughly equivalent to CSS 2.1 "smaller"
- return parseFontSize sprintf "%d%%", 100 * (0.85 ** $1);
+ # "-1" is roughly equivalent to CSS 2.1 "smaller"
+ my $n = sprintf "%f%%", 100 * (0.85 ** $1);
+ return parseFontSize($n,$base,$lo,$hi);
}
return undef;
}
+# Official CSS 2.1 colors are passed through as-is
my %cssColor = map { $_ => 1 } qw(
maroon red orange yellow olive
purple fuchsia white lime green
@@ -347,6 +430,12 @@
black silver gray
( run in 1.695 second using v1.01-cache-2.11-cpan-39bf76dae61 )