term-ansicolor 1.7.1 → 1.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.all_images.yml +27 -0
- data/.gitignore +1 -0
- data/.utilsrc +26 -0
- data/README.md +5 -3
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/bin/term_colortab +27 -1
- data/bin/term_display +5 -3
- data/bin/term_mandel +30 -24
- data/bin/term_snow +13 -13
- data/examples/example.rb +31 -1
- data/lib/term/ansicolor/attribute/color256.rb +38 -36
- data/lib/term/ansicolor/attribute/color8.rb +16 -16
- data/lib/term/ansicolor/attribute/intense_color8.rb +32 -34
- data/lib/term/ansicolor/attribute/text.rb +18 -15
- data/lib/term/ansicolor/attribute/underline.rb +34 -0
- data/lib/term/ansicolor/attribute.rb +86 -45
- data/lib/term/ansicolor/hsl_triple.rb +2 -2
- data/lib/term/ansicolor/hyperlink.rb +34 -0
- data/lib/term/ansicolor/ppm_reader.rb +9 -4
- data/lib/term/ansicolor/rgb_triple.rb +1 -3
- data/lib/term/ansicolor/version.rb +1 -1
- data/lib/term/ansicolor.rb +46 -42
- data/term-ansicolor.gemspec +16 -29
- data/tests/ansicolor_test.rb +69 -2
- data/tests/attribute_test.rb +45 -6
- data/tests/hsl_triple_test.rb +2 -2
- data/tests/hyperlink_test.rb +58 -0
- data/tests/ppm_reader_test.rb +8 -0
- data/tests/rgb_triple_test.rb +1 -1
- metadata +50 -15
- data/.travis.yml +0 -15
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            module Term
         | 
| 2 | 
            +
              module ANSIColor
         | 
| 3 | 
            +
                class Attribute
         | 
| 4 | 
            +
                  module Underline
         | 
| 5 | 
            +
                    Attribute.set :underline,  4, skip_definition: true
         | 
| 6 | 
            +
                    Attribute.set :underscore, 4, skip_definition: true # synonym for :underline
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    def underline(string = nil, color: nil, type: nil, &block)
         | 
| 9 | 
            +
                      code = {
         | 
| 10 | 
            +
                        nil =>   4,
         | 
| 11 | 
            +
                        default: '4:1',
         | 
| 12 | 
            +
                        double:  '4:2',
         | 
| 13 | 
            +
                        curly:   '4:3',
         | 
| 14 | 
            +
                        dotted:  '4:4',
         | 
| 15 | 
            +
                        dashed:  '4:5',
         | 
| 16 | 
            +
                      }.fetch(type) { raise ArgumentError, "invalid line type" }
         | 
| 17 | 
            +
                      if color
         | 
| 18 | 
            +
                        a = Term::ANSIColor::Attribute[color]
         | 
| 19 | 
            +
                        color_code =
         | 
| 20 | 
            +
                          if rgb = a.ask_and_send(:to_rgb_triple).full?(:to_a)
         | 
| 21 | 
            +
                            "\e[58;2;#{rgb * ?;}"
         | 
| 22 | 
            +
                          else
         | 
| 23 | 
            +
                            raise ArgumentError, "invalid color #{a&.name.inspect}"
         | 
| 24 | 
            +
                          end
         | 
| 25 | 
            +
                        code = "#{code}m#{color_code}"
         | 
| 26 | 
            +
                      end
         | 
| 27 | 
            +
                      apply_code(code, string, &block)
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    alias underscore underline
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -3,42 +3,45 @@ module Term | |
| 3 3 | 
             
                class Attribute
         | 
| 4 4 | 
             
                  @__store__ = {}
         | 
| 5 5 |  | 
| 6 | 
            -
                   | 
| 7 | 
            -
                     | 
| 8 | 
            -
             | 
| 9 | 
            -
                     | 
| 10 | 
            -
                       | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
                       | 
| 15 | 
            -
                    end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                    def self.attributes(&block)
         | 
| 18 | 
            -
                      @__order__.map { |name| @__store__[name] }
         | 
| 19 | 
            -
                    end
         | 
| 20 | 
            -
                  else
         | 
| 21 | 
            -
                    def self.set(name, code, options = {})
         | 
| 22 | 
            -
                      name = name.to_sym
         | 
| 23 | 
            -
                      result = @__store__[name] = new(name, code, options)
         | 
| 24 | 
            -
                      @rgb_colors = nil
         | 
| 25 | 
            -
                      result
         | 
| 6 | 
            +
                  def self.set(name, code, **options)
         | 
| 7 | 
            +
                    name = name.to_sym
         | 
| 8 | 
            +
                    result = @__store__[name] = new(name, code, options)
         | 
| 9 | 
            +
                    unless options[:skip_definition]
         | 
| 10 | 
            +
                      ::Term::ANSIColor.class_eval do
         | 
| 11 | 
            +
                        define_method(name) do |string = nil, &block|
         | 
| 12 | 
            +
                          apply_attribute(name, string, &block)
         | 
| 13 | 
            +
                        end
         | 
| 14 | 
            +
                      end
         | 
| 26 15 | 
             
                    end
         | 
| 16 | 
            +
                    result
         | 
| 17 | 
            +
                  end
         | 
| 27 18 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
                    end
         | 
