From a52ba1881305ea585b1978c534e09add9e0df94b Mon Sep 17 00:00:00 2001 From: pvincent Date: Sun, 14 Jan 2024 23:04:16 +0400 Subject: [PATCH] wrapper added --- app/controllers/scores_controller.rb | 1 + lib/formatters/basic_formatter.rb | 24 ++++++++++- lib/formatters/wrapper.rb | 62 ++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 lib/formatters/wrapper.rb diff --git a/app/controllers/scores_controller.rb b/app/controllers/scores_controller.rb index 2068852..441f8a2 100644 --- a/app/controllers/scores_controller.rb +++ b/app/controllers/scores_controller.rb @@ -11,6 +11,7 @@ class ScoresController < ApplicationController logger.debug 'this is a debug message' logger.fatal 'FATAL' logger.info @scores.inspect + logger.info File.basename($0) end # GET /scores/1 diff --git a/lib/formatters/basic_formatter.rb b/lib/formatters/basic_formatter.rb index 41c8f89..e052e51 100644 --- a/lib/formatters/basic_formatter.rb +++ b/lib/formatters/basic_formatter.rb @@ -1,7 +1,12 @@ +require_relative 'wrapper' +require 'io/console' + # Opinioned Rails custom formatter class BasicFormatter < SemanticLogger::Formatters::Color NAME_MAX_SIZE = 25 + FOREMAN_PREFIX = 15 CONTENT_PREFIX = ' '.freeze + WRAP_PREFIX = ' > '.freeze ANSI_DEBUG = "\e[90m".freeze ANSI_INFO = SemanticLogger::AnsiColors::GREEN @@ -48,6 +53,10 @@ class BasicFormatter < SemanticLogger::Formatters::Color message.rstrip! message += "\n" unless message.starts_with?('Completed 5') end + + wrap_length = IO.console.winsize[1] - FOREMAN_PREFIX - before_message.length + CONTENT_PREFIX.length + 12 + message = Wrapper.wrap("#{CONTENT_COLOR_MAP[log.level]}#{message.lstrip}", before_message(true), wrap_length) + "#{CONTENT_COLOR_MAP[log.level]}#{message}#{color_map.clear}" end @@ -79,8 +88,15 @@ class BasicFormatter < SemanticLogger::Formatters::Color private - def before_message - [name, level, tags, named_tags, duration, CONTENT_PREFIX].compact.join(' ') + def before_message(wrapped = false) + result = [name, level, tags, named_tags, duration, CONTENT_PREFIX].compact.join(' ') + if wrapped + [name, level, tags, named_tags, duration, + "#{color}#{WRAP_PREFIX}#{color_map.clear}"].compact.join(' ') + else + [name, level, tags, named_tags, duration, + CONTENT_PREFIX].compact.join(' ') + end end def backtrace(stack) @@ -88,4 +104,8 @@ class BasicFormatter < SemanticLogger::Formatters::Color "\n#{before_message} #{ANSI_ERROR}↳ #{stack.join("\n#{before_message} #{ANSI_ERROR}↳ ")}#{color_map.clear}" end + + def color_content + color + end end diff --git a/lib/formatters/wrapper.rb b/lib/formatters/wrapper.rb new file mode 100644 index 0000000..0ae5f81 --- /dev/null +++ b/lib/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