discourse/lib/content_buffer.rb

65 lines
1.4 KiB
Ruby
Raw Normal View History

2013-03-06 01:52:24 -06:00
# this class is used to track changes to an arbitrary buffer
2013-02-05 13:16:51 -06:00
class ContentBuffer
def initialize(initial_content)
@initial_content = initial_content
@lines = @initial_content.split("\n")
end
def apply_transform!(transform)
start_row = transform[:start][:row]
start_col = transform[:start][:col]
finish_row = transform[:finish][:row] if transform[:finish]
finish_col = transform[:finish][:col] if transform[:finish]
text = transform[:text]
if transform[:operation] == :delete
2013-02-25 10:42:20 -06:00
# fix first line
l = @lines[start_row]
2013-02-05 13:16:51 -06:00
l = l[0...start_col]
2013-02-25 10:42:20 -06:00
2013-02-05 13:16:51 -06:00
if (finish_row == start_row)
l << @lines[start_row][finish_col..-1]
@lines[start_row] = l
return
end
@lines[start_row] = l
2013-02-25 10:42:20 -06:00
# remove middle lines
(finish_row - start_row).times do
2013-02-05 13:16:51 -06:00
l = @lines.delete_at start_row + 1
end
2013-02-25 10:42:20 -06:00
# fix last line
2013-02-05 13:16:51 -06:00
@lines[start_row] << @lines[finish_row][finish_col-1..-1]
end
if transform[:operation] == :insert
2013-02-25 10:42:20 -06:00
2013-02-05 13:16:51 -06:00
@lines[start_row].insert(start_col, text)
2013-02-25 10:42:20 -06:00
2013-02-05 13:16:51 -06:00
split = @lines[start_row].split("\n")
2013-02-25 10:42:20 -06:00
2013-02-05 13:16:51 -06:00
if split.length > 1
@lines[start_row] = split[0]
i = 1
split[1..-2].each do |line|
@lines.insert(start_row + i, line)
i += 1
end
@lines.insert(i, "") unless @lines.length > i
@lines[i] = split[-1] + @lines[i]
end
end
end
def to_s
@lines.join("\n")
end
end