underscore.inflections
Version:
Port of ActiveSupport::Inflector::Inflections for underscore.js
433 lines (419 loc) • 15.8 kB
JavaScript
// Generated by CoffeeScript 1.6.3
(function() {
var camelToUnderscore, camelToUnderscoreWithoutReverse, defaultUncountables, irregularities, mixtureToTitleCase, root, singularToPlural, underscoreToHuman, underscoreToLowerCamel, _;
root = typeof exports !== "undefined" && exports !== null ? exports : this;
_ = root._ || require('underscore');
if (typeof exports !== "undefined") {
_.mixin(require('../src/underscore.inflections'));
}
defaultUncountables = ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans', 'moose', 'deer', 'news'];
singularToPlural = {
"search": "searches",
"switch": "switches",
"fix": "fixes",
"box": "boxes",
"process": "processes",
"address": "addresses",
"case": "cases",
"stack": "stacks",
"wish": "wishes",
"fish": "fish",
"jeans": "jeans",
"funky jeans": "funky jeans",
"my money": "my money",
"category": "categories",
"query": "queries",
"ability": "abilities",
"agency": "agencies",
"movie": "movies",
"archive": "archives",
"index": "indices",
"wife": "wives",
"safe": "saves",
"half": "halves",
"move": "moves",
"salesperson": "salespeople",
"person": "people",
"spokesman": "spokesmen",
"man": "men",
"woman": "women",
"basis": "bases",
"diagnosis": "diagnoses",
"diagnosis_a": "diagnosis_as",
"datum": "data",
"medium": "media",
"stadium": "stadia",
"analysis": "analyses",
"node_child": "node_children",
"child": "children",
"experience": "experiences",
"day": "days",
"comment": "comments",
"foobar": "foobars",
"newsletter": "newsletters",
"old_news": "old_news",
"news": "news",
"series": "series",
"species": "species",
"quiz": "quizzes",
"perspective": "perspectives",
"ox": "oxen",
"photo": "photos",
"buffalo": "buffaloes",
"tomato": "tomatoes",
"dwarf": "dwarves",
"elf": "elves",
"information": "information",
"equipment": "equipment",
"bus": "buses",
"status": "statuses",
"status_code": "status_codes",
"mouse": "mice",
"louse": "lice",
"house": "houses",
"octopus": "octopi",
"virus": "viri",
"alias": "aliases",
"portfolio": "portfolios",
"vertex": "vertices",
"matrix": "matrices",
"matrix_fu": "matrix_fus",
"axis": "axes",
"taxi": "taxis",
"testis": "testes",
"crisis": "crises",
"rice": "rice",
"shoe": "shoes",
"horse": "horses",
"prize": "prizes",
"edge": "edges",
"cow": "kine",
"database": "databases"
};
camelToUnderscore = {
"Product": "product",
"SpecialGuest": "special_guest",
"ApplicationController": "application_controller",
"Area51Controller": "area51_controller"
};
camelToUnderscoreWithoutReverse = {
"HTMLTidy": "html_tidy",
"HTMLTidyGenerator": "html_tidy_generator",
"FreeBSD": "free_bsd",
"HTML": "html"
};
underscoreToLowerCamel = {
"product": "product",
"special_guest": "specialGuest",
"application_controller": "applicationController",
"area51_controller": "area51Controller"
};
underscoreToHuman = {
"employee_salary": "Employee salary",
"employee_id": "Employee",
"underground": "Underground"
};
mixtureToTitleCase = {
'active_record': 'Active Record',
'ActiveRecord': 'Active Record',
'action web service': 'Action Web Service',
'Action Web Service': 'Action Web Service',
'Action web service': 'Action Web Service',
'actionwebservice': 'Actionwebservice',
'Actionwebservice': 'Actionwebservice',
"david's code": "David's Code",
"David's code": "David's Code",
"david's Code": "David's Code",
"sgt. pepper's": "Sgt. Pepper's",
"i've just seen a face": "I've Just Seen A Face",
"maybe you'll be there": "Maybe You'll Be There",
"¿por qué?": '¿Por Qué?',
"Fred’s": "Fred’s",
"Fred`s": "Fred`s"
};
irregularities = {
'person': 'people',
'man': 'men',
'child': 'children',
'sex': 'sexes',
'move': 'moves',
'misc.': 'misc.'
};
describe('underscore.inflections', function() {
describe('singularize', function() {
_.each(singularToPlural, function(value, key, list) {
return it("should properly singularize " + value, function() {
return _.singularize(value).should.equal(key);
});
});
_.each(singularToPlural, function(value, key, list) {
return it("should properly singularize " + key, function() {
return _.singularize(key).should.equal(key);
});
});
return it("should inflect an empty string", function() {
return _.pluralize("").should.equal("");
});
});
describe('pluralize', function() {
_.each(singularToPlural, function(value, key, list) {
return it("should properly pluralize " + key, function() {
return _.pluralize(key).should.equal(value);
});
});
_.each(singularToPlural, function(value, key, list) {
return it("should properly pluralize " + value, function() {
return _.pluralize(value).should.equal(value);
});
});
it("should inflect an empty string", function() {
return _.pluralize("").should.equal("");
});
it("should inflect with a count", function() {
_.pluralize("count", 1).should.equal("1 count");
_.pluralize("count", 2).should.equal("2 counts");
_.pluralize("count", '1').should.equal("1 count");
_.pluralize("count", '2').should.equal("2 counts");
_.pluralize("count", '1,066').should.equal("1,066 counts");
_.pluralize("count", '1.25').should.equal("1.25 counts");
_.pluralize("count", '1.0').should.equal("1.0 count");
_.pluralize("count", '1.00').should.equal("1.00 count");
_.pluralize("count", 0, {
plural: "counters"
}).should.equal("0 counters");
_.pluralize("count", null, {
plural: "counters"
}).should.equal("0 counters");
_.pluralize("person", 2).should.equal("2 people");
_.pluralize("buffalo", 10).should.equal("10 buffaloes");
_.pluralize("berry", 1).should.equal("1 berry");
return _.pluralize("berry", 12).should.equal("12 berries");
});
return it("should inflect with count, but not show number", function() {
_.pluralize("count", 1, {
showNumber: false
}).should.equal("count");
_.pluralize("count", 2, {
showNumber: false
}).should.equal("counts");
_.pluralize("count", '1', {
showNumber: false
}).should.equal("count");
_.pluralize("count", '2', {
showNumber: false
}).should.equal("counts");
_.pluralize("count", '1,066', {
showNumber: false
}).should.equal("counts");
_.pluralize("count", '1.25', {
showNumber: false
}).should.equal("counts");
_.pluralize("count", '1.0', {
showNumber: false
}).should.equal("count");
_.pluralize("count", '1.00', {
showNumber: false
}).should.equal("count");
_.pluralize("count", 0, {
plural: "counters",
showNumber: false
}).should.equal("counters");
_.pluralize("count", null, {
plural: "counters",
showNumber: false
}).should.equal("counters");
_.pluralize("person", 2, {
showNumber: false
}).should.equal("people");
_.pluralize("buffalo", 10, {
showNumber: false
}).should.equal("buffaloes");
_.pluralize("berry", 1, {
showNumber: false
}).should.equal("berry");
return _.pluralize("berry", 12, {
showNumber: false
}).should.equal("berries");
});
});
describe('uncountable', function() {
return _.each(defaultUncountables, function(word) {
it("should test uncountability of " + word + " with pluralize", function() {
return _.pluralize(word).should.equal(word);
});
it("should test uncountability of " + word + " with pluralize", function() {
return _.singularize(word).should.equal(word);
});
return it("should test uncountability of " + word + " with pluralize", function() {
return _.singularize(word).should.equal(_.pluralize(word));
});
});
});
describe('irregulars', function() {
return _.each(irregularities, function(value, key) {
it("should test irregularity between " + key + " and " + value, function() {
_.irregular(key, value);
_.singularize(value).should.equal(key);
return _.pluralize(key).should.equal(value);
});
return it("should test pluralize of irregularity " + value + " should be the same", function() {
_.irregular(key, value);
return _.pluralize(value).should.equal(value);
});
});
});
describe('overwriting', function() {
return it("should override and switch back", function() {
_.singularize("series").should.equal("series");
_.singular("series", "serie");
_.singularize("series").should.equal("serie");
return _.uncountable("series");
});
});
describe('clear', function() {
return it("should test clearing rules");
});
describe('camelize', function() {
it("should propertly camelize", function() {
return _.each(camelToUnderscore, function(value, key, list) {
return _.camelize(value).should.equal(key);
});
});
it("should downcase the first character if passed false as a second argument", function() {
return _.camelize('Capital', false).should.equal('capital');
});
return it("should remove underscores", function() {
return _.camelize('Camel_Case').should.equal('CamelCase');
});
});
describe('acronyms', function() {
before(function() {
_.acronym('API');
_.acronym('HTML');
_.acronym('HTTP');
_.acronym('RESTful');
_.acronym('W3C');
_.acronym('PhD');
_.acronym('RoR');
return _.acronym('SSL');
});
_.each([["API", "api", "API", "API"], ["APIController", "api_controller", "API controller", "API Controller"], ["HTTPAPI", "http_api", "HTTP API", "HTTP API"], ["SSLError", "ssl_error", "SSL error", "SSL Error"], ["RESTful", "restful", "RESTful", "RESTful"], ["RESTfulController", "restful_controller", "RESTful controller", "RESTful Controller"], ["IHeartW3C", "i_heart_w3c", "I heart W3C", "I Heart W3C"], ["PhDRequired", "phd_required", "PhD required", "PhD Required"], ["IRoRU", "i_ror_u", "I RoR u", "I RoR U"], ["RESTfulHTTPAPI", "restful_http_api", "RESTful HTTP API", "RESTful HTTP API"], ["Capistrano", "capistrano", "Capistrano", "Capistrano"], ["CapiController", "capi_controller", "Capi controller", "Capi Controller"], ["HttpsApis", "https_apis", "Https apis", "Https Apis"], ["Html5", "html5", "Html5", "Html5"], ["Restfully", "restfully", "Restfully", "Restfully"], ["RoRails", "ro_rails", "Ro rails", "Ro Rails"]], function(t) {
var camel, human, title, under;
camel = t[0];
under = t[1];
human = t[2];
title = t[3];
it('should camelize as underscored', function() {
return _.camelize(under).should.equal(camel);
});
it('should not change already camel cased', function() {
return _.camelize(camel).should.equal(camel);
});
it('should not modify already underscored', function() {
return _.underscore(under).should.equal(under);
});
it('should underscore camel cased', function() {
return _.underscore(camel).should.equal(under);
});
it('titleizes underscored text as expected', function() {
return _.titleize(under).should.equal(title);
});
it('titleizes camelcase text as expected', function() {
return _.titleize(camel).should.equal(title);
});
return it('should humanize as expected', function() {
return _.humanize(under).should.equal(human);
});
});
return describe('RESTfulHTTPAPI', function() {
return it('does its thing', function() {
return _.underscore('RESTfulHTTPAPI').should.equal('restful_http_api');
});
});
});
describe('acronym override', function() {
before(function() {
_.acronym('API');
return _.acronym('LegacyApi');
});
it('honors new acronym', function() {
return _.camelize('legacyapi').should.equal('LegacyApi');
});
it('does not match with underscore', function() {
return _.camelize('legacy_api').should.equal('LegacyAPI');
});
it('matches when delimited in a longer string', function() {
return _.camelize('some_legacyapi').should.equal('SomeLegacyApi');
});
return it('does not match when not delimited', function() {
return _.camelize('nonlegacyapi').should.equal('Nonlegacyapi');
});
});
describe('acronym camelize lower', function() {
before(function() {
_.acronym('API');
return _.acronym('HTML');
});
return it('does not camelize first letter', function() {
_.camelize('html_api', false).should.equal('htmlAPI');
_.camelize('htmlAPI', false).should.equal('htmlAPI');
return _.camelize('HTMLAPI', false).should.equal('htmlAPI');
});
});
describe('underscore acronym sequence', function() {
before(function() {
_.acronym('API');
_.acronym('JSON');
return _.acronym('HTML');
});
return it('deliniates on acronym boundaries', function() {
return _.underscore('JSONHTMLAPI').should.equal('json_html_api');
});
});
describe('underscore', function() {
_.each(camelToUnderscore, function(underscore, camel) {
return it('should underscore as expected', function() {
return _.underscore(camel).should.equal(underscore);
});
});
return _.each(camelToUnderscoreWithoutReverse, function(underscore, camel) {
return it('should underscore without reverse as expected', function() {
return _.underscore(camel).should.equal(underscore);
});
});
});
describe('humanize', function() {
return _.each(underscoreToHuman, function(human, underscore) {
return it('should humanize as expected', function() {
return _.humanize(underscore).should.equal(human);
});
});
});
describe('humanize by rule', function() {
before(function() {
_.human(/_cnt$/i, '_count');
return _.human(/^prefix/i, '');
});
return it('applies the custom rules', function() {
_.humanize('jargon_cnt').should.equal('Jargon count');
return _.humanize('prefix_request').should.equal('Request');
});
});
describe('humanize by string', function() {
before(function() {
return _.human('col_rpted_bugs', 'Reported bugs');
});
return it('performs the string replacement', function() {
_.humanize('col_rpted_bugs').should.equal('Reported bugs');
return _.humanize('COL_rpted_bugs').should.equal('Col rpted bugs');
});
});
return describe('titleize', function() {
return _.each(mixtureToTitleCase, function(titleized, before) {
return it("titleizes " + before, function() {
return _.titleize(before).should.equal(titleized);
});
});
});
});
}).call(this);