class Rbcat::Colorizer

Public Class Methods

colorize(string, predefined: nil, rules: nil, order: nil) click to toggle source
# File lib/rbcat/colorizer.rb, line 9
def self.colorize(string, predefined: nil, rules: nil, order: nil)
  return string if ENV["RBCAT_COLORIZER"] == "false"

  colors = Rbcat::Colors::DEFAULT
  config = create_config(predefined, rules, order)

  config.each_value do |settings|
    if settings[:once]
      string.sub!(settings[:regexp]) do |match|
        colors[settings[:color]] + match + colors[:default]
      end
    elsif settings[:colors]
      string.gsub!(settings[:regexp]) do
        str = ""
        Regexp.last_match.captures.each_with_index do |match, i|
          str << colors[settings[:colors][i]] + match + colors[:default]
        end

        str
      end
    else
      string.gsub!(settings[:regexp]) do |match|
        colors[settings[:color]] + match + colors[:default]
      end
    end
  end

  string
end
print_colors() click to toggle source
uncolorize(string) click to toggle source
# File lib/rbcat/colorizer.rb, line 39
def self.uncolorize(string)
  pattern = /\033\[([0-9]+);([0-9]+)m|\033\[([0-9]+)m/m
  string.gsub(pattern, "")
end

Private Class Methods

create_config(predefined, rules, order) click to toggle source
# File lib/rbcat/colorizer.rb, line 44
                     def self.create_config(predefined, rules, order)
  predefined_rules = predefined ? predefined : Rbcat.configuration&.predefined
  rules ||= Rbcat.configuration&.rules

  raise ConfigurationError, "No config defined." unless predefined_rules || rules
  if rules && rules.class != Hash
    raise ConfigurationError, "Incorrect configuration. " \
      "There is error while converting yaml config into Ruby's hash of rules."
  end

  config = {}
  order ||= Rbcat.configuration&.order || :predefined_first

  case order
  when :predefined_first
    predefined_rules&.each do |group|
      config.merge!(Object.const_get "Rbcat::Rules::#{group.to_s.upcase}")
    end

    rules ? deep_merge(config, rules) : config
  when :predefined_last
    config.merge!(rules) if rules

    predefined_rules&.each do |group|
      config.merge!(Object.const_get "Rbcat::Rules::#{group.to_s.upcase}")
    end

    config
  else
    raise ConfigurationError, "Wrong type of order: #{order}. " \
      "Define :predefined_first (default) or :predefined_last"
  end
end
deep_merge(hash, other_hash) click to toggle source
# File lib/rbcat/colorizer.rb, line 78
                     def self.deep_merge(hash, other_hash)
  other_hash.each_pair do |current_key, other_value|
    this_value = hash[current_key]
    hash[current_key] =
      if this_value.is_a?(Hash) && other_value.is_a?(Hash)
        deep_merge(this_value, other_value)
      else
        other_value
      end
  end

  hash
end