# frozen_string_literal: true
module Cucumber
module Term
# The ANSIColor module can be used for namespacing and mixed into your own
# classes.
module ANSIColor
# :stopdoc:
ATTRIBUTES = [
[:clear, 0],
[:reset, 0], # synonym for :clear
[:bold, 1],
[:dark, 2],
[:italic, 3], # not widely implemented
[:underline, 4],
[:underscore, 4], # synonym for :underline
[:blink, 5],
[:rapid_blink, 6], # not widely implemented
[:negative, 7], # no reverse because of String#reverse
[:concealed, 8],
[:strikethrough, 9], # not widely implemented
[:black, 30],
[:red, 31],
[:green, 32],
[:yellow, 33],
[:blue, 34],
[:magenta, 35],
[:cyan, 36],
[:white, 37],
[:on_black, 40],
[:on_red, 41],
[:on_green, 42],
[:on_yellow, 43],
[:on_blue, 44],
[:on_magenta, 45],
[:on_cyan, 46],
[:on_white, 47]
].freeze
ATTRIBUTE_NAMES = ATTRIBUTES.transpose.first
# :startdoc:
# Returns true, if the coloring function of this module
# is switched on, false otherwise.
def self.coloring?
@coloring
end
# Turns the coloring on or off globally, so you can easily do
# this for example:
# Cucumber::Term::ANSIColor::coloring = STDOUT.isatty
def self.coloring=(val)
@coloring = val
end
self.coloring = true
# rubocop:disable Security/Eval
ATTRIBUTES.each do |c, v|
eval <<-END_EVAL, binding, __FILE__, __LINE__ + 1
def #{c}(string = nil)
result = String.new
result << "\e[#{v}m" if Cucumber::Term::ANSIColor.coloring?
if block_given?
result << yield
elsif string
result << string
elsif respond_to?(:to_str)
result << to_str
else
return result #only switch on
end
result << "\e[0m" if Cucumber::Term::ANSIColor.coloring?
result
end
END_EVAL
end
# rubocop:enable Security/Eval
# Regular expression that is used to scan for ANSI-sequences while
# uncoloring strings.
COLORED_REGEXP = /\e\[(?:[34][0-7]|[0-9])?m/
def self.included(klass)
return unless klass == String
ATTRIBUTES.delete(:clear)
ATTRIBUTE_NAMES.delete(:clear)
end
# Returns an uncolored version of the string, that is all
# ANSI-sequences are stripped from the string.
def uncolored(string = nil)
if block_given?
yield.gsub(COLORED_REGEXP, '')
elsif string
string.gsub(COLORED_REGEXP, '')
elsif respond_to?(:to_str)
to_str.gsub(COLORED_REGEXP, '')
else
''
end
end
module_function
# Returns an array of all Cucumber::Term::ANSIColor attributes as symbols.
def attributes
ATTRIBUTE_NAMES
end
end
end
end