Class: StTools::String

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

Class Method Summary collapse

Class Method Details

.caps(text) ⇒ String

Метод делает заглавной первую букву в словах, разделенных пробелами или дефисом.

Examples:

Примеры использования

StTools::String.caps("саНКТ-петеРБург")    #=> "Санкт-Петербург"

Parameters:

  • text (String)

    исходная строка

Returns:

  • (String)

    строка с первыми заглавными буквами



170
171
172
173
174
175
176
177
178
179
# File 'lib/st_tools/string.rb', line 170

def self.caps(text)
  return nil if text.nil?
  str = self.downcase(text)
  str.gsub!(/(^[а-яa-z]|[а-яa-z\s]-[а-яa-z]|[\.\s\_][а-яa-z])/) do |part|
    part.gsub(/.\b$/) { |x| self.upcase(x) }
  end
  return str
rescue
  return text
end

.delat(text) ⇒ String

Метод заменяет в исходной строке английские символы, похожие на русские - на соответстующие русские символы. То есть это похоже на ситуацию, когда Google меняет слово, случайно написанное английскими буквами - на русское слово. Одновременно буква ‘ё’ меняется на ‘е’.

Parameters:

  • text (String)

    текст со смесью английских и русских букв

Returns:

  • (String)

    текст только с русскими буквами



58
59
60
61
# File 'lib/st_tools/string.rb', line 58

def self.delat(text)
  return nil if text.nil?
  return text.tr('ёЁEeHCcTOoPpAHKXxBM', 'еЕЕеНСсТОоРрАНКХхВМ')
end

.downcase(text) ⇒ String

Метод преобразует строку в нижний регистр с одновременной заменой буквы ‘ё’ на ‘е’. Метод имеет примерно в два раза более высокую производительности по сравнению с традиционным .mb_chars.downcase.to_s, но имеет ограничение - работа только с русскими и английскими строками

Examples:

Примеры использования

StTools::String.downcase("Hello, Вася!")   #=> "hello, вася!"

Parameters:

  • text (String)

    строка в произвольном регистре

Returns:

  • (String)

    строка в нижнем регистре



31
32
33
34
35
# File 'lib/st_tools/string.rb', line 31

def self.downcase(text)
  return nil if text.nil?
  return text.tr('QWERTYUIOPASDFGHJKLZXCVBNMАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',
                 'qwertyuiopasdfghjklzxcvbnmабвгдеёжзийклмнопрстуфхцчшщъыьэюя').gsub('ё', 'е')
end

.hide(text) ⇒ String

Метод позволяет показывать клиенту строку в неполном объеме, с закрытием части символов в строке звездочкой. При этом число звездочек в строке определеяется ее длиной. Чем строка дилинее - тем больше в ней звездочек.

Examples:

Примеры использования

StTools::String.hide("мы")                          #=> "мы"
StTools::String.hide("москва")                      #=> "мо*ква"
StTools::String.hide("длиннаяфраза")                #=> "дли**аяфраза"
StTools::String.hide("просто произвольная фраза")   #=> "**осто пр*извол*н*я фраза"

Parameters:

  • text (String)

    строка, которую необходимо закрыть звездочками

Returns:

  • (String)

    строка, часть символов которой заменена звездочками



89
90
91
92
93
94
95
96
97
# File 'lib/st_tools/string.rb', line 89

def self.hide(text)
  return nil if text.nil?
  len = text.length - 3
  0.upto((len/4).to_i) do
    pos = rand(len)
    text[pos,1] = '*'
  end
  return text
end

.normalize(text) ⇒ String

Метод проводит нормализацию строки для последующей машиной обработки. При этом осуществляется:

  • убирается букву ‘ё’

  • перевод строку в нижний регистр

  • замена случайно введенных английских букв на русские

  • убираются лидирующие и завершающие пробелы

  • в строке удаляются повторные пробелы между словами

Examples:

Примеры использования

StTools::String.normalize("  Ёлки-     ПАЛКИ")   #=> "елки- палки"

Parameters:

  • text (String)

    строка, введенная пользователям

Returns:

  • (String)

    строка без ‘ё’, в нижнем регистре, без английских букв



74
75
76
77
# File 'lib/st_tools/string.rb', line 74

def self.normalize(text)
  return nil if text.nil?
  return self.downcase(self.delat(text)).strip.gsub(/\s{1,100}/, ' ')
end

