From b8633d83d19e89d6c292a871918f753987185c6e Mon Sep 17 00:00:00 2001 From: Marc Heiligers Date: Sun, 9 Feb 2025 11:34:51 -0700 Subject: [PATCH] WIP --- lib/log_collection.rb | 108 ++++++++++++++++++++++++++++++++++++++++++ lib/value.rb | 56 ++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 lib/log_collection.rb diff --git a/lib/log_collection.rb b/lib/log_collection.rb new file mode 100644 index 0000000..64645de --- /dev/null +++ b/lib/log_collection.rb @@ -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 diff --git a/lib/value.rb b/lib/value.rb index 14e851c..96e77db 100644 --- a/lib/value.rb +++ b/lib/value.rb @@ -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