04 Jul, 2009, Runter wrote in the 1st comment:
Votes: 0
This is a fairly good way of parsing and replacing with color codes. Also, removes redundant color codes such as: "#r#r#rstring" to "#rstring".
I think it could be applied to just about any codebase. Improvements or suggestions welcome. Here's a profile of 1001 iterations on "#rH#re#Rll#go#n#rT#rh#Re#n"

color_table = {
"#z" => "\e

color_table = {
"#z" => "\e[2;30m",
"#Z" => "\e[1;30m",
"#r" => "\e[2;31m",
"#R" => "\e[1;31m",
"#g" => "\e[2;32m",
"#G" => "\e[1;32m",
"#y" => "\e[2;33m",
"#Y" => "\e[1;33m",
"#b" => "\e[2;34m",
"#B" => "\e[1;34m",
"#m" => "\e[2;35m",
"#M" => "\e[1;35m",
"#c" => "\e[2;36m",
"#C" => "\e[1;36m",
"#w" => "\e[2;37m",
"#W" => "\e[1;37m",
"#n" => "\e[0m",
}


$comp_tab = []
### compiles a table of values
$color_table.each_key do |k|
$comp_tab << k
end
$comp_tab = Regexp.union(*$comp_tab)

def parse_color(data)
last_code = nil
data.gsub($comp_tab) do |s|
if last_code != nil && last_code.eql?(s)
""
else
last_code = s
$color_table[s]
end
end
end


line = "#rH#re#Rll#go#n#rT#rh#Re#n"

puts parse_color line

1000.times do
parse_color(line)
end
[/code]

[quote]
% cumulative self self total
time seconds seconds calls ms/call ms/call name
51.11 0.23 0.23 1001 0.23 0.41 String#gsub
28.89 0.36 0.13 9009 0.01 0.02 BasicObject#!=
6.67 0.39 0.03 8008 0.00 0.00 String#==
4.44 0.41 0.02 1 20.00 440.00 Integer#times
2.22 0.42 0.01 1001 0.01 0.42 Object#parse_color
2.22 0.43 0.01 1001 0.01 0.01 BasicObject#==
2.22 0.44 0.01 8008 0.00 0.00 String#eql?
0.00 0.44 0.00 7007 0.00 0.00 Hash#[]
[/quote]
04 Jul, 2009, Chris Bailey wrote in the 2nd comment:
Votes: 0
Thief, thief! You stole my code! =)

