Skip to content
Open

Logs #29

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions lib/log_collection.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
module Input
class Log
attr_reader :count

def initialize(text, line_parser, color = 0xffffff)
@line_parser = line_parser
@line_collection = @line_parser.perform_word_wrap(text, @w)

@count = 1
end

def to_s
@line_collection.to_s
end

def ==(log)
log.is_a?(String) ? to_s == log : to_s == log.to_s
end

def another!
count += 1
end
end

class LogCollection
attr_reader :logs

include Enumerable

def initialize(logs = [])
@logs = logs
end

def each
@logs.each { |log| yield(log) }
end

def length
@logs.length
end

def [](num)
@logs[num]
end

def first
@logs.first
end

def last
@logs.last
end

def <<(log)
if last == log
last.another!
else
@logs.append(log)
end
self
end

def empty?
@logs.empty?
end

def replace(old_logs, new_logs)
@logs = (@logs[0, old_logs.first.number] || []) + new_logs.logs + (@logs[old_logs.last.number + 1, @logs.length] || [])

i = new_logs.last.number
l = @logs.length
s = new_logs.last.end
while (i += 1) < l
log = @logs[i]
log.number = i
log.start = s
s = log.end
end
end

def modified(from_index, to_index)
to_index, from_index = from_index, to_index if from_index > to_index
log = log_at(from_index)
modified_logs = []
i = log.number
loop do
modified_logs << log
break unless log.end < to_index || log.wrapped?

log = @logs[i += 1]
end

logCollection.new(modified_logs)
end

def text
@logs.map(&:text).join
end

def log_at(index)
@logs.detect { |log| index <= log.end } || @logs.last
end

def inspect
@logs.map(&:inspect)
end
end
end
56 changes: 56 additions & 0 deletions lib/value.rb
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,60 @@ def reflow(w, font_style)
@lines = @line_parser.perform_word_wrap(@lines.text, w, 0, 0, font_style)
end
end

class LogValue
def initialize(text, word_wrap_chars, crlf_chars, w, font_style:)
@w = w
@line_parser = LineParser.new(word_wrap_chars, crlf_chars, font_style: font_style)
@lines = @line_parser.perform_word_wrap(text, @w)
end

def to_s
@lines.text
end

def length
@lines.last.end
end

def empty?
@lines.last.end == 0
end

def insert(from, to, text) # rubocop:disable Metrics/AbcSize
modified_lines = @lines.modified(from, to)
original_value = modified_lines.text
first_modified_line = modified_lines.first
original_index = first_modified_line.start
modified_value = original_value[0, from - original_index].to_s + text + original_value[to - original_index, original_value.length].to_s
new_lines = @line_parser.perform_word_wrap(modified_value, @w, first_modified_line.number, original_index)

@lines.replace(modified_lines, new_lines)
end

def index(text)
@lines.text.index(text)
end

def rindex(text)
@lines.text.rindex(text)
end

def slice(from, length = 1)
@lines.text.slice(from, length)
end
alias [] slice

def replace(text)
@lines = @line_parser.perform_word_wrap(text, @w)
end

def reflow(w, font_style)
return if @w == w && @font_style == font_style

@w = w
@font_style = font_style
@lines = @line_parser.perform_word_wrap(@lines.text, w, 0, 0, font_style)
end
end
end
Loading