]> iEval git - gruntmaster-page.git/blobdiff - lib/Gruntmaster/Page.pm
Add Account page
[gruntmaster-page.git] / lib / Gruntmaster / Page.pm
index 12e732958878d9fd6a7fc855b97194ec7b5816e0..d3d25066accaaa17ba53591b76e0755338f413a9 100644 (file)
@@ -4,62 +4,80 @@ use 5.014000;
 use strict;
 use warnings;
 use parent qw/Exporter/;
-our @EXPORT_OK = qw/generate/;
+our @EXPORT_OK = qw/generate _generate/;
 
+use Fcntl qw/:flock/;
 use File::Basename qw/fileparse/;
 use File::Slurp qw/write_file/;
 use IO::Compress::Gzip qw/gzip/;
+use IO::File;
+use Gruntmaster::Data qw/PUBLISH/;
 
 our $VERSION = '0.001';
 our @generators;
 
 use constant LANGUAGES => [ 'en' ];
 use constant CONTENT_TYPES => {
-  html => 'text/html; charset=UTF-8',
-  txt => 'text/plain; charset=UTF-8',
+       html => 'text/html; charset=UTF-8',
+       txt => 'text/plain; charset=UTF-8',
 };
 
 sub declaregen{
-  my ($generator, $regex) = @_;
-  $generator = "Gruntmaster::Page::$generator";
-  eval "require $generator";
-  my $gensub = $generator->can('generate') or die "No such generator: $generator";
-  push @generators, [$regex,  $gensub];
+       my ($generator, $regex) = @_;
+       $generator = "Gruntmaster::Page::$generator";
+       eval "require $generator";
+       my $gensub = $generator->can('generate') or die "No such generator: $generator";
+       push @generators, [$regex,  $gensub];
 }
 
 {
-  my $component = qr'[^/]+';
-  my $contest = qr,(?:ct/$component/)?,;
-  declaregen Index        => qr,^index$,;
-  declaregen Ct           => qr,^ct/index$,;
-  declaregen 'Ct::Entry'  => qr,^ct/$component/index$,;
-  #declaregen St           => qr,^ct/$component/st/index$,;
-  declaregen Log          => qr,^${contest}log/index$,;
-  declaregen 'Log::Entry' => qr,^${contest}log/$component/index$,;
-  declaregen Submit       => qr,^${contest}submit$,;
-  declaregen Pb           => qr,^${contest}pb/index$,;
-  declaregen 'Pb::Entry'  => qr,^${contest}pb/$component/index$,;
+       my $component = qr'[^/]+';
+       my $contest = qr,(?:ct/$component/)?,;
+       declaregen Index                        => qr,^index$,;
+       declaregen Learn                        => qr,^learn$,;
+       declaregen Account                      => qr,^account$,;
+       declaregen Ct                           => qr,^ct/index$,;
+       declaregen 'Ct::Entry'          => qr,^ct/$component/index$,;
+       declaregen St                           => qr,^ct/$component/log/st$,;
+       declaregen Log                          => qr,^${contest}log/(?:\d+|index)$,;
+       declaregen 'Log::Entry' => qr,^${contest}log/job/$component$,;
+       declaregen Submit                       => qr,^${contest}submit$,;
+       declaregen Pb                           => qr,^${contest}pb/index$,;
+       declaregen 'Pb::Entry'          => qr,^${contest}pb/$component$,;
 }
 
-sub generate{
-  my ($path) = @_;
-  my ($path_noext, $ext) = $path =~ m/^(.*)\.(.*)$/;
-  my $basename = fileparse $path_noext;
-
-  open my $typemap, ">$path_noext.var";
-  say $typemap "URI: $basename\n";
-  for my $gen(@generators) {
-       my ($regex, $generator) = @$gen;
-       next unless $path_noext =~ $regex;
+sub _generate{
+       my ($path) = @_;
+       my ($path_noext, $ext) = $path =~ m/^(.*)\.(.*)$/;
+       my $basename = fileparse $path_noext;
+
+       IO::File->new(">$path_noext.var")->close unless -f "$path_noext.var";
+       flock my $lockfh = IO::File->new("<$path_noext.var"), LOCK_EX;
+       open my $typemap, ">$path_noext.var.new";
+       say $typemap "URI: $basename\n";
+       for my $gen (@generators) {
+               my ($regex, $generator) = @$gen;
+               next unless $path_noext =~ $regex;
+               for my $lang (@{LANGUAGES()}) {
+                       my $page = $generator->($path, $lang);
+                       write_file "$path_noext.$lang.$ext.new", $page;
+                       say $typemap "URI: $basename.$lang.$ext\nContent-Language: $lang\nContent-Type: " . CONTENT_TYPES->{$ext} . "\n";
+                       gzip \$page => "$path_noext.$lang.gz.$ext.new", Minimal => 1;
+                       say $typemap "URI: $basename.$lang.gz.$ext\nContent-Language: $lang\nContent-Encoding: gzip\nContent-Type: " . CONTENT_TYPES->{$ext} . "\n";
+               }
+               last
+       }
+
        for my $lang (@{LANGUAGES()}) {
-         my $page = $generator->($path, $lang);
-         write_file "$path_noext.$lang.$ext", $page;
-         say $typemap "URI: $basename.$lang.$ext\nContent-Language: $lang\nContent-Type: " . CONTENT_TYPES->{$ext} . "\n";
-         gzip \$page => "$path_noext.$lang.gz.$ext", Minimal => 1;
-         say $typemap "URI: $basename.$lang.gz.$ext\nContent-Language: $lang\nContent-Encoding: gzip\nContent-Type: " . CONTENT_TYPES->{$ext} . "\n";
+               rename "$path_noext.$lang.$ext.new", "$path_noext.$lang.$ext";
+               rename "$path_noext.$lang.gz.$ext.new", "$path_noext.$lang.gz.$ext";
        }
-  }
-  close $typemap;
+       rename "$path_noext.var.new", "$path_noext.var";
+       close $typemap;
+}
+
+sub generate{
+       PUBLISH 'genpage', shift;
 }
 
 1;
This page took 0.02618 seconds and 4 git commands to generate.