-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

The three rules of Ruby Quiz 2:

1.  Please do not post any solutions or spoiler discussion for this
quiz until 48 hours have passed from the time on this message.

2.  Support Ruby Quiz 2 by submitting ideas as often as you can!
Visit <http://splatbang.com/rubyquiz/>.

3.  Enjoy!

Suggestion:  A [QUIZ] in the subject of emails about the problem
helps everyone on Ruby Talk follow the discussion.  Please reply to
the original quiz message, if you can.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

## AnsiString (#185)


_Quiz description provided by Transfire_

Make a subclass of String (or delegate) that tracks "embedded" ANSI  
codes along with the text. The class should add methods for wrapping  
the text in ANSI codes. Implement as much of the core String API as  
possible. So for example:

    s1 = AnsiString.new("Hi")
    s2 = AnsiString.new("there!)

    s1.red    # wrap text in red/escape ANSI codes
    s1.blue   # wrap text in blue/escape ANSI codes

    s3 = s1 + ' ' + s2  #=> New AnsiString
    s3.to_str           #=> "\e[31mHi\e[0m \e[34mthere!\e[0m"

I have an [ANSICode][1] module (it's in [Facets][2]) that you are  
welcome to provide for the ANSI backend, if desired. It is easy enough  
to use; the literal equivalent of the above would be:

    ANSICode.red('Hi') + ' ' + ANSICode.blue('there!')

Bonus points for being able to use ANSIStrings in a gsub block:

    ansi_string.gsub(pattern){ |s| s.red }


[1]: http://facets.rubyforge.org/doc/api/more/classes/ANSICode.html
[2]: http://facets.rubyforge.org/