browser: allow dashes in usage identifier
[sheet.git] / browser.plp
index 6c06a2eb5745e53dc26a140ddae27510cf6aadc2..53be344b159b26760a558b74d33869473e838fa6 100644 (file)
@@ -79,7 +79,7 @@ given ($get{usage} // 'wm') {
        when (!$_) {
                # none
        }
-       when (!/^\w+$/) {
+       when (!/^[a-z][\w-]+$/) {
                printf "<p>Invalid browser usage data request: <em>%s</em>",
                        'identifier must be alphanumeric name or <q>0</q>';
        }
@@ -265,15 +265,29 @@ sub saystatuscol {
 sub saybrowsercols {
        my ($id, $browser) = @_;
        my $data = $caniuse->{data}->{$id}->{stats}->{$browser};
+       if (ref $data eq 'ARRAY') {
+               # special case for unsupported
+               my $release = $caniuse->{agents}->{$browser}->{verrelease};
+               $data = {
+                       map { $_ => defined $release->{$_} ? 'u' : 'n' } keys %$release
+               };
+       }
 
        my ($prev, @span);
        for my $ver (@{ $versions{$browser} }, undef) {
-               unless (!defined $prev
-               or ref $data eq 'HASH' && $data->{$prev} ~~ $data->{$ver}) {
+               my $compare = (
+                       !defined $ver ? undef :      # last column if nameless
+                       ref $data ne 'HASH' ? '' :   # unclassified if no support hash
+                       $data->{$ver} // $prev       # known or inherit from predecessor
+                       // (grep { defined } @{$data}{ @{ $versions{$browser} } })[0]
+                          ~~ 'n' && 'n'             # first known version is unsupported
+                       || 'u'                       # unsure
+               );
+               unless (!defined $prev or $prev ~~ $compare) {
                        my $usage = sum(map { $canihas->{$browser}->{$_} } @span);
                        printf '<td class="%s" colspan="%d" title="%s">%s',
                                join(' ',
-                                       X => $CSTATS{ ref $data eq 'HASH' && $data->{$prev} || 'u' },
+                                       X => $CSTATS{$prev},
                                        !$usage ? ('p0') : ('p',
                                                sprintf('p%01d', $usage * ($usagepct - .0001) / 10),
                                                sprintf('p%02d', $usage * ($usagepct - .0001)),
@@ -285,14 +299,14 @@ sub saybrowsercols {
                                        map { ref $_ eq 'CODE' ? $_->($browser) : $_ }
                                        map { $DSTATS{$_} // () }
                                        map { split / /, $_ }
-                                       ref $data eq 'HASH' && $data->{$prev} || 'u'
+                                       $prev
                                )),
                                showversions(@span),
                        undef $prev;
                        @span = ();
                }
                push @span, $ver;
-               $prev = $ver;
+               $prev = $compare;
        }
 }