[](name)
click to toggle source
def self.[](name)
case
when self === name then name
when Array === name then nearest_rgb_color name
when name.to_s =~ %r\A(on_)?(\d+)\z/ then get "#$1color#$2"
when name.to_s =~ %r\A#([0-9a-f]{3}){1,2}\z/ then nearest_rgb_color name
when name.to_s =~ %r\Aon_#([0-9a-f]{3}){1,2}\z/ then nearest_rgb_on_color name
else get name
end
end
attributes(&block)
click to toggle source
def self.attributes(&block)
@__order__.map { |name| @__store__[name] }
end
get(name)
click to toggle source
def self.get(name)
@__store__[name.to_sym]
end
named_attributes(&block)
click to toggle source
def self.named_attributes(&block)
@named_attributes ||= attributes.reject(&:rgb_color?).each(&block)
end
nearest_rgb_color(color, options = {})
click to toggle source
def self.nearest_rgb_color(color, options = {})
rgb = RGBTriple[color]
colors = rgb_colors
if options.key?(:gray) && !options[:gray]
colors = colors.reject(&:gray?)
end
colors.reject(&:background?).min_by { |c| c.distance_to(rgb, options) }
end
nearest_rgb_on_color(color, options = {})
click to toggle source
def self.nearest_rgb_on_color(color, options = {})
rgb = RGBTriple[color]
colors = rgb_colors
if options.key?(:gray) && !options[:gray]
colors = colors.reject(&:gray?)
end
colors.select(&:background?).min_by { |c| c.distance_to(rgb, options) }
end
new(name, code, options = {})
click to toggle source
def initialize(name, code, options = {})
@name = name.to_sym
@code = code.to_s
if html = options[:html]
@rgb = RGBTriple.from_html(html)
elsif !options.empty?
@rgb = RGBTriple.from_hash(options)
else
@rgb = nil
end
end
rgb_colors(&block)
click to toggle source
def self.rgb_colors(&block)
@rgb_colors ||= attributes.select(&:rgb_color?).each(&block)
end
set(name, code, options = {})
click to toggle source
def self.set(name, code, options = {})
name = name.to_sym
result = @__store__[name] = new(name, code, options)
@__order__ << name
@rgb_colors = nil
result
end
apply(string = nil, &block)
click to toggle source
def apply(string = nil, &block)
::Term::ANSIColor.color(self, string, &block)
end
background?()
click to toggle source
def background?
@name.to_s.start_with?('on_')
end
code()
click to toggle source
def code
if rgb_color?
background? ? "48;5;#{@code}" : "38;5;#{@code}"
else
@code
end
end
distance_to(other, options = {})
click to toggle source
def distance_to(other, options = {})
if our_rgb = to_rgb_triple and
other.respond_to?(:to_rgb_triple) and
other_rgb = other.to_rgb_triple
then
our_rgb.distance_to(other_rgb, options)
else
1 / 0.0
end
end
gradient_to(other, options = {})
click to toggle source
def gradient_to(other, options = {})
if our_rgb = to_rgb_triple and
other.respond_to?(:to_rgb_triple) and
other_rgb = other.to_rgb_triple
then
our_rgb.gradient_to(other_rgb, options).map do |rgb_triple|
self.class.nearest_rgb_color(rgb_triple, options)
end
else
[]
end
end
gray?()
click to toggle source
def gray?
rgb_color? && to_rgb_triple.gray?
end
rgb_color?()
click to toggle source
def rgb_color?
!!@rgb
end
to_rgb_triple()
click to toggle source
def to_rgb_triple
@rgb
end