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';
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"
}
}
}
}
-my $js_mtime = -M 'static/js.js' // 0;
+my $js_mtime = -M 'static/js/all.js' // 0;
for (<js/*>) {
if (!$js_mtime || $js_mtime > -M) {
make_js;