SnakeCaseToWordCase.java
package org.klojang.templates.name;
import org.klojang.check.Check;
import org.klojang.check.Tag;
import org.klojang.templates.NameMapper;
import static java.lang.Character.toLowerCase;
import static java.lang.Character.toUpperCase;
import static org.klojang.check.CommonChecks.emptyString;
import static org.klojang.util.StringMethods.trim;
/**
* Converts snake case identifiers to word case identifiers. For example
* {@code my_bloody_valentine} becomes {@code MyBloodyValentine}. Note that it doesn't
* matter whether the snake case identifier consists of lowercase letters, uppercase
* letters or both. {@code MY_BLOODY_VALENTINE} and {@code My_Bloody_Valentine} would also
* become {@code MyBloodyValentine}.
*
* @author Ayco Holleman
*/
public class SnakeCaseToWordCase implements NameMapper {
/**
* Maps a snake case name to a word case name. Any leading and trailing underscores in
* the name are ignored.
*
* @param name a word case name
* @return a camel case name
*/
public static String mapName(String name) {
String in = Check.that(trim(name, "_\t\r\n"))
.isNot(emptyString(), "cannot map \"%s\"", name).ok();
char[] out = new char[in.length()];
out[0] = toUpperCase(in.charAt(0));
boolean nextWord = false;
int j = 1;
for (int i = 1; i < in.length(); ++i) {
char c = in.charAt(i);
if (c == '_') {
nextWord = true;
} else {
out[j++] = nextWord ? toUpperCase(c) : toLowerCase(c);
nextWord = false;
}
}
return new String(out, 0, j);
}
/**
* Returns an instance of {@code SnakeCaseToWordCase}.
*
* @return an instance of {@code SnakeCaseToWordCase}
*/
public static SnakeCaseToWordCase snakeCaseToWordCase() {
return new SnakeCaseToWordCase();
}
/**
* Maps a snake case name to a word case name. Any leading and trailing underscores in
* the name are ignored.
*
* @param name a word case name
* @return a camel case name
*/
@Override
public String map(String name) {
return mapName(name);
}
}