common: fix initial call to setup debug time
[sheet.git] / browser.plp
index 8b51522a34498f8bfa44ab9f1dfa6dea1e548265..de245b8159a8af06e56b140ccfe0dab3d24cbc38 100644 (file)
@@ -1,11 +1,10 @@
 <(common.inc.plp)><:
-use 5.010;
-use utf8;
 use List::Util qw(sum max first);
+no if $] >= 5.018, warnings => 'experimental::smartmatch';
 
 Html({
        title => 'browser compatibility cheat sheet',
-       version => 'v1.1',
+       version => '1.4',
        description => [
                "Compatibility table of new web features (HTML5, CSS3, SVG, Javascript)",
                "comparing support and usage share for all popular browser versions.",
@@ -21,7 +20,7 @@ Html({
 
 say "<h1>Browser compatibility</h1>\n";
 
-my $caniuse = do 'data/browser/support.inc.pl' or die $! || $@;
+my $caniuse = do 'data/browser/support.inc.pl' or die $@ || $!;
 $_->{verrelease} = {
        # mark last three (future) versions as unreleased, ensure current isn't
        map {
@@ -57,7 +56,9 @@ my %DSTATS = (
        x => sub {
                join(' ',
                        'requires prefix',
-                       (map "-$_-", $caniuse->{agents}->{$_[0]}->{prefix} // ()),
+                       map {"-$_-"}
+                       ($caniuse->{agents}->{$_[0]}->{prefix_exceptions} // {})->{$_[1]}
+                       // $caniuse->{agents}->{$_[0]}->{prefix} // (),
                );
        },
 );
@@ -66,6 +67,7 @@ my %PSTATS = (  # score percentage
        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,
 );
 my %CSTATUS = (
        unoff => 'l1', # unofficial
@@ -88,22 +90,24 @@ print <<'';
 <p id="intro">Alternate rendition of Fyrd's <a href="http://caniuse.com/">when can I use...</a> page
 
 my ($canihas, $usage);
-my $minusage = $get{threshold} // .7;
+my $minusage = $get{threshold} // 1;
 given ($get{usage} // 'wm') {
        when (!$_) {
                # none
        }
        when (!m{ \A [a-z]\w+ (?:/\d[\d-]*\d)? \z }x) {
-               printf "<p>Invalid browser usage data request: <em>%s</em>",
-                       'identifier must be alphanumeric name or <q>0</q>';
+               Alert([
+                       'Invalid browser usage data request',
+                       'Identifier must be alphanumeric name or <q>0</q>.',
+               ]);
        }
        $canihas = do "data/browser/usage-$_.inc.pl" or do {
-               printf "<p>Browser usage data not found: <em>%s</em>", $! || $@;
+               Alert('Browser usage data not found', $@ || $!);
                break;
        };
        $usage = $_;
        my $ref = $canihas->{-title} || 'unknown';
-       $ref = sprintf '<a href="%s">%s</a>', $_, $ref
+       $ref = showlink($ref, $_)
                for $canihas->{-site} || $canihas->{-source} || ();
        $ref .= " $_" for $canihas->{-date} || ();
        print "\nwith $ref browser usage statistics";
@@ -268,8 +272,9 @@ sub featurescore {
                if ($canihas) {
                        while (my ($browser, $versions) = each %$row) {
                                ref $versions eq 'HASH' or next;
-                               while (my ($version, $_) = each %$versions) {
-                                       $rank += ($canihas->{$browser}->{$version} || .001) * $PSTATS{$_};
+                               while (my ($version, $status) = each %$versions) {
+                                       $status =~ s/\h\#\d+//g;
+                                       $rank += ($canihas->{$browser}->{$version} || .001) * $PSTATS{$status};
                                }
                        }
                        return $rank;
@@ -296,6 +301,7 @@ sub featurescore {
 sub formatnotes {
        my @html = @_;
        for (@html) {
+               s/\r\n?/\n/g;  # windows returns
                s/\h* $//gmx;  # trailing whitespace
                s/(?<= [^.\n]) $/./gmx;  # consistently end each line by a period
                Entity($_);
@@ -305,6 +311,15 @@ sub formatnotes {
        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};
@@ -327,11 +342,16 @@ sub saytitlecol {
        print '<div class=aside>';
        print "<p>$_</p>"
                for formatnotes($row->{description}, $row->{notes} || ());
+       if (my %notes = %{ $row->{notes_by_num} }) {
+               say '<p>Browser-specific notes:';
+               say "<br>#$_: ", formatnotes($notes{$_}) for sort keys %notes;
+               say '</p>';
+       }
        printf 'Resources: %s.', join(', ', map {
-               sprintf '<a href="%s">%s</a>', EscapeHTML($_->{url}), $_->{title}
+               showlink($_->{title}, $_->{url})
        } @$_) for grep { @$_ } $row->{links} // ();
        printf '<br>Parent feature: %s.', join(', ', map {
-               sprintf '<a href="%s">%s</a>', EscapeHTML("#$_"), $caniuse->{data}->{$_}->{title}
+               showlink($caniuse->{data}->{$_}->{title}, "#$_")
        } $_) for $row->{parent} || ();
        print '</div>';
 }
@@ -342,7 +362,7 @@ sub saystatuscol {
 
        for ($row->{status}) {
                my $cell = $_ // '-';
-               $cell = sprintf '<a href="%s">%s</a>', $_, $cell for $row->{spec} // ();
+               $cell = showlink($cell, $_) for $row->{spec} // ();
                printf '<td title="%s" class="l %s">%s',
                        $caniuse->{statuses}->{$_}, $CSTATUS{$_} // '', $cell;
        }
@@ -380,12 +400,12 @@ sub saybrowsercols {
 
                        # prepare version hover details
                        my $title = sprintf('%.1f%% %s', $usage * $usagepct, join(', ',
-                               map { ref $_ eq 'CODE' ? $_->($browser) : $_ }
+                               map { ref $_ eq 'CODE' ? $_->($browser, $span[0]->[0]) : $_ }
                                map { $DSTATS{$_} // () }
                                map { split / /, $_ }
                                $prev
                        ));
-                       $title .= "\n".EscapeHTML($_) for @notes;
+                       $title .= "\n$_" for notestotitle(@notes);
 
                        printf('<td class="%s" colspan="%d" title="%s">%s',
                                join(' ',