1 package Gruntmaster
::Page
::Common
;
6 use parent qw
/Exporter/;
7 our @EXPORT_OK = qw
/header footer cook_templates reload_templates/;
9 use File
::Slurp qw
/read_file/;
11 my %orig_header_templates = (
14 <title>TITLE_GOES_HERE</title>
15 <link rel="stylesheet" href="/gm.css">
16 <script src="/zepto.var" defer></script>
17 <script src="/view.js" defer></script>
18 <script src="/form.js" defer></script>
19 <meta charset="utf-8">
21 <span id="admin"></span>
22 <div id="title"><span class="i">i</span><span class="Eval">Eval</span></div>
23 <div id="subtitle">TITLE_GOES_HERE</div>
25 <nav><ul><li><a href="/learn.var">Learn</a><li><a href="/pb/">Practice</a><li><a href="/ct/">Compete</a><li><a href="/log/">Job log</a></ul></nav>
30 my %orig_footer_templates = (
34 Dilmom: Why don't you call your product the Gruntmaster 6000?
35 Dilbert: What kind of product do you see when you imagine a Gruntmaster 6000?
36 Dilmom: Well, it's a stripped-down version of the Gruntmaster 9000, of course. But it's software-upgradeable.
42 my $root = $ENV{GRUNTMASTER_TEMPLATE_ROOT
} or return;
43 my ($templates, $name) = @_;
44 my %out = %$templates;
45 for (<$root/$name*>) {
47 $out{$1} = read_file
$_
53 my %header_templates = patch_templates \
%orig_header_templates, 'header';
54 my %footer_templates = patch_templates \
%orig_footer_templates, 'footer';
56 sub reload_templates
() { $ENV{GRUNTMASTER_RELOAD_TEMPLATES
} }
59 my ($language, $title) = @_;
60 %header_templates = patch_templates \
%orig_header_templates, 'header' if reload_templates
;
61 $header_templates{$language} =~ s/TITLE_GOES_HERE/$title/ger;
65 %footer_templates = patch_templates \
%orig_footer_templates, 'footer' if reload_templates
;
66 $footer_templates{$_[0]};
69 sub cook_templates
(\
%@
) {
70 my ($templates, $name, $title) = @_;
72 my %out = patch_templates
$templates, $name;
73 $out{$_} = header
($_, $title) . $out{$_} for keys %out;
74 $out{$_} .= footer
$_ for keys %out;