- unoff => 'di-rare', # unofficial
- wd => 'di-b', # draft
- pr => 'di-prop', # proposed
- cr => 'di-d', # candidate
- rec => 'di-a', # recommendation
- ietf => 'di-a', # standard
+ unoff => 'l1', # unofficial
+ wd => 'l3', # draft
+ cr => 'l4', # candidate
+ pr => 'l4', # proposed
+ rec => 'l5', # recommendation
+ other => 'l2', # non-w3
+ ietf => 'l5', # standard
+);
+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 ];
+ }
+}
+my @browsers = grep { $versions{$_} }
+ qw(trident gecko webkit_saf ios_saf webkit_chr android presto op_mob op_mini);
+
+$canihas ||= {
+ map {
+ $_ => +{
+ map {
+ my $zero = $#$_ - 2; # baseline index
+ ($_->[$zero - 2] => .5), # past
+ ($_->[$zero - 1] => 10 ), # previous
+ ($_->[$zero + 2] => 0 ), # future
+ ($_->[$zero + 1] => .5), # next
+ ($_->[$zero ] => 30 ), # current
+ } $caniuse->{agents}->{$_}->{versions}
+ }
+ } @browsers
+}; # fallback hash based on release semantics
+my $scorediv = (max(map { ref $_ eq 'HASH' && sum(values %$_) } values %$canihas) // 1) / 100;
+
+print '<table class="mapped">';
+print '<col span="3">'; # should match first thead row
+printf '<colgroup span="%d">', scalar @{ $versions{$_} } for @browsers;
+say '</colgroup><col>';
+
+my $header = join('',
+ '<tr>',
+ '<th colspan="3">feature',
+ (map {
+ my $name = $caniuse->{agents}->{$_}->{browser};
+ sprintf('<th colspan="%d" class="%s" title="%s">%s',
+ scalar @{ $versions{$_} },
+ join(' ', map {"b-a-$_"} grep {$_}
+ $_, @{ $caniuse->{agents}->{$_} }{'prefix', 'type'},
+ ),
+ join(' ',
+ sprintf('%.1f%%', sum(values %{ $canihas->{$_} })),
+ $name,
+ ),
+ do {
+ length $name < 3 + @{ $versions{$_} }*2 ? $name
+ : $caniuse->{agents}->{$_}->{abbr};
+ },
+ )
+ } @browsers),
+ '<th>%',