Coloring terminal output.

Ary Borenszweig via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Sun Jul 27 07:31:31 PDT 2014


On 7/27/14, 11:16 AM, Ary Borenszweig wrote:
> On 7/13/14, 5:11 PM, yamadapc wrote:
>> Hello all :)
>>
>> I've made a simple port of ruby's colorize library for D.
>> I'd greatly appreciate any feedback. Windows isn't supported,
>> yet.
>>
>> Links:
>> http://code.dlang.org/packages/colorize
>> https://github.com/yamadapc/d-colorize
>> https://github.com/fazibear/colorize
>
> It's nice, but it could be more efficient.
>
> You usually use colors as a one-time shot to then output something to
> the terminal. For example in Ruby it would be:
>
> puts "hello".colorize.red.on_blue
>
> In Ruby it's implemented using regular expressions, very ugly and not
> very performant. In D you implemented it as returning another string
> that contains the format, which allocates a new string that is short lived.
>
> In Crystal we make colorize return a struct that wraps the original
> value but contains the color information. Then when that struct is
> converted to a string it appends the color codes to the output. In
> Crystal there's to_s (similar to toString()) but also to_s(io), which
> subclasses must override to append something to the given IO. That way
> memory allocations are reduced drastically without needing to create
> intermediate strings.
>
> Here's the source code and some specs if you feel like copying this idea:
>
> https://github.com/manastech/crystal/blob/master/src/colorize.cr
> https://github.com/manastech/crystal/blob/master/spec/std/colorize_spec.cr

Also, usually the color is known by the user and not something that is 
put in a variable and later read. So having convenience methods that 
don't do a big case over the color or an enum value is again more 
performant. Something like:

"hello".colorize.red

instead of:

"hello".colorize(fg.red)

which is shorter, more readable *and* more efficient.

You could generate those methods at compile time based on all the colors 
(which is something we do in Crystal too).


More information about the Digitalmars-d-announce mailing list