'y x' => 'l5 ex',
'a' => 'l3',
'a x' => 'l3 ex',
- 'p j' => 'l2',
- 'j' => 'l2',
'p' => 'l2',
- 'p p' => 'l2',
'u' => 'l0',
);
my %DSTATS = (
u => 'unknown',
n => 'unsupported',
p => 'plugin required',
- j => 'javascript required',
a => 'partial',
y => 'supported',
- d => 'disabled by default',
+ d => '(disabled by default)',
x => sub {
join(' ',
- 'requires prefix',
+ 'with prefix',
map {"-$_-"}
($caniuse->{agents}->{$_[0]}->{prefix_exceptions} // {})->{$_[1]}
// $caniuse->{agents}->{$_[0]}->{prefix} // (),
);
my %PSTATS = ( # score percentage
y => 1, 'y x' => .9,
- a => .5, 'a x' => .5, 'a d' => .1,
- j => .2, 'p j' => .2, 'n d' => .2, 'n x d' => .2,
- p => .2, 'p p' => .2, 'p d' => .1,
- n => 0, u => 0,
+ a => .5, 'a x' => .5, 'a d' => .2,
+ p => .2, 'p d' => .1,
+ n => 0, 'n d' => .2, 'n x d' => .2,
+ u => 0,
);
my %CSTATUS = (
unoff => 'l1', # unofficial
other => 'l0', # non-w3
);
my %versions;
-if (my ($somerow) = values %{ $caniuse->{data} }) {
- while (my ($browser, $row) = each %{ $somerow->{stats} }) {
- $versions{$browser} = [ sort { paddedver($a) cmp paddedver($b) } keys %$row ];
- }
+while (my ($browser, $row) = each %{ $caniuse->{agents} }) {
+ $versions{$browser} = [
+ sort { paddedver($a) cmp paddedver($b) } grep { defined }
+ @{ $row->{versions} }
+ ];
}
print <<'';
}
} @browsers
}; # fallback hash based on release semantics
-my $usagemax = (max(map { ref $_ eq 'HASH' && sum(values %$_) } values %$canihas) // 1) / 100;
my $usagepct = 1; # score multiplier for 0..100 result
# normalise usage percentage to only include shown browsers
$usagepct = 100.01 / featurescore({ # yes for every possible version
map { $_ => { map {$_ => 'y'} map { @{$_} } @{$versions{$_}} } } keys %versions
});
+$_->{usage} = featurescore($_->{stats}) * $usagepct
+ for values %{ $caniuse->{data} };
print '<table class="mapped">';
print '<col span="3">'; # should match first thead row
print "\n<tr>";
for my $browser (@browsers) {
for (@{ $versions{$browser} }) {
- my $lastver = $_->[-1];
- my $release = $caniuse->{agents}->{$browser}->{verrelease}->{$lastver};
- my $future = defined $release;
+ my $lastver = first {
+ !defined $caniuse->{agents}->{$browser}->{verrelease}->{$_} # stable
+ } reverse @{$_};
printf('<td title="%s"%s>%s',
join(' ',
sprintf('%.1f%%', sum(@{ $canihas->{$browser} }{@$_}) * $usagepct),
- $future ? 'development' : (),
- 'version ' . join(', ', @{$_}),
+ 'version ' . showversions(@{$_}, undef),
+ $_->[-1] eq $lastver ? () : '(development)',
),
- $future && ' class="ex"',
+ !defined $lastver && ' class="ex"',
showversions($lastver),
);
}
return @html;
}
+sub notestotitle {
+ my @notes = @_;
+ for (@notes) {
+ EscapeHTML($_);
+ s{ \[ ([^]]*) \] \( [^)]* \) }{$1}gx; # strip link urls
+ }
+ return @notes;
+}
+
sub saytitlecol {
my ($id) = @_;
my $row = $caniuse->{data}->{$id};
|| 'u' # unsure
);
unless (!defined $prev or $prev ~~ $compare) {
- my $usage = sum(@{ $canihas->{$browser} }{ map { @{$_} } @span });
+ my @vercover = (map { @{$_} } @span);
+ for ($ver ? @{$ver} : ()) {
+ $data->{$_} eq $data->{$vercover[-1]} or last;
+ push @vercover, $_; # matches from next span start
+ }
+ my $usage = sum(@{ $canihas->{$browser} }{@vercover});
# strip #\d note references from support class
my @notes;
while $prev =~ s/\h \# (\d+) \b//x;
# prepare version hover details
- my $title = sprintf('%.1f%% %s', $usage * $usagepct, join(', ',
- map { ref $_ eq 'CODE' ? $_->($browser, $span[0]->[0]) : $_ }
- map { $DSTATS{$_} // () }
- map { split / /, $_ }
- $prev
+ my $title = sprintf('%.1f%% %s', $usage * $usagepct, join(' ',
+ (map { ref $_ eq 'CODE' ? $_->($browser, $vercover[0]) : $_ }
+ map { $DSTATS{$_} // () }
+ map { split / /, $_ }
+ $prev
+ ),
+ 'in', $caniuse->{agents}->{$browser}->{abbr},
+ showversions(@vercover, undef),
));
- $title .= "\n".EscapeHTML($_) for @notes;
+ $title .= "\n$_" for notestotitle(@notes);
printf('<td class="%s" colspan="%d" title="%s">%s',
join(' ',
sprintf('p%01d', $usage * ($usagepct - .0001) / 10),
sprintf('p%02d', $usage * ($usagepct - .0001)),
),
- sprintf('pp%02d', $usage / $usagemax),
),
scalar @span,
$title,
- showversions($span[0]->[0], @span > 1 ? ($span[-1]->[-1]) : ()),
+ showversions($span[0]->[0], @span > 1 ? $span[-1]->[-1] : ()),
);
undef $prev;
@span = ();
sub sayusagecol {
my ($id) = @_;
- print '<td>', int featurescore($caniuse->{data}->{$id}->{stats}) * $usagepct;
+ print '<td>', int $caniuse->{data}->{$id}->{usage};
}
say '<tbody>';
for my $id (sort {
- featurescore($caniuse->{data}->{$b}->{stats})
- <=> featurescore($caniuse->{data}->{$a}->{stats})
+ $caniuse->{data}->{$b}->{usage} <=> $caniuse->{data}->{$a}->{usage}
} keys %{ $caniuse->{data} }) {
$caniuse->{data}->{$id}->{stats} or next; # skip metadata [summary]
printf '<tr id="%s">', $id;
}
sub showversions {
- my @span = ($_[0], @_>1 ? $_[-1] : ());
- s/-.*// for $span[0];
- for (@span) {
- s/^\./0./;
- s/x$/.*/;
- s/.*-//;
- }
+ # title to describe minumum version and optional maximum for multiple cells
+ my @span = (map { split /-/ } grep { defined } @_);
+ return $span[0] =~ s/\.0\z//r if @_ <= 1;
+ splice @span, 1, -1;
return join('‒', @span);
}