Coloring terminal output.

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


On 7/27/14, 11:31 AM, Ary Borenszweig wrote:
> 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).

Finally, don't restrict "colorize" to a string. You could colorize any 
object:

# works, without converting [1, 2, 3] to a string
puts [1, 2, 3].colorize.red


More information about the Digitalmars-d-announce mailing list