App-GraphicsColorNamesUtils
view release on metacpan or search on metacpan
lib/App/GraphicsColorNamesUtils.pm view on Meta::CPAN
my $mods = Module::List::Tiny::list_modules(
"Graphics::ColorNames::", {list_modules=>1});
my %all_codes;
for my $mod (sort keys %$mods) {
(my $scheme = $mod) =~ s/^Graphics::ColorNames:://;
my $codes = _get_scheme_codes($scheme);
for (keys %$codes) { $all_codes{$_} //= $codes->{$_} }
}
\%all_codes;
}
$SPEC{colorcode2name} = {
v => 1.1,
summary => 'Convert RGB color code to name',
args => {
code => {
schema => 'color::rgb24*', # XXX disable coercion from color name
req => 1,
pos => 0,
},
approx => {
summary => 'When a name with exact code is not found, '.
'find the several closest ones',
schema => 'bool*',
},
},
};
sub colorcode2name {
require Graphics::ColorNames;
my %args = @_;
my $code = lc $args{code};
my $all_codes = _get_all_schemes_codes();
my %names;
for my $name (sort keys %$all_codes) {
my $code = $all_codes->{$name};
$names{$code} //= [];
push @{ $names{$code} }, $name
unless grep { $_ eq $name } @{ $names{$code} };
}
if (defined $names{$code}) {
return [200, "OK", join(", ", @{ $names{$code} })];
} elsif ($args{approx}) {
require Color::RGB::Util;
my @colors_and_diffs =
sort {
$a->[2] <=> $b->[2]
}
map {
# name, code, distance to wanted
[$_, $all_codes->{$_}, do { Color::RGB::Util::rgb_diff($code, sprintf("%06x",$all_codes->{$_}), 'approx1')}]
} sort keys %$all_codes;
my @closest = splice @colors_and_diffs, 0, 5;
return [200, "OK (approx)", [map {+{name=>$_->[0], code=>$_->[1]}} @closest], {
'table.fields' => [qw/name code/]}];
} else {
return [404, "Color code '$code' does not yet have a name"];
}
}
$SPEC{list_color_schemes} = {
v => 1.1,
summary => 'List all installed Graphics::ColorNames schemes',
};
sub list_color_schemes {
require Graphics::ColorNames;
my %args = @_;
[200, "OK", [Graphics::ColorNames::all_schemes()]];
}
$SPEC{colorname2code} = {
v => 1.1,
summary => 'Convert color name to code',
args => {
name => {
schema => 'str*',
req => 1,
pos => 0,
completion => sub {
my %args = @_;
require Complete::Color;
Complete::Color::complete_color_name(word=>$args{word});
},
},
},
};
sub colorname2code {
require Graphics::ColorNames;
my %args = @_;
my $name = $args{name};
my $all_codes = _get_all_schemes_codes();
if (defined $all_codes->{$name}) {
return [200, "OK", $all_codes->{$name}];
} else {
return [404, "Unknown color name '$name'"];
}
}
$SPEC{list_color_names} = {
v => 1.1,
summary => 'List all color names from a Graphics::ColorNames scheme',
args => {
scheme => {
schema => 'perl::colorscheme::modname*',
req => 1,
pos => 0,
},
detail => {
schema => 'true*',
cmdline_aliases => {l=>{}},
},
},
};
sub list_color_names {
require Graphics::ColorNames;
my %args = @_;
my $codes = _get_scheme_codes($args{scheme});
my @rows;
my $resmeta = {};
for (sort keys %$codes) {
push @rows, {name=>$_, rgb=>$codes->{$_}};
}
if ($args{detail}) {
$resmeta->{'table.fields'} = [qw/name rgb/];
} else {
@rows = map {$_->{name}} @rows;
}
[200, "OK", \@rows, $resmeta];
}
$SPEC{show_color_swatch} = {
v => 1.1,
summary => 'List all color names from a Graphics::ColorNames scheme as a color swatch',
args => {
scheme => {
schema => 'perl::colorscheme::modname*',
req => 1,
pos => 0,
},
table_width => {
schema => 'posint*',
default => 80,
cmdline_aliases => {w=>{}},
},
columns => {
schema => 'posint*',
default => 1,
cmdline_aliases => {c=>{}},
},
row_height => {
( run in 2.136 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )