class HighLine::Style
ANSI styles to be used by HighLine.
def self.ansi_rgb_to_hex(ansi_number)
-
(String)
- all color codes joined as {.rgb_hex}
Parameters:
-
ansi_number
(Integer
) -- ANSI escape code
def self.ansi_rgb_to_hex(ansi_number) raise "Invalid ANSI rgb code #{ansi_number}" unless (16..231).cover?(ansi_number) parts = (ansi_number - 16). to_s(6). rjust(3, "0"). scan(/./). map { |d| (d.to_i * 255.0 / 6.0).ceil } rgb_hex(*parts) end
def self.clear_index
-
(void)
-
def self.clear_index # reset to builtin only styles @styles = list.select { |_name, style| style.builtin } @code_index = {} @styles.each_value { |style| index(style) } end
def self.code_index
-
(Hash)
- list of all cached Style codes
def self.code_index @code_index ||= {} end
def self.index(style)
-
(Style)
- the given style
Parameters:
-
style
(Style
) --
def self.index(style) if style.name @styles ||= {} @styles[style.name] = style end unless style.list @code_index ||= {} @code_index[style.code] ||= [] @code_index[style.code].reject! do |indexed_style| indexed_style.name == style.name end @code_index[style.code] << style end style end
def self.list
-
(Hash)
- list of all cached Styles
def self.list @styles ||= {} end
def self.rgb(*colors)
- Example: Creating a new Style based on rgb code -
Returns:
-
(Style)
- a Style with the rgb colors provided.
Parameters:
-
colors
() --
def self.rgb(*colors) hex = rgb_hex(*colors) name = ("rgb_" + hex).to_sym style = list[name] return style if style parts = rgb_parts(hex) new(name: name, code: "\e[38;5;#{rgb_number(parts)}m", rgb: parts) end
def self.rgb_hex(*colors)
-
(String)
- all color codes joined
Parameters:
-
colors
(Array
) -- color codes
def self.rgb_hex(*colors) colors.map do |color| color.is_a?(Numeric) ? format("%02x", color) : color.to_s end.join end
def self.rgb_number(*parts)
-
(Numeric)
- to be used as escape code on ANSI terminals
Parameters:
-
parts
(Array
) -- three numerical codes for red, green
def self.rgb_number(*parts) parts = parts.flatten 16 + parts.reduce(0) do |kode, part| kode * 6 + (part / 256.0 * 6.0).floor end end
def self.rgb_parts(hex)
def self.rgb_parts(hex) hex.scan(/../).map { |part| part.to_i(16) } end
def self.uncolor(string)
-
(String)
-
Parameters:
-
string
(String
) --
def self.uncolor(string) string.gsub(/\e\[\d+(;\d+)*m/, "") end
def blue
-
(Integer)
- the BLUE component of the rgb code
def blue @rgb && @rgb[2] end
def bright
-
(Style)
- a brighter version of this Style
def bright create_bright_variant(:bright) end
def code
-
(String)
- the Style code -
(String)
- all codes of the Style list joined together
def code if @list @list.map { |element| HighLine.Style(element).code }.join else @code end end
def color(string)
-
(String)
- an ANSI colored string
Parameters:
-
string
(String
) -- to be colored
def color(string) code + string + HighLine::CLEAR end
def create_bright_variant(variant_name)
def create_bright_variant(variant_name) raise "Cannot create a #{name} variant of a style list (#{inspect})" if @list new_name = ("#{variant_name}_" + @name.to_s).to_sym new_rgb = if @rgb == [0, 0, 0] [128, 128, 128] else @rgb.map { |color| color.zero? ? 0 : [color + 128, 255].min } end find_style(new_name) || variant(new_name, increment: 60, rgb: new_rgb) end
def dup
-
(Style)
- duplicated Style
def dup self.class.new(@definition) end
def find_style(name)
def find_style(name) self.class.list[name] end
def green
-
(Integer)
- the GREEN component of the rgb code
def green @rgb && @rgb[1] end
def initialize(defn = {})
-
defn
(Hash
) -- options for the Style to be created.
def initialize(defn = {}) @definition = defn @name = defn[:name] @code = defn[:code] @rgb = defn[:rgb] @list = defn[:list] @builtin = defn[:builtin] if @rgb hex = self.class.rgb_hex(@rgb) @name ||= "rgb_" + hex elsif @list @name ||= @list end self.class.index self unless defn[:no_index] end
def light
-
(Style)
- a lighter version of this Style
def light create_bright_variant(:light) end
def on
-
(Style)
-
def on new_name = ("on_" + @name.to_s).to_sym self.class.list[new_name] ||= variant(new_name, increment: 10) end
def red
-
(Integer)
- the RED component of the rgb code
def red @rgb && @rgb[0] end
def to_hash
-
(Hash)
- the definition used to create this Style
def to_hash @definition end
def variant(new_name, options = {})
-
(Style)
- new Style with changed attributes
Parameters:
-
options
(Hash
) -- Style attributes to be changed -
new_name
(Symbol
) --
def variant(new_name, options = {}) raise "Cannot create a variant of a style list (#{inspect})" if @list new_code = options[:code] || code if options[:increment] raise "Unexpected code in #{inspect}" unless new_code =~ /^(.*?)(\d+)(.*)/ new_code = Regexp.last_match(1) + (Regexp.last_match(2).to_i + options[:increment]).to_s + Regexp.last_match(3) end new_rgb = options[:rgb] || @rgb self.class.new(to_hash.merge(name: new_name, code: new_code, rgb: new_rgb)) end