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>
|