0
@@ -38,6 +38,20 @@ module English
0
plural_word(singular, plural)
+ def clear(type = :all)
0
+ if type == :singular || type == :all
0
+ @singularization_rules, @singularization_regex = nil, nil
0
+ if type == :plural || type == :all
0
+ @singularization_rules, @singularization_regex = nil, nil
0
# Define a singularization exception.
0
@@ -47,6 +61,7 @@ module English
0
# plural form of the word
0
def singular_word(singular, plural)
0
@singular_of[plural] = singular
0
+ @singular_of[plural.capitalize] = singular.capitalize
0
# Define a pluralization exception.
0
@@ -58,6 +73,7 @@ module English
0
# plural form of the word
0
def plural_word(singular, plural)
0
@plural_of[singular] = plural
0
+ @plural_of[singular.capitalize] = plural.capitalize
0
# Define a general rule.
0
@@ -67,7 +83,9 @@ module English
0
# ending of the word in singular form
0
# ending of the word in plural form
0
+ # whole_word<Boolean>::
0
+ # for capitalization, since words can be
0
+ # capitalized (Man => Men) #
0
# Once the following rule is defined:
0
# Language::English::Inflector.rule 'y', 'ies'
0
@@ -77,9 +95,12 @@ module English
0
- def rule(singular, plural)
0
+ # Define a general rule.
0
+ def rule(singular, plural, whole_word = false)
0
singular_rule(singular, plural)
0
plural_rule(singular, plural)
0
+ word(singular, plural) if whole_word
0
# Define a singularization rule.
0
@@ -122,31 +143,26 @@ module English
0
# Read prepared singularization rules.
0
def singularization_rules
0
- return @singularization_rules if @singularization_rules
0
- sorted = @singular_rules.sort_by{ |s, p| "#{p}".size }.reverse
0
- @singularization_rules = sorted.collect do |s, p|
0
+ if defined?(@singularization_regex) && @singularization_regex
0
+ return [@singularization_regex, @singularization_hash]
0
+ # No sorting needed: Regexen match on longest string
0
+ @singularization_regex = Regexp.new("(" + @singular_rules.map {|s,p| p}.join("|") + ")$", "i")
0
+ @singularization_hash = Hash[*@singular_rules.flatten].invert
0
+ [@singularization_regex, @singularization_hash]
0
# Read prepared pluralization rules.
0
def pluralization_rules
0
- return @pluralization_rules if @pluralization_rules
0
- sorted = @plural_rules.sort_by{ |s, p| "#{s}".size }.reverse
0
- @pluralization_rules = sorted.collect do |s, p|
0
+ if defined?(@pluralization_regex) && @pluralization_regex
0
+ return [@pluralization_regex, @pluralization_hash]
0
+ @pluralization_regex = Regexp.new("(" + @plural_rules.map {|s,p| s}.join("|") + ")$", "i")
0
+ @pluralization_hash = Hash[*@plural_rules.flatten]
0
+ [@pluralization_regex, @pluralization_hash]
0
+ attr_reader :singular_of, :plural_of
0
# Convert an English word from plurel to singular.
0
@@ -166,10 +182,9 @@ module English
0
- return result if singular_of.value? result
0
- singularization_rules.each do |(match, replacement)|
0
- break if result.gsub!(match, replacement)
0
+ regex, hash = singularization_rules
0
+ result.sub!(regex) {|m| hash[m]}
0
+ singular_of[word] = result
0
@@ -191,14 +206,15 @@ module English
0
# Aliased as pluralize (a Railism)
0
+ return "" if word == ""
0
if result = plural_of[word]
0
- #return self.dup if /s$/ =~ self # ???
0
- pluralization_rules.each do |(match, replacement)|
0
- break if result.gsub!(match, replacement)
0
+ regex, hash = pluralization_rules
0
+ result.sub!(regex) {|m| hash[m]}
0
+ plural_of[word] = result
0
@@ -218,9 +234,10 @@ module English
0
# Two arguments defines a singular and plural exception.
0
@@ -234,13 +251,11 @@ module English
0
word 'crisis' , 'crises'
0
word 'testis' , 'testes'
0
- word 'child' , 'children'
0
- word 'person' , 'people'
0
word 'potato' , 'potatoes'
0
word 'tomato' , 'tomatoes'
0
word 'buffalo' , 'buffaloes'
0
word 'torpedo' , 'torpedoes'
0
- word 'quiz' , 'quiz
es'
0
+ word 'quiz' , 'quiz
zes'
0
word 'matrix' , 'matrices'
0
word 'vertex' , 'vertices'
0
word 'index' , 'indices'
0
@@ -256,14 +271,23 @@ module English
0
word 'thesaurus' , 'thesauri'
0
word 'movie' , 'movies'
0
word 'cactus' , 'cacti'
0
+ word 'plus' , 'plusses'
0
+ word 'cross' , 'crosses'
0
+ word 'medium' , 'media'
0
+ word 'basis' , 'bases'
0
+ word 'diagnosis' , 'diagnoses'
0
# One-way singularization exception (convert plural to singular).
0
- # singular_word 'cactus', 'cacti'
0
+ rule 'person' , 'people', true
0
+ rule 'shoe' , 'shoes', true
0
+ rule 'hive' , 'hives', true
0
+ rule 'man' , 'men', true
0
+ rule 'child' , 'children', true
0
+ rule 'news' , 'news', true
0
@@ -281,6 +305,13 @@ module English
0
+ # more cases of words ending in -oses not being singularized properly
0
+ # than cases of words ending in -osis
0
@@ -292,8 +323,11 @@ module English
0
# One-way plural rules.
0
- plural_rule 'fe' , 'ves' # safe, wife
0
- plural_rule 's' , 'ses'
0
+ #plural_rule 'fe' , 'ves' # safe, wife
0
+ plural_rule 's' , 'ses'
0
+ plural_rule 'ive' , 'ives' # don't want to snag wife
0
+ plural_rule 'fe' , 'ves' # don't want to snag perspectives
Comments
uhm… both expressions lead to the same or not?