You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

62 lines
1.4 KiB

class Wrapper
def self.wrap(text, prefix = ' > ', length = 80)
pure = ''
ansi_code = {}
while (md = text.match(/\e\[\d+;?\d*m/))
pos = md.begin(0) + pure.length
pure += md.pre_match
text = md.post_match
append_in_hash(ansi_code, pos, md.match(0))
end
pure += text
offset = 0
ansi_extra = {}
rows = pure.length / length
last_code = nil
rows.times do |i|
pos = (i + 1) * length
last_code = last_ansi_by_range(ansi_code, last_code, offset, pos)
if last_code
append_in_hash(ansi_extra, pos, "\e[0m\n#{prefix}#{last_code}")
elsif pos < pure.length
append_in_hash(ansi_extra, pos, "\n#{prefix}")
end
offset = pos + 1
end
ansi_extra.each_pair do |k, v|
append_in_hash(ansi_code, k, v.first)
end
ansi_code = ansi_code.sort
final = pure
offset = 0
ansi_code.each do |k, v|
insert_text = v.join
final = final.insert(k + offset, insert_text)
offset += insert_text.length
end
final
end
def self.last_ansi_by_range(ansi_code, last_code, offset, pos)
pos.downto(offset) do |i|
next unless ansi_code.has_key?(i)
result = ansi_code[i].last
result = nil if result == "\e[0m"
return result
end
last_code
end
def self.append_in_hash(hash, key, value)
if hash.has_key?(key)
hash[key] << value
else
hash[key] = [value]
end
end
end