module Colorize

Overview

With Colorize you can change the fore- and background colors and text decorations when rendering text on terminals supporting ANSI escape codes. It adds the colorize method to Object and thus all classes as its main interface, which calls to_s and surrounds it with the necessary escape codes when it comes to obtaining a string representation of the object.

NOTE To use Colorize, you must explicitly import it with require "colorize"

Its first argument changes the foreground color:

require "colorize"

"foo".colorize(:green)
100.colorize(:red)
[1, 2, 3].colorize(:blue)

There are alternative ways to change the foreground color:

require "colorize"

"foo".colorize.fore(:green)
"foo".colorize.green

To change the background color, the following methods are available:

require "colorize"

"foo".colorize.back(:green)
"foo".colorize.on(:green)
"foo".colorize.on_green

You can also pass an RGB color to colorize:

require "colorize"

"foo".colorize(0, 255, 255)      # => "foo" in aqua
"foo".colorize.fore(0, 255, 255) # => "foo" in aqua

# This is the same as:

"foo".colorize(Colorize::ColorRGB.new(0, 255, 255))      # => "foo" in aqua
"foo".colorize.fore(Colorize::ColorRGB.new(0, 255, 255)) # => "foo" in aqua

Or an 8-bit color:

require "colorize"

"foo".colorize(Colorize::Color256.new(208))      # => "foo" in orange
"foo".colorize.fore(Colorize::Color256.new(208)) # => "foo" in orange

It's also possible to change the text decoration:

require "colorize"

"foo".colorize.mode(:underline)
"foo".colorize.underline

The colorize method returns a Colorize::Object instance, which allows chaining methods together:

require "colorize"

"foo".colorize.fore(:yellow).back(:blue).mode(:underline)

With the toggle method you can temporarily disable adding the escape codes. Settings of the instance are preserved however and can be turned back on later:

require "colorize"

"foo".colorize(:red).toggle(false)              # => "foo" without color
"foo".colorize(:red).toggle(false).toggle(true) # => "foo" in red

The color :default leaves the object's representation as it is but the object is a Colorize::Object then which is handy in conditions such as:

require "colorize"

"foo".colorize(Random::DEFAULT.next_bool ? :green : :default)

Available colors are:

:default
:black
:red
:green
:yellow
:blue
:magenta
:cyan
:light_gray
:dark_gray
:light_red
:light_green
:light_yellow
:light_blue
:light_magenta
:light_cyan
:white

See Colorize::Mode for available text decorations.

Defined in:

colorize.cr:119
colorize.cr:206

Class Method Summary

Class Method Detail

def self.enabled=(enabled : Bool) #

Objects will only be colored if this is true.

require "colorize"

Colorize.enabled = true
"hello".colorize.red.to_s # => "\e[31mhello\e[0m"

Colorize.enabled = false
"hello".colorize.red.to_s # => "hello"

NOTE This is by default disabled on non-TTY devices because they likely don't support ANSI escape codes. This will also be disabled if the environment variable TERM is "dumb" or NO_COLOR contains any value.


[View source]
def self.enabled? : Bool #

Objects will only be colored if this is true.

require "colorize"

Colorize.enabled = true
"hello".colorize.red.to_s # => "\e[31mhello\e[0m"

Colorize.enabled = false
"hello".colorize.red.to_s # => "hello"

NOTE This is by default disabled on non-TTY devices because they likely don't support ANSI escape codes. This will also be disabled if the environment variable TERM is "dumb" or NO_COLOR contains any value.


[View source]
def self.on_tty_only! #

Makes Colorize.enabled true if and only if both of STDOUT.tty? and STDERR.tty? are true and the tty is not considered a dumb terminal. This is determined by the environment variable called TERM. If TERM=dumb, color won't be enabled. If NO_COLOR contains any value color won't be enabled conforming to https://no-color.org


[View source]
def self.reset(io = STDOUT) #

Resets the color and text decoration of the io.

io = IO::Memory.new
Colorize.with.green.surround(io) do
  io << "green"
  Colorize.reset(io)
  io << " default"
end

[View source]
def self.with : Colorize::Object(String) #

Helper method to use colorize with IO.

io = IO::Memory.new
io << "not-green"
Colorize.with.green.bold.surround(io) do
  io << "green and bold if Colorize.enabled"
end

[View source]