.pretty_list(items, separator: ',', union: :and, pretag: '', afttag: '') ⇒ String

Метод преобразует список Array в строку перечисление вида “это, это и это”. Метод позволяет делать перечсиелние на разных языках, использовать частицы ‘и’ и ‘или’, а также оформлять список тегами HTML.

Examples:

Примеры использования

StTools::Setup.setup(:ru)
StTools::String.pretty_list([1,2])                      #=> "1 и 2"
StTools::String.pretty_list([1,2,4])                    #=> "1, 2 и 4"
StTools::String.pretty_list([1,2,3,4], union: :or)      #=> "1, 2, 3 или 4"

Parameters:

  • items (Array)

    массив значений для оформления в виде списка

  • separator (String) (defaults to: ',')

    знак разделитель, по умолчанию запятая (‘,’)

  • union (Sym) (defaults to: :and)

    признак частицы, если указать :and, то будет использована частица ‘и’, либо ‘или’ в других случаях

  • pretag (String) (defaults to: '')

    открывающий тег HTML для обрамления элементов списка

  • afttag (String) (defaults to: '')

    закрывающий тег HTML для обрамления элементов списка

Returns:

  • (String)

    конвертированная строка



225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
# File 'lib/st_tools/string.rb', line 225

def self.pretty_list(items, separator: ',', union: :and, pretag: '', afttag: '')
  return '' if items.nil? || items.empty?
  return "#{pretag}#{items.first}#{afttag}" if items.count == 1
  out = Array.new
  last = items.last
  arr = items[0,items.count-1]
  arr.each do |one|
    out << "#{pretag}#{one}#{afttag}"
    out << separator + ' '
  end
  out.pop
  case union
    when :and
      out << " #{I18n.t('string.pretty_list.and')} "
    else
      out << " #{I18n.t('string.pretty_list.or')} "
  end
  out << "#{pretag}#{last}#{afttag}"
  out.join
end

.split(text, separator, opts = {}) ⇒ Array