| 19 | 
            +
                  def self.attributes(&block)
         | 
| 20 | 
            +
                    @__store__.each_value(&block)
         | 
| 31 21 | 
             
                  end
         | 
| 32 22 |  | 
| 33 | 
            -
                  def self.[](name)
         | 
| 34 | 
            -
                     | 
| 35 | 
            -
                     | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 23 | 
            +
                  def self.[](name, true_coloring: false)
         | 
| 24 | 
            +
                    true_coloring ||= Term::ANSIColor.true_coloring?
         | 
| 25 | 
            +
                    if true_coloring
         | 
| 26 | 
            +
                      case
         | 
| 27 | 
            +
                      when self === name                              then name
         | 
| 28 | 
            +
                      when Array === name                             then true_color name
         | 
| 29 | 
            +
                      when name.respond_to?(:to_rgb_triple)           then true_color(name.to_rgb_triple.to_a)
         | 
| 30 | 
            +
                      when name.to_s =~ /\A(on_)?(\d+)\z/             then get "#$1color#$2"
         | 
| 31 | 
            +
                      when name.to_s =~ /\A#([0-9a-f]{3}){1,2}\z/i    then true_color name
         | 
| 32 | 
            +
                      when name.to_s =~ /\Aon_#([0-9a-f]{3}){1,2}\z/i then on_true_color name
         | 
| 33 | 
            +
                      else                                            get name
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
                    else
         | 
| 36 | 
            +
                      case
         | 
| 37 | 
            +
                      when self === name                              then name
         | 
| 38 | 
            +
                      when Array === name                             then nearest_rgb_color name
         | 
| 39 | 
            +
                      when name.respond_to?(:to_rgb_triple)           then nearest_rgb_color(name.to_rgb_triple.to_a)
         | 
| 40 | 
            +
                      when name.to_s =~ /\A(on_)?(\d+)\z/             then get "#$1color#$2"
         | 
| 41 | 
            +
                      when name.to_s =~ /\A#([0-9a-f]{3}){1,2}\z/i    then nearest_rgb_color name
         | 
| 42 | 
            +
                      when name.to_s =~ /\Aon_#([0-9a-f]{3}){1,2}\z/i then nearest_rgb_on_color name
         | 
| 43 | 
            +
                      else                                            get name
         | 
| 44 | 
            +
                      end
         | 
| 42 45 | 
             
                    end
         | 
| 43 46 | 
             
                  end
         | 
| 44 47 |  | 
| @@ -47,7 +50,7 @@ module Term | |
| 47 50 | 
             
                  end
         | 
| 48 51 |  | 
| 49 52 | 
             
                  def self.rgb_colors(options = {}, &block)
         | 
| 50 | 
            -
                    colors =  | 
| 53 | 
            +
                    colors = attributes.select(&:rgb_color?)
         | 
| 51 54 | 
             
                    if options.key?(:gray) && !options[:gray]
         | 
| 52 55 | 
             
                      colors = colors.reject(&:gray?)
         | 
| 53 56 | 
             
                    end
         | 
| @@ -70,12 +73,31 @@ module Term | |
| 70 73 | 
             
                    colors.select(&:background?).min_by { |c| c.distance_to(rgb, options) }
         | 
| 71 74 | 
             
                  end
         | 
| 72 75 |  | 
| 76 | 
            +
                  def self.true_color(color, options = {})
         | 
| 77 | 
            +
                    rgb = RGBTriple[color]
         | 
| 78 | 
            +
                    new(:true, "", { true_color: rgb, background: false })
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  def self.on_true_color(color, options = {})
         | 
| 82 | 
            +
                    rgb = RGBTriple[color]
         | 
| 83 | 
            +
                    new(:on_true, "", { true_color: rgb, background: true })
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 73 86 | 
             
                  def initialize(name, code, options = {})
         | 
| 74 | 
            -
                    @name | 
| 75 | 
            -
                    @ | 
| 76 | 
            -
                     | 
| 87 | 
            +
                    @name       = name.to_sym
         | 
| 88 | 
            +
                    @background = !!options[:background]
         | 
| 89 | 
            +
                    @code       = code.to_s
         | 
| 90 | 
            +
                    @direct     = false
         | 
| 91 | 
            +
                    @true_color = false
         | 
| 92 | 
            +
                    if rgb = options[:true_color]
         | 
| 93 | 
            +
                      @true_color = true
         | 
| 94 | 
            +
                      @rgb = rgb
         | 
| 95 | 
            +
                    elsif rgb = options[:direct]
         | 
| 96 | 
            +
                      @direct = true
         | 
| 97 | 
            +
                      @rgb = RGBTriple.from_html(rgb)
         | 
| 98 | 
            +
                    elsif html = options[:html]
         | 
| 77 99 | 
             
                      @rgb = RGBTriple.from_html(html)
         | 
| 78 | 
            -
                    elsif  | 
| 100 | 
            +
                    elsif options.slice(:red, :green, :blue).size == 3
         | 
| 79 101 | 
             
                      @rgb = RGBTriple.from_hash(options)
         | 
| 80 102 | 
             
                    else
         | 
| 81 103 | 
             
                      @rgb = nil # prevent instance variable not initialized warnings
         | 
