class HighLine::Style

ANSI styles to be used by HighLine.

def self.ansi_rgb_to_hex(ansi_number)

Returns:
  • (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

Returns:
  • (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

Returns:
  • (Hash) - list of all cached Style codes
def self.code_index
  @code_index ||= {}
end

def self.index(style)

Returns:
  • (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

Returns:
  • (Hash) - list of all cached Styles
def self.list
  @styles ||= {}
end

def self.rgb(*colors)

Other tags:
    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)

Returns:
  • (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)

Returns:
  • (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)

Returns:
  • (String) -

Parameters:
  • string (String) --
def self.uncolor(string)
  string.gsub(/\e\[\d+(;\d+)*m/, "")
end

def blue

Returns:
  • (Integer) - the BLUE component of the rgb code
def blue
  @rgb && @rgb[2]
end

def bright

Returns:
  • (Style) - a brighter version of this Style
def bright
  create_bright_variant(:bright)
end

def code

Returns:
  • (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)

Returns:
  • (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

Returns:
  • (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

Returns:
  • (Integer) - the GREEN component of the rgb code
def green
  @rgb && @rgb[1]
end

def initialize(defn = {})

Parameters:
  • 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

Returns:
  • (Style) - a lighter version of this Style
def light
  create_bright_variant(:light)
end

def on

Returns:
  • (Style) -
def on
  new_name = ("on_" + @name.to_s).to_sym
  self.class.list[new_name] ||= variant(new_name, increment: 10)
end

def red

Returns:
  • (Integer) - the RED component of the rgb code
def red
  @rgb && @rgb[0]
end

def to_hash

Returns:
  • (Hash) - the definition used to create this Style
def to_hash
  @definition
end

def variant(new_name, options = {})

Returns:
  • (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