Метод аналогичен обычной функции split, однако дополнительно может выполнять следующие действия:

  • strip каждого элемента

  • normalize соответсвующей функцией (#normalize)

  • сортировка в прямом порядке

  • удаление дубликотов

Examples:

Примеры использования

StTools::String.split("саша, Паша,   ТАНЯ, Алина", ',')                                                 #=> ["саша", "Паша", "ТАНЯ", "Алина"]
StTools::String.split("саша, Паша,   ТАНЯ, Алина", ',', normalize: true)                                #=> ["саша", "паша", "таня", "алина"]
StTools::String.split("саша, Паша,   ТАНЯ, Алина", ',', normalize: true, sort: true)                    #=> ["алина", "паша", "саша", "таня"]
StTools::String.split("саша, Паша,   ТАНЯ, Алина,  таня", ',', normalize: true, sort: true, uniq: true) #=> ["алина", "паша", "саша", "таня"]

Parameters:

  • text (String)

    исходная строка

  • separator (String)

    сепаратор (по умолчанию нет - необходимо явное указание)

  • opts (Hash) (defaults to: {})

    опции преобразования

Options Hash (opts):

  • :normalize (Boolean)
    • применить к каждому элементу массива функцию #normalize

  • :sort (Boolean)
    • сортировать выходной массив

  • :uniq (Boolean)
    • удалить из массива дубликаты

Returns:

  • (Array)

    массив элементов из строки



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/st_tools/string.rb', line 117

def self.split(text, separator, opts = {})
  return [] if text.nil?
  out = text.split(separator)
  out.map! { |x| x.strip }
  out.map! { |x| self.normalize(x) } if opts[:normalize]
  out.uniq! if opts[:uniq]
  out.sort! if opts[:sort]

  return out
rescue
  return []
end

.to_bool(text, default = false) ⇒ Boolean

Метод конвертирует строку в тип boolean

Examples:

Примеры использования

StTools::String.to_bool("True")      #=> true
StTools::String.to_bool("trUE")      #=> true
StTools::String.to_bool("on")        #=> true
StTools::String.to_bool("1")         #=> true
StTools::String.to_bool("Да")        #=> true
StTools::String.to_bool("Yes")       #=> true
StTools::String.to_bool("false")     #=> false
StTools::String.to_bool("fALse")     #=> false
StTools::String.to_bool("oFF")       #=> false
StTools::String.to_bool("0")         #=> false
StTools::String.to_bool(nil, true)   #=> true
StTools::String.to_bool(nil, false)  #=> false

params = { opt1: true }
StTools::String.to_bool(params[:opt1], false)  #=> true
StTools::String.to_bool(params[:opt2], true)   #=> true

Parameters:

  • text (String)

    исходная строка, содержащая ‘true/false’, ‘on/off’, ‘1/0’

  • default (Boolean) (defaults to: false)

    значение по умолчанию для строк, имеющих значение nil

Returns:

  • (Boolean)

    true или false



203
204
205
206
207
# File 'lib/st_tools/string.rb', line 203

def self.to_bool(text, default = false)
  return default if text.nil?
  return true if ['true', 'on', '1', 'да', 'yes'].include?(self.downcase(text.to_s))
  false
end

.to_range(text, opts = {}) ⇒ Array

Метод возвращает полный массив Array [1, 4, 5, 6, 7, 456] для строк вида ‘1, 4, 5-7, 456’. Дополнительно осуществляется:

  • сортировка в прямом порядке

  • удаление дубликотов

Examples:

Примеры использования

StTools::String.to_range("1, 4, 5-7, 456, 6")                           #=> [1, 4, 5, 6, 7, 456, 6]
StTools::String.to_range("1, 4, 5-7, 456, 6", sort: true)               #=> [1, 4, 5, 6, 6, 7, 456]
StTools::String.to_range("1, 4, 5-7, 456, 6", sort: true, uniq: true)   #=> [1, 4, 5, 6, 7, 456]

Parameters:

  • text (String)

    исходная строка

  • opts (Hash) (defaults to: {})

Options Hash (opts):

  • :sort (Boolean)
    • сортировать выходной массив

  • :uniq (Boolean)
    • удалить из массива дубликаты

Returns:

  • (Array)

    массив чисел



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/st_tools/string.rb', line 144

def self.to_range(text, opts = {})
  return [] if text.nil?
  out = Array.new

  tmp = self.split(text, ',')
  tmp.each do |one|
    if one.match(/\-/)
      d = one.split(/\-/)
      out += Range.new(d.first.to_i, d.last.to_i).to_a
    else
      out << one.to_i
    end
  end

  out.uniq! if opts[:uniq]
  out.sort! if opts[:sort]

  return out
end

.translit(text) ⇒ String

Метод преобразует текст в транслит

Examples:

Примеры использования

StTools::String.translit("Жмеринка")   #=> "Zhmerinka"

Parameters:

  • text (String)

    исходная строка с русскими буквами

Returns:

  • (String)

    строка в транслите



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/st_tools/string.rb', line 10

def self.translit(text)
  return nil if text.nil?
  translited = text.tr('абвгдеёзийклмнопрстуфхэыь', 'abvgdeezijklmnoprstufhey\'\'')
  translited = translited.tr('АБВГДЕЁЗИЙКЛМНОПРСТУФХЭЫЬ', 'ABVGDEEZIJKLMNOPRSTUFHEY\'\'')

  translited = translited.gsub(/[жцчшщъюяЖЦЧШЩЪЮЯ]/, 'ж' => 'zh', 'ц' => 'ts', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',
                               'ъ' => '', 'ю' => 'ju', 'я' => 'ja',
                               'Ж' => 'Zh', 'Ц' => 'Ts', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch',
                               'Ъ' => '', 'Ю' => 'Ju', 'Я' => 'Ja')
  translited.gsub!('\'', '')
  return translited
end

.upcase(text) ⇒ String

Метод преобразует строку в верхний регистр с одновременной заменой буквы ‘Ё’ на ‘Е’. Метод имеет примерно в два раза более высокую производительности по сравнению с традиционным .mb_chars.downcase.to_s, но имеет ограничение - работа только с русскими и английскими строками

Examples:

Примеры использования

StTools::String.upcase("Hello, Вася!")   #=> "HELLO, ВАСЯ!"

Parameters:

  • text (String)

    строка в произвольном регистре

Returns:

  • (String)

    строка в верхнем регистре



45
46
47
48
49
# File 'lib/st_tools/string.rb', line 45

def self.upcase(text)
  return nil if text.nil?
  return text.tr('qwertyuiopasdfghjklzxcvbnmабвгдеёжзийклмнопрстуфхцчшщъыьэюя',
                 'QWERTYUIOPASDFGHJKLZXCVBNMАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ').gsub('Ё', 'Е')
end