| @@ -85,25 +107,39 @@ module Term | |
| 85 107 | 
             
                  attr_reader :name
         | 
| 86 108 |  | 
| 87 109 | 
             
                  def code
         | 
| 88 | 
            -
                    if  | 
| 110 | 
            +
                    if true_color?
         | 
| 111 | 
            +
                      background? ? "48;2;#{@rgb.to_a * ?;}" : "38;2;#{@rgb.to_a * ?;}"
         | 
| 112 | 
            +
                    elsif rgb_color?
         | 
| 89 113 | 
             
                      background? ? "48;5;#{@code}" : "38;5;#{@code}"
         | 
| 114 | 
            +
                    elsif direct?
         | 
| 115 | 
            +
                      background? ? (@code.to_i + 10).to_s : @code
         | 
| 90 116 | 
             
                    else
         | 
| 91 117 | 
             
                      @code
         | 
| 92 118 | 
             
                    end
         | 
| 93 119 | 
             
                  end
         | 
| 94 120 |  | 
| 95 121 | 
             
                  def apply(string = nil, &block)
         | 
| 96 | 
            -
                    ::Term::ANSIColor. | 
| 122 | 
            +
                    ::Term::ANSIColor.apply_attribute(self, string, &block)
         | 
| 97 123 | 
             
                  end
         | 
| 98 124 |  | 
| 99 125 | 
             
                  def background?
         | 
| 100 | 
            -
                     | 
| 126 | 
            +
                    !!@background
         | 
| 101 127 | 
             
                  end
         | 
| 102 128 |  | 
| 129 | 
            +
                  def direct?
         | 
| 130 | 
            +
                    !!@direct
         | 
| 131 | 
            +
                  end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  attr_writer :background
         | 
| 134 | 
            +
             | 
| 103 135 | 
             
                  attr_reader :rgb
         | 
| 104 136 |  | 
| 105 137 | 
             
                  def rgb_color?
         | 
| 106 | 
            -
                    !!@rgb
         | 
| 138 | 
            +
                    !!@rgb && !@true_color && !@direct
         | 
| 139 | 
            +
                  end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                  def true_color?
         | 
| 142 | 
            +
                    !!(@rgb && @true_color)
         | 
| 107 143 | 
             
                  end
         | 
| 108 144 |  | 
| 109 145 | 
             
                  def gray?
         | 
| @@ -127,11 +163,16 @@ module Term | |
| 127 163 |  | 
| 128 164 | 
             
                  def gradient_to(other, options = {})
         | 
| 129 165 | 
             
                    if our_rgb = to_rgb_triple and
         | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 166 | 
            +
                        other.respond_to?(:to_rgb_triple) and
         | 
| 167 | 
            +
                        other_rgb = other.to_rgb_triple
         | 
| 168 | 
            +
                      then
         | 
| 169 | 
            +
                      true_coloring = options[:true_coloring] || Term::ANSIColor.true_coloring?
         | 
| 133 170 | 
             
                      our_rgb.gradient_to(other_rgb, options).map do |rgb_triple|
         | 
| 134 | 
            -
                         | 
| 171 | 
            +
                        if true_coloring
         | 
| 172 | 
            +
                          self.class.true_color(rgb_triple, options)
         | 
| 173 | 
            +
                        else
         | 
| 174 | 
            +
                          self.class.nearest_rgb_color(rgb_triple, options)
         | 
| 175 | 
            +
                        end
         | 
| 135 176 | 
             
                      end
         | 
| 136 177 | 
             
                    else
         | 
| 137 178 | 
             
                      []
         | 
| @@ -72,8 +72,8 @@ module Term | |
| 72 72 |  | 
| 73 73 | 
             
                  def initialize(hue, saturation, lightness)
         | 
| 74 74 | 
             
                    @hue        = Float(hue) % 360
         | 
| 75 | 
            -
                    @saturation =  | 
| 76 | 
            -
                    @lightness  =  | 
| 75 | 
            +
                    @saturation = Float(saturation).clamp(0, 100)
         | 
| 76 | 
            +
                    @lightness  = Float(lightness).clamp(0, 100)
         | 
| 77 77 | 
             
                  end
         | 
| 78 78 |  | 
| 79 79 | 
             
                  attr_reader :hue
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require 'tins/terminal'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Term
         | 
| 4 | 
            +
              module ANSIColor
         | 
| 5 | 
            +
                module Hyperlink
         | 
| 6 | 
            +
                  def hyperlink(link, string = nil, id: nil, as_link: false)
         | 
| 7 | 
            +
                    block_given? && string != nil && !respond_to?(:to_str) and
         | 
| 8 | 
            +
                      raise ArgumentError,
         | 
| 9 | 
            +
                      "Require either the string argument or a block argument"
         | 
| 10 | 
            +
                    if link.nil?
         | 
| 11 | 
            +
                      link = ''
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                    if as_link && !link.empty?
         | 
| 14 | 
            +
                      string ||= link
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                    result = ''
         | 
| 17 | 
            +
                    if Term::ANSIColor.coloring?
         | 
| 18 | 
            +
                      result = "\e]8;#{"id=#{id}" unless id.nil?};" << link.to_str << "\e\\"
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
                    if block_given?
         | 
| 21 | 
            +
                      result << yield.to_s
         | 
