style: common cat class for category table headers
[sheet.git] / browser.plp
index 5380cef8b498c34dda0932a5054ff52e516fed05..bd6d8abde4ec1a195bbf32a599397da1502e3bb1 100644 (file)
@@ -23,12 +23,19 @@ say "<h1>Browser compatibility</h1>\n";
 
 my $caniuse = do 'browser-support.inc.pl' or die $! || $@;
 $_->{verrelease} = {
-       # mark last two (future) versions as unreleased, ensure current isn't
-       map { $_->[-1] => 0, $_->[-2] => 0, $_->[-3] => undef } $_->{versions}
+       # mark last three (future) versions as unreleased, ensure current isn't
+       map {
+               $_->[-1] => 0, $_->[-2] => 0, $_->[-3] => 0,
+               $_->[-4] => undef,
+       } $_->{versions}
 } for values %{ $caniuse->{agents} };
 
 my %CSTATS = (
        'n'   => 'l1',
+       'n d' => 'l2',
+       'n x d' => 'l2 ex',
+       'p d' => 'l2',
+       'a d' => 'l2',
        'y'   => 'l5',
        'y x' => 'l5 ex',
        'a'   => 'l3',
@@ -46,6 +53,7 @@ my %DSTATS = (
        j => 'javascript required',
        a => 'partial',
        y => 'supported',
+       d => 'disabled by default',
        x => sub {
                join(' ',
                        'requires prefix',
@@ -68,12 +76,12 @@ if (my ($somerow) = values %{ $caniuse->{data} }) {
                $versions{$browser} = [ sort { paddedver($a) cmp paddedver($b) } keys %$row ];
        }
 }
-my @browsers = keys %versions;
 
 print <<'';
 <p id="intro">Alternate rendition of Fyrd's <a href="http://caniuse.com/">when can I use...</a> page
 
-my ($canihas, $usage, $minusage);
+my ($canihas, $usage);
+my $minusage = $get{threshold} // .5;
 given ($get{usage} // 'wm') {
        when (!$_) {
                # none
@@ -93,12 +101,18 @@ given ($get{usage} // 'wm') {
        $ref .= " $_" for $canihas->{-date} || ();
        print "\nwith $ref browser usage statistics";
 }
+
+my @browsers;
 if ($usage) { # first() does not work inside given >:(
        # adapt version usage to actual support data
        my %engineuse;  # prefix => usage sum
        for my $browser (keys %versions) {
                my $row = $canihas->{$browser} // {};
                my $verlist = $versions{$browser} or next;
+               if ($minusage and sum(values %$row) < $minusage) {
+                       delete $versions{$browser};
+                       next;
+               }
                my %supported = map { $_ => 1 } @$verlist;
 
                # cascade unknown versions
@@ -112,7 +126,7 @@ if ($usage) { # first() does not work inside given >:(
                }
 
                # build row list for each version
-               if ($minusage = $get{threshold} // .5) {
+               if ($minusage) {
                        my @vershown;  # $verlist replacement
                        my ($rowusage, @verrow) = (0);  # replacement row tracking
                        for (@$verlist) {
@@ -140,7 +154,7 @@ if ($usage) { # first() does not work inside given >:(
                $engineuse{ $caniuse->{agents}->{$a}->{prefix} }
                        ||
                $canihas->{$b}->{-total} <=> $canihas->{$a}->{-total}
-       } @browsers;
+       } keys %versions;
 }
 else {
        # order browser columns by name grouped by engine
@@ -149,7 +163,7 @@ else {
                $caniuse->{agents}->{$a}->{prefix}
                        ||
                $a cmp $b
-       } @browsers;
+       } keys %versions;
 }
 :>.
 </p>
@@ -307,7 +321,8 @@ sub saystatuscol {
 
 sub saybrowsercols {
        my ($id, $browser) = @_;
-       my $data = $caniuse->{data}->{$id}->{stats}->{$browser};
+       my $feature = $caniuse->{data}->{$id};
+       my $data = $feature->{stats}->{$browser};
        if (ref $data eq 'ARRAY') {
                # special case for unsupported
                my $release = $caniuse->{agents}->{$browser}->{verrelease};
@@ -328,7 +343,22 @@ sub saybrowsercols {
                );
                unless (!defined $prev or $prev ~~ $compare) {
                        my $usage = sum(@{ $canihas->{$browser} }{ map { @{$_} } @span });
-                       printf '<td class="%s" colspan="%d" title="%s">%s',
+
+                       # strip #\d note references from support class
+                       my @notes;
+                       push @notes, $feature->{notes_by_num}->{$1}
+                               while $prev =~ s/\h \# (\d+) \b//x;
+
+                       # prepare version hover details
+                       my $title = sprintf('%.1f%% %s', $usage * $usagepct, join(', ',
+                               map { ref $_ eq 'CODE' ? $_->($browser) : $_ }
+                               map { $DSTATS{$_} // () }
+                               map { split / /, $_ }
+                               $prev
+                       ));
+                       $title .= "\n".EscapeHTML($_) for @notes;
+
+                       printf('<td class="%s" colspan="%d" title="%s">%s',
                                join(' ',
                                        X => $CSTATS{$prev},
                                        !$usage ? ('p0') : ('p',
@@ -338,13 +368,9 @@ sub saybrowsercols {
                                        sprintf('pp%02d', $usage / $usagemax),
                                ),
                                scalar @span,
-                               sprintf('%.1f%% %s', $usage * $usagepct, join(', ',
-                                       map { ref $_ eq 'CODE' ? $_->($browser) : $_ }
-                                       map { $DSTATS{$_} // () }
-                                       map { split / /, $_ }
-                                       $prev
-                               )),
+                               $title,
                                showversions($span[0]->[0], @span > 1 ? ($span[-1]->[-1]) : ()),
+                       );
                        undef $prev;
                        @span = ();
                }
@@ -378,7 +404,7 @@ sub paddedver {
        # normalised version number comparable as string (cmp)
        shift =~ /(?:.*-|^)(\d*)(.*)/;
        # matched (major)(.minor) of last value in range (a-B)
-       return sprintf('%02d', $1 || 0) . $2;
+       return sprintf('%02d', $1 || 99) . $2;
 }
 
 sub showversions {
@@ -399,7 +425,7 @@ sub showversions {
        <table class="glyphs"><tr>
        <td class="X l5">supported
        <td class="X l3">partial
-       <td class="X l2">external (js/plugin)
+       <td class="X l2">optional
        <td class="X l1">missing
        <td class="X l0">unknown
        <td class="X ex">prefixed