Sha256: 75ef8d1ff1d4b36011a64fb3e8254fb335c6bc0d10f045313b391d9a59397748

Contents?: true

Size: 1.82 KB

Versions: 11

Compression:

Stored size: 1.82 KB

Contents

# Converts ansi formatting codes to html
module Cardio
  module Utils
    # convert ANSI to html
    module Ansi2Html
      def ansi2html data
        data.gsub(/\033\[(?<code>[\d\;]{2,})m(?<content>.*?)\033\[0m/) do
          to_span_tag Regexp.last_match(:code), Regexp.last_match(:content)
        end
      end

      private

      ANSI_COLOR_CODE = {
        0 => "black",
        1 => "red",
        2 => "green",
        3 => "gold",
        4 => "blue",
        5 => "magenta",
        6 => "darkcyan",
        7 => "white"
      }.freeze

      ANSI_BRIGHT_COLOR_CODE = {
        0 => "gray",
        1 => "lightcoral",
        2 => "lightgreen",
        3 => "lightyellow",
        4 => "lightblue",
        5 => "mediumpurple",
        6 => "lightcyan",
        7 => "lightgray"
      }.freeze

      STYLE_MAPPINGS = {
        1 => "font-weight:bold",
        2 => "opacity:0.5",
        3 => "font-style:italic",
        4 => "text-decoration:underline",
        5 => "text-decoration:blink",
        6 => "text-decoration:blink",
        9 => "text-decoration:line-through"
      }.freeze

      def to_span_tag codes, content
        style = codes.split(";")
                     .map(&method(:translate_style_code))
                     .join
        "<span style='#{style}'>#{content}</span>"
      end

      def translate_style_code code
        return STYLE_MAPPINGS[code.to_i] if code.size == 1

        color_code = code[-1].to_i
        property, mapping =
          case code[0..-2]
          when "3"
            ["color", ANSI_COLOR_CODE]
          when "4"
            ["background-color", ANSI_COLOR_CODE]
          when "9"
            ["color", ANSI_BRIGHT_COLOR_CODE]
          when "10"
            ["background-color", ANSI_BRIGHT_COLOR_CODE]
          end
        "#{property}: #{mapping[color_code]}; "
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
card-mod-script-0.18.1 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.18.0 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.17.0 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.16.0 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.15.6 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.15.5 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.15.4 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.15.3 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.15.2.pre1 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.15.1.1 lib/cardio/utils/ansi2_html.rb
card-mod-script-0.15.1 lib/cardio/utils/ansi2_html.rb