| 22 | 
            +
                    elsif string.respond_to?(:to_str)
         | 
| 23 | 
            +
                      result << string.to_str
         | 
| 24 | 
            +
                    elsif respond_to?(:to_str)
         | 
| 25 | 
            +
                      result << to_str
         | 
| 26 | 
            +
                    else
         | 
| 27 | 
            +
                      return result # only switch on
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                    result << "\e]8;;\e\\" if Term::ANSIColor.coloring?
         | 
| 30 | 
            +
                    result
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -4,9 +4,10 @@ module Term | |
| 4 4 | 
             
                  include Term::ANSIColor
         | 
| 5 5 |  | 
| 6 6 | 
             
                  def initialize(io, options = {})
         | 
| 7 | 
            -
                    @io | 
| 8 | 
            -
                    @options | 
| 9 | 
            -
                    @buffer | 
| 7 | 
            +
                    @io            = io
         | 
| 8 | 
            +
                    @options       = options
         | 
| 9 | 
            +
                    @buffer        = ''
         | 
| 10 | 
            +
                    @true_coloring = options[:true_coloring]
         | 
| 10 11 | 
             
                  end
         | 
| 11 12 |  | 
| 12 13 | 
             
                  def reset_io
         | 
| @@ -34,7 +35,11 @@ module Term | |
| 34 35 | 
             
                      last_pixel = nil
         | 
| 35 36 | 
             
                      for pixel in row
         | 
| 36 37 | 
             
                        if pixel != last_pixel
         | 
| 37 | 
            -
                          color =  | 
| 38 | 
            +
                          color = if @true_coloring
         | 
| 39 | 
            +
                                    Attribute.true_color(pixel, @options)
         | 
| 40 | 
            +
                                  else
         | 
| 41 | 
            +
                                    Attribute.nearest_rgb_color(pixel, @options)
         | 
| 42 | 
            +
                                  end
         | 
| 38 43 | 
             
                          result << on_color(color)
         | 
| 39 44 | 
             
                          last_pixel = pixel
         | 
| 40 45 | 
             
                        end
         | 
    
        data/lib/term/ansicolor.rb
    CHANGED
    
    | @@ -1,4 +1,6 @@ | |
| 1 1 | 
             
            require 'tins/xt/full'
         | 
| 2 | 
            +
            require 'tins/xt/ask_and_send'
         | 
| 3 | 
            +
            require 'mize'
         | 
| 2 4 |  | 
| 3 5 | 
             
            module Term
         | 
| 4 6 |  | 
| @@ -15,25 +17,11 @@ module Term | |
| 15 17 | 
             
                require 'term/ansicolor/attribute/intense_color8'
         | 
| 16 18 | 
             
                require 'term/ansicolor/attribute/color256'
         | 
| 17 19 | 
             
                require 'term/ansicolor/movement'
         | 
| 18 | 
            -
             | 
| 19 20 | 
             
                include Term::ANSIColor::Movement
         | 
| 21 | 
            +
                require 'term/ansicolor/hyperlink'
         | 
| 22 | 
            +
                include Term::ANSIColor::Hyperlink
         | 
| 23 | 
            +
                include Term::ANSIColor::Attribute::Underline
         | 
| 20 24 |  | 
| 21 | 
            -
                # :stopdoc:
         | 
| 22 | 
            -
                ATTRIBUTE_NAMES = Attribute.named_attributes.map(&:name)
         | 
| 23 | 
            -
                # :startdoc:
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                # Returns true if Term::ANSIColor supports the +feature+.
         | 
| 26 | 
            -
                #
         | 
| 27 | 
            -
                # The feature :clear, that is mixing the clear color attribute into String,
         | 
| 28 | 
            -
                # is only supported on ruby implementations, that do *not* already
         | 
| 29 | 
            -
                # implement the String#clear method. It's better to use the reset color
         | 
| 30 | 
            -
                # attribute instead.
         | 
| 31 | 
            -
                def support?(feature)
         | 
| 32 | 
            -
                  case feature
         | 
| 33 | 
            -
                  when :clear
         | 
| 34 | 
            -
                    !String.instance_methods(false).map(&:to_sym).include?(:clear)
         | 
| 35 | 
            -
                  end
         | 
| 36 | 
            -
                end
         | 
| 37 25 | 
             
                # Returns true, if the coloring function of this module
         | 
| 38 26 | 
             
                # is switched on, false otherwise.
         | 
| 39 27 | 
             
                def self.coloring?
         | 
| @@ -42,31 +30,32 @@ module Term | |
| 42 30 |  | 
| 43 31 | 
             
                # Turns the coloring on or off globally, so you can easily do
         | 
| 44 32 | 
             
                # this for example:
         | 
| 45 | 
            -
                # | 
| 33 | 
            +
                #   Term::ANSIColor::coloring = STDOUT.isatty
         | 
| 46 34 | 
             
                def self.coloring=(val)
         | 
| 47 | 
            -
                  @coloring = val
         | 
| 35 | 
            +
                  @coloring = !!val
         | 
| 48 36 | 
             
                end
         | 
| 49 37 | 
             
                self.coloring = true
         | 
| 50 38 |  | 
| 51 | 
            -
                 | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
                    end
         | 
| 56 | 
            -
                  EOT
         | 
| 57 | 
            -
                  self
         | 
