From 86ce93d067f95d45ddbb04e568b0c77de5f26d87 Mon Sep 17 00:00:00 2001 From: "Felix W. Dekker" Date: Thu, 1 Oct 2020 20:26:11 +0200 Subject: [PATCH] Use standard template --- .gitattributes | 1 + .gitignore | 117 +++++++++ Gruntfile.js | 112 ++++++++ README.md | 20 ++ index.html | 248 ------------------ package-lock.json | Bin 0 -> 206613 bytes package.json | 33 +++ src/main/index.html | 76 ++++++ src/main/js/index.js | 160 +++++++++++ .../main/js/jaro-winkler.js | 10 +- 10 files changed, 528 insertions(+), 249 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Gruntfile.js delete mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/main/index.html create mode 100644 src/main/js/index.js rename jaro-winkler.js => src/main/js/jaro-winkler.js (92%) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1a6bd45 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +package-lock.json binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7ea1e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,117 @@ +## Node +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.pnp.* diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..acad4ee --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,112 @@ +const path = require("path"); + +module.exports = grunt => { + grunt.initConfig({ + pkg: grunt.file.readJSON("package.json"), + clean: { + default: ["dist/"], + }, + copy: { + html: { + files: [{expand: true, cwd: "src/main/", src: "**/*.html", dest: "dist/"}] + }, + }, + focus: { + dev: { + include: ["html", "js", "link"], + }, + }, + replace: { + dev: { + src: ["./dist/*.html", "./dist/*.js"], + replacements: [ + { + from: "%%VERSION_NUMBER%%", + to: "<%= pkg.version %>+" + new Date().toISOString().slice(0, 19).replace(/[-:T]/g, "") + } + ], + overwrite: true + }, + deploy: { + src: ["./dist/*.html", "./dist/*.js"], + replacements: [ + { + from: "%%VERSION_NUMBER%%", + to: "<%= pkg.version %>" + } + ], + overwrite: true + }, + }, + watch: { + html: { + files: ["src/main/**/*.html"], + tasks: ["copy:html"], + }, + js: { + files: ["src/main/**/*.js"], + tasks: ["webpack:dev", "replace:dev"], + }, + link: { + files: ["node_modules/@fwdekker/*/dist/**"], + tasks: ["webpack:dev", "replace:dev"], + }, + }, + webpack: { + options: { + entry: "./src/main/js/index.js", + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: [".js"], + }, + output: { + filename: "bundle.js", + path: path.resolve(__dirname, "dist/"), + }, + }, + dev: { + mode: "development", + devtool: "inline-source-map", + }, + deploy: { + mode: "production", + }, + }, + }); + + grunt.loadNpmTasks("grunt-contrib-clean"); + grunt.loadNpmTasks("grunt-contrib-copy"); + grunt.loadNpmTasks("grunt-contrib-watch"); + grunt.loadNpmTasks("grunt-focus"); + grunt.loadNpmTasks("grunt-text-replace"); + grunt.loadNpmTasks("grunt-webpack"); + + grunt.registerTask("dev", [ + // Pre + "clean", + // Copy files + "copy:html", + // Compile JS + "webpack:dev", + "replace:dev", + ]); + grunt.registerTask("dev:server", ["dev", "focus:dev"]); + grunt.registerTask("deploy", [ + // Pre + "clean", + // Copy files + "copy:html", + // Compile JS + "webpack:deploy", + "replace:deploy", + ]); + + grunt.registerTask("default", ["dev"]); +}; diff --git a/README.md b/README.md index ad814f9..9f2462b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,23 @@ # Codsworth name generator Choose a fitting name for your _Fallout 4_ character that Codsworth can pronounce. This tool gives you a list of names that look like yours so that you can pretend he's saying the right name. + +## Development +### Requirements +* [npm](https://www.npmjs.com/) + +### Setting up +```shell script +# Install dependencies (only needed once) +$> npm ci +``` + +### Building +```shell script +# Build the tool in `dist/` for development +$> npm run dev +# Same as above, but automatically rerun it whenever files are changed +$> npm run dev:server +# Build the tool in `dist/` for deployment +$> npm run deploy +``` diff --git a/index.html b/index.html deleted file mode 100644 index b2ff4ee..0000000 --- a/index.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - - - - Codsworth name generator - - - - - -
- -
-
-

Codsworth name generator

- -
-

- These generators use the - - list of names that can be pronounced by Codsworth - - to help you find an appropriate name for your character. -

-
-
-
- - - -
- -
-
-

Similar names

-
-
-

Random names

