class SuperDiff::Csi::EightBitColor
Constants
- LAYERS_BY_LEADING_CODE
- LEADING_CODES_BY_LAYER
- OPENING_REGEX
- SERIAL_CODE
- STARTING_INDICES
- VALID_CODES_BY_NAME
- VALID_CODE_RANGE
- VALID_COMPONENT_RANGE
- VALID_PAIR_INDEX_RANGES
- VALID_PAIR_TYPES
Attributes
code[R]
Public Class Methods
new( value = nil, layer: nil, red: nil, green: nil, blue: nil, type: nil, index: nil )
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 44 def initialize( value = nil, layer: nil, red: nil, green: nil, blue: nil, type: nil, index: nil ) if value case value when Symbol @code = interpret_color_name!(value) @layer = interpret_layer!(layer) when Array @code = interpret_pair!(type: type, index: index) @layer = interpret_layer!(layer) else if value.is_a?(String) && value.start_with?("\e[") pair = interpret_sequence!(value) @code = pair.fetch(:code) @layer = pair.fetch(:layer) else @code = interpret_code!(value) @layer = interpret_layer!(layer) end end else @code = interpret_triplet!(red: red, green: green, blue: blue) @layer = interpret_layer!(layer) end end
opening_regex()
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 40 def self.opening_regex OPENING_REGEX end
Public Instance Methods
to_foreground()
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 81 def to_foreground self.class.new(code, layer: :foreground) end
to_s()
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 77 def to_s "\e[#{leading_code};#{SERIAL_CODE};#{code}m" end
Private Instance Methods
interpret_code!(code)
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 165 def interpret_code!(code) if !VALID_CODE_RANGE.cover?(code) raise ArgumentError.new( "#{code.inspect} is not a valid color code " + "(must be between 0 and 255).", ) end code end
interpret_color_name!(name)
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 109 def interpret_color_name!(name) if !VALID_CODES_BY_NAME.include?(name) message = "#{name.inspect} is not a valid color name.\n" + "Valid names are:\n" VALID_CODES_BY_NAME.keys.each do |valid_name| message << "- #{valid_name}\n" end raise ArgumentError.new(message) end VALID_CODES_BY_NAME[name] end
interpret_layer!(value)
click to toggle source
Calls superclass method
SuperDiff::Csi::Color#interpret_layer!
# File lib/super_diff/csi/eight_bit_color.rb, line 157 def interpret_layer!(value) if value.to_s.to_i > 0 LAYERS_BY_LEADING_CODE.fetch(value.to_s.to_i) else super end end
interpret_pair!(type:, index:)
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 125 def interpret_pair!(type:, index:) if !VALID_PAIR_TYPES.include?(type) raise ArgumentError.new( "Given pair did not have a valid type. " + "Type must be one of: #{VALID_PAIR_TYPES}", ) end valid_range = VALID_PAIR_INDEX_RANGES[type] if !valid_range.cover?(index) raise ArgumentError.new( "Given pair did not have a valid index. " + "For #{type}, index must be between #{valid_range.begin} and " + "#{valid_range.end}.", ) end STARTING_INDICES[type] + index end
interpret_sequence!(sequence)
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 146 def interpret_sequence!(sequence) match = sequence.match(OPENING_REGEX) if match { layer: interpret_layer!(match[1]), code: interpret_code!(match[2].to_i), } end end
interpret_triplet!(red:, green:, blue:)
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 93 def interpret_triplet!(red:, green:, blue:) if invalid_triplet?(red, green, blue) raise ArgumentError.new( "(#{red},#{green},#{blue}) is not a valid color " + "specification. All components must be between " + "#{VALID_COMPONENT_RANGE.begin} and #{VALID_COMPONENT_RANGE.end}.", ) end 16 + 36 * red + 6 * green + blue end
invalid_triplet?(*values)
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 105 def invalid_triplet?(*values) values.none? { |component| VALID_COMPONENT_RANGE.cover?(component) } end
leading_code()
click to toggle source
# File lib/super_diff/csi/eight_bit_color.rb, line 89 def leading_code LEADING_CODES_BY_LAYER.fetch(layer) end