codsworth-namegen/js/main.js

284 lines
13 KiB
JavaScript

"use strict";
/// Constants
var SIMILARCOUNT = 25;
var RANDOMCOUNT = 25;
var NAMELIST = ["Aaliyah","Aaron","Abigail","Abram","Abrams","Adalyn","Adam","Adams","Addison","Adeline","Adrian","Ahn","Aideen","Aiden","Akira","Al","Alaina","Alan","Alana","Alex","Alexander","Alexandra","Alexis","Alice","Allen","Allison","Altman","Alyssa","Amanda","Amelia","Anderson","Andonov","Andrew","Andy","Angel","Angela","Anna","Annabelle","Anthony","Archer","Aria","Arianna","Asdf","Ash","Asher","Ashford","Ashley","Asimov","Assface","Atkins","Atkinson","Atom","Atomic","Atticus","Aubrey","Audrey","Austin","Autumn","Ava","Avery","Bacon","Badass","Bailey","Baker","Banner","Bannerman","Bannion","Barnes","Barron","Barry","Bash","Bastard","Battosai","Batty","Baudoin","Bell","Bella","Ben","Benjamin","Bennell","Bennett","Bentley","Bery","Bill","Billy","Bilodeau","Black","Blaise","Blake","Blaze","Bob","Bobbi","Bobby","Bogdanove","Bond","Boob","Boobie","Boobies","Boom","Boston","Bowman","Bradley","Braun","Brayden","Brenda","Brenna","Brian","Brianna","Brick","Brigner","Brock","Brody","Brooklyn","Brooks","Browder","Brown","Browne","Bruce","Bruckheimer","Bryan","Bryant","Buffy","Bulger","Bull","Burgess","Burke","Burt","Butch","Butler","Caden","Cal","Caleb","Callie","Camden","Camilla","Campbell","Capable","Carey","Carnow","Carofano","Caroline","Carson","Carter","Carver","Casserly","Castle","Catherine","Cha","Chapin","Chappy","Charles","Charlie","Charlotte","Chase","Cheng","Cherise","Cherry","CherryBomb","Chloe","Chopper","Chris","Christian","Christiane","Christopher","Church","Claire","Clara","Clark","Clarke","Claw","Clemens","Clunk","Cobb","Cobra","Cock","Cockerham","Cole","Colin","Collins","Colton","Conall","Connor","Cook","Cooke","Cooper","Cormac","Corman","Cornelius","Cornett","Corrie","Corrine","Corvo","Corwin","Cory","Cosgrove","Courtenay","Courtney","Cox","Coyle","Craig","Crash","Cruz","Cubbison","Cullen","Cummings","Dag","Damien","Dan","Dane","Danger","Daniel","Daniels","Danny","Darrel","Darren","Darryl","Daryl","Dave","David","Davis","Dawson","Deag","Death","Deb","Debbie","Deborah","Deckard","Declan","Deitrick","Delaney","Dell","Dennis","Denton","Deschain","Deth","Diana","Diane","DiAngelo","Diaz","Dick","DiMaggio","Dinolt","DJ","Django","Dom","Domics","Dominguez","Dominic","Don","Donald","Dong","DongJun","Donnie","Donny","Doug","Douglas","Dragon","Draper","Dulany","Dutch","Duvall","Dylan","Eagle","East","Ed","Eddie","Eddy","Edwards","Elena","Eli","Eliana","Elijah","Elizabeth","Ella","Ellie","Elliot","Elliott","Emil","Emile","Emily","Emma","Erectus","Eric","Erik","Erin","Ernest","Ernie","Ethan","Eugene","Eva","Evan","Evans","Evelyn","Everdeen","Everett","Felipe","Ferret","Fifi","Finn","Finster","Fiona","Fisher","Flag","Flagg","Flash","Flores","Flynn","Foster","Fox","Fragile","Francis","Franke","Freeman","Frost","Fuck","Fucker","Fuckface","Furiosa","Fury","Gabriel","Gabriella","Gardiner","Gary","Gavin","Gene","George","Georgia","Gerry","Gianna","Gil","Glen","Gomez","Gonzalez","Goose","Gordon","Graber","Grace","Grant","Gravato","Gray","Grayson","Greco","Green","Greene","Grey","Griffin","Grognak","Gryphon","Gutierrez","Guy","Hackman","Hailey","Hall","Ham","Hamilton","Hamm","Hammer","Hammett","Hamrick","Han","Hannah","Hans","Harden","Hardi","Harold","Harper","Harris","Harry","Haschart","Hasenbuhler","Hastings","Hawk","Hawke","Hazel","Henning","Henry","Herbert","Hicks","Hill","Hines","Holly","Holmes","Hook","Hopgood","Houle","Howard","Hudson","Hughes","Humongous","Humungus","Hyun","Ian","Ilya","Imperator","Indiana","Indy","Isaac","Isabella","Isabelle","Isaiah","Ist","Istvan","J.P.","Jack","Jackson","Jacob","Jag","Jake","James","Jangjoon","Jasmine","Jason","Jay","Jayce","Jayden","Jeff","Jeffery","Jen","Jenkins","Jennifer","Jeremiah","Jeremy","Jerry","Jerusalem","Jess","Jessica","Jessie","Jet","Jim","Jimmy","Joan","Joe","Joel","Joey","John","Johnson","Jon","Jonathan","Jones","JonPaul","Jordan","Jordyn","Joseph","Josh","Joshua","Josiah","JP","Juan","Julia","Julian","Juliana","Justin","Kaela","Kaelyn","Kaitlyn","Kal","KalEl","Kaneda","Kate","Katharine","Katherine","Katniss","Kauffman","Kayla","Kaylee","Keira","Kelley","Kelly","Kelvin","Ken","Kennedy","Kenshin","Kevin","Kim","King","Kirk","Knight","Krietz","Kuhlmann","Kurt","Kylie","Lafferty","Lamb","Landon","Lane","Langlois","Laura","Lauren","Laurie","Layla","Lea","Leah","Lederer","Lee","Leo","Leon","Les","Leslie","Levi","Lewis","Li","Liam","Liesegang","Lila","Liliana","Lillian","Lily","Lincoln","Linda","Lionheart","Lipari","Liz","Logan","London","Loner","Long","Lopez","Losi","Lucas","Luce","Lucy","Luke","Lundin","Lupe","Lynda","Maam","Mackenzie","Macklin","Madam","Madeleine","Madelyn","Madison","Makayla","Mal","Malcolm","Mamba","Mandy","Mara","Marcus","Marge","Maria","Marie","Marji","Marjorie","Mark","Markiepoo","Marko","Markus","Marlowe","Marsden","Martin","Martinez","Marty","Mary","Mason","Mateo","Matt","Matthew","Matty","Max","Maya","McCoy","McDyer","McFly","McKay","McPherson","Means","Megan","Meister","Mejillones","Mia","Micah","Michael","Michonne","Miguel","Mikami","Mike","Mila","Miles","Miller","Mitchell","Mohammed","Molly","Monster","Montana","Moonves","Moore","Morales","Morgan","Morgue","Morpheus","Morris","Muck","Mudguts","Muhammad","Mulder","Muldoon","Murphy","Myers","Nadia","Nancy","Nanes","Nardone","Nasty","Natalia","Natalie","Natasha","Nate","Nathan","Nathaniel","Nazarov","nchez","Neary","Nelson","Neo","Nesmith","Neville","Nguyen","Nicholas","Nico","Nipple","Noah","Nogueira","Nolan","Noonan","Nora","Norm","Norm","Norman","Normand","North","Northup","Nourmohammadi","Nuclear","Nuke","Olds","Oliver","Olivia","Ollie","Olsen","Olson","Optical","Orgasmo","Orin","Ortiz","Owen","Owens","Pagliarulo","Palmer","Paris","Parker","Parson","Pat","Patrick","Patty","Paul","Pely","Pendleton","Penelope","Perez","Perry","Pete","Peter","Peterson","Peyton","Phil","Philip","Phillips","Picard","Plissken","Powell","Preacher","Price","Priest","Prince","Princess","Psycho","Puma","Purkey","Purkeypile","Python","Qin","Quartermain","Quatermass","Queen","Quinn","Rabil","Raf","Rafael","Ramirez","Ramsey","Randal","Randall","Rankin","Rapp","Ray","Raymond","Reagan","Red","Reed","Reese","Rex","Reyes","Reynolds","Ricardo","Richard","Richards","Richardson","Rick","Ricky","Rictus","Riddick","Riley","Ripken","Ripley","River","Rivera","Rob","Robb","Robert","Roberts","Robinson","Rock","Rockatansky","Rocky","Rodriguez","Roger","Rogers","Roland","Rollins","Romanov","Romanova","Romero","Ron","Ronald","Ronnie","Ronny","Rook","Rosa","Rose","Ross","Roy","Ruby","Russell","Ryan","Sadie","Sage","Salvatore","Sam","Samantha","Sammie","Sammy","Samuel","Sanchez","Sanders","Sandra","Sanjuro","Sara","Sarah","Sarse","Savannah","Sawyer","Scarlett","Schaefer","Scharf","Schram","Schreiber","Scott","Scully","Sears","Sebastian","Selena","Seljenes","Serena","Seth","Sex","Sexy","Shane","Shannon","Sheiman","Shen","Shinji","Shrike","Sidney","Simmons","Singer","Sir","Skyler","Slaughter","Slinger","Slit","Sloan","Smirnova","Smith","Snake","Snow","Snyder","Solo","Solomon","Sophia","Sophie","South","Southie","Spade","Spider","Spike","Splendid","Spring","Springsteen","Stark","Stef","Stella","Steph","Stephanie","Stephen","Sterling","Steve","Steven","Steward","Stewart","Stone","Struthers","Stuart","Sullivan","Summer","Sunshine","Sweetpea","Sydney","Tallahassee","Taylor","Teare","Ted","Teddy","Teitel","Tesla","Tetsuo","Texas","Thomas","Thompson","Thorn","Thorne","Tiana","Tim","Timmy","Timothy","Tit","Tittie","Titties","Toadie","Toast","Todd","Toecutter","Tom","Tommy","Tonon","Tony","Torres","Tracey","Tracy","Treadway","Tresnjak","Trinity","Tristan","Trump","Tuck","Turner","Tyler","Unbreakable","Utting","Valenti","Valentina","Valkyrie","Vargas","Vash","Venkman","Vic","Vicens","Victoria","Violet","Vivian","Vlatko","Wagner","Walker","Walton","Wanderer","Ward","Washington","Watson","Watts","Wayne","Webb","Wells","Wes","West","Weyland","Wez","White","Whitey","Wikus","Will","William","Williams","Willy","Wilson","Winter","Wisnewski","Wood","Woodward","Wright","Wyatt","Xavier","Yan","Yojimbo","Yorick","Young","Yutani","Zachary","Zdana","Zed","Zenith","Zetta","Ziggy","Zip","Zoe"];
/// Shared functions
// Returns minimum of three integers
var min = function(a, b, c)
{
return Math.min(Math.min(a, b), c);
};
// Loads user options in template and returns combination
var optionDefault = function(template, options)
{
var prop;
for(prop in options)
{
if(options.hasOwnProperty(prop))
{
template[prop] = options[prop];
}
}
return template;
};
// Returns a mod b
var modulo = function(a, b)
{
return (((a % b) + b) % b);
};
/// Name generator
function Name(size)
{
size = (size === undefined ? 10 : size);
this.count_ = 0;
this.history_ = [];
this.size_ = size;
}
// Returns random name
Name.prototype.generate_ = function()
{
return NAMELIST[Math.floor(Math.random() * NAMELIST.length)];
};
// Adds given name to history
Name.prototype.add = function(name)
{
if(name !== undefined)
{
this.history_[modulo(this.count_, this.size_)] = name;
this.count_++;
}
return name;
};
// Adds a random name to history
Name.prototype.addRandom = function()
{
var name = this.generate_();
return this.add(name);
};
// Returns history
Name.prototype.getHistory = function(separator, count)
{
count = (count === undefined ? Math.min(this.size_, this.count_) : count);
var i, name, out = [];
for(i = count; i > 0; i--)
{
name = this.history_[modulo((this.count_ - i), this.size_)];
if(name === undefined)
{
break;
}
out.push(name);
}
return out.join(separator);
};
// Resets the name generator
Name.prototype.reset = function()
{
this.count_ = 0;
this.history_ = [];
};
/// Levenshtein similarity
function Levenshtein(name)
{
this.name_ = name;
this.size_ = name.length;
this.reset_();
this.populate_();
}
// Set string algorithm
Levenshtein.prototype.algo_ = levenshtein;
// Resets object
Levenshtein.prototype.reset_ = function()
{
this.buckets_ = [];
for(var i = 0; i <= this.size_; i++)
{
this.buckets_[i] = [];
}
};
// Populates buckets
Levenshtein.prototype.populate_ = function()
{
var listSize = NAMELIST.length,
name, dist;
for(var i = 0; i < listSize; i++)
{
name = NAMELIST[i];
dist = this.algo_(this.name_, name, { caseSensitive : false });
if(dist <= this.size_)
{
this.buckets_[dist].push(name);
}
}
};
// Returns best matches, limited to amount
Levenshtein.prototype.getSimilar = function(amount)
{
var i, len,
matches = 0,
top = [],
bucket = 0;
while(bucket < this.size_)
{
len = this.buckets_[bucket].length;
for(i = 0; i < len; i++)
{
top.push(this.buckets_[bucket][i]);
matches++;
if(matches >= amount)
{
break;
}
}
bucket++;
if(matches >= amount)
{
break;
}
}
return top;
};
/// Jaro-Winkler similarity
function JaroWinkler(name)
{
this.name_ = name;
this.size_ = name.length;
this.reset_();
this.populate_();
}
// Set string algorithm
JaroWinkler.prototype.algo_ = jaro_winkler;
// Comparator for values returned by algorithm
JaroWinkler.prototype.comparator_ = function(a, b)
{
return (b[1] - a[1]);
};
// Resets object
JaroWinkler.prototype.reset_ = function()
{
this.hits_ = [];
};
// Populates hits
JaroWinkler.prototype.populate_ = function()
{
var listSize = NAMELIST.length,
i, name, value;
for(i = 0; i < listSize; i++)
{
name = NAMELIST[i];
value = this.algo_(this.name_, name, { caseSensitive : false });
this.hits_[i] = [name, value];
}
this.hits_.sort(this.comparator_);
};
// Returns best matches, limited to amount
JaroWinkler.prototype.getSimilar = function(amount)
{
var similar = [];
for(var i = 0; i < amount; i++)
{
similar[i] = this.hits_[i][0];
}
return similar;
};
/// DOM elements
// Similar name
var simInput = document.getElementById("similarInput");
var simButton = document.getElementById("generateSimilar");
var simOutput = document.getElementById("similarNames");
simButton.addEventListener(
"click",
function(e)
{
e.preventDefault();
// Get input
var name = simInput.value;
if(name === undefined || name === "")
{
return;
}
// Find most similar names
var sorter = new JaroWinkler(name);
var names = sorter.getSimilar(SIMILARCOUNT);
// Update contents
simOutput.value = names.join("\n");
},
false
);
// Random name
var randNamer = new Name(RANDOMCOUNT);
var randButton = document.getElementById("generateRandom");
var randOutput = document.getElementById("randomNames");
randButton.addEventListener(
"click",
function(e)
{
e.preventDefault();
// Add random name
randNamer.addRandom();
// Update contents
randOutput.value = randNamer.getHistory("\n");
randOutput.scrollTop = randOutput.scrollHeight;
},
false
);