From: Robert Klemme Date: 2006-11-06T18:35:07+09:00 Subject: Re: Ugly code - suggestions? 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