package com.yoursway.rails.commons; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.yoursway.rails.commons.internal.RubyRegexpUtils; public class Inflector { private static class Pair { private final Pattern pattern; private final String replacement; public Pair(Pattern pattern, String replacement) { this.pattern = pattern; this.replacement = replacement; } public Pattern getPattern() { return pattern; } public String getReplacement() { return replacement; } } private final List<Pair> singulars = new ArrayList<Pair>(); private final List<Pair> plurals = new ArrayList<Pair>(); private final Collection<String> uncountables = new HashSet<String>(); public void plural(String rule, String replacement) { final Pattern regexp = RubyRegexpUtils.compileRubyRegexp(rule); final String javaReplacement = RubyRegexpUtils.convertRubyReplacement(replacement); plurals.add(0, new Pair(regexp, javaReplacement)); } public void singular(String rule, String replacement) { final Pattern regexp = RubyRegexpUtils.compileRubyRegexp(rule); final String javaReplacement = RubyRegexpUtils.convertRubyReplacement(replacement); singulars.add(0, new Pair(regexp, javaReplacement)); } public void irregular(String singular, String plural) { plural("(" + singular.charAt(0) + ")" + singular.substring(1), "\\1" + plural.substring(1)); singular("(" + plural.charAt(0) + ")" + plural.substring(1), "\\1" + singular.substring(1)); } public void uncountable(String word) { uncountables.add(word); } public String pluralize(String word) { if (uncountables.contains(word)) return word; else { for (Pair pair : plurals) { Matcher matcher = pair.getPattern().matcher(word); if (matcher.find()) return matcher.replaceAll(pair.getReplacement()); } return word; } } public String singularize(String word) { if (uncountables.contains(word)) return word; else { for (Pair pair : plurals) { Matcher matcher = pair.getPattern().matcher(word); if (matcher.find()) return matcher.replaceAll(pair.getReplacement()); } return word; } } }