module RSpec::Buildkite::Recolorizer

Public Instance Methods

recolorize(string) click to toggle source

Re-color an ANSI-colorized string using terminal CSS classes: github.com/buildkite/terminal/blob/05a77905c468b9150cac41298fdb8a0735024d42/style.go#L34

# File lib/rspec/buildkite/recolorizer.rb, line 7
def recolorize(string)
  level = 0
  string.gsub(/\e\[(\d+(?:;\d+)*)m/) do
    "".tap do |buffer|
      codes = $1.split(";").map(&:to_i)

      classes = []
      while code = codes.shift
        case code
        when 0
          classes.clear
          buffer << ("</span>" * level)
          level = 0
        when 1..5, 9, 30..37
          classes << "term-fg#{code}"
        when 38
          if codes[0] == 5
            codes.shift
            if codes[0]
              classes << "term-fgx#{codes.shift}"
            end
          end
        when 40..47
          classes << "term-bg#{code}"
        when 48
          if codes[0] == 5
            codes.shift
            if codes[0]
              classes << "term-bgx#{codes.shift}"
            end
          end
        when 90..97
          classes << "term-fgi#{code}"
        when 100..107
          classes << "term-bgi#{code}"
        end
      end

      if classes.any?
        level += 1
        buffer << %{<span class=#{classes.map { |klass| klass }.join(" ").encode(:xml => :attr)}>}
      end
    end
  end << ("</span>" * level)
end