use v5.14;
use warnings;
- use CSS::Minifier::XS qw//;
+ use CSS::Minifier::XS qw/minify/;
+use CSS::SpriteMaker;
-
use Digest::SHA qw/sha256_base64/;
use IO::Compress::Gzip qw/gzip/;
use File::Slurp qw/read_file write_file edit_file_lines/;
+ use List::Util qw/first/;
mkdir 'static';
mkdir 'static/css';
mkdir 'static/js';
+sub make_sprite {
+ my $maker = Local::CSS::SpriteMaker->new(
+ css_class_prefix => 'logo-',
+ rc_override_classname => sub {
+ my ($name) = @_;
+ $name =~ s/-light/.logo-light/r;
+ }
+ );
+
+ $maker->make_sprite(
+ source_images => ['logos/'],
+ target_file => 'static/logos.png',
+ add_extra_padding => 10,
+ );
+
+ $maker->print_css(
+ filename => 'css/logos.css',
+ sprite_filename => '/static/logos.png',
+ );
+
+ system 'pngnq-s9', '-s1', 'static/logos.png';
+ system 'optipng', '-o7', '-zm1-9', 'static/logos-nq8.png';
+ rename 'static/logos-nq8.png', 'static/logos.png';
+}
+
sub gzip_file {
my ($file) = @_;
gzip $file => "$file.gz", -Level => 9, Minimal => 1;
}
+ sub read_css_into_blocks {
+ my ($file) = @_;
+ my (@blocks, $block);
+ for (read_file $file) {
+ $block .= $_;
+ if (/^}/) {
+ push @blocks, $block;
+ $block = '';
+ }
+ }
+ \@blocks
+ }
+
sub make_css {
- my $common_css;
- $common_css .= read_file $_ for <css/*.css>;
+ my %css;
+ $css{common} .= read_file $_ for <css/*.css>;
+
+ my (%themes, $rndtheme);
for (<css/themes/*>) {
- my ($theme) = m,themes/(.*)\.css,;
- my $css = read_file $_;
- $css .= $common_css;
- write_file "static/css/$theme.css", CSS::Minifier::XS::minify $css;
- gzip_file "static/css/$theme.css";
+ ($rndtheme) = m,themes/(.*)\.css,;
+ $themes{$rndtheme} = read_css_into_blocks $_;
+ }
+
+ while (grep { scalar @$_ } values %themes) {
+ my %blocks = map { $_ => (shift @{$themes{$_}}) // '' } keys %themes;
+ if (grep { $_ ne $blocks{$rndtheme} } values %blocks) {
+ $css{$_} .= $blocks{$_} for keys %themes;
+ } else {
+ $css{common} .= $blocks{$rndtheme};
+ }
+ }
+
+ for my $name (keys %css) {
+ write_file "static/css/$name.css", minify $css{$name};
+ gzip_file "static/css/$name.css"
}
}
gzip_file 'static/js/all.js';
}
+my $sprite_mtime = -M 'static/logos.png' // 0;
+for (<logos/*>) {
+ if (!$sprite_mtime || $sprite_mtime > -M) {
+ make_sprite;
+ last
+ }
+}
+
my $css_mtime = -M 'static/css/slate.css' // 0;
for (<css/*>, <css/themes/*>) {
if (!$css_mtime || $css_mtime > -M) {
return unless $file;
my $hash = sha256_base64 scalar read_file $file;
s/integrity=".*"/integrity="sha256-$hash="/;
-} 'tmpl/skel.en'
+} 'tmpl/skel.en';
+
+package
+ Local::CSS::SpriteMaker;
+
+use parent qw/CSS::SpriteMaker/;
+
+sub _get_stylesheet_string {
+ my $self = shift;
+ my @ret = split "\n", $self->SUPER::_get_stylesheet_string(@_);
+ shift @ret;
+ @ret = sort @ret;
+ unshift @ret, <<EOF;
+a.logo {
+ background-image: url("/static/logos.png");
+ background-repeat: no-repeat;
+ display: inline-block;
+ vertical-align: middle;
+}
+EOF
+ join "\n", @ret;
+}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<link href="/static/css/cyborg.css" title="cyborg" rel="stylesheet" integrity="x">
-<link href="/static/css/slate.css" title="slate" rel="alternate stylesheet" integrity="x">
+<link href="/static/favicon.png" rel="shortcut icon">
+ <link href="/static/css/common.css" rel="stylesheet" integrity="x">
+<link href="/static/css/cyborg.css" title="cyborg" rel="alternate stylesheet" integrity="x">
+<link href="/static/css/slate.css" title="slate" rel="stylesheet" integrity="x">
<link href="/static/css/readable.css" title="readable" rel="alternate stylesheet" integrity="x">
<script src="/static/js/all.js" type="text/javascript" async defer integrity="x"></script>
<div class="container-fluid">
<nav role="navigation">
<ul class="nav nav-pills nav-justified">
-<li id="nav-home"><a href="/">Gruntmaster 6000</a>
+<li id="nav-home"><a href="/">Home</a>
<li id="nav-pb"><a href="/pb/">Problems</a>
<li id="nav-ct"><a href="/ct/">Contests</a>
<li id="nav-log"><a href="/log/">Job log</a>
<li id="nav-us"><a href="/us/">Users</a>
<li id="nav-account" static="no"><a href="/account">Account</a>
+<li id="nav-about"><a href="/about">About / Help</a>
<li id="nav-contribute"><a href="/contribute">Contribute!</a>
</ul>
</nav>
+<div id="logo"></div>
<h1 id="title">TITLE</h1>
-<div id="static" class="alert alert-info" static="yes">This is a static version of Gruntmaster 6000.</div>
+<div id="static" class="alert alert-info" static="yes">This is a static version of MindCoding, useful when the <a class="alert-link" href="https://mindcoding.ro/">regular version</a> is overloaded.</div>
<div id="result"></div>
<main id="content">Content goes here</main>
+<div id="webchat"><a href="http://webchat.oftc.net/?channels=%23mindcoding" target="_blank">Webchat</a></div>
+
+<div id="sponsors">
+<h3>Official sponsors</h3>
+<a class="logo logo-emag" href="http://www.fundatiaemag.ro/"></a>
+<a class="logo logo-easyhost" href="http://ro.easyhost.com/"></a>
+<a class="logo logo-takeofflabs" href="http://www.takeofflabs.com/"></a>
+<a class="logo logo-bigstep" href="http://www.bigstep.com/"></a>
+<a class="logo logo-yardi" href="https://www.facebook.com/YardiRomania"></a>
+<a class="logo logo-bosch" href="http://www.bosch.com.ro/"></a>
+<a class="logo logo-endava" href="http://www.endava.com/"></a>
+</div>
+
<footer>
-Dilmom: Why don't you call your product the Gruntmaster 6000?<br>
-Dilbert: What kind of product do you see when you imagine a Gruntmaster 6000?<br>
-Dilmom: Well, it's a stripped-down version of the Gruntmaster 9000, of course. But it's software-upgradeable.
+<div class="row">
+<div class="col-md-6 column text-center">
+<a class="logo logo-hermes" href="http://www.societatea-hermes.ro"></a>
+</div>
+
+<div class="col-md-6 column text-center">
+<a class="logo logo-facebook" href="http://www.facebook.com/mindcodingcluj"></a>
+</div>
+</div>
+
+<h3>Partners</h3>
+<a href="https://www.facebook.com/spyhce?fref=ts" class="logo logo-spyhce"></a>
+<a href="https://www.facebook.com/telenav?fref=ts" class="logo logo-telenav"></a>
+<h3>Media Partners</h3>
+<a href="http://cs.ubbcluj.ro" class="logo logo-csf"></a>
+<a href="http://www.uniunea.ro" class="logo logo-usr"></a>
+<a href="http://www.coscj.ro" class="logo logo-cos"></a>
+<a href="http://www.cluj2015.ro/romana" class="logo logo-eyc"></a>
</footer>