| 39 | 
            +
                # Returns true, if the tue coloring mode of this module is switched on,
         | 
| 40 | 
            +
                # false otherwise.
         | 
| 41 | 
            +
                def self.true_coloring?
         | 
| 42 | 
            +
                  @true_coloring
         | 
| 58 43 | 
             
                end
         | 
| 59 44 |  | 
| 60 | 
            -
                 | 
| 61 | 
            -
             | 
| 45 | 
            +
                # Turns the true coloring mode on or off globally, that will display 24-bit
         | 
| 46 | 
            +
                # colors if your terminal supports it:
         | 
| 47 | 
            +
                #  Term::ANSIColor::true_coloring = ENV['COLORTERM'] =~ /\A(truecolor|24bit)\z/
         | 
| 48 | 
            +
                def self.true_coloring=(val)
         | 
| 49 | 
            +
                  @true_coloring = !!val
         | 
| 62 50 | 
             
                end
         | 
| 51 | 
            +
                self.true_coloring = false
         | 
| 63 52 |  | 
| 64 53 | 
             
                # Regular expression that is used to scan for ANSI-Attributes while
         | 
| 65 54 | 
             
                # uncoloring strings.
         | 
| 66 | 
            -
                COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9]|[34]8;5;\d{1,3})?m/
         | 
| 55 | 
            +
                COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9]|[34]8;(5;\d{1,3}|2;\d{1,3}(;\d{1,3}){2})|4:\d|53)?m/
         | 
| 67 56 |  | 
| 68 | 
            -
                # Returns an uncolored version of the string, that is all
         | 
| 69 | 
            -
                #  | 
| 57 | 
            +
                # Returns an uncolored version of the string, that is all ANSI-Attributes
         | 
| 58 | 
            +
                # are stripped from the string.
         | 
| 70 59 | 
             
                def uncolor(string = nil) # :yields:
         | 
| 71 60 | 
             
                  if block_given?
         | 
| 72 61 | 
             
                    yield.to_str.gsub(COLORED_REGEXP, '')
         | 
| @@ -81,13 +70,9 @@ module Term | |
| 81 70 |  | 
| 82 71 | 
             
                alias uncolored uncolor
         | 
| 83 72 |  | 
| 84 | 
            -
                 | 
| 85 | 
            -
                # color +name+. If string isn't a string only the escape sequence to switch
         | 
| 86 | 
            -
                # on the color +name+ is returned.
         | 
| 87 | 
            -
                def color(name, string = nil, &block)
         | 
| 88 | 
            -
                  attribute = Attribute[name] or raise ArgumentError, "unknown attribute #{name.inspect}"
         | 
| 73 | 
            +
                def apply_code(code, string = nil, &block)
         | 
| 89 74 | 
             
                  result = ''
         | 
| 90 | 
            -
                  result << "\e[#{ | 
| 75 | 
            +
                  result << "\e[#{code}m" if Term::ANSIColor.coloring?
         | 
| 91 76 | 
             
                  if block_given?
         | 
| 92 77 | 
             
                    result << yield.to_s
         | 
| 93 78 | 
             
                  elsif string.respond_to?(:to_str)
         | 
| @@ -95,21 +80,40 @@ module Term | |
| 95 80 | 
             
                  elsif respond_to?(:to_str)
         | 
| 96 81 | 
             
                    result << to_str
         | 
| 97 82 | 
             
                  else
         | 
| 98 | 
            -
                    return result #only switch on
         | 
| 83 | 
            +
                    return result # only switch on
         | 
| 99 84 | 
             
                  end
         | 
| 100 85 | 
             
                  result << "\e[0m" if Term::ANSIColor.coloring?
         | 
| 101 86 | 
             
                  result.extend(Term::ANSIColor)
         | 
| 102 87 | 
             
                end
         | 
| 103 88 |  | 
| 89 | 
            +
                def apply_attribute(name, string = nil, &block)
         | 
| 90 | 
            +
                  attribute = Attribute[name] or
         | 
| 91 | 
            +
                    raise ArgumentError, "unknown attribute #{name.inspect}"
         | 
| 92 | 
            +
                  apply_code(attribute.code, string, &block)
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                # Return +string+ or the result string of the given +block+ colored with
         | 
| 96 | 
            +
                # color +name+. If string isn't a string only the escape sequence to switch
         | 
| 97 | 
            +
                # on the color +name+ is returned.
         | 
| 98 | 
            +
                def color(name, string = nil, &block)
         | 
| 99 | 
            +
                  apply_attribute(name, string, &block)
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                # Return +string+ or the result string of the given +block+ with a
         | 
| 103 | 
            +
                # background colored with color +name+. If string isn't a string only the
         | 
| 104 | 
            +
                # escape sequence to switch on the color +name+ is returned.
         | 
| 104 105 | 
             
                def on_color(name, string = nil, &block)
         | 
| 105 | 
            -
                  attribute = Attribute[name] or | 
| 106 | 
            -
             | 
| 106 | 
            +
                  attribute = Attribute[name] or
         | 
| 107 | 
            +
                    raise ArgumentError, "unknown attribute #{name.inspect}"
         | 
| 108 | 
            +
                  attribute = attribute.dup
         | 
| 109 | 
            +
                  attribute.background = true
         | 
