codsworth-namegen/src/main/js/main.js

132 lines
12 KiB
JavaScript

const {$, doAfterLoad, footer, header, nav} = window.fwdekker;
import {jaroWinkler} from "./jaroWinkler";
/**
* Number of similar results to show when given a name.
*
* @type {number}
*/
const similarCount = 25;
/**
* Number of random results to keep in memory.
*
* @type {number}
*/
const randomCount = 25;
/**
* List of all names known by Codsworth.
*
* @type {string[]}
*/
const names = ["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"];
/**
* Returns a random element from the given array.
*
* @param array {*[]} the array to choose a random element from
* @returns {*} a random element from the given array
*/
const getRandomFromArray = array => array[Math.floor(Math.random() * array.length)];
/**
* Finds strings similar to the given string using the Jaro-Winkler algorithm.
*
* @param string {string} the string to find similar strings of
* @param candidates {string[]} the strings to compare to the given string
* @param count {number} the number of similar strings to return
* @return {string[]} the `count` most similar candidates
*/
const jaroWinklerFinder = (string, candidates, count) =>
candidates
.map(candidate => [candidate, jaroWinkler(string, candidate, false)])
.sort((a, b) => b[1] - a[1])
.map(it => it[0])
.slice(0, count);
/**
* A cyclical buffer that overwrites old entries once it's full in a cyclical manner.
*/
class CircularBuffer {
/**
* Constructs a new cyclical buffer.
*
* @param size {number} the maximum number of elements that can go in the buffer
*/
constructor(size) {
this.size = size;
this.index = 0; // Points to next insertion
this.entries = [];
}
/**
* Adds a new entry to the buffer, potentially overwriting the oldest entry.
*
* @param {*} entry the entry to add; can be any type, including `undefined`
*/
add(entry) {
this.entries[this.index % this.size] = entry;
this.index++;
}
/**
* Returns the entries in order of insertion.
*
* @return {*[]} the entries in order of insertion
*/
getEntriesInOrder() {
const out = [];
for (let i = 0; i < this.size && i < this.index; i++)
out.unshift(this.entries[(this.index - i - 1) % this.size]);
return out;
}
}
// Load template
doAfterLoad(() => {
$("#nav").appendChild(nav("/Tools/Codsworth Name Generator/"));
$("#header").appendChild(header({
title: "Codsworth Name Generator",
description: `Choose a fitting name for your Fallout 4 character that Codsworth can pronounce`
}));
$("#footer").appendChild(footer({
vcsURL: "https://git.fwdekker.com/FWDekker/codsworth-namegen/",
version: "v%%VERSION_NUMBER%%"
}));
$("main").classList.remove("hidden");
});
// Event handlers
doAfterLoad(() => {
const generateSimilar = () => {
const name = $("#similarInput").value;
if (name === undefined || name === "")
return;
$("#similarNames").value = jaroWinklerFinder(name, names, similarCount).join("\n");
};
$("#generateSimilar").addEventListener("click", generateSimilar);
$("#similarInput").addEventListener("keypress", event => {
if (event.key === "Enter") {
generateSimilar();
event.preventDefault();
}
});
const randomBuffer = new CircularBuffer(randomCount);
$("#generateRandom").onclick = () => {
randomBuffer.add(getRandomFromArray(names));
const randomOutput = $("#randomNames");
randomOutput.value = randomBuffer.getEntriesInOrder().join("\n");
randomOutput.scrollTop = randomOutput.scrollHeight;
};
});