No really though, it works beautifully.
04 Jul, 2009, Scandum wrote in the 3rd comment:
Votes: 0
\e\e[2; should be \e[22;

Or to be compliant with all color terminals: \e[0;
04 Jul, 2009, kiasyn wrote in the 4th comment:
Votes: 0
Scandum said:
\e\e[2; should be \e[22;

Or to be compliant with all color terminals: \e[0;[/quote]


source?
04 Jul, 2009, Runter wrote in the 5th comment:
Votes: 0
Also, Chris made the table. So he gets the credit for anything wrong with it. ;)
04 Jul, 2009, Tyche wrote in the 6th comment:
Votes: 0
kiasyn said:
Scandum said:
\e\e[2; should be \e[22;

Or to be compliant with all color terminals: \e[0;[/quote]


source?[/quote]

1) ECMA-48
2) personal experience.

While it's possible that faint (2), bold (1) and normal (22) colors are all supported, I've not seen a terminal program that's default (0) wasn't normal color, although I believe one you could configure to swap normal/bold.
So I decided in TeensyMud to use default (0) and bold (1) and all of the clients I tested support that.
04 Jul, 2009, Runter wrote in the 7th comment:
Votes: 0
Smells good to me.
05 Jul, 2009, Scandum wrote in the 8th comment:
Votes: 0
\e\e[2m isn't supported by rxvt and PuTTY.

One interesting alternative is to use \e[30m to \e[37m for dim, and \e[90m to \e97m for bold. Most terminal emulators seem to support this, but I'm not sure about mud clients.

I created a brief article on colors some weeks ago: http://mudwiki.org/wiki/ANSI_color
05 Jul, 2009, Chris Bailey wrote in the 9th comment:
Votes: 0
I had originally used \eI had originally used \e[30m - \e[90m but actually decided to change it for compatibility reasons. I thought the way I did it was the most widely accepted. I know little to nothing about this though.
05 Jul, 2009, kiasyn wrote in the 10th comment:
Votes: 0
require 'towers_ext'

str = "
[black] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[blue] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[cyan] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[dark blue] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis
dapibus interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur
sagittis lorem a pretium. Praesent a libero turpis, ut.
[dark cyan] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis
dapibus interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur
sagittis lorem a pretium. Praesent a libero turpis, ut.
[dark green] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis
dapibus interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur
sagittis lorem a pretium. Praesent a libero turpis, ut.
[dark grey] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis
dapibus interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur
sagittis lorem a pretium. Praesent a libero turpis, ut.
[dark red] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[green] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[grey] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[orange] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[pink] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[purple] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[red] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[white] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
[yellow] Pellentesque varius urna eget nibh ullamcorper dignissim. Pellentesque ullamcorper neque eu turpis dapibus
interdum id sit amet tortor. Ut nunc quam, pretium et tempus eu, sagittis ac mauris. Quisque consectetur sagittis
lorem a pretium. Praesent a libero turpis, ut.
"

30000.times do
output = TowersEXT::Colour.parse_colours(str)
end


[s]  %   cumulative   self              self     total
time seconds seconds calls ms/call ms/call name
70.27 0.26 0.26 30000 0.01 0.01 TowersEXT::Colour#parse_colours
29.73 0.37 0.11 1 110.00 370.00 Integer#times
0.00 0.37 0.00 1 0.00 0.00 Kernel.require
0.00 0.37 0.00 2 0.00 0.00 BasicObject#singleton_method_added
0.00 0.37 0.00 1 0.00 0.00 Class#inherited
0.00 0.37 0.00 2 0.00 0.00 IO#set_encoding
0.00 0.37 0.00 1 0.00 370.00 #toplevel
05 Jul, 2009, Tyche wrote in the 11th comment:
Votes: 0
If you want to get timings for the function itself you can use Benchmark

Quote
$ ruby colors2.rb
HelloThe
Rehearsal ———————————————-
using gsub 0.078000 0.000000 0.078000 ( 0.063000)
————————————- total: 0.078000sec

user system total real
using gsub 0.047000 0.000000 0.047000 ( 0.048000)


Shortened it up a little.
require 'benchmark'

$color_table = {
"#z" => "\e
require 'benchmark'

$color_table = {
"#z" => "\e[2;30m",
"#Z" => "\e[1;30m",
"#r" => "\e[2;31m",
"#R" => "\e[1;31m",
"#g" => "\e[2;32m",
"#G" => "\e[1;32m",
"#y" => "\e[2;33m",
"#Y" => "\e[1;33m",
"#b" => "\e[2;34m",
"#B" => "\e[1;34m",
"#m" => "\e[2;35m",
"#M" => "\e[1;35m",
"#c" => "\e[2;36m",
"#C" => "\e[1;36m",
"#w" => "\e[2;37m",
"#W" => "\e[1;37m",
"#n" => "\e[0m",
}

$comp_tab = Regexp.union *$color_table.keys

def parse_color(data)
last_code = nil
data.gsub($comp_tab) do |s|
if last_code != nil && last_code.eql?(s)
""
else
last_code = s
$color_table[s]
end
end
end

line = "#rH#re#Rll#go#n#rT#rh#Re#n"

puts parse_color line

Benchmark.bmbm do |x|
x.report("using gsub") { 1000.times do; parse_color(line); end }
end
[/code]
05 Jul, 2009, Runter wrote in the 12th comment:
Votes: 0
I guess I'll mention that Kiasyn's solution is actually in C. Hard to compare the two.
15 Jul, 2009, quixadhal wrote in the 13th comment:
Votes: 0
Quick suggestion… you might want to add '##' as an escape for a single '#', in case someone wanted to print something like "#######\n#COOL!#\n#######" for some silly reason.

Or any other escape of your choice, of course… just something so you can generate one of the above tokens without having it get turned into ANSI codes if you really wanted it to be text.
15 Jul, 2009, Scandum wrote in the 14th comment:
Votes: 0
It'd be better to go with tintin color codes since they easily upgrade to xterm 256 color codes.

http://www.mudbytes.net/index.php?a=file...
17 Jul, 2009, kiasyn wrote in the 15th comment:
Votes: 0
what
17 Jul, 2009, quixadhal wrote in the 16th comment:
Votes: 0
Scandum said:
It'd be better to go with tintin color codes since they easily upgrade to xterm 256 color codes.
http://www.mudbytes.net/index.php?a=file...


tintin is a mud CLIENT, and has no business knowing anything about the internal colour codes any given mud SERVER uses. As far as a client is concerned, all colour codes should be various terminal escape sequences, since unless they've been translated to an output format, they aren't meant to be fiddled with as anything other than text. Doing so would break OLC editors, since you'd have no way to display the non-converted code sequences.

As for being "easily extendable", just about any coherent system is. In this case…. #xNNN would be simple /#x\d{1,3}/.
0.0/16