| 110 | 
            +
                  apply_attribute(attribute, string, &block)
         | 
| 107 111 | 
             
                end
         | 
| 108 112 |  | 
| 109 113 | 
             
                class << self
         | 
| 110 114 | 
             
                  # Returns an array of all Term::ANSIColor attributes as symbols.
         | 
| 111 | 
            -
                  def term_ansicolor_attributes
         | 
| 112 | 
            -
                    ::Term::ANSIColor:: | 
| 115 | 
            +
                  memoize method: def term_ansicolor_attributes
         | 
| 116 | 
            +
                    ::Term::ANSIColor::Attribute.attributes.map(&:name)
         | 
| 113 117 | 
             
                  end
         | 
| 114 118 |  | 
| 115 119 | 
             
                  alias attributes term_ansicolor_attributes
         | 
    
        data/term-ansicolor.gemspec
    CHANGED
    
    | @@ -1,45 +1,32 @@ | |
| 1 1 | 
             
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            -
            # stub: term-ansicolor 1. | 
| 2 | 
            +
            # stub: term-ansicolor 1.10.4 ruby lib
         | 
| 3 3 |  | 
| 4 4 | 
             
            Gem::Specification.new do |s|
         | 
| 5 5 | 
             
              s.name = "term-ansicolor".freeze
         | 
| 6 | 
            -
              s.version = "1. | 
| 6 | 
            +
              s.version = "1.10.4".freeze
         | 
| 7 7 |  | 
| 8 8 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
         | 
| 9 9 | 
             
              s.require_paths = ["lib".freeze]
         | 
| 10 10 | 
             
              s.authors = ["Florian Frank".freeze]
         | 
| 11 | 
            -
              s.date = " | 
| 11 | 
            +
              s.date = "2024-07-15"
         | 
| 12 12 | 
             
              s.description = "This library uses ANSI escape sequences to control the attributes of terminal output".freeze
         | 
| 13 13 | 
             
              s.email = "flori@ping.de".freeze
         | 
