charset: omit unassigned half of ascii table
[sheet.git] / common.inc.plp
index d6ef393c0313c437124e6c0d5f626394d9d76914..31c2c2270b71e209a20cf885fe0363ad623066e6 100644 (file)
@@ -8,10 +8,21 @@ use open ':std' => ':utf8';
 
 use File::stat 'stat';
 use HTTP::Date;
+use Encode qw( decode_utf8 );
+
+sub Alert {
+       my ($html, $debug) = @_;
+       ref $html eq 'ARRAY' or $html = [$html];
+       my ($title, @lines) = @{$html};
+       $body = "<h2>$title</h2>";
+       $body .= "\n<p>$_</p>" for @lines;
+       $body .= "\n<pre>$debug</pre>" if $Dev and $debug;
+       say "<div class=error>$body</div>\n";
+}
 
 $PLP::ERROR = sub {
        my ($text, $html) = @_;
-       print '<p class="error"><strong>Fatal error</strong>: '.$html."</p>\n\n";
+       Alert("<strong>Fatal error</strong>: $html.");
        warn $text;
 };
 
@@ -20,6 +31,11 @@ BEGIN {
        our $Time = [Time::HiRes::gettimeofday];
 }
 
+# user request
+our $Dev = $ENV{HTTP_HOST} =~ /\bdev\./;
+our ($file) = $ENV{SCRIPT_FILENAME} =~ m{ ([^/]+) \.plp$ }x;
+our $Request = decode_utf8($ENV{PATH_INFO} =~ s{^/}{}r);
+
 our $style;
 our $showkeys = !exists $get{keys} ? undef :
        ($get{keys} ne '0' && ($get{keys} || 'always'));
@@ -54,7 +70,7 @@ sub stylesheet {
 }
 
 sub checkmodified {
-       my $lastmod;
+       my $lastmod = 0;
        for (@_) {
                my $mod = stat $_ or next;
                $mod = $mod->mtime or next;
@@ -99,20 +115,14 @@ sub Html {
                '<script type="text/javascript" src="/keys.js?1.6"></script>',
        ) if $meta->{keys};
 
-       # other vars
-       my $Dev = $ENV{HTTP_HOST} =~ /\bdev\./;
-       my ($file) = $ENV{SCRIPT_FILENAME} =~ m{ ([^/]+) \.plp$ }x;
-
        # leading output
        $header{content_type} = "text/html; charset=$meta->{charset}";
-       print <<"EOT";
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-<meta http-equiv="content-type" content="$header{content_type}">
-<title>$meta->{title}</title>
-EOT
+       say '<!DOCTYPE html>';
+       say '<html lang="en">';
+       say '';
+       say '<head>';
+       say sprintf '<meta http-equiv="content-type" content="%s">', $header{content_type};
+       say sprintf '<title>%s</title>', $meta->{title};
        say sprintf '<meta name="description" content="%s">', EscapeHTML($_)
                for join(' ', @{ $meta->{description} }) || ();
        say sprintf '<meta name="keywords" content="%s">', EscapeHTML($_)
@@ -122,7 +132,9 @@ EOT
        say for stylesheet($meta->{stylesheet});
        say for map { @{$_} } $meta->{raw} || ();
        say '<meta name="robots" content="noindex">' if $Dev;
-       say qq{</head>\n\n<body id="$file">};
+       say '</head>';
+       say '';
+       say sprintf '<body id="%s">', $file;
 
        # development version indicator
        printf '<p style="%s">beta</p>', join('; ',
@@ -147,7 +159,7 @@ EOT
        <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html" rel="license copyright"
         title="Licensed under the GNU Affero General Public License, version 3">AGPLv3</a>
 EOT
-               say sprintf '• %.3fs', Time::HiRes::tv_interval($Time) if $Dev;
+               say sprintf '• %.3fs', Time::HiRes::tv_interval($Time) if $Dev and $Time;
                say '</p>';
                say '';
                say '</html>';