int stem()

in lucene/analysis/common/src/java/org/apache/lucene/analysis/fr/FrenchLightStemmer.java [64:210]


  int stem(char[] s, int len) {
    if (len > 5 && s[len - 1] == 'x') {
      if (s[len - 3] == 'a' && s[len - 2] == 'u' && s[len - 4] != 'e') s[len - 2] = 'l';
      len--;
    }

    if (len > 3 && s[len - 1] == 'x') len--;

    if (len > 3 && s[len - 1] == 's') len--;

    if (len > 9 && endsWith(s, len, "issement")) {
      len -= 6;
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 8 && endsWith(s, len, "issant")) {
      len -= 4;
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 6 && endsWith(s, len, "ement")) {
      len -= 4;
      if (len > 3 && endsWith(s, len, "ive")) {
        len--;
        s[len - 1] = 'f';
      }
      return norm(s, len);
    }

    if (len > 11 && endsWith(s, len, "ficatrice")) {
      len -= 5;
      s[len - 2] = 'e';
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 10 && endsWith(s, len, "ficateur")) {
      len -= 4;
      s[len - 2] = 'e';
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 9 && endsWith(s, len, "catrice")) {
      len -= 3;
      s[len - 4] = 'q';
      s[len - 3] = 'u';
      s[len - 2] = 'e';
      // s[len-1] = 'r' <-- unnecessary, already 'r'.
      return norm(s, len);
    }

    if (len > 8 && endsWith(s, len, "cateur")) {
      len -= 2;
      s[len - 4] = 'q';
      s[len - 3] = 'u';
      s[len - 2] = 'e';
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 8 && endsWith(s, len, "atrice")) {
      len -= 4;
      s[len - 2] = 'e';
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 7 && endsWith(s, len, "ateur")) {
      len -= 3;
      s[len - 2] = 'e';
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 6 && endsWith(s, len, "trice")) {
      len--;
      s[len - 3] = 'e';
      s[len - 2] = 'u';
      s[len - 1] = 'r';
    }

    if (len > 5 && endsWith(s, len, "ième")) return norm(s, len - 4);

    if (len > 7 && endsWith(s, len, "teuse")) {
      len -= 2;
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 6 && endsWith(s, len, "teur")) {
      len--;
      s[len - 1] = 'r';
      return norm(s, len);
    }

    if (len > 5 && endsWith(s, len, "euse")) return norm(s, len - 2);

    if (len > 8 && endsWith(s, len, "ère")) {
      len--;
      s[len - 2] = 'e';
      return norm(s, len);
    }

    if (len > 7 && endsWith(s, len, "ive")) {
      len--;
      s[len - 1] = 'f';
      return norm(s, len);
    }

    if (len > 4 && (endsWith(s, len, "folle") || endsWith(s, len, "molle"))) {
      len -= 2;
      s[len - 1] = 'u';
      return norm(s, len);
    }

    if (len > 9 && endsWith(s, len, "nnelle")) return norm(s, len - 5);

    if (len > 9 && endsWith(s, len, "nnel")) return norm(s, len - 3);

    if (len > 4 && endsWith(s, len, "ète")) {
      len--;
      s[len - 2] = 'e';
    }

    if (len > 8 && endsWith(s, len, "ique")) len -= 4;

    if (len > 8 && endsWith(s, len, "esse")) return norm(s, len - 3);

    if (len > 7 && endsWith(s, len, "inage")) return norm(s, len - 3);

    if (len > 9 && endsWith(s, len, "isation")) {
      len -= 7;
      if (len > 5 && endsWith(s, len, "ual")) s[len - 2] = 'e';
      return norm(s, len);
    }

    if (len > 9 && endsWith(s, len, "isateur")) return norm(s, len - 7);

    if (len > 8 && endsWith(s, len, "ation")) return norm(s, len - 5);

    if (len > 8 && endsWith(s, len, "ition")) return norm(s, len - 5);

    return norm(s, len);
  }