| // A singleton instance of this class is yielded by Inflector.inflections, which can then be used to specify additional |
| // inflection rules. Examples: |
| // |
| // BulletSupport.Inflector.inflect ($) -> |
| // $.plural /^(ox)$/i, '$1en' |
| // $.singular /^(ox)en/i, '$1' |
| // |
| // $.irregular 'octopus', 'octopi' |
| // |
| // $.uncountable "equipment" |
| // |
| // 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. |
| |
| var util = require('./util'); |
| |
| var Inflections = function () { |
| this.plurals = []; |
| this.singulars = []; |
| this.uncountables = []; |
| this.humans = []; |
| require('./defaults')(this); |
| return this; |
| }; |
| |
| // Specifies a new pluralization rule and its replacement. The rule can either be a string or a regular expression. |
| // The replacement should always be a string that may include references to the matched data from the rule. |
| Inflections.prototype.plural = function (rule, replacement) { |
| if (typeof rule == 'string') { |
| this.uncountables = util.array.del(this.uncountables, rule); |
| } |
| this.uncountables = util.array.del(this.uncountables, replacement); |
| this.plurals.unshift([rule, replacement]); |
| }; |
| |
| // Specifies a new singularization rule and its replacement. The rule can either be a string or a regular expression. |
| // The replacement should always be a string that may include references to the matched data from the rule. |
| Inflections.prototype.singular = function (rule, replacement) { |
| if (typeof rule == 'string') { |
| this.uncountables = util.array.del(this.uncountables, rule); |
| } |
| this.uncountables = util.array.del(this.uncountables, replacement); |
| this.singulars.unshift([rule, replacement]); |
| }; |
| |
| // Specifies a new irregular that applies to both pluralization and singularization at the same time. This can only be used |
| // for strings, not regular expressions. You simply pass the irregular in singular and plural form. |
| // |
| // irregular 'octopus', 'octopi' |
| // irregular 'person', 'people' |
| Inflections.prototype.irregular = function (singular, plural) { |
| this.uncountables = util.array.del(this.uncountables, singular); |
| this.uncountables = util.array.del(this.uncountables, plural); |
| if (singular[0].toUpperCase() == plural[0].toUpperCase()) { |
| this.plural(new RegExp("(" + singular[0] + ")" + singular.slice(1) + "$", "i"), '$1' + plural.slice(1)); |
| this.plural(new RegExp("(" + plural[0] + ")" + plural.slice(1) + "$", "i"), '$1' + plural.slice(1)); |
| this.singular(new RegExp("(" + plural[0] + ")" + plural.slice(1) + "$", "i"), '$1' + singular.slice(1)); |
| } else { |
| this.plural(new RegExp("" + (singular[0].toUpperCase()) + singular.slice(1) + "$"), plural[0].toUpperCase() + plural.slice(1)); |
| this.plural(new RegExp("" + (singular[0].toLowerCase()) + singular.slice(1) + "$"), plural[0].toLowerCase() + plural.slice(1)); |
| this.plural(new RegExp("" + (plural[0].toUpperCase()) + plural.slice(1) + "$"), plural[0].toUpperCase() + plural.slice(1)); |
| this.plural(new RegExp("" + (plural[0].toLowerCase()) + plural.slice(1) + "$"), plural[0].toLowerCase() + plural.slice(1)); |
| this.singular(new RegExp("" + (plural[0].toUpperCase()) + plural.slice(1) + "$"), singular[0].toUpperCase() + singular.slice(1)); |
| this.singular(new RegExp("" + (plural[0].toLowerCase()) + plural.slice(1) + "$"), singular[0].toLowerCase() + singular.slice(1)); |
| } |
| }; |
| |
| // Specifies a humanized form of a string by a regular expression rule or by a string mapping. |
| // When using a regular expression based replacement, the normal humanize formatting is called after the replacement. |
| // When a string is used, the human form should be specified as desired (example: 'The name', not 'the_name') |
| // |
| // human /(.*)_cnt$/i, '$1_count' |
| // human "legacy_col_person_name", "Name" |
| Inflections.prototype.human = function (rule, replacement) { |
| this.humans.unshift([rule, replacement]); |
| } |
| |
| // Add uncountable words that shouldn't be attempted inflected. |
| // |
| // uncountable "money" |
| // uncountable ["money", "information"] |
| Inflections.prototype.uncountable = function (words) { |
| this.uncountables = this.uncountables.concat(words); |
| } |
| |
| // Clears the loaded inflections within a given scope (default is _'all'_). |
| // Give the scope as a symbol of the inflection type, the options are: _'plurals'_, |
| // _'singulars'_, _'uncountables'_, _'humans'_. |
| // |
| // clear 'all' |
| // clear 'plurals' |
| Inflections.prototype.clear = function (scope) { |
| if (scope == null) scope = 'all'; |
| switch (scope) { |
| case 'all': |
| this.plurals = []; |
| this.singulars = []; |
| this.uncountables = []; |
| this.humans = []; |
| default: |
| this[scope] = []; |
| } |
| } |
| |
| // Clears the loaded inflections and initializes them to [default](../inflections.html) |
| Inflections.prototype.default = function () { |
| this.plurals = []; |
| this.singulars = []; |
| this.uncountables = []; |
| this.humans = []; |
| require('./defaults')(this); |
| return this; |
| }; |
| |
| module.exports = new Inflections(); |