rmtools 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/License.txt +15 -0
- data/Manifest.txt +37 -0
- data/README.txt +10 -0
- data/Rakefile +39 -0
- data/ext/extconf.rb +12 -0
- data/ext/rmtools.cpp +529 -0
- data/ext/rmtools.h +161 -0
- data/lib/rmtools.rb +53 -0
- data/lib/rmtools/arguments.rb +24 -0
- data/lib/rmtools/array.rb +189 -0
- data/lib/rmtools/binding.rb +23 -0
- data/lib/rmtools/boolean.rb +57 -0
- data/lib/rmtools/coloring.rb +82 -0
- data/lib/rmtools/cyr-time.rb +49 -0
- data/lib/rmtools/cyrilic.rb +124 -0
- data/lib/rmtools/dumps.rb +192 -0
- data/lib/rmtools/enum.rb +90 -0
- data/lib/rmtools/hash.rb +40 -0
- data/lib/rmtools/io.rb +303 -0
- data/lib/rmtools/js.rb +25 -0
- data/lib/rmtools/limited_string.rb +17 -0
- data/lib/rmtools/logging.rb +158 -0
- data/lib/rmtools/module.rb +113 -0
- data/lib/rmtools/numeric.rb +82 -0
- data/lib/rmtools/object.rb +74 -0
- data/lib/rmtools/printing.rb +41 -0
- data/lib/rmtools/proc.rb +25 -0
- data/lib/rmtools/random.rb +195 -0
- data/lib/rmtools/range.rb +100 -0
- data/lib/rmtools/setup.rb +21 -0
- data/lib/rmtools/string.rb +276 -0
- data/lib/rmtools/string_to_proc.rb +113 -0
- data/lib/rmtools/stringscanner.rb +58 -0
- data/lib/rmtools/time.rb +32 -0
- data/lib/rmtools/traceback.rb +106 -0
- data/lib/rmtools/tree.rb +71 -0
- metadata +191 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
class Numeric
|
3
|
+
def b; (self != 0) && self end
|
4
|
+
end
|
5
|
+
class String
|
6
|
+
def b; !empty? && self end
|
7
|
+
end
|
8
|
+
class Proc
|
9
|
+
def b; (self != NULL) && self end
|
10
|
+
end
|
11
|
+
module Enumerable
|
12
|
+
def b; !empty? && self end
|
13
|
+
end
|
14
|
+
|
15
|
+
class TrueClass
|
16
|
+
def to_i; 1; end
|
17
|
+
def <=>(obj)
|
18
|
+
case obj
|
19
|
+
when nil, false then 1
|
20
|
+
when self then 0
|
21
|
+
else -1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def < obj; !!obj end
|
26
|
+
def <= obj; !!obj or obj == true end
|
27
|
+
def > obj; !obj end
|
28
|
+
def >= obj; !obj or obj == true end
|
29
|
+
end
|
30
|
+
|
31
|
+
class FalseClass
|
32
|
+
def to_i; 0; end
|
33
|
+
def <=>(obj)
|
34
|
+
case obj
|
35
|
+
when nil then 1
|
36
|
+
when self then 0
|
37
|
+
else -1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def < obj; !!obj end
|
42
|
+
def <= obj; !obj.nil? end
|
43
|
+
def > obj; obj.nil? end
|
44
|
+
def >= obj; !obj end
|
45
|
+
end
|
46
|
+
|
47
|
+
class NilClass
|
48
|
+
def to_i; 0; end
|
49
|
+
def <=>(obj)
|
50
|
+
obj.nil? ? 0 : -1
|
51
|
+
end
|
52
|
+
|
53
|
+
def < obj; !obj.nil? end
|
54
|
+
def <= obj; true or obj == true end
|
55
|
+
def > obj; false end
|
56
|
+
def >= obj; obj.nil? or obj == true end
|
57
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module RMTools
|
3
|
+
|
4
|
+
class Coloring
|
5
|
+
__init__
|
6
|
+
method_defined? :b and undef_method :b
|
7
|
+
method_defined? :p and undef_method :p
|
8
|
+
|
9
|
+
if !defined? ::BOLD
|
10
|
+
BOLD = 1
|
11
|
+
UNDERLINE = 4
|
12
|
+
GRAYBG = 5
|
13
|
+
BOLDBG = 7
|
14
|
+
|
15
|
+
KEY = BLACK = 30
|
16
|
+
RED = 31
|
17
|
+
GREEN = 32
|
18
|
+
YELLOW = 33
|
19
|
+
BLUE = 34
|
20
|
+
PURPLE = 35
|
21
|
+
CYAN = 36
|
22
|
+
GRAY = 37
|
23
|
+
|
24
|
+
Colors = {:black => 30, :red => 31, :green => 32, :yellow => 33, :blue => 34, :purple => 35, :cyan => 36, :gray => 37,
|
25
|
+
:k => 30, :r => 31, :g => 32, :y => 33, :b => 34, :p => 35, :c => 36
|
26
|
+
}.unify_strs
|
27
|
+
Effects = {:bold => 1, :underline => 4, :graybg => 5, :boldbg => 7,
|
28
|
+
:b => 1, :u => 4, :gbg => 5, :bbg => 7
|
29
|
+
}.unify_strs end
|
30
|
+
|
31
|
+
def paint(str, num=nil, effect=nil)
|
32
|
+
# default cmd.exe cannot into ANSI
|
33
|
+
return str if ENV['ComSpec'] =~ /cmd(.exe)?$/
|
34
|
+
num = Colors[num] if num.is String
|
35
|
+
effect = Effects[effect] if effect.is String
|
36
|
+
if num and effect
|
37
|
+
"\e[#{effect};#{num}m#{str}\e[m"
|
38
|
+
elsif effect
|
39
|
+
"\e[#{effect}m#{str}\e[m"
|
40
|
+
elsif num
|
41
|
+
"\e[#{num}m#{str}\e[m"
|
42
|
+
else str
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def method_missing(m, str)
|
47
|
+
paint str, *(m.to_s/"_")
|
48
|
+
end
|
49
|
+
|
50
|
+
def clean str
|
51
|
+
str.gsub(/\e\[.*?m/, '')
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
Painter = Coloring.new
|
57
|
+
['sub', 'gsub', 'sub!', 'gsub!'].each {|m| Coloring.module_eval "
|
58
|
+
def #{m.sub 'sub', 'hl'} str, pattern, color=:red_bold
|
59
|
+
str.#{m}(pattern) {|word| send color, word}
|
60
|
+
end
|
61
|
+
"
|
62
|
+
module_eval "
|
63
|
+
def #{m.sub 'sub', 'hl'} str, pattern, color=:red_bold
|
64
|
+
str.#{m}(pattern) {|word| Painter.send color, word}
|
65
|
+
end
|
66
|
+
"
|
67
|
+
# module_function m.to_sym
|
68
|
+
}
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
class String
|
73
|
+
|
74
|
+
def find_hl(pat, range=1000) idx = case pat
|
75
|
+
when String; index pat
|
76
|
+
when Regexp; self =~ pat
|
77
|
+
else raise TypeError, "pattern must be string or regexp"
|
78
|
+
end
|
79
|
+
puts RMTools.ghl(self[[idx-range, 0].max, 2*range], pat)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
class String
|
4
|
+
|
5
|
+
def digit_date
|
6
|
+
gsub(/jan|[яЯ][нН][вВ]([аА][рР][яЯьЬ]?)?/i, '01').
|
7
|
+
gsub(/feb|[фФ][еЕ][вВ]([рР][аА][лЛ][яЯьЬ]?)?/i, '02').
|
8
|
+
gsub(/mar|[мМ][аА][рР]([тТ][аА]?)?/i, '03').
|
9
|
+
gsub(/apr|[аА][пП][рР]([еЕ][лЛ][яЯьЬ]?)?/i, '04').
|
10
|
+
gsub(/may|[мМ][аА][яЯйЙ]?/i, '05').
|
11
|
+
gsub(/june?|[иИ][юЮ][нН][яЯьЬ]?/i, '06').
|
12
|
+
gsub(/july?|[иИ][юЮ][лЛ][яЯьЬ]?/i, '07').
|
13
|
+
gsub(/aug|[аА][вВ][гГ]([уУ][сС][тТ][аА]?)?/i, '08').
|
14
|
+
gsub(/sep|[сС][еЕ][нН]([тТ][яЯ][бБ][рР][яЯьЬ]?)?/i, '09').
|
15
|
+
gsub(/oct|[оО][кК][тТ]([яЯ][бБ][рР][яЯьЬ]?)?/i, '10').
|
16
|
+
gsub(/nov|[нН][оО][яЯ]([бБ][рР][яЯьЬ]?)?/i, '11').
|
17
|
+
gsub(/dec|[дД][еЕ][кК]([аА][бБ][рР][яЯьЬ]?)?/i, '12')
|
18
|
+
end
|
19
|
+
alias digitize digit_date
|
20
|
+
|
21
|
+
def tr_date
|
22
|
+
gsub(/[яЯ][нН][вВ]([аА][рР][яЯьЬ]?)?/, 'jan').
|
23
|
+
gsub(/[фФ][еЕ][вВ]([рР][аА][лЛ][яЯьЬ]?)?/, 'feb').
|
24
|
+
gsub(/[мМ][аА][рР]([тТ][аА]?)?/, 'mar').
|
25
|
+
gsub(/[аА][пП][рР]([еЕ][лЛ][яЯьЬ]?)?/, 'apr').
|
26
|
+
gsub(/[мМ][аА][яЯйЙ]?/, 'may').
|
27
|
+
gsub(/[иИ][юЮ][нН][яЯьЬ]?/, 'jun').
|
28
|
+
gsub(/[иИ][юЮ][лЛ][яЯьЬ]?/, 'jul').
|
29
|
+
gsub(/[аА][вВ][гГ]([уУ][сС][тТ][аА]?)?/, 'aug').
|
30
|
+
gsub(/[сС][еЕ][нН]([тТ][яЯ][бБ][рР][яЯьЬ]?)?/, 'sep').
|
31
|
+
gsub(/[оО][кК][тТ]([яЯ][бБ][рР][яЯьЬ]?)?/, 'oct').
|
32
|
+
gsub(/[нН][оО][яЯ]([бБ][рР][яЯьЬ]?)?/, 'nov').
|
33
|
+
gsub(/[дД][еЕ][кК]([аА][бБ][рР][яЯьЬ]?)?/, 'dec')
|
34
|
+
end
|
35
|
+
|
36
|
+
def digit_nums
|
37
|
+
gsub(/[оО][дД][иИ][нН]|[еЕ][дД][иИ][нН][иИ][цЦ][аА]/, '1').
|
38
|
+
gsub(/[дД][вВ]([оО][йЙ][кК])?[аА]/, '2').
|
39
|
+
gsub(/[тТ][рР]([иИ]|[оО][йЙ][кК][аА])/, '3').
|
40
|
+
gsub(/[чЧ][еЕ][тТ]([ыЫ][рР][еЕ]|[вВ][еЕёЁ][рР][кК][аА])/, '4').
|
41
|
+
gsub(/[пП][яЯ][тТ]([ьЬ]|[еЕёЁ][рР][кК][аА])/, '5').
|
42
|
+
gsub(/[шШ][еЕ][сС][тТ]([ьЬ]|[еЕёЁ][рР][кК][аА])/, '6').
|
43
|
+
gsub(/[сС][еЕ][мМ]([ьЬ]|[еЕёЁ][рР][кК][аА])/, '7').
|
44
|
+
gsub(/[вВ][оО][сС]([еЕ][мМ][ьЬ]|[ьЬ][мМ][еЕёЁ][рР][кК][аА])/i, '8').
|
45
|
+
gsub(/[дД][еЕ][вВ][яЯ][тТ]([ьЬ]|[кК][аА])/, '9').
|
46
|
+
gsub(/[нН][оОуУ][лЛ][ьЬ]/, '0')
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
RU_LETTERS = "абвгдеёжзийклмнопрстуфхцчшщьыъэюя", "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ"
|
3
|
+
ANSI2UTF = Iconv.new("UTF-8", "WINDOWS-1251").method :iconv
|
4
|
+
UTF2ANSI = Iconv.new("WINDOWS-1251", "UTF-8").method :iconv
|
5
|
+
|
6
|
+
class String
|
7
|
+
|
8
|
+
def cyr_ic
|
9
|
+
gsub(/[ёЁ]/, '[ёЁ]').gsub(/[йЙ]/, '[йЙ]').gsub(/[цЦ]/, '[цЦ]').gsub(/[уУ]/, '[уУ]').gsub(/[кК]/, '[кК]').gsub(/[еЕ]/, '[еЕ]').gsub(/[нН]/, '[нН]').gsub(/[гГ]/, '[гГ]').gsub(/[шШ]/, '[шШ]').gsub(/[щЩ]/, '[щЩ]').gsub(/[зЗ]/, '[зЗ]').gsub(/[хХ]/, '[хХ]').gsub(/[ъЪ]/, '[ъЪ]').gsub(/[фФ]/, '[фФ]').gsub(/[ыЫ]/, '[ыЫ]').gsub(/[вВ]/, '[вВ]').gsub(/[аА]/, '[аА]').gsub(/[пП]/, '[пП]').gsub(/[рР]/, '[рР]').gsub(/[оО]/, '[оО]').gsub(/[лЛ]/, '[лЛ]').gsub(/[дД]/, '[дД]').gsub(/[жЖ]/, '[жЖ]').gsub(/[эЭ]/, '[эЭ]').gsub(/[яЯ]/, '[яЯ]').gsub(/[чЧ]/, '[чЧ]').gsub(/[сС]/, '[сС]').gsub(/[мМ]/, '[мМ]').gsub(/[иИ]/, '[иИ]').gsub(/[тТ]/, '[тТ]').gsub(/[ьЬ]/, '[ьЬ]').gsub(/[бБ]/, '[бБ]').gsub(/[юЮ]/, '[юЮ]')
|
10
|
+
end
|
11
|
+
alias :ci :cyr_ic
|
12
|
+
|
13
|
+
def utfmask
|
14
|
+
gsub(/А/m,"А").gsub(/Б/m,"Б").gsub(/Е/m,"Е").gsub(/И/m,"И").gsub(/О/m,"О").gsub(/У/m,"У").gsub(/Ы/m,"Ы").gsub(/а/m,"а").gsub(/б/m,"б").gsub(/е/m,"е").gsub(/и/m,"и").gsub(/о/m,"о").gsub(/у/m,"у").gsub(/ы/m,"ы")
|
15
|
+
end
|
16
|
+
|
17
|
+
def translit
|
18
|
+
gsub(/[ёЁ]/, 'yo').gsub(/[йЙ]/, 'y').gsub(/[цЦ]/, 'c').gsub(/[уУ]/, 'u').gsub(/[кК]/, 'k').gsub(/[еЕ]/, 'e').gsub(/[нН]/, 'n').gsub(/[гГ]/, 'g').gsub(/[шШ]/, 'sh').gsub(/[щЩ]/, 'sch').gsub(/[зЗ]/, 'z').gsub(/[хХ]/, 'h').gsub(/[ьЬъЪ]/, "'").gsub(/[фФ]/, 'f').gsub(/[иИыЫ]/, 'i').gsub(/[вВ]/, 'v').gsub(/[аА]/, 'a').gsub(/[пП]/, 'p').gsub(/[рР]/, 'r').gsub(/[оО]/, 'o').gsub(/[лЛ]/, 'l').gsub(/[дД]/, 'd').gsub(/[жЖ]/, 'j').gsub(/[эЭ]/, 'e').gsub(/[яЯ]/, 'ya').gsub(/[чЧ]/, 'ch').gsub(/[сС]/, 's').gsub(/[мМ]/, 'm').gsub(/[тТ]/, 't').gsub(/[бБ]/, 'b').gsub(/[юЮ]/, 'yu')
|
19
|
+
end
|
20
|
+
|
21
|
+
if RUBY_VERSION >= "1.9"
|
22
|
+
|
23
|
+
def ru2en
|
24
|
+
tr "ёйцукенгшщзхъфывапролдэячсмить/.ю?,б\"№;:жЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИВТЬБЮ", "`qwertyuiop[]asdfghjkl'zxcvbnm|/.&?,@\#$^;~QWERTYUIOP{}ASDFGHJKL:\"ZXCVBDNM<>"
|
25
|
+
end
|
26
|
+
|
27
|
+
def en2ru
|
28
|
+
tr "`qwertyuiop[]asdfghjkl;:'zxcvbnm,./|?\"@\#$^&~QWERTYUIOP{}ASDFGHJKLZXCVBNM<>", "ёйцукенгшщзхъфывапролджЖэячсмитьбю./,Э\"№;:?ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЯЧСМИТЬБЮ"
|
29
|
+
end
|
30
|
+
|
31
|
+
ANSI_LETTERS_UC = ["\270\340-\377", "\250\300-\337"].force_encodings "Windows-1251"
|
32
|
+
ANSI_LETTERS_DC = ANSI_LETTERS_UC.reverse
|
33
|
+
ANSI_YOYE = ["\270\250", "\345\305"].force_encodings "Windows-1251"
|
34
|
+
ANSI_ENCODING = ANSI_LETTERS_UC[0].encoding
|
35
|
+
|
36
|
+
def cupcase
|
37
|
+
encoding != ANSI_ENCODING ?
|
38
|
+
ANSI2UTF[UTF2ANSI[self].tr(*ANSI_LETTERS_UC)]:
|
39
|
+
tr(*ANSI_LETTERS_UC)
|
40
|
+
end
|
41
|
+
|
42
|
+
def cdowncase
|
43
|
+
encoding != ANSI_ENCODING ?
|
44
|
+
ANSI2UTF[UTF2ANSI[self].tr(*ANSI_LETTERS_DC)]:
|
45
|
+
tr(*ANSI_LETTERS_DC)
|
46
|
+
end
|
47
|
+
|
48
|
+
def ccap
|
49
|
+
self[0].cupcase + self[1..-1]
|
50
|
+
end
|
51
|
+
|
52
|
+
def cuncap
|
53
|
+
self[0].cdowncase + self[1..-1]
|
54
|
+
end
|
55
|
+
|
56
|
+
def rmumlaut
|
57
|
+
encoding != ANSI_ENCODING ?
|
58
|
+
ANSI2UTF[UTF2ANSI[self].tr(*ANSI_YOYE)]:
|
59
|
+
tr(*ANSI_YOYE)
|
60
|
+
end
|
61
|
+
|
62
|
+
else
|
63
|
+
|
64
|
+
def cupcase(encode=1)
|
65
|
+
encode ?
|
66
|
+
ANSI2UTF[UTF2ANSI[self].tr("\270\340-\377", "\250\300-\337")]:
|
67
|
+
tr("\270\340-\377", "\250\300-\337")
|
68
|
+
end
|
69
|
+
|
70
|
+
def cdowncase(encode=1)
|
71
|
+
encode ?
|
72
|
+
ANSI2UTF[UTF2ANSI[self].tr("\250\300-\337", "\270\340-\377")]:
|
73
|
+
tr("\250\300-\337", "\270\340-\377")
|
74
|
+
end
|
75
|
+
|
76
|
+
def ccap(encode=1)
|
77
|
+
self[0,2].cupcase(encode) + self[2..-1]
|
78
|
+
end
|
79
|
+
|
80
|
+
def cuncap(encode=1)
|
81
|
+
self[0,2].cdowncase(encode) + self[2..-1]
|
82
|
+
end
|
83
|
+
|
84
|
+
def rmumlaut(encode=1)
|
85
|
+
encode ?
|
86
|
+
ANSI2UTF[UTF2ANSI[self].tr("\270\250", "\345\305")]:
|
87
|
+
tr("\270\250", "\345\305")
|
88
|
+
end
|
89
|
+
|
90
|
+
def ru2en
|
91
|
+
gsub("ё", "`").gsub("й", "q").gsub("ц", "w").gsub("у", "e").gsub("к", "r").gsub("е", "t").gsub("н", "y").gsub("г", "u").gsub("ш", "i").gsub("щ", "o").gsub("з", "p").gsub("х", "[").gsub("ъ", "]").gsub("ф", "a").gsub("ы", "s").gsub("в", "d").gsub("а", "f").gsub("п", "g").gsub("р", "h").gsub("о", "j").gsub("л", "k").gsub("д", "l").gsub("э", "'").gsub("я", "z").gsub("ч", "x").gsub("с", "c").gsub("м", "v").gsub("и", "b").gsub("т", "n").gsub("ь", "m").gsub("/", "|").gsub(".", "/").gsub("ю", ".").gsub("?", "&").gsub(",", "?").gsub("б", ",").gsub("\"", "@").gsub("№", "#").gsub(";", "$").gsub(":", "^").gsub("ж", ";").gsub("Ё", "~").gsub("Й", "Q").gsub("Ц", "W").gsub("У", "E").gsub("К", "R").gsub("Е", "T").gsub("Н", "Y").gsub("Г", "U").gsub("Ш", "I").gsub("Щ", "O").gsub("З", "P").gsub("Х", "{").gsub("Ъ", "}").gsub("Ф", "A").gsub("Ы", "S").gsub("В", "D").gsub("А", "F").gsub("П", "G").gsub("Р", "H").gsub("О", "J").gsub("Л", "K").gsub("Д", "L").gsub("Ж", ":").gsub("Э", "\"").gsub("Я", "Z").gsub("Ч", "X").gsub("С", "C").gsub("М", "V").gsub("И", "B").gsub("Т", "N").gsub("Ь", "M").gsub("Б", "<").gsub("Ю", ">")
|
92
|
+
end
|
93
|
+
|
94
|
+
def en2ru
|
95
|
+
gsub("`", "ё").gsub("q", "й").gsub("w", "ц").gsub("e", "у").gsub("r", "к").gsub("t", "е").gsub("y", "н").gsub("u", "г").gsub("i", "ш").gsub("o", "щ").gsub("p", "з").gsub("[", "х").gsub("]", "ъ").gsub("a", "ф").gsub("s", "ы").gsub("d", "в").gsub("f", "а").gsub("g", "п").gsub("h", "р").gsub("j", "о").gsub("k", "л").gsub("l", "д").gsub(";", "ж").gsub(":", "Ж").gsub("'", "э").gsub("z", "я").gsub("x", "ч").gsub("c", "с").gsub("v", "м").gsub("b", "и").gsub("n", "т").gsub("m", "ь").gsub(",", "б").gsub(".", "ю").gsub("/", ".").gsub("|", "/").gsub("?", ",").gsub("\"", "Э").gsub("@", "\"").gsub("#", "№").gsub("$", ";").gsub("^", ":").gsub("&", "?").gsub("~", "Ё").gsub("Q", "Й").gsub("W", "Ц").gsub("E", "У").gsub("R", "К").gsub("T", "Е").gsub("Y", "Н").gsub("U", "Г").gsub("I", "Ш").gsub("O", "Щ").gsub("P", "З").gsub("{", "Х").gsub("}", "Ъ").gsub("A", "Ф").gsub("S", "Ы").gsub("D", "В").gsub("F", "А").gsub("G", "П").gsub("H", "Р").gsub("J", "О").gsub("K", "Л").gsub("L", "Д").gsub("Z", "Я").gsub("X", "Ч").gsub("C", "С").gsub("V", "М").gsub("B", "И").gsub("N", "Т").gsub("M", "Ь").gsub("<", "Б").gsub(">", "Ю")
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
def swap
|
101
|
+
sub(/([a-zA-Z])|([а-яА-ЯёЁ])/) {|m| return $~[1]? en2ru: ru2en}
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
def caps?
|
106
|
+
self !~ /[а-яё]/
|
107
|
+
end
|
108
|
+
|
109
|
+
def cyr?
|
110
|
+
self !~ /[^а-яА-ЯёЁ]/
|
111
|
+
end
|
112
|
+
|
113
|
+
def csqueeze
|
114
|
+
ANSI2UTF[UTF2ANSI[self].squeeze]
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
class Regexp
|
120
|
+
|
121
|
+
def cyr_ic() Regexp.new(source.cyr_ic, options) end
|
122
|
+
alias :ci :cyr_ic
|
123
|
+
|
124
|
+
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module RMTools
|
3
|
+
|
4
|
+
def reports(w, b) w.reports(b) end
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
module Enumerable
|
9
|
+
|
10
|
+
def dump_recurse(obj, depth, maxdepth)
|
11
|
+
res = ''
|
12
|
+
case obj
|
13
|
+
when Hash
|
14
|
+
if depth <= maxdepth
|
15
|
+
res = "{\n"
|
16
|
+
obj.each { |i, j|
|
17
|
+
i = 'nil' if i.nil?
|
18
|
+
j = 'nil' if j.nil?
|
19
|
+
childinfo = dump_recurse(j,depth+1,maxdepth)
|
20
|
+
res << "%s\t%s => %s、\n"%[("\t"*depth), i, childinfo]
|
21
|
+
}
|
22
|
+
res << "\t"*depth+" }"
|
23
|
+
else
|
24
|
+
res = obj.inspect
|
25
|
+
end
|
26
|
+
res
|
27
|
+
when Array
|
28
|
+
if depth <= maxdepth
|
29
|
+
res = "[\n"
|
30
|
+
obj.each_with_index { |j, i|
|
31
|
+
j = 'nil' if j.nil?
|
32
|
+
childinfo = dump_recurse(j,depth+1,maxdepth)
|
33
|
+
res << "%s\t%0*d: %s、\n"%[("\t"*depth), (obj.size-1).to_s.size, i, childinfo]
|
34
|
+
}
|
35
|
+
res << "\t"*depth+" ]"
|
36
|
+
else
|
37
|
+
res = obj.inspect
|
38
|
+
end
|
39
|
+
res
|
40
|
+
when String then obj
|
41
|
+
else obj.inspect
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def urlencode
|
46
|
+
map {|k, v| next if !v
|
47
|
+
k, v = k.to_s, v.to_s
|
48
|
+
if v =~ /&/
|
49
|
+
v = v/'&'
|
50
|
+
v.map {|val| "#{CGI.escape(k)}=#{CGI.escape(val)}"} * '&'
|
51
|
+
elsif k =~ /&/
|
52
|
+
k = k/'&'
|
53
|
+
k.map {|key| "#{CGI.escape(key)}=#{CGI.escape(v)}"} * '&'
|
54
|
+
else
|
55
|
+
"#{CGI.escape(k)}=#{CGI.escape(v)}"
|
56
|
+
end
|
57
|
+
} * '&'
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
class Object
|
63
|
+
|
64
|
+
def present
|
65
|
+
Hash[readable_variables.map {|v| [":#{v}", __send__(v)]}].present
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
class Array
|
71
|
+
|
72
|
+
def dump(depth=5)
|
73
|
+
res = "[ "
|
74
|
+
res << map_with_index {|j, i|
|
75
|
+
j = 'nil' if j.nil?
|
76
|
+
"%0*d: %s、"%[i, (size-1).to_s.size, dump_recurse(j,0,depth)]
|
77
|
+
}*"\n "
|
78
|
+
res << "]\n"
|
79
|
+
end
|
80
|
+
|
81
|
+
def present(inspect_string=nil)
|
82
|
+
res = "[ "
|
83
|
+
indent = (size-1).to_s.size
|
84
|
+
res << map_with_index {|k,i|
|
85
|
+
"#{i.to_s.rjust(indent)}: #{(k.is String and !inspect_string) ? k : k.inspect}"
|
86
|
+
}*"\n "
|
87
|
+
res << "]"
|
88
|
+
puts res
|
89
|
+
end
|
90
|
+
|
91
|
+
def reports b
|
92
|
+
map {|s| b.eval "\"#{s.gsub('"'){'\"'}} = \#{(#{s}).inspect}\""} * '; '
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
class Hash
|
98
|
+
|
99
|
+
def dump(depth=5)
|
100
|
+
res = "{ "
|
101
|
+
res << map {|i, j|
|
102
|
+
i = 'nil' if i.nil?
|
103
|
+
j = 'nil' if j.nil?
|
104
|
+
"%0*s => %s、\n"%[i, keys.to_ss.max, dump_recurse(j,0,depth)]
|
105
|
+
}*"\n "
|
106
|
+
res << "}\n"
|
107
|
+
end
|
108
|
+
|
109
|
+
def present(inspect_string=nil)
|
110
|
+
str = "{ "
|
111
|
+
sorted = sort rescue(to_a.sort_by_to_s)
|
112
|
+
sorted.each {|k,v|
|
113
|
+
"#{(k.is String and !inspect_string) ? k : k.inspect} => #{(v.is String and !inspect_string) ? v : v.inspect},"
|
114
|
+
}*"\n "
|
115
|
+
str << "}"
|
116
|
+
puts str
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
class String
|
122
|
+
|
123
|
+
# with default delimiters - inversion of #urlencode
|
124
|
+
def to_hash(unscp=true, params_delim='&', k_v_delim='=')
|
125
|
+
params = split(params_delim)
|
126
|
+
h = {}
|
127
|
+
params.each {|par|
|
128
|
+
str = par.split(k_v_delim, 2)
|
129
|
+
if unscp
|
130
|
+
h[CGI.unescape(str[0]) || ''] = CGI.unescape(str[1] || '')
|
131
|
+
else
|
132
|
+
h[str[0]] = str[1]
|
133
|
+
end
|
134
|
+
}
|
135
|
+
h
|
136
|
+
end
|
137
|
+
|
138
|
+
# inversion of #to_json
|
139
|
+
# works only with activesupport ^_^"
|
140
|
+
def from_json
|
141
|
+
ActiveSupport::JSON.decode self
|
142
|
+
end
|
143
|
+
|
144
|
+
def reports b
|
145
|
+
split(' ').map {|s| b.eval "\"#{s.gsub('"'){'\"'}} = \#{(#{s}).inspect}\""} * '; '
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
class Integer
|
151
|
+
|
152
|
+
def to_apprtime(t=nil)
|
153
|
+
if t
|
154
|
+
if t.in [:minutes, :min, :m]
|
155
|
+
"#{self/60} minutes"
|
156
|
+
elsif t.in [:hours, :h]
|
157
|
+
"#{self/3600} hours"
|
158
|
+
elsif t.in [:days, :d]
|
159
|
+
"#{self/86400} days"
|
160
|
+
end
|
161
|
+
elsif self < 60
|
162
|
+
"#{self} seconds"
|
163
|
+
elsif self < 3600
|
164
|
+
"#{self/60} minutes"
|
165
|
+
elsif self < 86400
|
166
|
+
"#{self/3600} hours"
|
167
|
+
else
|
168
|
+
"#{self/86400} days"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def bytes(t=nil)
|
173
|
+
if t
|
174
|
+
if :kb == t
|
175
|
+
sprintf "%.2fkb", to_f/1024
|
176
|
+
elsif :mb == t
|
177
|
+
sprintf "%.2fmb", to_f/1048576
|
178
|
+
elsif :gb == t
|
179
|
+
sprintf "%.2fmb", to_f/1073741824
|
180
|
+
end
|
181
|
+
elsif self < 1024
|
182
|
+
"#{self}b"
|
183
|
+
elsif self < 1048576
|
184
|
+
sprintf "%.2fkb", to_f/1024
|
185
|
+
elsif self < 1073741824
|
186
|
+
sprintf "%.2fmb", to_f/1048576
|
187
|
+
else
|
188
|
+
sprintf "%.2fmb", to_f/1073741824
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|