index: release v1.18 with only altgr index linked
[sheet.git] / tools / mktermcol-xcolor
1 #!/usr/bin/env perl
2 use 5.014;
3
4 BEGIN { push @INC, '.'; }
5 use Shiar_Sheet::Colour 1.05;
6
7 say "# automatically generated by $0";
8 say 'use strict;';
9 say '+{';
10 my @names;
11 my %seen;
12
13 for my $path (@ARGV) {
14         open my $theme, '<', $path or do {
15                 warn "could not open $path: $!\n";
16                 next;
17         };
18         (my $name = $path) =~ s{.*/}{};  # basename
19
20         my (%pal, @pal);
21         while (readline $theme) {
22                 m{
23                         (?: (foreground | background) | color(\d+) ) \h* : \h*
24                         (?: \#(\S+) | rgb:(\S+) )
25                 }x or next;
26                 my ($name, $idx, $val) = ($1, $2, uc $+);
27                 $name or $idx < 16 or next;
28                 $val =~ s/[^0-9A-F]//g;
29                 ($name ? $pal{$name} : $pal[$idx]) = $val;
30         }
31
32         my $huesum = 0;
33         for my $hue (
34                 sort map { $_->hue }
35                 grep { ($_->hsv)[1] > 32 }  # ignore unsaturated
36                 map { Shiar_Sheet::Colour->new($_) }
37                 @pal
38         ) {
39                 state $lasthue;
40                 $huesum += abs($lasthue - $hue) > .02 if defined $lasthue;
41                 $lasthue = $hue;
42         }
43         $huesum > 3 or next;  # require number of significant hue changes
44         #TODO tweak to include good-pants, exclude cheesecake-*
45
46         if ($seen{"@pal"}++) {
47                 warn "ignore duplicate palette $name\n";
48                 next;
49         }
50
51         splice @pal, 8 if "@pal[0..7]" eq "@pal[8..15]";
52
53         say qq("$name" => {);
54         say qq(\ttitle => '$name',);
55         say qq(\tparent => 'cga',);
56         say qq(\tlist => [qw(@pal)],);
57         say qq(\t$_ => '$pal{$_}',) for keys %pal;
58         say qq(},);
59         push @names, $name;
60 }
61
62 say 'xcolor => [', join(', ', map {"'$_'"} @names), '],';
63 say '}';