Module: String::Inflections
- Defined in:
- lib/core_ext/string.rb
Overview
This module acts as a singleton returned/yielded by String.inflections, which is used to override or specify additional inflection rules. Examples:
String.inflections do |inflect|
inflect.plural /^(ox)$/i, '\1\2en'
inflect.singular /^(ox)en/i, '\1'
inflect.irregular 'octopus', 'octopi'
inflect.uncountable "equipment"
end
New rules are added at the top. So in the example above, the irregular rule for octopus will now be the first of the pluralization and singularization rules that is runs. This guarantees that your rules run before any of the rules that may already have been loaded.
Constant Summary collapse
- DEFAULT_INFLECTIONS_PROC =
Proc that is instance evaled to create the default inflections for both the model inflector and the inflector extension. rubocop:disable Metrics/BlockLength
proc do plural(/$/, 's') plural(/s$/i, 's') plural(/(alias|(?:stat|octop|vir|b)us)$/i, '\1es') plural(/(buffal|tomat)o$/i, '\1oes') plural(/([ti])um$/i, '\1a') plural(/sis$/i, 'ses') plural(/(?:([^f])fe|([lr])f)$/i, '\1\2ves') plural(/(hive)$/i, '\1s') plural(/([^aeiouy]|qu)y$/i, '\1ies') plural(/(x|ch|ss|sh)$/i, '\1es') plural(/(matr|vert|ind)ix|ex$/i, '\1ices') plural(/([m|l])ouse$/i, '\1ice') singular(/s$/i, '') singular(/([ti])a$/i, '\1um') singular(/(analy|ba|cri|diagno|parenthe|progno|synop|the)ses$/i, '\1sis') singular(/([^f])ves$/i, '\1fe') singular(/([h|t]ive)s$/i, '\1') singular(/([lr])ves$/i, '\1f') singular(/([^aeiouy]|qu)ies$/i, '\1y') singular(/(m)ovies$/i, '\1ovie') singular(/(x|ch|ss|sh)es$/i, '\1') singular(/([m|l])ice$/i, '\1ouse') singular(/buses$/i, 'bus') singular(/oes$/i, 'o') singular(/shoes$/i, 'shoe') singular(/(alias|(?:stat|octop|vir|b)us)es$/i, '\1') singular(/(vert|ind)ices$/i, '\1ex') singular(/matrices$/i, 'matrix') irregular('person', 'people') irregular('man', 'men') irregular('child', 'children') irregular('sex', 'sexes') irregular('move', 'moves') irregular('quiz', 'quizzes') irregular('testis', 'testes') uncountable(%w[equipment information rice money species series fish sheep news]) end
Class Attribute Summary collapse
-
.plurals ⇒ Object
readonly
An Array that stores the pluralization rules.
-
.singulars ⇒ Object
readonly
An Array that stores the singularization rules.
-
.uncountables ⇒ Object
readonly
An Array of uncountable word strings that should not be inflected.
Class Method Summary collapse
-
.clear(scope = :all) ⇒ Array
Clear inflection rules in a given scope.
-
.irregular(singular, plural) ⇒ Object
Specifies a new irregular inflection rule that transforms between singular and plural forms.
-
.plural(rule, replacement) ⇒ Array
Specifies a new pluralization rule to transform singular words into plural forms.
-
.singular(rule, replacement) ⇒ Array
Specifies a new singularization rule to transform plural words into singular forms.
-
.uncountable(*words) ⇒ Array
Adds words that have the same singular and plural form to the uncountables list.
Class Attribute Details
.plurals ⇒ Object (readonly)
An Array that stores the pluralization rules. Each rule is a 2-element array containing:
-
A regular expression pattern for matching words to pluralize
-
A substitution pattern (e.g. ‘\1es’) for transforming the match into plural form
Rules are processed in reverse order, so newer rules take precedence.
86 87 88 |
# File 'lib/core_ext/string.rb', line 86 def plurals @plurals end |
.singulars ⇒ Object (readonly)
An Array that stores the singularization rules. Each rule is a 2-element array containing:
-
A regular expression pattern for matching plural words
-
A substitution pattern (e.g. ‘\1y’) for transforming the match into singular form
Rules are processed in reverse order, so newer rules take precedence.
93 94 95 |
# File 'lib/core_ext/string.rb', line 93 def singulars @singulars end |
.uncountables ⇒ Object (readonly)
An Array of uncountable word strings that should not be inflected. These words have the same form in both singular and plural. Examples: ‘fish’, ‘money’, ‘species’
98 99 100 |
# File 'lib/core_ext/string.rb', line 98 def uncountables @uncountables end |
Class Method Details
.clear(scope = :all) ⇒ Array
Clear inflection rules in a given scope. If scope is not specified, all inflection rules will be cleared. Passing :plurals, :singulars, or :uncountables will clear only that specific type of rule.
115 116 117 118 119 120 121 122 123 124 |
# File 'lib/core_ext/string.rb', line 115 def self.clear(scope = :all) case scope when :all @plurals = [] @singulars = [] @uncountables = [] else instance_variable_set(:"@#{scope}", []) end end |
.irregular(singular, plural) ⇒ Object
Specifies a new irregular inflection rule that transforms between singular and plural forms. This method creates rules for both pluralization and singularization simultaneously. Unlike regular inflection rules, this only works with literal strings, not regexp.
137 138 139 140 |
# File 'lib/core_ext/string.rb', line 137 def self.irregular(singular, plural) plural(Regexp.new("(#{singular[0, 1]})#{singular[1..]}$", 'i'), "\\1#{plural[1..]}") singular(Regexp.new("(#{plural[0, 1]})#{plural[1..]}$", 'i'), "\\1#{singular[1..]}") end |
.plural(rule, replacement) ⇒ Array
Specifies a new pluralization rule to transform singular words into plural forms. Adds the rule to the beginning of the rules array so it takes precedence over existing rules.
153 154 155 |
# File 'lib/core_ext/string.rb', line 153 def self.plural(rule, replacement) @plurals.insert(0, [rule, replacement]) end |
.singular(rule, replacement) ⇒ Array
Specifies a new singularization rule to transform plural words into singular forms. Adds the rule to the beginning of the rules array so it takes precedence over existing rules.
169 170 171 |
# File 'lib/core_ext/string.rb', line 169 def self.singular(rule, replacement) @singulars.insert(0, [rule, replacement]) end |
.uncountable(*words) ⇒ Array
Adds words that have the same singular and plural form to the uncountables list. These words will be skipped by the inflector and returned unchanged.
188 189 190 |
# File 'lib/core_ext/string.rb', line 188 def self.uncountable(*words) (@uncountables << words).flatten! end |