X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/6fcc37bb969a9298ef5ad850d8b8361fe6ca3a5a..9ab0df43bbb8c43a31403d7e6810588e9de08da3:/common.inc.plp?ds=sidebyside diff --git a/common.inc.plp b/common.inc.plp index dd41751..fec7b57 100644 --- a/common.inc.plp +++ b/common.inc.plp @@ -47,17 +47,14 @@ BEGIN { our $Dev = $ENV{HTTP_HOST} =~ /\bdev\./; } -our $Request = decode_utf8($ENV{PATH_INFO} =~ s{^/}{}r); +our $Request //= decode_utf8($ENV{PATH_INFO} =~ s{^/}{}r); our $style; -our $showkeys = !exists $get{keys} ? undef : - ($get{keys} ne '0' && ($get{keys} || 'always')); $header{content_type} = 'text/html; charset=utf-8'; sub stylesheet { - my ($avail) = @_; - my @avail = ref $avail eq 'ARRAY' ? @{$avail} : $avail or return; + my @avail = qw( light dark circus mono red ); my %styles = map {$_ => $_} @avail; if (defined( my $setstyle = $get{style} )) { @@ -74,12 +71,10 @@ sub stylesheet { } or warn "Unable to create style cookie: $@"; } - $style ||= exists $cookie{style} && $styles{ $cookie{style} } || $avail[0]; - - return map { sprintf( - '', - $_ eq $style ? 'stylesheet' : 'alternate stylesheet', "/$_.css?1.12", $_ - ) } @avail; + my $setstyle = $style; + $style ||= $styles{$_} for $cookie{style} || (); + $style ||= $avail[0]; + return $setstyle; } sub checkmodified { @@ -99,6 +94,24 @@ sub checkmodified { $header{'Last-Modified'} = time2str($lastmod); } +sub Data { + my ($filename) = @_; + my @data = eval { + open my $cache, '<:raw', "data/$filename.json" + or return do "./$filename.inc.pl"; # silent fallback to original code + require JSON; + local $/; # slurp + return JSON::decode_json(readline $cache); + }; + if ($@ or !@data or !$data[0]) { + die ['Table data not found', $@ || $!]; + } + if (@data == 1 and ref $data[0] eq 'HASH' and not %{$data[0]}) { + die ['Table data missing']; + } + return wantarray ? @data : $data[0]; # list compatibility like do does +} + sub Html { my ($meta) = @_; @@ -113,8 +126,8 @@ sub Html { } # default fallbacks - $meta->{stylesheet} ||= [qw( light dark circus mono red )]; $meta->{charset} ||= 'utf-8'; + $meta->{lang} ||= 'en'; # convert options to arrays ref $_ eq 'ARRAY' or $_ = [$_] @@ -123,27 +136,35 @@ sub Html { # document headers before output $header{content_type} = "text/html; charset=$meta->{charset}" unless $PLP::sentheaders; - unshift @{ $meta->{raw} }, stylesheet($meta->{stylesheet}); + exit if $ENV{REQUEST_METHOD} eq 'HEAD'; - push @{ $meta->{raw} }, ( - '', + unshift @{ $meta->{raw} }, ( + '', ); + $meta->{stylesheet} = stylesheet(); - # optional amends - push @{ $meta->{raw} }, ( - '', - '', - !$showkeys ? '' : - $showkeys eq 'ghost' ? '' : (), - '', - ) if $meta->{keys}; + if (my $img = $meta->{image}) { + my $proto = sprintf('http%s://', !!$ENV{HTTPS} && 's'); + my $url = "$proto$ENV{HTTP_HOST}/$img"; + push @{ $meta->{raw} }, ( + qq(), + ); + } my ($file) = $ENV{SCRIPT_FILENAME} =~ m{ ([^/]+) \.plp$ }x; + $meta->{canonical} //= "/$file" . ($Request ne '' && "/$Request"); + if (my $url = $meta->{canonical}) { + $url = "https://sheet.shiar.nl$url"; + push @{ $meta->{raw} }, qq(); + } + PLP_START { # leading output say ''; - say ''; + my $rootattr = ''; + $rootattr .= qq( class="s-$_") for $meta->{stylesheet} || (); + say qq(); say ''; say ''; say sprintf '', $_ @@ -157,6 +178,7 @@ sub Html { say ''; say for map { @{$_} } $meta->{raw} || (); say '' if $Dev; + say ''; say ''; say ''; say sprintf '', $file; @@ -196,22 +218,28 @@ EOT BEGIN { $PLP::ERROR = sub { - my ($text, $html) = @_; - warn $text; + my ($message, $html) = @_; + if (ref $message) { + warn join ': ', @{$message}; + $html = shift @{$message}; + } + else { + warn $message; + $message = []; + } unless ($PLP::sentheaders) { Html({nocache => 1}); say '

Page unavailable

'; } - Alert("Fatal error: $html."); + Alert("Fatal error: $html.", @{$message}); }; } sub showlink { my ($title, $href, $selected) = @_; - return sprintf( - !$href ? '%s' : - $selected ? '%s' : '%s', - EscapeHTML($title), EscapeHTML($href) - ); + EscapeHTML($title); + return $title if not $href; + return "$title" if $selected; + return sprintf '%s', EscapeHTML($href), $title; }