-
-
Save chrissie1/7273a10f7681da7e5b26 to your computer and use it in GitHub Desktop.
| fun String.pluralize() : String{ | |
| val rules = listOf( | |
| "$" to "s", | |
| "s$"to "s", | |
| "(ax|test)is$" to "$1es", | |
| "us$" to "i", | |
| "(octop|vir)us$" to "$1i", | |
| "(octop|vir)i$" to "$1i", | |
| "(alias|status)$" to "$1es", | |
| "(bu)s$" to "$1ses", | |
| "(buffal|tomat)o$" to "$1oes", | |
| "([ti])um$" to "$1a", | |
| "([ti])a$" to "$1a", | |
| "sis$" to "ses", | |
| "(,:([^f])fe|([lr])f)$" to "$1$2ves", | |
| "(hive)$" to "$1s", | |
| "([^aeiouy]|qu)y$" to "$1ies", | |
| "(x|ch|ss|sh)$" to "$1es", | |
| "(matr|vert|ind)ix|ex$" to "$1ices", | |
| "([m|l])ouse$" to "$1ice", | |
| "([m|l])ice$" to "$1ice", | |
| "^(ox)$" to "$1en", | |
| "(quiz)$" to "$1zes", | |
| "f$" to "ves", | |
| "fe$" to "ves") | |
| val unCountable = listOf("equipment", "information", "rice", "money", | |
| "species", "series", "fish", "sheep", "aircraft","bison", "flounder", "pliers", "bream", | |
| "gallows", "proceedings", "breeches", "graffiti", "rabies", | |
| "britches", "headquarters", "salmon", "carp", "herpes", | |
| "scissors", "chassis", "high-jinks", "sea-bass", "clippers", | |
| "homework", "cod", "innings", "shears", | |
| "contretemps", "jackanapes", "corps", "mackerel", | |
| "swine", "debris", "measles", "trout", "diabetes", "mews", | |
| "tuna", "djinn", "mumps", "whiting", "eland", "news", | |
| "wildebeest", "elk", "pincers", "sugar") | |
| val exceptions = listOf("person" to "people", | |
| "man" to "men", | |
| "goose" to "geese", | |
| "child" to "children", | |
| "sex" to "sexes", | |
| "move" to "moves", | |
| "stadium" to "stadiums", | |
| "deer" to "deer") | |
| if(unCountable.contains(this)) return this | |
| val rule = rules.last { Pattern.compile(it.component1(), Pattern.CASE_INSENSITIVE).matcher(this).find()} | |
| var found = Pattern.compile(rule.component1(), Pattern.CASE_INSENSITIVE).matcher(this).replaceAll(rule.component2()) | |
| val excep = exceptions.firstOrNull() { this.equals(it.component1())} | |
| if(excep !=null) found = excep.component2() | |
| val endswith = exceptions.firstOrNull { this.endsWith(it.component1())} | |
| if(endswith != null) found = this.replace(endswith.component1(),endswith.component2()) | |
| return found | |
| } |
| package org.humanizer.jvm.tests | |
| import org.spek.Spek | |
| import org.spek.givenData | |
| import org.humanizer.jvm.titleize | |
| import org.spek.shouldEqual | |
| import org.humanizer.jvm.pluralize | |
| import org.humanizer.jvm.singularize | |
| public class PluralizeTests() : Spek() { | |
| { | |
| var data = listOf( | |
| "search" to "searches", | |
| "switch" to "switches", | |
| "fix" to "fixes", | |
| "box" to "boxes", | |
| "process" to "processes", | |
| "address" to "addresses", | |
| "case" to "cases", | |
| "stack" to "stacks", | |
| "wish" to "wishes", | |
| "fish" to "fish", | |
| "category" to "categories", | |
| "query" to "queries", | |
| "ability" to "abilities", | |
| "agency" to "agencies", | |
| "movie" to "movies", | |
| "archive" to "archives", | |
| "index" to "indices", | |
| "wife" to "wives", | |
| "safe" to "saves", | |
| "half" to "halves", | |
| "move" to "moves", | |
| "salesperson" to "salespeople", | |
| "person" to "people", | |
| "spokesman" to "spokesmen", | |
| "man" to "men", | |
| "woman" to "women", | |
| "basis" to "bases", | |
| "diagnosis" to "diagnoses", | |
| "datum" to "data", | |
| "medium" to "media", | |
| "analysis" to "analyses", | |
| "node_child" to "node_children", | |
| "child" to "children", | |
| "experience" to "experiences", | |
| "day" to "days", | |
| "comment" to "comments", | |
| "foobar" to "foobars", | |
| "newsletter" to "newsletters", | |
| "old_news" to "old_news", | |
| "news" to "news", | |
| "series" to "series", | |
| "species" to "species", | |
| "quiz" to "quizzes", | |
| "perspective" to "perspectives", | |
| "ox" to "oxen", | |
| "photo" to "photos", | |
| "buffalo" to "buffaloes", | |
| "tomato" to "tomatoes", | |
| "dwarf" to "dwarves", | |
| "elf" to "elves", | |
| "information" to "information", | |
| "equipment" to "equipment", | |
| "bus" to "buses", | |
| "status" to "statuses", | |
| "status_code" to "status_codes", | |
| "mouse" to "mice", | |
| "louse" to "lice", | |
| "house" to "houses", | |
| "octopus" to "octopi", | |
| "virus" to "viri", | |
| "alias" to "aliases", | |
| "portfolio" to "portfolios", | |
| "vertex" to "vertices", | |
| "matrix" to "matrices", | |
| "axis" to "axes", | |
| "testis" to "testes", | |
| "crisis" to "crises", | |
| "rice" to "rice", | |
| "shoe" to "shoes", | |
| "horse" to "horses", | |
| "prize" to "prizes", | |
| "edge" to "edges", | |
| "deer" to "deer", | |
| "sheep" to "sheep", | |
| "wolf" to "wolves" | |
| ) | |
| givenData(data) { | |
| val (value, expected) = it | |
| on("calling pluralize on String", { | |
| val actual = value.pluralize() | |
| it("should be ${expected}", { | |
| shouldEqual(expected, actual) | |
| }) | |
| }) | |
| } | |
| /*givenData(data) { | |
| val (expected, value) = it | |
| on("calling singularize on String", { | |
| val actual = value.singularize() | |
| it("should be ${expected}", { | |
| shouldEqual(expected, actual) | |
| }) | |
| }) | |
| }*/ | |
| } | |
| } |
Give me full context. What's this? Also you've got found defined twice.
I updated the gist with the current code for pluralize, far from complete but it's a start.
"man".pluralize() should give "men" and is one of the exceptions not covered by the regex rules
you're seeing the compiler hints right?
Your problem is that first is not finding a matching element. That's what the exception is throwing.
the compiler hints are wrong because when I run the tests I get an error on that line. Added tests.
So maybe I should use some other method?
Compiler hints aren't wrong. You're assigning a value to found, not using it. Then assigning a new value, not using it, then assigning another value, not using it.
you are saying I'm wrong. The nerve.
Ok I was wrong, the last version is now there.
I'm getting an NRE ( actually java.lang.IllegalArgumentException: No element matching predicate was found) on the .component2() line when this is not in the exceptions list. I thought you didn't have that in kotlin. Better way?