Class: String

Inherits:
Object
  • Object
show all
Defined in:
lib/string_tools/core_ext/string.rb

Constant Summary collapse

ANSI_CLEAR =

Embed in a String to clear all previous ANSI sequences.

"\e[0m"
ANSI_BOLD =
"\e[1m"
ANSI_UNDERLINE =
"\e[4m"
BLACK =

Colors

"\e[30m"
RED =
"\e[31m"
GREEN =
"\e[32m"
YELLOW =
"\e[33m"
BLUE =
"\e[34m"
MAGENTA =
"\e[35m"
CYAN =
"\e[36m"
WHITE =
"\e[37m"
WIN_1251_ENCODING =
'windows-1251'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.natcmp(str1, str2) ⇒ Object



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
# File 'lib/string_tools/core_ext/string.rb', line 44

def self.natcmp(str1, str2)
  str1, str2 = str1.dup, str2.dup
  compare_expression = /^(\D*)((?:\d+(?:\.\d+)?)*)(.*)$/

  # Remove all whitespace
  str1.gsub!(/\s*/, '')
  str2.gsub!(/\s*/, '')

  while (str1.length > 0) or (str2.length > 0)
    # Extract non-digits, digits and rest of string
    str1 =~ compare_expression
    chars1, num1, str1 = $1.dup, $2.dup, $3.dup

    str2 =~ compare_expression
    chars2, num2, str2 = $1.dup, $2.dup, $3.dup

    # Compare the non-digits
    case (chars1 <=> chars2)
    when 0 # Non-digits are the same, compare the digits...
      # If either number begins with a zero, then compare alphabetically,
      # otherwise compare numerically
      if !(num1[0] == 48 && num1[1] != 46) and !(num2[0] == 48 && num2[1] != 46)
        num1, num2 = num1.to_f, num2.to_f
      end

      case (num1 <=> num2)
      when -1 then return -1
      when 1 then return 1
      end
    when -1 then return -1
    when 1 then return 1
    end # case

  end # while

  # Strings are naturally equal
  0
end

Instance Method Details

#boldObject

Synopsys

Make text bolder (for ASCII terminals)


136
137
138
# File 'lib/string_tools/core_ext/string.rb', line 136

def bold
  surround_with_ansi(ANSI_BOLD)
end

#colorize(color, bold_or_options = nil) ⇒ Object

Synopsys

Colorize string (for terminals)
Does not work with sprintf yet

Usage

"ln -s".colorize(:red)

Args

+color+ - symbol, one of the following (black, white, red, green, yellow, blue, magenta, cyan)
+bold_or_options+ - True/False or Hash


113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/string_tools/core_ext/string.rb', line 113

def colorize(color, bold_or_options = nil)
  is_bold      = bold_or_options.is_a?(TrueClass)
  is_underline = false

  if bold_or_options.is_a?(Hash)
    is_bold    ||= bold_or_options[:bold]
    is_underline = bold_or_options[:underline]
  end

  raise ArgumentError('Color must be a symbol') unless color.is_a?(Symbol)
  color_const = color.to_s.upcase.to_sym

  raise ArgumentError('Unknown color') unless self.class.const_defined?(color_const)
  ascii_color = self.class.const_get(color_const)

  s = surround_with_ansi(ascii_color)
  s = s.bold      if is_bold
  s = s.underline if is_underline
  s
end

#detect_encodingObject

shorthand



160
161
162
163
164
# File 'lib/string_tools/core_ext/string.rb', line 160

def detect_encoding
  e = ::CharDet.detect(self)["encoding"]
  e = WIN_1251_ENCODING if StringTools::CharDet::CP1251_COMPATIBLE_ENCODINGS.include?(e)
  e
end

#mb_downcaseObject



187
188
189
190
191
192
193
194
# File 'lib/string_tools/core_ext/string.rb', line 187