| 14 | 
            -
              s.executables = [" | 
| 15 | 
            -
              s.extra_rdoc_files = ["README.md".freeze, "lib/term/ansicolor.rb".freeze, "lib/term/ansicolor/attribute.rb".freeze, "lib/term/ansicolor/attribute/color256.rb".freeze, "lib/term/ansicolor/attribute/color8.rb".freeze, "lib/term/ansicolor/attribute/intense_color8.rb".freeze, "lib/term/ansicolor/attribute/text.rb".freeze, "lib/term/ansicolor/hsl_triple.rb".freeze, "lib/term/ansicolor/movement.rb".freeze, "lib/term/ansicolor/ppm_reader.rb".freeze, "lib/term/ansicolor/rgb_color_metrics.rb".freeze, "lib/term/ansicolor/rgb_triple.rb".freeze, "lib/term/ansicolor/version.rb".freeze]
         | 
| 16 | 
            -
              s.files = [". | 
| 17 | 
            -
              s.homepage = " | 
| 14 | 
            +
              s.executables = ["term_cdiff".freeze, "term_colortab".freeze, "term_decolor".freeze, "term_display".freeze, "term_mandel".freeze, "term_snow".freeze]
         | 
| 15 | 
            +
              s.extra_rdoc_files = ["README.md".freeze, "lib/term/ansicolor.rb".freeze, "lib/term/ansicolor/attribute.rb".freeze, "lib/term/ansicolor/attribute/color256.rb".freeze, "lib/term/ansicolor/attribute/color8.rb".freeze, "lib/term/ansicolor/attribute/intense_color8.rb".freeze, "lib/term/ansicolor/attribute/text.rb".freeze, "lib/term/ansicolor/attribute/underline.rb".freeze, "lib/term/ansicolor/hsl_triple.rb".freeze, "lib/term/ansicolor/hyperlink.rb".freeze, "lib/term/ansicolor/movement.rb".freeze, "lib/term/ansicolor/ppm_reader.rb".freeze, "lib/term/ansicolor/rgb_color_metrics.rb".freeze, "lib/term/ansicolor/rgb_triple.rb".freeze, "lib/term/ansicolor/version.rb".freeze]
         | 
| 16 | 
            +
              s.files = [".all_images.yml".freeze, ".gitignore".freeze, ".utilsrc".freeze, "CHANGES".freeze, "COPYING".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "bin/term_cdiff".freeze, "bin/term_colortab".freeze, "bin/term_decolor".freeze, "bin/term_display".freeze, "bin/term_mandel".freeze, "bin/term_snow".freeze, "examples/example.rb".freeze, "examples/lambda-red-plain.ppm".freeze, "examples/lambda-red.png".freeze, "examples/lambda-red.ppm".freeze, "lib/term/ansicolor.rb".freeze, "lib/term/ansicolor/.keep".freeze, "lib/term/ansicolor/attribute.rb".freeze, "lib/term/ansicolor/attribute/color256.rb".freeze, "lib/term/ansicolor/attribute/color8.rb".freeze, "lib/term/ansicolor/attribute/intense_color8.rb".freeze, "lib/term/ansicolor/attribute/text.rb".freeze, "lib/term/ansicolor/attribute/underline.rb".freeze, "lib/term/ansicolor/hsl_triple.rb".freeze, "lib/term/ansicolor/hyperlink.rb".freeze, "lib/term/ansicolor/movement.rb".freeze, "lib/term/ansicolor/ppm_reader.rb".freeze, "lib/term/ansicolor/rgb_color_metrics.rb".freeze, "lib/term/ansicolor/rgb_triple.rb".freeze, "lib/term/ansicolor/version.rb".freeze, "term-ansicolor.gemspec".freeze, "tests/ansicolor_test.rb".freeze, "tests/attribute_test.rb".freeze, "tests/hsl_triple_test.rb".freeze, "tests/hyperlink_test.rb".freeze, "tests/ppm_reader_test.rb".freeze, "tests/rgb_color_metrics_test.rb".freeze, "tests/rgb_triple_test.rb".freeze, "tests/test_helper.rb".freeze]
         | 
| 17 | 
            +
              s.homepage = "https://github.com/flori/term-ansicolor".freeze
         | 
| 18 18 | 
             
              s.licenses = ["Apache-2.0".freeze]
         | 
| 19 19 | 
             
              s.rdoc_options = ["--title".freeze, "Term-ansicolor - Ruby library that colors strings using ANSI escape sequences".freeze, "--main".freeze, "README.md".freeze]
         | 
| 20 | 
            -
              s. | 
| 21 | 
            -
              s.rubygems_version = "3.0.1".freeze
         | 
| 20 | 
            +
              s.rubygems_version = "3.5.11".freeze
         | 
| 22 21 | 
             
              s.summary = "Ruby library that colors strings using ANSI escape sequences".freeze
         | 
| 23 | 
            -
              s.test_files = ["tests/ansicolor_test.rb".freeze, "tests/attribute_test.rb".freeze, "tests/hsl_triple_test.rb".freeze, "tests/ppm_reader_test.rb".freeze, "tests/rgb_color_metrics_test.rb".freeze, "tests/rgb_triple_test.rb".freeze, "tests/test_helper.rb".freeze]
         | 
| 22 | 
            +
              s.test_files = ["tests/ansicolor_test.rb".freeze, "tests/attribute_test.rb".freeze, "tests/hsl_triple_test.rb".freeze, "tests/hyperlink_test.rb".freeze, "tests/ppm_reader_test.rb".freeze, "tests/rgb_color_metrics_test.rb".freeze, "tests/rgb_triple_test.rb".freeze, "tests/test_helper.rb".freeze]
         | 
| 24 23 |  | 
| 25 | 
            -
               | 
| 26 | 
            -
                s.specification_version = 4
         | 
| 24 | 
            +
              s.specification_version = 4
         | 
| 27 25 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
                  s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
         | 
| 35 | 
            -
                  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
         | 
| 36 | 
            -
                  s.add_dependency(%q<test-unit>.freeze, [">= 0"])
         | 
| 37 | 
            -
                  s.add_dependency(%q<tins>.freeze, ["~> 1.0"])
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
              else
         | 
| 40 | 
            -
                s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.9.1"])
         | 
| 41 | 
            -
                s.add_dependency(%q<simplecov>.freeze, [">= 0"])
         | 
| 42 | 
            -
                s.add_dependency(%q<test-unit>.freeze, [">= 0"])
         | 
| 43 | 
            -
                s.add_dependency(%q<tins>.freeze, ["~> 1.0"])
         | 
| 44 | 
            -
              end
         | 
| 26 | 
            +
              s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.16.0".freeze])
         | 
| 27 | 
            +
              s.add_development_dependency(%q<simplecov>.freeze, [">= 0".freeze])
         | 
| 28 | 
            +
              s.add_development_dependency(%q<test-unit>.freeze, [">= 0".freeze])
         | 
| 29 | 
            +
              s.add_development_dependency(%q<utils>.freeze, [">= 0".freeze])
         | 
| 30 | 
            +
              s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.0".freeze])
         | 
| 31 | 
            +
              s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.5".freeze])
         | 
| 45 32 | 
             
            end
         | 
    
        data/tests/ansicolor_test.rb
    CHANGED
    
    | @@ -103,9 +103,22 @@ class ANSIColorTest < Test::Unit::TestCase | |
| 103 103 |  | 
| 104 104 | 
             
              def test_attributes
         | 
| 105 105 | 
             
                foo = 'foo'
         | 
| 106 | 
            -
                 | 
| 106 | 
            +
                attributes = %i[
         | 
| 107 | 
            +
                  clear reset bold dark faint italic underline underscore
         | 
| 108 | 
            +
                  blink rapid_blink reverse negative concealed conceal strikethrough black
         | 
| 109 | 
            +
                  red green yellow blue magenta cyan white on_black on_red on_green on_yellow
         | 
| 110 | 
            +
                  on_blue on_magenta on_cyan on_white intense_black bright_black intense_red
         | 
| 111 | 
            +
                  bright_red intense_green bright_green intense_yellow bright_yellow
         | 
| 112 | 
            +
                  intense_blue bright_blue intense_magenta bright_magenta intense_cyan
         | 
| 113 | 
            +
                  bright_cyan intense_white bright_white on_intense_black on_bright_black
         | 
| 114 | 
            +
                  on_intense_red on_bright_red on_intense_green on_bright_green
         | 
| 115 | 
            +
                  on_intense_yellow on_bright_yellow on_intense_blue on_bright_blue
         | 
| 116 | 
            +
                  on_intense_magenta on_bright_magenta on_intense_cyan on_bright_cyan
         | 
| 117 | 
            +
                  on_intense_white on_bright_white
         | 
| 118 | 
            +
                ]
         | 
| 119 | 
            +
                for a in attributes
         | 
| 107 120 | 
             
                  # skip :clear and :reverse b/c Ruby implements them on string
         | 
| 108 | 
            -
                  if a != :clear && a != :reverse | 
| 121 | 
            +
                  if a != :clear && a != :reverse
         | 
| 109 122 | 
             
                    refute_equal foo, foo_colored = foo.__send__(a)
         | 
| 110 123 | 
             
                    assert_equal foo, foo_colored.uncolor
         | 
| 111 124 | 
             
                  end
         | 
| @@ -121,6 +134,44 @@ class ANSIColorTest < Test::Unit::TestCase | |
| 121 134 | 
             
                assert_equal Term::ANSIColor.attributes, 'foo'.attributes
         | 
| 122 135 | 
             
              end
         | 
| 123 136 |  | 
| 137 | 
            +
              def test_underline_invalid_type
         | 
| 138 | 
            +
                assert_raises(ArgumentError) { Term::ANSIColor.underline(type: :nix) { 'foo' } }
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              def test_underline_invalid_color
         | 
| 142 | 
            +
                assert_raises(ArgumentError) { Term::ANSIColor.underline(color: :nix) { 'foo' } }
         | 
| 143 | 
            +
              end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
              def test_underline
         | 
| 146 | 
            +
                foo = 'foo'
         | 
| 147 | 
            +
                assert_equal "\e[4mfoo\e[0m", Term::ANSIColor.underline { foo }
         | 
| 148 | 
            +
                assert_equal "\e[4m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(color: '#ff8040') { foo }
         | 
| 149 | 
            +
              end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
              def test_underline_double
         | 
| 152 | 
            +
                foo = 'foo'
         | 
| 153 | 
            +
                assert_equal "\e[4:2mfoo\e[0m", Term::ANSIColor.underline(type: :double) { foo }
         | 
| 154 | 
            +
                assert_equal "\e[4:2m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :double, color: '#ff8040') { foo }
         | 
| 155 | 
            +
              end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
              def test_underline_curly
         | 
| 158 | 
            +
                foo = 'foo'
         | 
| 159 | 
            +
                assert_equal "\e[4:3mfoo\e[0m", Term::ANSIColor.underline(type: :curly) { foo }
         | 
| 160 | 
            +
                assert_equal "\e[4:3m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :curly, color: '#ff8040') { foo }
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
              def test_underline_dotted
         | 
| 164 | 
            +
                foo = 'foo'
         | 
| 165 | 
            +
                assert_equal "\e[4:4mfoo\e[0m", Term::ANSIColor.underline(type: :dotted) { foo }
         | 
| 166 | 
            +
                assert_equal "\e[4:4m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :dotted, color: '#ff8040') { foo }
         | 
| 167 | 
            +
              end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
              def test_underline_dashed
         | 
| 170 | 
            +
                foo = 'foo'
         | 
| 171 | 
            +
                assert_equal "\e[4:5mfoo\e[0m", Term::ANSIColor.underline(type: :dashed) { foo }
         | 
| 172 | 
            +
                assert_equal "\e[4:5m\e[58;2;255;135;95mfoo\e[0m", Term::ANSIColor.underline(type: :dashed, color: '#ff8040') { foo }
         | 
| 173 | 
            +
              end
         | 
| 174 | 
            +
             | 
| 124 175 | 
             
              def test_move_to
         | 
| 125 176 | 
             
                string_23_23 = "\e[23;23Hred"
         | 
| 126 177 | 
             
                assert_equal string_23_23, string.move_to(23, 23)
         | 
| @@ -157,4 +208,20 @@ class ANSIColorTest < Test::Unit::TestCase | |
| 157 208 | 
             
                string = Color.red(string)
         | 
| 158 209 | 
             
                assert_kind_of Term::ANSIColor, 'new'
         | 
| 159 210 | 
             
              end
         | 
| 211 | 
            +
             | 
| 212 | 
            +
              def test_coloring
         | 
| 213 | 
            +
                assert Term::ANSIColor.coloring?
         | 
| 214 | 
            +
                Term::ANSIColor.coloring = false
         | 
| 215 | 
            +
                assert_false Term::ANSIColor.coloring?
         | 
| 216 | 
            +
              ensure
         | 
| 217 | 
            +
                Term::ANSIColor.coloring = true
         | 
| 218 | 
            +
              end
         | 
| 219 | 
            +
             | 
| 220 | 
            +
              def test_true_coloring
         | 
| 221 | 
            +
                assert_false Term::ANSIColor.true_coloring?
         | 
| 222 | 
            +
                Term::ANSIColor.true_coloring = true
         | 
| 223 | 
            +
                assert Term::ANSIColor.true_coloring?
         | 
| 224 | 
            +
              ensure
         | 
| 225 | 
            +
                Term::ANSIColor.true_coloring = false
         | 
| 226 | 
            +
              end
         | 
| 160 227 | 
             
            end
         |