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"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.natcmp(str1, str2) ⇒ Object



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

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)


134
135
136
# File 'lib/string_tools/core_ext/string.rb', line 134

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


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

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



157
158
159
160
161
# File 'lib/string_tools/core_ext/string.rb', line 157

def detect_encoding
  e = ::CharDet.detect(self)["encoding"]
  e = 'windows-1251' if StringTools.cp1251_compatible_encodings.include?(e)
  e
end

#naturalizedObject



38
39
40
# File 'lib/string_tools/core_ext/string.rb', line 38

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

#remove_colorsObject

Synopsys

remove colors from colorized string


146
147
148
# File 'lib/string_tools/core_ext/string.rb', line 146

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

#strip_tagsObject

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



19
20
21
# File 'lib/string_tools/core_ext/string.rb', line 19

def strip_tags
  ActionController::Base.helpers.strip_tags(self).to_str.gsub(/<!--/, '<--')
end

#to_bObject



30
31
32
# File 'lib/string_tools/core_ext/string.rb', line 30

def to_b
  ActiveRecord::ConnectionAdapters::Column.value_to_boolean(self) || false
end

#to_cp1251Object



185
186
187
188
189
# File 'lib/string_tools/core_ext/string.rb', line 185

def to_cp1251
  encode 'cp1251', :undef => :replace, :invalid => :replace
rescue
  ''
end

#to_cp1251!Object



191
192
193
# File 'lib/string_tools/core_ext/string.rb', line 191

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

#to_f_with_strip_commaObject

‘11,3’.to_f

> 11.3



25
26
27
# File 'lib/string_tools/core_ext/string.rb', line 25

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

#to_punycodeObject

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



82
83
84
# File 'lib/string_tools/core_ext/string.rb', line 82

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

#to_script_safe_jsonObject



34
35
36
# File 'lib/string_tools/core_ext/string.rb', line 34

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

#to_utf8Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/string_tools/core_ext/string.rb', line 167

def to_utf8
  # и так utf
  return self if is_utf8?

  enc = detect_encoding

  # если utf или английские буквы, то тоже ок
  return self if ['utf-8', 'ascii'].include?(enc)

  # если неизвестная каша, то возвращаем пустую строку
  return '' if enc.nil?

  # иначе пытаемся перекодировать
  encode 'utf-8', enc, :undef => :replace, :invalid => :replace
rescue
  ''
end

#to_utf8!Object



163
164
165
# File 'lib/string_tools/core_ext/string.rb', line 163

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

#underlineObject

Synopsys

Make text underlined (for ASCII terminals)


140
141
142
# File 'lib/string_tools/core_ext/string.rb', line 140

def underline
  surround_with_ansi(ANSI_UNDERLINE)
end