package com.github.marschall.memoryfilesystem; import java.text.Normalizer; import java.text.Normalizer.Form; import java.util.Locale; /** * Constant definitions for the standard {@link StringTransformer StringTransformers}. */ public final class StringTransformers { /** * Keeps a string as is. */ public static final StringTransformer IDENTIY = new IdentityTransformer(); /** * Normalizes a string using * <a href="https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms">NFD</a> */ public static final StringTransformer NFD = new NFD(); /** * Normalizes a string using * <a href="https://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms">NFC</a> */ public static final StringTransformer NFC = new NFC(); public StringTransformer caseInsensitive() { return caseInsensitive(Locale.getDefault()); } public static StringTransformer caseInsensitive(Locale locale) { return new CaseInsenstive(locale); } public static StringTransformer caseInsensitiveMacOSNative(Locale locale) { return new CaseInsenstiveMacOSNative(locale); } public static StringTransformer caseInsensitiveMacOSJvm(Locale locale) { return new CaseInsenstiveMacOSJvm(locale); } static final class NFD implements StringTransformer { @Override public String transform(String s) { // Wikipedia says MAC_OS uses NFD // http://en.wikipedia.org/wiki/HFS_Plus return Normalizer.normalize(s, Form.NFD); } } static final class NFC implements StringTransformer { @Override public String transform(String s) { return Normalizer.normalize(s, Form.NFC); } } static final class CaseInsenstiveMacOSNative implements StringTransformer { private final Locale locale; CaseInsenstiveMacOSNative(Locale locale) { this.locale = locale; } @Override public String transform(String s) { return Normalizer.normalize(s, Form.NFD).toUpperCase(this.locale); } } static final class CaseInsenstiveMacOSJvm implements StringTransformer { private final Locale locale; CaseInsenstiveMacOSJvm(Locale locale) { this.locale = locale; } @Override public String transform(String s) { return Normalizer.normalize(s, Form.NFC).toUpperCase(this.locale); } } static final class CaseInsenstive implements StringTransformer { private final Locale locale; CaseInsenstive(Locale locale) { this.locale = locale; } @Override public String transform(String s) { return s.toUpperCase(this.locale); } } static final class IdentityTransformer implements StringTransformer { @Override public String transform(String s) { return s; } } }