class BretonWordTokenizer extends WordTokenizer {

  private static final Pattern REPL_PATTERN_1 = compile("([Cc])['’‘ʼ]([Hh])");
  private static final Pattern REPL_PATTERN_2 = compile("(\\p{L})['’‘ʼ]");
  private static final Pattern REPL_PATTERN_3 = compile("\u0001\u0001BR@APOS\u0001\u0001", LITERAL);

  /**
   * Tokenizes just like WordTokenizer with the exception that "c’h"
   * is not split. "C’h" is considered as a letter in breton (trigraph)
   * and it occurs in many words.  So tokenizer should not split it.
   * Also split things like "n’eo" into 2 tokens only "n’" + "eo".
   * 
   * @param text Text to tokenize
   * @return List of tokens.
   *         Note: a special string ##BR_APOS## is used to replace apostrophes
   *         during tokenizing.
   */
  @Override
  public List<String> tokenize(String text) {<FILL_FUNCTION_BODY>}
}


    // FIXME: this is a bit of a hacky way to tokenize.  It should work
    // but I should work on a more elegant way.
    String replaced = REPL_PATTERN_1.matcher(text).replaceAll("$1\u0001\u0001BR@APOS\u0001\u0001$2");
    replaced = REPL_PATTERN_2.matcher(replaced).replaceAll("$1\u0001\u0001BR@APOS\u0001\u0001 ");

    List<String> tokenList = super.tokenize(replaced);
    List<String> tokens = new ArrayList<>();

    // Put back apostrophes and remove spurious spaces.
    Iterator<String> itr = tokenList.iterator();
    while (itr.hasNext()) {
      String word = REPL_PATTERN_3.matcher(itr.next()).replaceAll("’");
      tokens.add(word);
      if (!word.equals("’") && word.endsWith("’")) {
        itr.next(); // Skip the next spurious white space.
      }
    }
    return tokens;
  
<methods>public non-sealed void <init>() ,public static List<java.lang.String> getProtocols() ,public java.lang.String getTokenizingCharacters() ,public boolean isCurrencyExpression(java.lang.String) ,public static boolean isEMail(java.lang.String) ,public static boolean isUrl(java.lang.String) ,public List<java.lang.String> replaceEmojis(java.lang.String) ,public List<java.lang.String> restoreEmojis(List<java.lang.String>, List<java.lang.String>) ,public List<java.lang.String> splitCurrencyExpression(java.lang.String) ,public List<java.lang.String> tokenize(java.lang.String) <variables>private static final java.util.regex.Pattern CURRENCY_EXPRESSION,private static final java.util.regex.Pattern CURRENCY_SYMBOLS,private static final java.util.regex.Pattern CURRENCY_VALUE,private static final java.util.regex.Pattern DOMAIN_CHARS,private static final java.util.regex.Pattern E_MAIL,private static final java.util.regex.Pattern NO_PROTOCOL_URL,private static final List<java.lang.String> PROTOCOLS,protected final java.lang.String REMOVED_EMOJI,private static final java.lang.String TOKENIZING_CHARACTERS,private static final java.util.regex.Pattern URL_CHARS