Centralize template cooking and introduce reloadable templates
authorMarius Gavrilescu <marius@ieval.ro>
Thu, 16 Jan 2014 20:38:51 +0000 (22:38 +0200)
committerMarius Gavrilescu <marius@ieval.ro>
Thu, 16 Jan 2014 20:38:51 +0000 (22:38 +0200)
12 files changed:
lib/Gruntmaster/Page/Account.pm
lib/Gruntmaster/Page/Common.pm
lib/Gruntmaster/Page/Ct.pm
lib/Gruntmaster/Page/Ct/Entry.pm
lib/Gruntmaster/Page/Index.pm
lib/Gruntmaster/Page/Learn.pm
lib/Gruntmaster/Page/Log.pm
lib/Gruntmaster/Page/Log/Entry.pm
lib/Gruntmaster/Page/Pb.pm
lib/Gruntmaster/Page/Pb/Entry.pm
lib/Gruntmaster/Page/St.pm
lib/Gruntmaster/Page/Submit.pm

index f757e9fe08b859b4853627bac9cf0a1889782ae5..20acc6ab30e6731f6f0786acd3d18edb8915426c 100644 (file)
@@ -7,12 +7,10 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Account';
-
 use HTML::Template::Compiled;
-use Gruntmaster::Page::Common qw/header footer patch_templates/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 
-my %templates = (
+my %orig_templates = (
   en => <<'HTML',
 <div id="result"></div>
 
@@ -48,12 +46,10 @@ Confirm new password:<br>
 HTML
 );
 
-patch_templates %templates, 'account';
-
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, account => 'Account';
 
 sub generate{
+  %templates = cook_templates %orig_templates, account => 'Account' if reload_templates;
   HTML::Template::Compiled->new(scalarref => \$templates{$_[1]})->output
 }
 
index 667dae8d61258c4bc095f1a8b5a1e3f5f06296db..37cdf710fc60e21223a52f01a7b00fe379f262ad 100644 (file)
@@ -4,11 +4,11 @@ use 5.014000;
 use strict;
 use warnings;
 use parent qw/Exporter/;
-our @EXPORT_OK = qw/header footer patch_templates/;
+our @EXPORT_OK = qw/header footer cook_templates reload_templates/;
 
 use File::Slurp qw/read_file/;
 
-my %header_templates = (
+my %orig_header_templates = (
   en => <<'HTML',
 <!DOCTYPE html>
 <title>TITLE_GOES_HERE</title>
@@ -27,7 +27,7 @@ my %header_templates = (
 HTML
 );
 
-my %footer_templates = (
+my %orig_footer_templates = (
   en => <<'HTML',
 
 <footer>
@@ -38,25 +38,42 @@ Dilmom: Well, it's a stripped-down version of the Gruntmaster 9000, of course. B
 HTML
 );
 
-sub patch_templates (\%$){
+sub patch_templates {
        my $root = $ENV{GRUNTMASTER_TEMPLATE_ROOT} or return;
        my ($templates, $name) = @_;
+       my %out = %$templates;
        for (<$root/$name*>) {
                m/\.(.+)$/;
-               $templates->{$1} = read_file $_
+               $out{$1} = read_file $_
        }
+
+       %out
 }
 
-patch_templates %header_templates, 'header';
-patch_templates %footer_templates, 'footer';
+my %header_templates = patch_templates \%orig_header_templates, 'header';
+my %footer_templates = patch_templates \%orig_footer_templates, 'footer';
+
+sub reload_templates () { $ENV{GRUNTMASTER_RELOAD_TEMPLATES} }
 
 sub header{
   my ($language, $title) = @_;
+  %header_templates = patch_templates \%orig_header_templates, 'header' if reload_templates;
   $header_templates{$language} =~ s/TITLE_GOES_HERE/$title/ger;
 }
 
 sub footer{
+  %footer_templates = patch_templates \%orig_footer_templates, 'footer' if reload_templates;
   $footer_templates{$_[0]};
 }
 
+sub cook_templates (\%@) {
+       my ($templates, $name, $title) = @_;
+
+       my %out = patch_templates $templates, $name;
+       $out{$_}  = header ($_, $title) . $out{$_} for keys %out;
+       $out{$_} .= footer  $_  for keys %out;
+
+       %out
+}
+
 1;
index 19c4aad33cc319d4504768eb2b7fc8c30c4ac47a..8ef38155306fe9b42ec55e92089b04a6a5282086 100644 (file)
@@ -7,14 +7,12 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Contests';
-
 use HTML::Template::Compiled;
 use POSIX qw/strftime/;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 use Gruntmaster::Data qw/contest_name contest_start contest_end contest_owner/;
 
-my %templates = (
+my %orig_templates = (
        en => <<'HTML',
 <tmpl_if running>
 <h1>Running contests</h1>
@@ -60,10 +58,10 @@ my %templates = (
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, ct => 'Contests';
 
 sub generate{
+       %templates = cook_templates %orig_templates, ct => 'Contests' if reload_template;
        my $htc = HTML::Template::Compiled->new(scalarref => \$templates{$_[1]});
 
        my (@running, @pending, @finished);
index 3c336c17bd0939c7b36460194b1a831b76a3972d..bba2991c6e8a13d5fbeebbd473cbd440cb2806a4 100644 (file)
@@ -7,14 +7,12 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => '<tmpl_var name>';
-
 use HTML::Template::Compiled;
 use POSIX qw/strftime/;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 use Gruntmaster::Data qw/contest_name contest_start contest_end/;
 
-my %templates = (
+my %orig_templates = (
        en => <<'HTML',
 Contest start time: <tmpl_var start><br>
 Contest end time: <tmpl_var end><p>
@@ -25,10 +23,10 @@ Contest end time: <tmpl_var end><p>
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, ct_entry => '<tmpl_var name>';
 
 sub generate{
+       %templates = cook_templates %orig_templates, ct_entry => '<tmpl_var name>' if reload_templates;
        my ($path, $lang) = @_;
        $path = ($path =~ m,ct/(.*)/index,)[0];
        my $template = $templates{$lang};
index 4f20bace0494fe0ed79b21e148d4ab459a635a22..0214ea6b5c906de88d294e36270f0f131d05dc07 100644 (file)
@@ -7,20 +7,18 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Gruntmaster 6000';
-
 use HTML::Template::Compiled;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 
-my %templates = (
+my %orig_templates = (
   en => <<'HTML',
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, index => 'Gruntmaster 6000';
 
 sub generate{
+  %templates = cook_templates %orig_templates, index => 'Gruntmaster 6000' if reload_templates;
   HTML::Template::Compiled->new(scalarref => \$templates{$_[1]})->output
 }
 
index 1ba2e4ed165c7de4f1e9d511c6a1cfdcf9ac69c6..171a184ae5eeb6e211784239d3833fc5f88eb72d 100644 (file)
@@ -7,22 +7,20 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Learn';
-
 use HTML::Template::Compiled;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 
-my %templates = (
+my %orig_templates = (
   en => <<'HTML',
 Install interactive-perl-tutorial from your nearest CPAN mirror. Run <code>cpan App::InteractivePerlTutorial</code>.
 <p>You can also get the source from <a href="http://git.ieval.ro/?p=app-interactiveperltutorial.git">git.ieval.ro</a>
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, learn => 'Learn';
 
 sub generate{
+  %templates = cook_templates %orig_templates, learn => 'Learn' if reload_templates;
   HTML::Template::Compiled->new(scalarref => \$templates{$_[1]})->output;
 }
 
index 0c842c2d20915a1763bee1871c700f681b80981e..47c8a2e9288770b3df5d7062831aca3e3d1abe72 100644 (file)
@@ -7,7 +7,6 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Job log';
 use constant PAGE_SIZE => 10;
 
 use constant FORMAT_EXTENSION => {
@@ -16,10 +15,10 @@ use constant FORMAT_EXTENSION => {
 
 use HTML::Template::Compiled;
 use POSIX qw/strftime/;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 use Gruntmaster::Data qw/jobcard job_date job_extension job_filesize problem_name job_private job_problem job_result job_result_text job_user/;
 
-my %templates = (
+my %orig_templates = (
        en => <<'HTML',
 <table border>
 <thead>
@@ -35,10 +34,10 @@ my %templates = (
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, log => 'Job log';
 
 sub generate{
+       %templates = cook_templates %orig_templates, log => 'Job log' if reload_templates;
        $_[0] =~ m,^(?:ct/([^/]+)/)?log/(\w+)\.html$,;
        local $Gruntmaster::Data::contest = $1;
        my $pages = jobcard / PAGE_SIZE;
index 3e9e08fed2f2d8762a93a62f87ab6cdf07ccde26..8fed9a19fb6aa3b28730a900c07d088ef511eb19 100644 (file)
@@ -7,14 +7,12 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Job <tmpl_var id>';
-
 use HTML::Template::Compiled;
 use POSIX qw/strftime/;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 use Gruntmaster::Data qw/job_results/;
 
-my %templates = (
+my %orig_templates = (
        en => <<'HTML',
 <table border>
 <thead>
@@ -26,10 +24,10 @@ my %templates = (
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, log_entry => 'Job <tmpl_var id>';
 
 sub generate{
+       %templates = cook_templates %orig_templates, log_entry => 'Job <tmpl_var id>' if reload_templates;
        $_[0] =~ m,^(?:ct/([^/]+)/)?log/job/([^/]+)\.html$,;
        local $Gruntmaster::Data::contest = $1;
        my $id = $2;
index 5ada0e22b8a5ad07175140b570a299d33384cdb1..18b47bf894710cb8449ba68910592c7a1a266004 100644 (file)
@@ -7,16 +7,14 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Problems';
-
 use Fcntl qw/:flock/;
 use HTML::Template::Compiled;
 use IO::File;
 use POSIX qw/strftime/;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 use Gruntmaster::Data qw/problem_name problem_level problems/;
 
-my %templates = (
+my %orig_templates = (
   en => <<'HTML',
 <tmpl_if levels>
 <h2>Beginner</h2>
@@ -47,10 +45,10 @@ my %templates = (
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, pb => 'Problems';
 
 sub generate{
+       %templates = cook_templates %orig_templates, pb => 'Problems' if reload_templates;
        $_[0] =~ m,^(?:ct/([^/]+)/)?pb/index.html$,;
        local $Gruntmaster::Data::contest = $1;
 
index c9dfe206b3f8aacd080c6fc5a2817088e6dca562..dbfbe18ca42b86c6c2f0b7fd3a6b21de6518b503 100644 (file)
@@ -7,18 +7,14 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use Fcntl qw/:flock/;
 use HTML::Template::Compiled;
-use IO::File;
 use POSIX qw/strftime/;
-use File::Basename qw/fileparse/;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 use Gruntmaster::Data qw/contest_start contest_end problem_name problem_statement/;
 
 use constant FORMATS => [qw/CPP/];
-use constant TITLE => '<tmpl_var name>';
 
-my %templates = (
+my %orig_templates = (
        en => <<'HTML',
 <tmpl_var statement>
 
@@ -39,10 +35,10 @@ my %templates = (
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, pb_entry => '<tmpl_var name>';
 
 sub generate{
+       %templates = cook_templates %orig_templates, pb_entry => '<tmpl_var name>' if reload_templates;
        $_[0] =~ m,(?:ct/([^/])+/)?pb/(\w+)\.html$,;
 
        my ($contest, $id) = ($1, $2);
index e5b418d26a7844767e06c053b8d5ac05175720dd..e3873ba51b418de037516ca24a52b7470f898757 100644 (file)
@@ -7,15 +7,13 @@ use parent qw/Exporter/;
 our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
-use constant TITLE => 'Standings';
-
 use HTML::Template::Compiled;
 use List::Util qw/sum/;
 use POSIX qw/strftime/;
-use Gruntmaster::Page::Common qw/header footer/;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
 use Gruntmaster::Data qw/problems jobcard job_result_text job_result job_problem job_user/;
 
-my %templates = (
+my %orig_templates = (
        en => <<'HTML',
 <table border>
 <thead>
@@ -29,10 +27,10 @@ my %templates = (
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, st => 'Standings';
 
 sub generate{
+       %templates = cook_templates %orig_templates, st => 'Standings' if reload_templates;
        local $Gruntmaster::Data::contest = ($_[0] =~ m,^ct/([^/]+)/,)[0];
        my $htc = HTML::Template::Compiled->new(scalarref => \$templates{$_[1]});
 
index 3f289d5c50eebb1f6b0e7680a48f07b92346273c..7e4d1634d27ca6ef328cc530b4e095db02c4a976 100644 (file)
@@ -8,15 +8,12 @@ our @EXPORT_OK = qw/generate/;
 our $VERSION = '0.001';
 
 use constant FORMATS => [qw/CPP/];
-use constant TITLE => 'Submit job';
 
-use Fcntl qw/:flock/;
 use HTML::Template::Compiled;
-use YAML::Any qw/LoadFile/;
-use Gruntmaster::Page::Common qw/header footer/;
-use Gruntmaster::Data qw//;
+use Gruntmaster::Page::Common qw/cook_templates reload_templates/;
+use Gruntmaster::Data qw/problem_name problems/;
 
-my %templates = (
+my %orig_templates = (
        en => <<'HTML',
 <form action="https://gm.ieval.ro/action/submit" method="POST" enctype="multipart/form-data">
 <label>Problem:<br>
@@ -36,10 +33,11 @@ my %templates = (
 HTML
 );
 
-$templates{$_}  = header($_, TITLE) . $templates{$_} for keys %templates;
-$templates{$_} .= footer $_ for keys %templates;
+my %templates = cook_templates %orig_templates, submit => 'Submit job';
 
 sub generate{
+       %templates = cook_templates %orig_templates, submit => 'Submit job' if reload_templates;
+
        my $htc = HTML::Template::Compiled->new(scalarref => \$templates{$_[1]});
        my @problems = map +{ id => $_, name => problem_name }, problems;
        $htc->param(problems => \@problems);
This page took 0.023417 seconds and 4 git commands to generate.