def mb_downcase
  # https://github.com/rails/rails/commit/393e19e508a08ede0f5037bccb984e3eb252d579
  if ActiveSupport::VERSION::STRING >= '4.0.0' && ActiveSupport::VERSION::STRING <= '4.2.0'
    ActiveSupport::Multibyte::Unicode.send(:database).codepoints
  end

  mb_chars.downcase.to_s
end

#naturalizedObject



40
41
42
# File 'lib/string_tools/core_ext/string.rb', line 40

def naturalized
  scan(/[^\d\.]+|[\d\.]+/).map{|f| f.match(/^\d+(\.\d+)?$/) ? f.to_f : f }
end

#remove_colorsObject

Synopsys

remove colors from colorized string


148
149
150
# File 'lib/string_tools/core_ext/string.rb', line 148

def remove_colors
  gsub(/\e\[\d+m/, '')
end

#remove_nonprintableObject

Public: returns copy of string with all non-printable characters removed

Examples

"q\uFFFEw\uFFFFe\uFFF0r\uFDD0t\uFDEFy".remove_nonprintable
# => "qwerty"

Returns String



204
205
206
# File 'lib/string_tools/core_ext/string.rb', line 204

def remove_nonprintable
  gsub(/[^[:print:]\n\t]/i, '')
end

#remove_nonprintable!Object

Public: removes all non-printable characters from string

Examples

"q\uFFFEw\uFFFFe\uFFF0r\uFDD0t\uFDEFy".remove_nonprintable!
# => "qwerty"

Returns String



216
217
218
# File 'lib/string_tools/core_ext/string.rb', line 216

def remove_nonprintable!
  replace(remove_nonprintable)
end

#strip_tagsObject

возвращает строку из которой удалены HTML-теги символы <>&“ остаются без изменения



21
22
23
# File 'lib/string_tools/core_ext/string.rb', line 21

def strip_tags
  Nokogiri::HTML5.parse(self).content
end

#to_bObject



32
33
34
# File 'lib/string_tools/core_ext/string.rb', line 32

def to_b
  StringTools::String.new(self).to_b
end

#to_cp1251Object



179
180
181
# File 'lib/string_tools/core_ext/string.rb', line 179

def to_cp1251
  encode 'cp1251', undef: :replace, invalid: :replace, replace: ''
end

#to_cp1251!Object



183
184
185
# File 'lib/string_tools/core_ext/string.rb', line 183

def to_cp1251!
  self.replace(self.to_cp1251)
end

#to_f_with_strip_commaObject

‘11,3’.to_f

> 11.3



27
28
29
# File 'lib/string_tools/core_ext/string.rb', line 27

def to_f_with_strip_comma
  self.gsub(/,/,'.').to_f_without_strip_comma
end

#to_punycodeObject

Выполняет преобразование строки в punycode.



84
85
86
# File 'lib/string_tools/core_ext/string.rb', line 84

def to_punycode
  Addressable::URI.parse(self).normalize.to_s
end

#to_script_safe_jsonObject



36
37
38
# File 'lib/string_tools/core_ext/string.rb', line 36

def to_script_safe_json
  self.to_json.gsub('</script>', '</" + "script>" + "')
end

#to_utf8(inplace = false) ⇒ Object



166
167
168
169
170
171
172
173
# File 'lib/string_tools/core_ext/string.rb', line 166

def to_utf8(inplace = false)
  return self if valid_encoding? && is_utf8?

  source_enc = detect_encoding
  return '' unless source_enc

  encode_utf8(source_enc, inplace)
end

#to_utf8!Object



175
176
177
# File 'lib/string_tools/core_ext/string.rb', line 175

def to_utf8!
  to_utf8(true)
end

#underlineObject

Synopsys

Make text underlined (for ASCII terminals)


142
143
144
# File 'lib/string_tools/core_ext/string.rb', line 142

def underline
  surround_with_ansi(ANSI_UNDERLINE)
end