Add coloring to strings

This commit is contained in:
Eric Budd 2018-03-30 18:27:54 -04:00
parent f8177eee9a
commit 5d1db27aca
2 changed files with 66 additions and 1 deletions

37
iris.rb
View File

@ -57,6 +57,39 @@ require 'readline'
# require 'pry' # Only needed for debugging
class String
COLOR_MAP = {
'n' => '0',
'i' => '1',
'u' => '4',
'v' => '7',
'r' => '31',
'g' => '32',
'y' => '33',
'b' => '34',
'm' => '35',
'c' => '36',
'w' => '37',
}
COLOR_RESET = "\033[0m"
def color_token
return COLOR_RESET if self == '}'
tag = self.scan(/\w/).map{ |t| COLOR_MAP[t] }.sort.join(';')
"\033[#{tag}m"
end
def colorize
r = /{[rgybmcwniuv]+\s|}/
split = self.split(r, 2)
return self if r.match(self).nil?
newstr = split.first + $&.color_token + split.last
return (newstr + COLOR_RESET) if r.match(newstr).nil?
newstr.colorize
end
def wrapped(width = Display::WIDTH)
self.gsub(/.{1,#{width}}(?:\s|\Z|\-)/){($& + 5.chr).gsub(/\n\005/,"\n").gsub(/\005/,"\n")}
end
@ -391,7 +424,8 @@ class Display
end
def self.say(stuff = '')
puts stuff
stuff = stuff.join("\n") if stuff.is_a? Array
puts stuff.colorize
end
def self.topic_index_width
@ -718,3 +752,4 @@ class Startupper
end
Startupper.new(ARGV) if __FILE__==$0

View File

@ -304,3 +304,33 @@ describe Startupper do
end
end
end
describe 'colorizing' do
let(:color_string) {
"
RED {r normal}\t{ri intense}\t{ru underline}\t{riu intense underline}
{rv reverse}\t{riv intense}\t{ruv underline}\t{riuv intense underline}
GREEN {g normal}\t{gi intense}\t{ug underline}\t{uig intense underline}
{gv reverse}\t{giv intense}\t{ugv underline}\t{uigv intense underline}
YELLOW {y normal}\t{yi intense}\t{yu underline}\t{yiu intense underline}
{yv reverse}\t{yiv intense}\t{yuv underline}\t{yiuv intense underline}
BLUE {b normal}\t{bi intense}\t{bu underline}\t{biu intense underline}
{bv reverse}\t{biv intense}\t{buv underline}\t{biuv intense underline}
MAGENTA {m normal}\t{mi intense}\t{mu underline}\t{miu intense underline}
{mv reverse}\t{miv intense}\t{muv underline}\t{miuv intense underline}
CYAN {c normal}\t{ci intense}\t{cu underline}\t{ciu intense underline}
{cv reverse}\t{civ intense}\t{cuv underline}\t{ciuv intense underline}
WHITE {w normal}\t{wi intense}\t{wu underline}\t{wiu intense underline}
{wv reverse}\t{wiv intense}\t{wuv underline}\t{wiuv intense underline}
"
}
it 'produces the expected output' do
# color_string.split("\n")[1].colorize.must_equal "\n RED \e[31mnormal\e[0m\t\e[1;31mintense\e[0m\t\e[31;4munderline\e[0m\t\e[1;31;4mintense underline\e[0m\n \e[31;7mreverse\e[0m\t\e[1;31;7mintense\e[0m\t\e[31;4;7munderline\e[0m\t\e[1;31;4;7mintense underline\e[0m\n GREEN \e[32mnormal\e[0m\t\e[1;32mintense\e[0m\t\e[32;4munderline\e[0m\t\e[1;32;4mintense underline\e[0m\n \e[32;7mreverse\e[0m\t\e[1;32;7mintense\e[0m\t\e[32;4;7munderline\e[0m\t\e[1;32;4;7mintense underline\e[0m\n YELLOW \e[33mnormal\e[0m\t\e[1;33mintense\e[0m\t\e[33;4munderline\e[0m\t\e[1;33;4mintense underline\e[0m\n \e[33;7mreverse\e[0m\t\e[1;33;7mintense\e[0m\t\e[33;4;7munderline\e[0m\t\e[1;33;4;7mintense underline\e[0m\n BLUE \e[34mnormal\e[0m\t\e[1;34mintense\e[0m\t\e[34;4munderline\e[0m\t\e[1;34;4mintense underline\e[0m\n \e[34;7mreverse\e[0m\t\e[1;34;7mintense\e[0m\t\e[34;4;7munderline\e[0m\t\e[1;34;4;7mintense underline\e[0m\n MAGENTA \e[35mnormal\e[0m\t\e[1;35mintense\e[0m\t\e[35;4munderline\e[0m\t\e[1;35;4mintense underline\e[0m\n \e[35;7mreverse\e[0m\t\e[1;35;7mintense\e[0m\t\e[35;4;7munderline\e[0m\t\e[1;35;4;7mintense underline\e[0m\n CYAN \e[36mnormal\e[0m\t\e[1;36mintense\e[0m\t\e[36;4munderline\e[0m\t\e[1;36;4mintense underline\e[0m\n \e[36;7mreverse\e[0m\t\e[1;36;7mintense\e[0m\t\e[36;4;7munderline\e[0m\t\e[1;36;4;7mintense underline\e[0m\n WHITE \e[37mnormal\e[0m\t\e[1;37mintense\e[0m\t\e[37;4munderline\e[0m\t\e[1;37;4mintense underline\e[0m\n \e[37;7mreverse\e[0m\t\e[1;37;7mintense\e[0m\t\e[37;4;7munderline\e[0m\t\e[1;37;4;7mintense underline\e[0m\n \e[0m"
color_string.split("\n")[1].colorize.must_equal " RED \e[31mnormal\e[0m\t\e[1;31mintense\e[0m\t\e[31;4munderline\e[0m\t\e[1;31;4mintense underline\e[0m\e[0m"
end
it 'returns an empty string when provided an empty string' do
''.colorize.must_equal ''
end
end