|
- # frozen_string_literal: true
-
- module Cucumber
- module Term
- # This module allows to colorize text using ANSI escape sequences.
- #
- # Include the module in your class and use its methods to colorize text.
- #
- # Example:
- #
- # require 'cucumber/term/ansicolor'
- #
- # class MyFormatter
- # include Cucumber::Term::ANSIColor
- #
- # def initialize(config)
- # $stdout.puts yellow("Initializing formatter")
- # $stdout.puts green("Coloring is active \o/") if Cucumber::Term::ANSIColor.coloring?
- # $stdout.puts grey("Feature path:") + blue(bold(config.feature_dirs))
- # end
- # end
- #
- # To see what colours and effects are available, just run this in your shell:
- #
- # ruby -e "require 'rubygems'; require 'cucumber/term/ansicolor'; puts Cucumber::Term::ANSIColor.attributes"
- #
- 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],
- [:grey, 90],
- [: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:
-
- # Regular expression that is used to scan for ANSI-sequences while
- # uncoloring strings.
- COLORED_REGEXP = /\e\[(?:[34][0-7]|[0-9])?m/
-
- @coloring = true
-
- class << self
- # Turns the coloring on or off globally, so you can easily do
- # this for example:
- # Cucumber::Term::ANSIColor::coloring = $stdout.isatty
- attr_accessor :coloring
-
- # Returns true, if the coloring function of this module
- # is switched on, false otherwise.
- alias coloring? :coloring
-
- def included(klass)
- return unless klass == String
-
- ATTRIBUTES.delete(:clear)
- ATTRIBUTE_NAMES.delete(:clear)
- end
- end
-
- ATTRIBUTES.each do |color_name, color_code|
- define_method(color_name) do |text = nil, &block|
- if block
- colorize(block.call, color_code)
- elsif text
- colorize(text, color_code)
- elsif respond_to?(:to_str)
- colorize(to_str, color_code)
- else
- colorize(nil, color_code) # switch coloration on
- end
- end
- end
-
- # Returns an uncolored version of the string
- # ANSI-sequences are stripped from the string.
- def uncolored(text = nil)
- if block_given?
- uncolorize(yield)
- elsif text
- uncolorize(text)
- elsif respond_to?(:to_str)
- uncolorize(to_str)
- else
- ''
- end
- end
-
- # Returns an array of all Cucumber::Term::ANSIColor attributes as symbols.
- def attributes
- ATTRIBUTE_NAMES
- end
-
- private
-
- def colorize(text, color_code)
- return String.new(text || '') unless Cucumber::Term::ANSIColor.coloring?
- return "\e[#{color_code}m" unless text
-
- "\e[#{color_code}m#{text}\e[0m"
- end
-
- def uncolorize(string)
- string.gsub(COLORED_REGEXP, '')
- end
- end
- end
- end
|