Module: Snibbets::Color
Overview
Terminal output color functions.
Constant Summary collapse
- ESCAPE_REGEX =
/(?<=\[)(?:(?:(?:[349]|10)[0-9]|[0-9])?;?)+(?=m)/.freeze
- ATTRIBUTES =
All available color names. Available as methods and string extensions.
[ [:clear, 0], # String#clear is already used to empty string in Ruby 1.9 [: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 [:strike, 9], # not widely implemented [:black, 30], [:red, 31], [:green, 32], [:yellow, 33], [:blue, 34], [:magenta, 35], [:purple, 35], [:cyan, 36], [:white, 37], [:bgblack, 40], [:bgred, 41], [:bggreen, 42], [:bgyellow, 43], [:bgblue, 44], [:bgmagenta, 45], [:bgpurple, 45], [:bgcyan, 46], [:bgwhite, 47], [:boldblack, 90], [:boldred, 91], [:boldgreen, 92], [:boldyellow, 93], [:boldblue, 94], [:boldmagenta, 95], [:boldpurple, 95], [:boldcyan, 96], [:boldwhite, 97], [:boldbgblack, 100], [:boldbgred, 101], [:boldbggreen, 102], [:boldbgyellow, 103], [:boldbgblue, 104], [:boldbgmagenta, 105], [:boldbgpurple, 105], [:boldbgcyan, 106], [:boldbgwhite, 107], [:softpurple, '0;35;40'], [:hotpants, '7;34;40'], [:knightrider, '7;30;40'], [:flamingo, '7;31;47'], [:yeller, '1;37;43'], [:whiteboard, '1;30;47'], [:chalkboard, '1;37;40'], [:led, '0;32;40'], [:redacted, '0;30;40'], [:alert, '1;31;43'], [:error, '1;37;41'], [:default, '0;39'] ].map(&:freeze).freeze
- ATTRIBUTE_NAMES =
ATTRIBUTES.transpose.first
Class Attribute Summary collapse
-
.coloring ⇒ Object
Enables colored output.
Class Method Summary collapse
-
.coloring? ⇒ Boolean
Returns true if the coloring function of this module is switched on, false otherwise.
-
.template(input) ⇒ String
Convert a template string to a colored string.
Instance Method Summary collapse
-
#attributes ⇒ Object
Returns an array of all Snibbets::Color attributes as symbols.
- #rgb(hex) ⇒ Object
-
#support?(feature) ⇒ Boolean
Returns true if Snibbets::Color supports the
feature
. -
#uncolor(string = nil) ⇒ Object
Returns an uncolored version of the string, that is all ANSI-sequences are stripped from the string.
Class Attribute Details
.coloring ⇒ Object
Enables colored output
211 212 213 |
# File 'lib/snibbets/colors.rb', line 211 def coloring @coloring ||= true end |
Class Method Details
.coloring? ⇒ Boolean
Returns true if the coloring function of this module is switched on, false otherwise.
200 201 202 |
# File 'lib/snibbets/colors.rb', line 200 def coloring? @coloring end |
.template(input) ⇒ String
Convert a template string to a colored string. Colors are specified with single letters inside curly braces. Uppercase changes background color.
w: white, k: black, g: green, l: blue, y: yellow, c: cyan, m: magenta, r: red, b: bold, u: underline, i: italic, x: reset (remove background, color, emphasis)
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/snibbets/colors.rb', line 234 def template(input) input = input.join(' ') if input.is_a? Array fmt = input.gsub(/%/, '%%') fmt = fmt.gsub(/(?<!\\u|\$)\{(\w+)\}/i) do Regexp.last_match(1).split('').map { |c| "%<#{c}>s" }.join('') end colors = { w: white, k: black, g: green, l: blue, y: yellow, c: cyan, m: magenta, r: red, W: bgwhite, K: bgblack, G: bggreen, L: bgblue, Y: bgyellow, C: bgcyan, M: bgmagenta, R: bgred, d: dark, b: bold, u: underline, i: italic, x: reset } fmt.empty? ? input : format(fmt, colors) end |
Instance Method Details
#attributes ⇒ Object
Returns an array of all Snibbets::Color attributes as symbols.
324 325 326 |
# File 'lib/snibbets/colors.rb', line 324 def attributes ATTRIBUTE_NAMES end |
#rgb(hex) ⇒ Object
296 297 298 299 300 301 302 303 304 305 306 307 |
# File 'lib/snibbets/colors.rb', line 296 def rgb(hex) is_bg = hex.match(/^bg?#/) ? true : false hex_string = hex.sub(/^([fb]g?)?#/, '') parts = hex_string.match(/(?<r>..)(?<g>..)(?<b>..)/) t = [] %w[r g b].each do |e| t << parts[e].hex end color = "\e[#{is_bg ? '48' : '38'};2;#{t.join(';')}m" end |
#support?(feature) ⇒ Boolean
Returns true if Snibbets::Color supports the feature
.
The feature :clear, that is mixing the clear color attribute into String, is only supported on ruby implementations, that do not already implement the String#clear method. It’s better to use the reset color attribute instead.
100 101 102 103 104 105 |
# File 'lib/snibbets/colors.rb', line 100 def support?(feature) case feature when :clear !String.instance_methods(false).map(&:to_sym).include?(:clear) end end |
#uncolor(string = nil) ⇒ Object
Returns an uncolored version of the string, that is all ANSI-sequences are stripped from the string.
311 312 313 314 315 316 317 318 319 320 321 |
# File 'lib/snibbets/colors.rb', line 311 def uncolor(string = nil) # :yields: if block_given? yield.to_str.gsub(ESCAPE_REGEX, '') elsif string.respond_to?(:to_str) string.to_str.gsub(ESCAPE_REGEX, '') elsif respond_to?(:to_str) to_str.gsub(ESCAPE_REGEX, '') else '' end end |