| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-util-Inflector'>/**</span> * General purpose inflector class that {@link #pluralize pluralizes}, {@link #singularize singularizes} and * {@link #ordinalize ordinalizes} words. Sample usage: * *     //turning singular words into plurals *     Ext.util.Inflector.pluralize('word'); //'words' *     Ext.util.Inflector.pluralize('person'); //'people' *     Ext.util.Inflector.pluralize('sheep'); //'sheep' * *     //turning plurals into singulars *     Ext.util.Inflector.singularize('words'); //'word' *     Ext.util.Inflector.singularize('people'); //'person' *     Ext.util.Inflector.singularize('sheep'); //'sheep' * *     //ordinalizing numbers *     Ext.util.Inflector.ordinalize(11); //"11th" *     Ext.util.Inflector.ordinalize(21); //"21st" *     Ext.util.Inflector.ordinalize(1043); //"1043rd" * * # Customization * * The Inflector comes with a default set of US English pluralization rules. These can be augmented with additional * rules if the default rules do not meet your application's requirements, or swapped out entirely for other languages. * Here is how we might add a rule that pluralizes "ox" to "oxen": * *     Ext.util.Inflector.plural(/^(ox)$/i, "$1en"); * * Each rule consists of two items - a regular expression that matches one or more rules, and a replacement string. In * this case, the regular expression will only match the string "ox", and will replace that match with "oxen". Here's * how we could add the inverse rule: * *     Ext.util.Inflector.singular(/^(ox)en$/i, "$1"); * * Note that the ox/oxen rules are present by default. */Ext.define('Ext.util.Inflector', {    /* Begin Definitions */    singleton: true,    /* End Definitions */<span id='Ext-util-Inflector-property-plurals'>    /**</span>     * @private     * The registered plural tuples. Each item in the array should contain two items - the first must be a regular     * expression that matchers the singular form of a word, the second must be a String that replaces the matched     * part of the regular expression. This is managed by the {@link #plural} method.     * @property {Array} plurals     */    plurals: [        [(/(quiz)$/i),                "$1zes"  ],        [(/^(ox)$/i),                 "$1en"   ],        [(/([m|l])ouse$/i),           "$1ice"  ],        [(/(matr|vert|ind)ix|ex$/i),  "$1ices" ],        [(/(x|ch|ss|sh)$/i),          "$1es"   ],        [(/([^aeiouy]|qu)y$/i),       "$1ies"  ],        [(/(hive)$/i),                "$1s"    ],        [(/(?:([^f])fe|([lr])f)$/i),  "$1$2ves"],        [(/sis$/i),                   "ses"    ],        [(/([ti])um$/i),              "$1a"    ],        [(/(buffal|tomat|potat)o$/i), "$1oes"  ],        [(/(bu)s$/i),                 "$1ses"  ],        [(/(alias|status|sex)$/i),    "$1es"   ],        [(/(octop|vir)us$/i),         "$1i"    ],        [(/(ax|test)is$/i),           "$1es"   ],        [(/^person$/),                "people" ],        [(/^man$/),                   "men"    ],        [(/^(child)$/),               "$1ren"  ],        [(/s$/i),                     "s"      ],        [(/$/),                       "s"      ]    ],<span id='Ext-util-Inflector-property-singulars'>    /**</span>     * @private     * The set of registered singular matchers. Each item in the array should contain two items - the first must be a     * regular expression that matches the plural form of a word, the second must be a String that replaces the     * matched part of the regular expression. This is managed by the {@link #singular} method.     * @property {Array} singulars     */    singulars: [      [(/(quiz)zes$/i),                                                    "$1"     ],      [(/(matr)ices$/i),                                                   "$1ix"   ],      [(/(vert|ind)ices$/i),                                               "$1ex"   ],      [(/^(ox)en/i),                                                       "$1"     ],      [(/(alias|status)es$/i),                                             "$1"     ],      [(/(octop|vir)i$/i),                                                 "$1us"   ],      [(/(cris|ax|test)es$/i),                                             "$1is"   ],      [(/(shoe)s$/i),                                                      "$1"     ],      [(/(o)es$/i),                                                        "$1"     ],      [(/(bus)es$/i),                                                      "$1"     ],      [(/([m|l])ice$/i),                                                   "$1ouse" ],      [(/(x|ch|ss|sh)es$/i),                                               "$1"     ],      [(/(m)ovies$/i),                                                     "$1ovie" ],      [(/(s)eries$/i),                                                     "$1eries"],      [(/([^aeiouy]|qu)ies$/i),                                            "$1y"    ],      [(/([lr])ves$/i),                                                    "$1f"    ],      [(/(tive)s$/i),                                                      "$1"     ],      [(/(hive)s$/i),                                                      "$1"     ],      [(/([^f])ves$/i),                                                    "$1fe"   ],      [(/(^analy)ses$/i),                                                  "$1sis"  ],      [(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i), "$1$2sis"],      [(/([ti])a$/i),                                                      "$1um"   ],      [(/(n)ews$/i),                                                       "$1ews"  ],      [(/people$/i),                                                       "person" ],      [(/s$/i),                                                            ""       ]    ],<span id='Ext-util-Inflector-property-uncountable'>    /**</span>     * @private     * The registered uncountable words     * @property {String[]} uncountable     */     uncountable: [        "sheep",        "fish",        "series",        "species",        "money",        "rice",        "information",        "equipment",        "grass",        "mud",        "offspring",        "deer",        "means"    ],<span id='Ext-util-Inflector-method-singular'>    /**</span>     * Adds a new singularization rule to the Inflector. See the intro docs for more information     * @param {RegExp} matcher The matcher regex     * @param {String} replacer The replacement string, which can reference matches from the matcher argument     */    singular: function(matcher, replacer) {        this.singulars.unshift([matcher, replacer]);    },<span id='Ext-util-Inflector-method-plural'>    /**</span>     * Adds a new pluralization rule to the Inflector. See the intro docs for more information     * @param {RegExp} matcher The matcher regex     * @param {String} replacer The replacement string, which can reference matches from the matcher argument     */    plural: function(matcher, replacer) {        this.plurals.unshift([matcher, replacer]);    },<span id='Ext-util-Inflector-method-clearSingulars'>    /**</span>     * Removes all registered singularization rules     */    clearSingulars: function() {        this.singulars = [];    },<span id='Ext-util-Inflector-method-clearPlurals'>    /**</span>     * Removes all registered pluralization rules     */    clearPlurals: function() {        this.plurals = [];    },<span id='Ext-util-Inflector-method-isTransnumeral'>    /**</span>     * Returns true if the given word is transnumeral (the word is its own singular and plural form - e.g. sheep, fish)     * @param {String} word The word to test     * @return {Boolean} True if the word is transnumeral     */    isTransnumeral: function(word) {        return Ext.Array.indexOf(this.uncountable, word) != -1;    },<span id='Ext-util-Inflector-method-pluralize'>    /**</span>     * Returns the pluralized form of a word (e.g. Ext.util.Inflector.pluralize('word') returns 'words')     * @param {String} word The word to pluralize     * @return {String} The pluralized form of the word     */    pluralize: function(word) {        if (this.isTransnumeral(word)) {            return word;        }        var plurals = this.plurals,            length  = plurals.length,            tuple, regex, i;        for (i = 0; i < length; i++) {            tuple = plurals[i];            regex = tuple[0];            if (regex == word || (regex.test && regex.test(word))) {                return word.replace(regex, tuple[1]);            }        }        return word;    },<span id='Ext-util-Inflector-method-singularize'>    /**</span>     * Returns the singularized form of a word (e.g. Ext.util.Inflector.singularize('words') returns 'word')     * @param {String} word The word to singularize     * @return {String} The singularized form of the word     */    singularize: function(word) {        if (this.isTransnumeral(word)) {            return word;        }        var singulars = this.singulars,            length    = singulars.length,            tuple, regex, i;        for (i = 0; i < length; i++) {            tuple = singulars[i];            regex = tuple[0];            if (regex == word || (regex.test && regex.test(word))) {                return word.replace(regex, tuple[1]);            }        }        return word;    },<span id='Ext-util-Inflector-method-classify'>    /**</span>     * Returns the correct {@link Ext.data.Model Model} name for a given string. Mostly used internally by the data     * package     * @param {String} word The word to classify     * @return {String} The classified version of the word     */    classify: function(word) {        return Ext.String.capitalize(this.singularize(word));    },<span id='Ext-util-Inflector-method-ordinalize'>    /**</span>     * Ordinalizes a given number by adding a prefix such as 'st', 'nd', 'rd' or 'th' based on the last digit of the     * number. 21 -> 21st, 22 -> 22nd, 23 -> 23rd, 24 -> 24th etc     * @param {Number} number The number to ordinalize     * @return {String} The ordinalized number     */    ordinalize: function(number) {        var parsed = parseInt(number, 10),            mod10  = parsed % 10,            mod100 = parsed % 100;        //11 through 13 are a special case        if (11 <= mod100 && mod100 <= 13) {            return number + "th";        } else {            switch(mod10) {                case 1 : return number + "st";                case 2 : return number + "nd";                case 3 : return number + "rd";                default: return number + "th";            }        }    }}, function() {    //aside from the rules above, there are a number of words that have irregular pluralization so we add them here    var irregulars = {            alumnus: 'alumni',            cactus : 'cacti',            focus  : 'foci',            nucleus: 'nuclei',            radius: 'radii',            stimulus: 'stimuli',            ellipsis: 'ellipses',            paralysis: 'paralyses',            oasis: 'oases',            appendix: 'appendices',            index: 'indexes',            beau: 'beaux',            bureau: 'bureaux',            tableau: 'tableaux',            woman: 'women',            child: 'children',            man: 'men',            corpus:	'corpora',            criterion: 'criteria',            curriculum:	'curricula',            genus: 'genera',            memorandum:	'memoranda',            phenomenon:	'phenomena',            foot: 'feet',            goose: 'geese',            tooth: 'teeth',            antenna: 'antennae',            formula: 'formulae',            nebula: 'nebulae',            vertebra: 'vertebrae',            vita: 'vitae'        },        singular;    for (singular in irregulars) {        this.plural(singular, irregulars[singular]);        this.singular(irregulars[singular], singular);    }});</pre></body></html>
 |