package org.tessell.util; import static org.tessell.util.StringUtils.capitalize; import static org.tessell.util.StringUtils.uncapitalize; import java.util.ArrayList; import java.util.Iterator; /** Copy/paste from joist.util. */ public class Inflector { private static final String lower = "[a-z]"; private static final String upper = "[A-Z0-9]"; private Inflector() { } public static String humanize(final String camelCased) { String name = ""; for (final Iterator<String> i = split(camelCased).iterator(); i.hasNext();) { String part = capitalize(i.next().toLowerCase()); if (!part.isEmpty()) { name += part; if (i.hasNext()) { name += " "; } } } return name; } public static String camelize(final String humanCased) { String name = ""; for (final Iterator<String> i = split(humanCased).iterator(); i.hasNext();) { name += capitalize(i.next().toLowerCase()); } return uncapitalize(name); } /** Splits word into groups based on where underscores and case changes are. */ private static ArrayList<String> split(final String word) { final ArrayList<String> parts = new ArrayList<String>(); boolean wasLower = false; int at = 0; final int length = word.length(); for (int i = 0; i < length; i++) { final String c = word.substring(i, i + 1); if ("_".equals(c) || " ".equals(c)) { parts.add(word.substring(at, i)); at = i + 1; } else if (wasLower && c.matches(upper)) { parts.add(word.substring(at, i)); at = i; wasLower = false; } else if (!wasLower && c.matches(lower)) { wasLower = true; } } if (at != length) { parts.add(word.substring(at)); } return parts; } }