mirror of
https://gitlab.futo.org/keyboard/latinime.git
synced 2024-09-28 14:54:30 +01:00
am e9f69e16
: Merge "Move a generic string utility to StringUtils"
* commit 'e9f69e166109e46cf1685418fb0ed8119575689f': Move a generic string utility to StringUtils
This commit is contained in:
commit
f10e7cbe96
@ -22,6 +22,10 @@ import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
|
||||
public final class StringUtils {
|
||||
public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case
|
||||
public static final int CAPITALIZE_FIRST = 1; // First only
|
||||
public static final int CAPITALIZE_ALL = 2; // All caps
|
||||
|
||||
private StringUtils() {
|
||||
// This utility class is not publicly instantiable.
|
||||
}
|
||||
@ -171,4 +175,31 @@ public final class StringUtils {
|
||||
}
|
||||
return list.toArray(new String[list.size()]);
|
||||
}
|
||||
|
||||
// This method assumes the text is not empty or null.
|
||||
public static int getCapitalizationType(final String text) {
|
||||
// If the first char is not uppercase, then the word is either all lower case or
|
||||
// camel case, and in either case we return CAPITALIZE_NONE.
|
||||
if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE;
|
||||
final int len = text.length();
|
||||
int capsCount = 1;
|
||||
int letterCount = 1;
|
||||
for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) {
|
||||
if (1 != capsCount && letterCount != capsCount) break;
|
||||
final int codePoint = text.codePointAt(i);
|
||||
if (Character.isUpperCase(codePoint)) {
|
||||
++capsCount;
|
||||
++letterCount;
|
||||
} else if (Character.isLetter(codePoint)) {
|
||||
// We need to discount non-letters since they may not be upper-case, but may
|
||||
// still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME")
|
||||
++letterCount;
|
||||
}
|
||||
}
|
||||
// We know the first char is upper case. So we want to test if either every letter other
|
||||
// than the first is lower case, or if they are all upper case. If the string is exactly
|
||||
// one char long, then we will arrive here with letterCount 1, and this is correct, too.
|
||||
if (1 == capsCount) return CAPITALIZE_FIRST;
|
||||
return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE);
|
||||
}
|
||||
}
|
||||
|
@ -58,10 +58,6 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
|
||||
|
||||
public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts";
|
||||
|
||||
public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case
|
||||
public static final int CAPITALIZE_FIRST = 1; // First only
|
||||
public static final int CAPITALIZE_ALL = 2; // All caps
|
||||
|
||||
private final static String[] EMPTY_STRING_ARRAY = new String[0];
|
||||
private Map<String, DictionaryPool> mDictionaryPools = CollectionUtils.newSynchronizedTreeMap();
|
||||
private Map<String, UserBinaryDictionary> mUserDictionaries =
|
||||
@ -325,13 +321,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
|
||||
}
|
||||
Collections.reverse(mSuggestions);
|
||||
StringUtils.removeDupes(mSuggestions);
|
||||
if (CAPITALIZE_ALL == capitalizeType) {
|
||||
if (StringUtils.CAPITALIZE_ALL == capitalizeType) {
|
||||
for (int i = 0; i < mSuggestions.size(); ++i) {
|
||||
// get(i) returns a CharSequence which is actually a String so .toString()
|
||||
// should return the same object.
|
||||
mSuggestions.set(i, mSuggestions.get(i).toString().toUpperCase(locale));
|
||||
}
|
||||
} else if (CAPITALIZE_FIRST == capitalizeType) {
|
||||
} else if (StringUtils.CAPITALIZE_FIRST == capitalizeType) {
|
||||
for (int i = 0; i < mSuggestions.size(); ++i) {
|
||||
// Likewise
|
||||
mSuggestions.set(i, StringUtils.toTitleCase(
|
||||
@ -438,31 +434,4 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
|
||||
}
|
||||
return new DictAndProximity(dictionaryCollection, proximityInfo);
|
||||
}
|
||||
|
||||
// This method assumes the text is not empty or null.
|
||||
public static int getCapitalizationType(String text) {
|
||||
// If the first char is not uppercase, then the word is either all lower case,
|
||||
// and in either case we return CAPITALIZE_NONE.
|
||||
if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE;
|
||||
final int len = text.length();
|
||||
int capsCount = 1;
|
||||
int letterCount = 1;
|
||||
for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) {
|
||||
if (1 != capsCount && letterCount != capsCount) break;
|
||||
final int codePoint = text.codePointAt(i);
|
||||
if (Character.isUpperCase(codePoint)) {
|
||||
++capsCount;
|
||||
++letterCount;
|
||||
} else if (Character.isLetter(codePoint)) {
|
||||
// We need to discount non-letters since they may not be upper-case, but may
|
||||
// still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME")
|
||||
++letterCount;
|
||||
}
|
||||
}
|
||||
// We know the first char is upper case. So we want to test if either every letter other
|
||||
// than the first is lower case, or if they are all upper case. If the string is exactly
|
||||
// one char long, then we will arrive here with letterCount 1, and this is correct, too.
|
||||
if (1 == capsCount) return CAPITALIZE_FIRST;
|
||||
return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE);
|
||||
}
|
||||
}
|
||||
|
@ -214,14 +214,14 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session {
|
||||
// If the word is in there as is, then it's in the dictionary. If not, we'll test lower
|
||||
// case versions, but only if the word is not already all-lower case or mixed case.
|
||||
if (dict.isValidWord(text)) return true;
|
||||
if (AndroidSpellCheckerService.CAPITALIZE_NONE == capitalizeType) return false;
|
||||
if (StringUtils.CAPITALIZE_NONE == capitalizeType) return false;
|
||||
|
||||
// If we come here, we have a capitalized word (either First- or All-).
|
||||
// Downcase the word and look it up again. If the word is only capitalized, we
|
||||
// tested all possibilities, so if it's still negative we can return false.
|
||||
final String lowerCaseText = text.toLowerCase(mLocale);
|
||||
if (dict.isValidWord(lowerCaseText)) return true;
|
||||
if (AndroidSpellCheckerService.CAPITALIZE_FIRST == capitalizeType) return false;
|
||||
if (StringUtils.CAPITALIZE_FIRST == capitalizeType) return false;
|
||||
|
||||
// If the lower case version is not in the dictionary, it's still possible
|
||||
// that we have an all-caps version of a word that needs to be capitalized
|
||||
@ -296,7 +296,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session {
|
||||
}
|
||||
}
|
||||
|
||||
final int capitalizeType = AndroidSpellCheckerService.getCapitalizationType(text);
|
||||
final int capitalizeType = StringUtils.getCapitalizationType(text);
|
||||
boolean isInDict = true;
|
||||
DictAndProximity dictInfo = null;
|
||||
try {
|
||||
|
Loading…
Reference in New Issue
Block a user