Robert Klemme
11/6/2006 9:33:00 AM
On 05.11.2006 22:13, Gabriele Marrone wrote:
> Hello!
>
> I'm writing an ANSI color codes parser which gets a string with text and
> ANSI color codes and outputs an array with substrings and numbers of the
> color codes.
> A color code is something like "\e[31m". Generally, I assume (am I
> wrong?) they match /\e\[(\d+)(;\d+)*m/.
>
> Here is what I came up with:
>
>
> module ANSIParser
> def self.ansi_to_array(str)
> str = str.to_s
> ret = []
> while ((m = /\e\[(\d+)(;\d+)*m/.match(str)))
> ret << m.pre_match if m.pre_match != ""
> ret += m[0].scan(/\d+/).map { |c| c.to_i }
> str = m.post_match
> end
> ret << str if str != ""
> return ret
> end
> end
>
> # TEST:
> ansistr = "\e[31mred,\e[32;1m\e[32;1mbold green\e[33;32;31mred anyway,
> still bold\e[33;32;31m"
>
> puts ansistr # you should see colors if your terminal supports ANSI escapes
> puts ANSIParser::ansi_to_array(ansistr).inspect
>> ansistr = "\e[31mred,\e[32;1m\e[32;1mbold green\e[33;32;31mred
anyway, still bold\e[33;32;31m"
=> "\e[31mred,\e[32;1m\e[32;1mbold green\e[33;32;31mred anyway, still
bold\e[33;32;31m"
>> ansistr.split(%r{(\e\[\d+(?:;\d+)*m)}).inject([]) do |arr, s|
?> case s
>> when ""
>> arr
>> when %r{^\e}
>> arr.concat( s.scan( /\d+/ ).map {|x| x.to_i} )
>> else
?> arr << s
>> end
>> end
=> [31, "red,", 32, 1, 32, 1, "bold green", 33, 32, 31, "red anyway,
still bold", 33, 32, 31]
Kind regards
robert