Make contest problem entries more cacheable
[gruntmaster-page.git] / lib / Gruntmaster / Page / Base.pm
CommitLineData
bb95f538 1package Gruntmaster::Page::Base;
832cb45e
MG
2
3use 5.014000;
4use strict;
5use warnings;
6d78fc24
MG
6
7use File::Slurp qw/read_file/;
bb95f538
MG
8use HTML::Template::Compiled;
9
10##################################################
11
9da2f495
MG
12sub read_templates {
13 my $root = 'tmpl';
14 my $name = shift;
15
16 map { m/\.(.+)$/; $1 => scalar read_file $_ } <tmpl/$name.*>;
17}
18
19my %header_templates = read_templates 'header';
20my %footer_templates = read_templates 'footer';
21
22sub header{
23 my ($language, $title) = @_;
24 $header_templates{$language} =~ s/TITLE_GOES_HERE/$title/ger;
25}
26
27sub footer{
28 $footer_templates{$_[0]};
29}
30
31##################################################
32
bb95f538
MG
33use POSIX ();
34use Gruntmaster::Data ();
35use List::Util ();
49c1467a
MG
36use LWP::UserAgent;
37
38my $ua = LWP::UserAgent->new;
9da2f495 39my %templates;
bb95f538
MG
40
41sub import {
42 my $caller = caller;
43 my ($self, $name, $title) = @_;
44
45 Gruntmaster::Data->export_to_level(1, $caller);
46 List::Util->export_to_level(1, $caller, qw/sum/);
47
48 no strict 'refs';
49 *{"${caller}::strftime"} = \&POSIX::strftime;
7dc32473
MG
50 *{"${caller}::debug"} = sub {
51 local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
191f4979 52 $_[0]->{'psgix.logger'}->({qw/level debug message/ => $_[1]})
7dc32473 53 };
ff57a758 54 *{"${caller}::reply"} = sub { [200, ['Content-Type' => 'text/plain', 'Cache-Control' => 'no-cache'], [ @_ ] ] };
49c1467a
MG
55 *{"${caller}::purge"} = sub {
56 return unless $ENV{PURGE_HOST};
57 my $req = HTTP::Request->new(PURGE => "http://$ENV{PURGE_HOST}$_[0]");
58 $ua->request($req)
59 };
832cb45e 60
9da2f495
MG
61 if ($name) {
62 $templates{$caller} = { read_templates $name };
63 $templates{$caller}{$_} = header ($_, $title) . $templates{$caller}{$_} for keys $templates{$caller};
64 $templates{$caller}{$_} .= footer $_ for keys $templates{$caller};
6d78fc24 65 }
2b0036ac
MG
66}
67
bb95f538
MG
68##################################################
69
bb95f538 70sub generate{
7dc32473 71 my ($self, $lang, @args) = @_;
bb95f538 72
bb95f538 73 my $htc = HTML::Template::Compiled->new(scalarref => \$templates{$self}{$lang}, default_escape => 'HTML',);
7dc32473 74 $self->_generate($htc, $lang, @args);
1053baee
MG
75 my $out = $htc->output;
76 utf8::downgrade($out);
c86e504e
MG
77 my $vary = 'Accept-Language, ' . $self->vary;
78 [200, ['Content-Type' => 'text/html', 'Content-Language' => $_[1], 'Vary' => $vary, 'X-Forever' => 1, 'Cache-Control' => 'max-age=' . $self->max_age], [ $out ] ]
bb95f538
MG
79}
80
81sub _generate {}
82
c86e504e
MG
83sub vary {}
84
ff57a758
MG
85sub max_age { 60 }
86
7dc32473 87sub variants {
9da2f495 88 [ map { [ $_, 1, 'text/html', undef, undef, $_, undef ]} keys $templates{$_[0]} ]
7dc32473
MG
89}
90
bb95f538 911
This page took 0.020502 seconds and 4 git commands to generate.