class Reline::Face::Config

Constants

ESSENTIAL_DEFINE_NAMES
RESET_SGR

Attributes

definition[R]

Public Class Methods

new(name, &block) click to toggle source
# File reline/face.rb, line 62
def initialize(name, &block)
  @definition = {}
  block.call(self)
  ESSENTIAL_DEFINE_NAMES.each do |name|
    @definition[name] ||= { style: :reset, escape_sequence: RESET_SGR }
  end
end

Public Instance Methods

[](name) click to toggle source
# File reline/face.rb, line 77
def [](name)
  @definition.dig(name, :escape_sequence) or raise ArgumentError, "unknown face: #{name}"
end
define(name, **values) click to toggle source
# File reline/face.rb, line 72
def define(name, **values)
  values[:escape_sequence] = format_to_sgr(values.to_a).freeze
  @definition[name] = values
end

Private Instance Methods

format_to_sgr(ordered_values) click to toggle source
# File reline/face.rb, line 93
def format_to_sgr(ordered_values)
  sgr = "\e[" + ordered_values.map do |key_value|
    key, value = key_value
    case key
    when :foreground, :background
      case value
      when Symbol
        SGR_PARAMETERS[key][value]
      when String
        sgr_rgb(key, value)
      end
    when :style
      [ value ].flatten.map do |style_name|
        SGR_PARAMETERS[:style][style_name]
      end.then do |sgr_parameters|
        sgr_parameters.include?(nil) ? nil : sgr_parameters
      end
    end.then do |rendition_expression|
      unless rendition_expression
        raise ArgumentError, "invalid SGR parameter: #{value.inspect}"
      end
      rendition_expression
    end
  end.join(';') + "m"
  sgr == RESET_SGR ? RESET_SGR : RESET_SGR + sgr
end
rgb_expression?(color) click to toggle source
# File reline/face.rb, line 120
def rgb_expression?(color)
  color.respond_to?(:match?) and color.match?(/\A#[0-9a-fA-F]{6}\z/)
end
sgr_rgb(key, value) click to toggle source
# File reline/face.rb, line 83
def sgr_rgb(key, value)
  return nil unless rgb_expression?(value)
  case key
  when :foreground
    "38;2;"
  when :background
    "48;2;"
  end + value[1, 6].scan(/../).map(&:hex).join(";")
end