-
Notifications
You must be signed in to change notification settings - Fork 67
/
ext.rb
257 lines (209 loc) · 5.07 KB
/
ext.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
93
94
95
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
class String
def humanize
self.split(/_|-| /).join(' ')
end
def titleize
self.split(/_|-| /).each{|word| word[0...1] = word[0...1].upcase}.join(' ')
end
def empty?
self.length < 1
end
def pluralize
Inflector.inflections.pluralize self
end
def singularize
Inflector.inflections.singularize self
end
def camelize(uppercase_first_letter = true)
string = self.dup
string.gsub!(/(?:_|(\/))([a-z\d]*)/i) do
new_word = $2.downcase
new_word[0] = new_word[0].upcase
new_word = "/#{new_word}" if $1 == '/'
new_word
end
if uppercase_first_letter && uppercase_first_letter != :lower
string[0] = string[0].upcase
else
string[0] = string[0].downcase
end
string.gsub!('/', '::')
string
end
def underscore
word = self.dup
word.gsub!(/::/, '/')
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
word.tr!("-", "_")
word.downcase!
word
end
end
# Inflector is a singleton class that helps
# singularize, pluralize and other-thing-ize
# words. It is very much based on the Rails
# ActiveSupport implementation or Inflector
class Inflector
def self.instance
@__instance__ ||= new
end
def initialize
reset
end
def reset
# Put singular-form to plural form transformations here
@plurals = [
[/^person$/, 'people'],
[/^identity$/, 'identities'],
[/^child$/, 'children'],
[/^(.*)ee$/i, '\1ees'], # attendee => attendees
[/^(.*)us$/i, '\1i'], # alumnus => alumni
[/^(.*s)$/i, '\1es'], # pass => passes
[/^(.*)$/, '\1s'] # normal => normals
]
# Put plural-form to singular form transformations here
@singulars = [
[/^people$/, 'person'],
[/^identities$/, 'identity'],
[/^children$/, 'child'],
[/^(.*)ees$/i, '\1ee'], # attendees => attendee
[/^(.*)es$/i, '\1'], # passes => pass
[/^(.*)i$/i, '\1us'], # alumni => alumnus
[/^(.*)s$/i, '\1'] # normals => normal
]
@irregulars = [
]
@uncountables = [
'fish',
'sheep'
]
end
attr_reader :plurals, :singulars, :uncountables, :irregulars
def self.inflections
if block_given?
yield Inflector.instance
else
Inflector.instance
end
end
def uncountable(word)
@uncountables << word
end
def singular(rule, replacement)
@singulars << [rule, replacement]
end
def plural(rule, replacement)
@plurals << [rule, replacement]
end
def irregular(rule, replacement)
@irregulars << [rule, replacement]
end
def uncountable?(word)
return word if @uncountables.include?(word.downcase)
false
end
def singularize(word)
return word if uncountable?(word)
plural = word.dup
@irregulars.each do |rule|
return plural if plural.gsub!(rule.first, rule.last)
end
@singulars.each do |rule|
return plural if plural.gsub!(rule.first, rule.last)
end
plural
end
def pluralize(word)
return word if uncountable?(word)
singular = word.dup
@irregulars.each do |rule|
return singular if singular.gsub!(rule.first, rule.last)
end
@plurals.each do |rule|
return singular if singular.gsub!(rule.first, rule.last)
end
singular
end
end
class NilClass
def empty?
true
end
end
class Array
def empty?
self.length < 1
end
end
class Hash
def empty?
self.length < 1
end
end
class Symbol
def titleize
self.to_s.titleize
end
end
class Ansi
ESCAPE = "\033"
def self.color(color_constant)
"#{ESCAPE}[#{color_constant}m"
end
def self.reset_color
color 0
end
def self.yellow_color
color 33
end
def self.green_color
color 32
end
def self.red_color
color 31
end
end
class Debug
@@silent = false
@@colorize = true
# Use silence if you want to keep messages from being echoed
# to the console.
def self.silence
@@silent = true
end
def self.colorize
@@colorize
end
def self.colorize=(value)
@@colorize = value == true
end
# Use resume when you want messages that were silenced to
# resume displaying.
def self.resume
@@silent = false
end
def self.put_message(type, message, color = Ansi.reset_color)
open_color = @@colorize ? color : ''
close_color = @@colorize ? Ansi.reset_color : ''
NSLog("#{open_color}#{type} #{caller[1]}: #{message}#{close_color}") unless @@silent
end
def self.info(msg)
put_message 'INFO', msg, Ansi.green_color
end
def self.warning(msg)
put_message 'WARNING', msg, Ansi.yellow_color
end
def self.error(msg)
put_message 'ERROR', msg, Ansi.red_color
end
end
# These are C macros in iOS SDK. Not workable for Ruby.
def UIInterfaceOrientationIsLandscape(orientation)
orientation == UIInterfaceOrientationLandscapeLeft ||
orientation == UIInterfaceOrientationLandscapeRight
end
def UIInterfaceOrientationIsPortrait(orientation)
orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown
end