termcol: make rules to setup xcolors checkout
[sheet.git] / browser.plp
index 83a9678ef6f2b3b319f66e8500e2b65c4c11542e..c890052b866f8e85f7a80f424a8b78755c7bf88a 100644 (file)
@@ -39,23 +39,19 @@ my %CSTATS = (
        '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} // (),
@@ -64,10 +60,10 @@ my %DSTATS = (
 );
 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
@@ -197,11 +193,11 @@ $canihas ||= {
        } @browsers
 }; # fallback hash based on release semantics
 
-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
-});
+# score multiplier for percentage of all browser versions
+my $usagepct = 99.99 / sum(
+       map { $_->{-total} // values %{$_} } values %{$canihas}
+);
+
 $_->{usage} = featurescore($_->{stats}) * $usagepct
        for values %{ $caniuse->{data} };
 
@@ -236,15 +232,15 @@ print '<thead>', $header;
 # preceding row without any colspan to work around gecko bug
 print "\n<tr>";
 for my $browser (@browsers) {
-       for (@{ $versions{$browser} }) {
+       for my $span (@{ $versions{$browser} }) {
                my $lastver = first {
                        !defined $caniuse->{agents}->{$browser}->{verrelease}->{$_} # stable
-               } reverse @{$_};
+               } reverse @{$span};
                printf('<td title="%s"%s>%s',
                        join(' ',
-                               sprintf('%.1f%%', sum(@{ $canihas->{$browser} }{@$_}) * $usagepct),
-                               'version ' . showversions(@{$_}, undef),
-                               $_->[-1] eq $lastver ? () : '(development)',
+                               sprintf('%.1f%%', sum(@{ $canihas->{$browser} }{ @{$span} }) * $usagepct),
+                               'version ' . showversions(@{$span}, undef),
+                               $span->[-1] eq $lastver ? () : '(development)',
                        ),
                        !defined $lastver && ' class="ex"',
                        showversions($lastver),
@@ -393,7 +389,12 @@ sub saybrowsercols {
                        || '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;
@@ -401,11 +402,14 @@ sub saybrowsercols {
                                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$_" for notestotitle(@notes);
 
@@ -451,15 +455,15 @@ say '</table>';
 
 sub paddedver {
        # normalised version number comparable as string (cmp)
-       shift =~ /(?:.*-|^)(\d*)(.*)/;
+       $_[0] =~ m/(?:.*-|^)(\d*)(.*)/;
        # matched (major)(.minor) of last value in range (a-B)
-       return sprintf('%02d', $1 || 99) . $2;
+       return sprintf('%02d', length $1 ? $1 : 99) . $2;
 }
 
 sub showversions {
        # title to describe minumum version and optional maximum for multiple cells
        my @span = (map { split /-/ } grep { defined } @_);
-       return $span[0] if @_ <= 1;
+       return $span[0] =~ s/\.0\z//r if @_ <= 1;
        splice @span, 1, -1;
        return join('‒', @span);
 }