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