File: colored2.rb

package info (click to toggle)
ruby-colored2 4.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 560 kB
  • sloc: ruby: 345; makefile: 4
file content (88 lines) | stat: -rw-r--r-- 2,470 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# frozen_string_literal: false

require 'colored2/codes'
require 'colored2/ascii_decorator'

module Colored2
  def self.decorate(a_class)
    a_class.send(:include, Colored2)
  end

  def self.included(from_class)
    from_class.class_eval do
      def surround_with_color(color: nil, effect: nil, color_self: nil, string: nil, &block)
        color_type = if Colored2.background_next? && effect.nil?
                       Colored2.foreground_next!
                       :background
                     else
                       :foreground
                     end

        opts = {}
        opts.merge!(color_type => color) if color
        opts.merge!(effect:) if effect

        if color_self
          opts.merge!( beginning: :on, end: :off)
          colored = Colored2::AsciiDecorator.new(self).decorate(opts)
          if string || block
            arg = "#{string}#{block&.call}"
            colored << Colored2::AsciiDecorator.new(arg).decorate(opts) if !arg.empty?
          end
        else
          opts.merge!( end: :on )
          colored = Colored2::AsciiDecorator.new(self).decorate(opts)
          if string || block
            arg = "#{string}#{block&.call}"
            colored << Colored2::AsciiDecorator.new(arg).decorate(opts.merge(end: :off)) if !arg.empty?
          end
        end
        colored
      end

      def on
        Colored2.background_next!
        self
      end
    end

    from_class.instance_eval do
      COLORS.each_key do |color|
        define_method(color) do |string = nil, &block|
          surround_with_color(color:, color_self: true, string:, &block)
        end

        define_method(:"#{color}!") do |string = nil, &block|
          surround_with_color(color:, color_self: false, string:, &block)
        end
      end

      EFFECTS.each_key do |effect|
        next if effect == 'no_color'

        define_method(effect) do |string = nil, &block|
          surround_with_color(effect:, color_self: true, string:, &block)
        end

        define_method(:"#{effect}!") do |string = nil, &block|
          surround_with_color(effect:, color_self: false, string:, &block)
        end
      end

      define_method(:to_eol) do
        tmp = sub(/^(\e\[[\[\e0-9;m]+m)/, "\\1\e[2K")
        if tmp == self
          return "\e[2K" << self
        end

        tmp
      end

      define_method(:to_bol) do
        "#{self}\033[#{length}D\033[0D"
      end
    end
  end
end

require 'colored2/strings'