class SuperDiff::Csi::FourBitColor

Constants

COLORS_BY_CODE
OPENING_REGEX
VALID_CODES_BY_NAME
VALID_CODE_RANGES
VALID_NAMES
VALID_TYPES

Attributes

name[R]

Public Class Methods

exists?(name) click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 33
def self.exists?(name)
  VALID_CODES_BY_NAME.has_key?(name)
end
new(value, layer: nil) click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 41
def initialize(value, layer: nil)
  if value.is_a?(Symbol)
    @name = interpret_name!(value)
    @layer = interpret_layer!(layer)
  else
    pair =
      if value.start_with?("\e[")
        interpret_sequence!(value)
      else
        interpret_code!(value)
      end

    @name = pair.fetch(:name)
    @layer = pair.fetch(:layer)
  end
end
opening_regex() click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 37
def self.opening_regex
  OPENING_REGEX
end

Public Instance Methods

to_foreground() click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 63
def to_foreground
  self.class.new(name, layer: :foreground)
end
to_s() click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 58
def to_s
  code = VALID_CODES_BY_NAME.fetch(name).fetch(layer)
  "\e[#{code}m"
end

Private Instance Methods

interpret_code!(code) click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 95
def interpret_code!(code)
  if VALID_CODE_RANGES.none? { |range| range.cover?(code) }
    message =
      "#{code.inspect} is not a valid color code.\n" +
      "Valid codes are:\n"

    VALID_CODE_RANGES.each do |range|
      message << "- #{range.begin} through #{range.end}\n"
    end

    raise ArgumentError.new(message)
  end

  COLORS_BY_CODE.fetch(code)
end
interpret_name!(name) click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 71
def interpret_name!(name)
  if !VALID_NAMES.include?(name)
    message =
      "#{name.inspect} is not a valid color name.\n" +
      "Valid names are:\n"

    VALID_NAMES.each do |valid_name|
      message << "- #{valid_name}"
    end

    raise ArgumentError.new(message)
  end

  name
end
interpret_sequence!(sequence) click to toggle source
# File lib/super_diff/csi/four_bit_color.rb, line 87
def interpret_sequence!(sequence)
  match = sequence.match(OPENING_REGEX)

  if match
    interpret_code!(match[1].to_i)
  end
end