pvincent
10 months ago
3 changed files with 85 additions and 2 deletions
-
1app/controllers/scores_controller.rb
-
24lib/formatters/basic_formatter.rb
-
62lib/formatters/wrapper.rb
@ -0,0 +1,62 @@ |
|||||
|
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 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue