#!/usr/bin/env perl
-use 5.010;
+use 5.014;
+BEGIN { push @INC, '.'; }
+use Shiar_Sheet::Colour 1.05;
+
+say "# automatically generated by $0";
say 'use strict;';
say '+{';
my @names;
+my %seen;
-for my $path (glob 'data/xcolors/themes/*') {
- open my $theme, '<', $path;
+for my $path (@ARGV) {
+ open my $theme, '<', $path or do {
+ warn "could not open $path: $!\n";
+ next;
+ };
(my $name = $path) =~ s{.*/}{}; # basename
- push @names, $name;
- my @pal;
+ my (%pal, @pal);
while (readline $theme) {
- m{ color(\d+) \h* : \h* ( \#(\S+) | rgb:(\S+) ) }x or next;
- my ($idx, $val) = ($1, uc $+);
- $idx < 16 or next;
+ m{
+ (?: (foreground | background) | color(\d+) ) \h* : \h*
+ (?: \#(\S+) | rgb:(\S+) )
+ }x or next;
+ my ($name, $idx, $val) = ($1, $2, uc $+);
+ $name or $idx < 16 or next;
$val =~ s/[^0-9A-F]//g;
- $pal[$idx] = $val;
+ ($name ? $pal{$name} : $pal[$idx]) = $val;
+ }
+
+ my $huesum = 0;
+ for my $hue (
+ sort map { $_->hue }
+ grep { ($_->hsv)[1] > 32 } # ignore unsaturated
+ map { Shiar_Sheet::Colour->new($_) }
+ @pal
+ ) {
+ state $lasthue;
+ $huesum += abs($lasthue - $hue) > .02 if defined $lasthue;
+ $lasthue = $hue;
}
+ $huesum > 3 or next; # require number of significant hue changes
+ #TODO tweak to include good-pants, exclude cheesecake-*
+
+ if ($seen{"@pal"}++) {
+ warn "ignore duplicate palette $name\n";
+ next;
+ }
+
+ splice @pal, 8 if "@pal[0..7]" eq "@pal[8..15]";
say qq("$name" => {);
say qq(\ttitle => '$name',);
say qq(\tparent => 'cga',);
say qq(\tlist => [qw(@pal)],);
+ say qq(\t$_ => '$pal{$_}',) for keys %pal;
say qq(},);
+ push @names, $name;
}
say 'xcolor => [', join(', ', map {"'$_'"} @names), '],';