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
|
# File 'lib/angus/generator/thor/helper_methods.rb', line 4
def pluralize(word)
uncountable = %w(equipment information rice money species series fish sheep)
rules = []
irregular = {
'person' => 'people',
'man' => 'men',
'child' => 'children',
'sex' => 'sexes',
'move' => 'moves'
}
irregular.each do |word, replacement|
rules << [word, replacement]
rules << [replacement, replacement]
end
rules << [/^(ox)$/i , '\1en' ]
rules << [/(quiz)$/i , '\1zes' ]
rules << [/([m|l])ouse$/i , '\1ice' ]
rules << [/(matr|vert|ind)ix|ex$/i, '\1ices' ]
rules << [/(x|ch|ss|sh)$/i , '\1es' ]
rules << [/([^aeiouy]|qu)ies$/i , '\1y' ]
rules << [/([^aeiouy]|qu)y$/i , '\1ies' ]
rules << [/(hive)$/i , '\1s' ]
rules << [/(?:([^f])fe|([lr])f)$/i, '\1\2ves']
rules << [/sis$/i , 'ses' ]
rules << [/([ti])um$/i , '\1a' ]
rules << [/(buffal|tomat)o$/i , '\1oes' ]
rules << [/(bu)s$/i , '\1ses' ]
rules << [/(alias|status)$/i , '\1es' ]
rules << [/(octop|vir)us$/i , '\1i' ]
rules << [/(ax|test)is$/i , '\1es' ]
rules << [/s$/i , 's' ]
rules << [/$/ , 's' ]
result = word.to_s.dup
if word.empty? || uncountable.include?(result.downcase[/\b\w+\Z/])
result
else
rules.each { |(rule, replacement)| break if result.sub!(rule, replacement) }
result
end
end
|