Module: HighLine::StringExtensions

Included in:
String
Defined in:
lib/highline/string_extensions.rb

Overview

HighLine extensions for String class. Included by HighLine::String.

Constant Summary collapse

STYLE_METHOD_NAME_PATTERN =
/^(on_)?rgb_([0-9a-fA-F]{6})$/

Class Method Summary collapse

Class Method Details

.define_builtin_style_methods(base) ⇒ Object

At include time, it defines all basic builtin styles.

Parameters:

  • base (Class, Module)

    base Class/Module



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/highline/string_extensions.rb', line 96

def self.define_builtin_style_methods(base)
  HighLine::COLORS.each do |color|
    color = color.downcase
    base.class_eval <<-METHOD_DEFINITION
      undef :#{color} if method_defined? :#{color}
      def #{color}
        color(:#{color})
      end
    METHOD_DEFINITION

    base.class_eval <<-METHOD_DEFINITION
      undef :on_#{color} if method_defined? :on_#{color}
      def on_#{color}
        on(:#{color})
      end
    METHOD_DEFINITION

    HighLine::STYLES.each do |style|
      style = style.downcase
      base.class_eval <<-METHOD_DEFINITION
        undef :#{style} if method_defined? :#{style}
        def #{style}
          color(:#{style})
        end
      METHOD_DEFINITION
    end
  end
end

.define_style_support_methods(base) ⇒ void

This method returns an undefined value.

At include time, it defines all basic style support method like #color, #on, #uncolor, #rgb, #on_rgb and the #method_missing callback

Parameters:

  • base (Class, Module)

    the base class/module



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
89
90
91
92
# File 'lib/highline/string_extensions.rb', line 29

def self.define_style_support_methods(base)
  base.class_eval do
    undef :color if method_defined? :color
    undef :foreground if method_defined? :foreground
    def color(*args)
      self.class.new(HighLine.color(self, *args))
    end
    alias_method :foreground, :color

    undef :on if method_defined? :on
    def on(arg)
      color(("on_" + arg.to_s).to_sym)
    end

    undef :uncolor if method_defined? :uncolor
    def uncolor
      self.class.new(HighLine.uncolor(self))
    end

    undef :rgb if method_defined? :rgb
    def rgb(*colors)
      color_code = setup_color_code(*colors)
      color("rgb_#{color_code}".to_sym)
    end

    undef :on_rgb if method_defined? :on_rgb
    def on_rgb(*colors)
      color_code = setup_color_code(*colors)
      color("on_rgb_#{color_code}".to_sym)
    end

    # @todo Chain existing method_missing?
    undef :method_missing if method_defined? :method_missing
    def method_missing(method, *_args)
      if method.to_s =~ STYLE_METHOD_NAME_PATTERN
        color(method)
      else
        super
      end
    end

    undef :respond_to_missing if method_defined? :respond_to_missing
    def respond_to_missing?(method_name, include_private = false)
      method_name.to_s =~ STYLE_METHOD_NAME_PATTERN || super
    end

    private

    def setup_color_code(*colors)
      color_code = colors.map do |color|
        if color.is_a?(Numeric)
          format("%02x", color)
        else
          color.to_s
        end
      end.join

      raise "Bad RGB color #{colors.inspect}" unless
        color_code =~ /^[a-fA-F0-9]{6}/

      color_code
    end
  end
end

.included(base) ⇒ Object

Included hook. Actions to take when being included.

Parameters:

  • base (Class, Module)

    base class



18
19
20
21
# File 'lib/highline/string_extensions.rb', line 18

def self.included(base)
  define_builtin_style_methods(base)
  define_style_support_methods(base)
end