-
-
- - -
-
- - -
-
-
- - -
-
- - - - -
-
- - - - -
-
-
- - - - -
- - - - - - - - diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..cb6b70de4111692327594dfc53498706085820b8 GIT binary patch literal 206613 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

o%5=$OGC8^kUyF^c1N$j}ISjo7?;FLn5 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 + + + + + + + + + + Codsworth name generator + + + + + +

+ +
+ + + + +
+ +
+
+

Similar names

+
+
+

Random names

+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + + + +
+
+ + + + +
+
+
+
+ +
+ + + + + + diff --git a/src/main/js/index.js b/src/main/js/index.js new file mode 100644 index 0000000..dd3c700 --- /dev/null +++ b/src/main/js/index.js @@ -0,0 +1,160 @@ +import {$, doAfterLoad, footer, header, nav} from "@fwdekker/template"; +import {jaro_winkler} from "./jaro-winkler"; + + +/// Constants +const similarCount = 25; +const randomCount = 25; +const 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 a mod b +const modulo = (a, b) => (((a % b) + b) % b); + + +/// Name generator +class Name { + constructor(size) { + size = (size === undefined ? 10 : size); + + this.count_ = 0; + this.history_ = []; + this.size_ = size; + } + + + // Returns a random name + static generate_() { + return nameList[Math.floor(Math.random() * nameList.length)]; + } + + // Adds given name to history + add(name) { + if (name !== undefined) { + this.history_[modulo(this.count_, this.size_)] = name; + this.count_++; + } + + return name; + } + + // Adds a random name to history + addRandom() { + return this.add(Name.generate_()); + }; + + // Returns history + getHistory(separator, count) { + count = (count === undefined ? Math.min(this.size_, this.count_) : count); + + const out = []; + for (let i = count; i > 0; i--) { + const name = this.history_[modulo((this.count_ - i), this.size_)]; + if (name === undefined) + break; + + out.push(name); + } + + return out.join(separator); + }; +} + + +/// Jaro-Winkler similarity +class JaroWinkler { + constructor(name) { + this.algo_ = jaro_winkler; + this.name_ = name; + + this.reset_(); + this.populate_(); + } + + + // Comparator for values returned by algorithm + static comparator_(a, b) { + return b[1] - a[1]; + } + + // Resets object + reset_() { + this.hits_ = []; + }; + + // Populates hits + populate_() { + const listSize = nameList.length; + + for (let i = 0; i < listSize; i++) { + const name = nameList[i]; + const value = this.algo_(this.name_, name, {caseSensitive: false}); + + this.hits_[i] = [name, value]; + } + + this.hits_.sort(JaroWinkler.comparator_); + }; + + // Returns `amount` best matches + getSimilar(amount) { + const similar = []; + + for (let i = 0; i < amount; i++) + similar[i] = this.hits_[i][0]; + + return similar; + }; +} + + +/// Setup +// 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({ + author: "Felix W. Dekker", + authorURL: "https://fwdekker.com/", + license: "MIT License", + licenseURL: "https://git.fwdekker.com/FWDekker/codsworth-namegen/src/branch/master/LICENSE", + vcs: "git", + vcsURL: "https://git.fwdekker.com/FWDekker/codsworth-namegen/", + version: "v%%VERSION_NUMBER%%" + })); + $("main").style.display = null; +}); + +// Event handlers +doAfterLoad(() => { + const generateSimilar = () => { + const name = $("#similarInput").value; + if (name === undefined || name === "") + return; + + const names = (new JaroWinkler(name)).getSimilar(similarCount); + $("#similarNames").value = names.join("\n"); + }; + + $("#generateSimilar").onclick = generateSimilar; + $("#similarInput").addEventListener("keypress", e => { + if (e.key === "Enter") { + generateSimilar(); + e.preventDefault(); + } + }); + + + const randNamer = new Name(randomCount); + $("#generateRandom").onclick = () => { + randNamer.addRandom(); + + const randOutput = $("#randomNames"); + randOutput.value = randNamer.getHistory("\n"); + randOutput.scrollTop = randOutput.scrollHeight; + }; +}); diff --git a/jaro-winkler.js b/src/main/js/jaro-winkler.js similarity index 92% rename from jaro-winkler.js rename to src/main/js/jaro-winkler.js index 45a2724..d61b068 100644 --- a/jaro-winkler.js +++ b/src/main/js/jaro-winkler.js @@ -24,7 +24,15 @@ "use strict"; -const jaro_winkler = function (a, b, options) { +const optionDefault = (template, options) => { + for (let prop in options) + if (options.hasOwnProperty(prop)) + template[prop] = options[prop]; + + return template; +}; + +export const jaro_winkler = function (a, b, options) { // Load default options options = optionDefault({"caseSensitive": true}, options);