Skip to content

Commit

Permalink
Added English plural-to-singular string util.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed May 17, 2015
1 parent 6e45d9c commit 592a307
Showing 1 changed file with 55 additions and 21 deletions.
76 changes: 55 additions & 21 deletions rapidoid-utils/src/main/java/org/rapidoid/util/English.java
Expand Up @@ -39,38 +39,72 @@ public class English {


private static final Map<String, String> IRREGULAR_PLURAL = IO.loadMap("irregular-plural.txt"); private static final Map<String, String> IRREGULAR_PLURAL = IO.loadMap("irregular-plural.txt");


public static String plural(String s) { public static String plural(String noun) {
if (U.isEmpty(s)) { if (U.isEmpty(noun)) {
return s; return noun;
} }


if (IRREGULAR_PLURAL.containsKey(s.toLowerCase())) { if (IRREGULAR_PLURAL.containsKey(noun.toLowerCase())) {
boolean capital = Character.isUpperCase(s.charAt(0)); boolean capital = Character.isUpperCase(noun.charAt(0));
boolean upper = Character.isUpperCase(s.charAt(s.length() - 1)); boolean upper = Character.isUpperCase(noun.charAt(noun.length() - 1));
String pl = IRREGULAR_PLURAL.get(s.toLowerCase()); String pl = IRREGULAR_PLURAL.get(noun.toLowerCase());


if (upper) { if (upper) {
return pl.toUpperCase(); return pl.toUpperCase();
} else { } else {
return (capital ? U.capitalized(pl) : pl); return (capital ? U.capitalized(pl) : pl);
} }


} else if (PLURAL1.matcher(s).matches()) { } else if (PLURAL1.matcher(noun).matches()) {
return s + "es"; return noun + "es";
} else if (PLURAL2.matcher(s).matches()) { } else if (PLURAL2.matcher(noun).matches()) {
return s + "es"; return noun + "es";
} else if (PLURAL3.matcher(s).matches()) { } else if (PLURAL3.matcher(noun).matches()) {
return U.mid(s, 0, -1) + "ies"; return U.mid(noun, 0, -1) + "ies";
} else if (PLURAL1U.matcher(s).matches()) { } else if (PLURAL1U.matcher(noun).matches()) {
return s + "ES"; return noun + "ES";
} else if (PLURAL2U.matcher(s).matches()) { } else if (PLURAL2U.matcher(noun).matches()) {
return s + "ES"; return noun + "ES";
} else if (PLURAL3U.matcher(s).matches()) { } else if (PLURAL3U.matcher(noun).matches()) {
return U.mid(s, 0, -1) + "IES"; return U.mid(noun, 0, -1) + "IES";
} else { } else {
boolean upper = Character.isUpperCase(s.charAt(s.length() - 1)); boolean upper = Character.isUpperCase(noun.charAt(noun.length() - 1));
return s + (upper ? "S" : "s"); return noun + (upper ? "S" : "s");
} }
} }


public static String singular(String noun) {
if (U.isEmpty(noun)) {
return noun;
}

if (noun.toLowerCase().endsWith("s")) {
String singular = U.mid(noun, 0, -1);
if (plural(singular).equals(noun)) {
return singular;
}
}

if (noun.toLowerCase().endsWith("es")) {
String singular = U.mid(noun, 0, -2);
if (plural(singular).equals(noun)) {
return singular;
}
}

if (noun.toLowerCase().endsWith("ies")) {
String singular = U.mid(noun, 0, -1);
if (!singular.isEmpty()) {
boolean upper = Character.isUpperCase(singular.charAt(singular.length() - 1));
singular += upper ? 'Y' : 'y';
if (plural(singular).equals(noun)) {
return singular;
}
}
}

// FIXME handle irregular plural
return noun;
}

} }

0 comments on commit 592a307

Please sign in to comment.