fixed incorrect displaying of word + punctuation in Hindi
This commit is contained in:
parent
55038c4719
commit
19fa3dc772
18 changed files with 203 additions and 173 deletions
|
|
@ -8,8 +8,8 @@ import io.github.sspanak.tt9.hacks.InputType;
|
||||||
import io.github.sspanak.tt9.languages.Language;
|
import io.github.sspanak.tt9.languages.Language;
|
||||||
import io.github.sspanak.tt9.languages.NaturalLanguage;
|
import io.github.sspanak.tt9.languages.NaturalLanguage;
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
|
||||||
import io.github.sspanak.tt9.util.TextTools;
|
import io.github.sspanak.tt9.util.TextTools;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
class Mode123 extends ModePassthrough {
|
class Mode123 extends ModePassthrough {
|
||||||
@Override public int getId() { return MODE_123; }
|
@Override public int getId() { return MODE_123; }
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import io.github.sspanak.tt9.languages.Language;
|
||||||
import io.github.sspanak.tt9.languages.LanguageKind;
|
import io.github.sspanak.tt9.languages.LanguageKind;
|
||||||
import io.github.sspanak.tt9.languages.NaturalLanguage;
|
import io.github.sspanak.tt9.languages.NaturalLanguage;
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
class ModeABC extends InputMode {
|
class ModeABC extends InputMode {
|
||||||
private final ArrayList<ArrayList<String>> KEY_CHARACTERS = new ArrayList<>();
|
private final ArrayList<ArrayList<String>> KEY_CHARACTERS = new ArrayList<>();
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ import io.github.sspanak.tt9.languages.LanguageCollection;
|
||||||
import io.github.sspanak.tt9.languages.LanguageKind;
|
import io.github.sspanak.tt9.languages.LanguageKind;
|
||||||
import io.github.sspanak.tt9.languages.NaturalLanguage;
|
import io.github.sspanak.tt9.languages.NaturalLanguage;
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
|
||||||
import io.github.sspanak.tt9.util.TextTools;
|
import io.github.sspanak.tt9.util.TextTools;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
class ModeCheonjiin extends InputMode {
|
class ModeCheonjiin extends InputMode {
|
||||||
// used when we want do display a different set of characters for a given key, for example
|
// used when we want do display a different set of characters for a given key, for example
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ import io.github.sspanak.tt9.ime.helpers.TextField;
|
||||||
import io.github.sspanak.tt9.languages.Language;
|
import io.github.sspanak.tt9.languages.Language;
|
||||||
import io.github.sspanak.tt9.languages.LanguageKind;
|
import io.github.sspanak.tt9.languages.LanguageKind;
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
|
||||||
import io.github.sspanak.tt9.util.Text;
|
import io.github.sspanak.tt9.util.Text;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class AutoSpace {
|
public class AutoSpace {
|
||||||
private static final Set<Character> PRECEDING_SPACE_PUNCTUATION = Set.of('(', '«', '„');
|
private static final Set<Character> PRECEDING_SPACE_PUNCTUATION = Set.of('(', '«', '„');
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ import io.github.sspanak.tt9.ime.helpers.TextField;
|
||||||
import io.github.sspanak.tt9.languages.EmojiLanguage;
|
import io.github.sspanak.tt9.languages.EmojiLanguage;
|
||||||
import io.github.sspanak.tt9.languages.Language;
|
import io.github.sspanak.tt9.languages.Language;
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
|
||||||
import io.github.sspanak.tt9.util.TextTools;
|
import io.github.sspanak.tt9.util.TextTools;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class WordPredictions extends Predictions {
|
public class WordPredictions extends Predictions {
|
||||||
private final TextField textField;
|
private final TextField textField;
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import androidx.annotation.NonNull;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
|
||||||
import io.github.sspanak.tt9.util.TextTools;
|
import io.github.sspanak.tt9.util.TextTools;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class EmojiLanguage extends Language {
|
public class EmojiLanguage extends Language {
|
||||||
final public static String EMOJI_SEQUENCE = "11";
|
final public static String EMOJI_SEQUENCE = "11";
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.languages.exceptions.InvalidLanguageCharactersException;
|
import io.github.sspanak.tt9.languages.exceptions.InvalidLanguageCharactersException;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
|
||||||
import io.github.sspanak.tt9.util.Text;
|
import io.github.sspanak.tt9.util.Text;
|
||||||
import io.github.sspanak.tt9.util.TextTools;
|
import io.github.sspanak.tt9.util.TextTools;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
|
|
||||||
public class NaturalLanguage extends Language implements Comparable<NaturalLanguage> {
|
public class NaturalLanguage extends Language implements Comparable<NaturalLanguage> {
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,9 @@ import io.github.sspanak.tt9.R;
|
||||||
import io.github.sspanak.tt9.ime.TraditionalT9;
|
import io.github.sspanak.tt9.ime.TraditionalT9;
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
import io.github.sspanak.tt9.ui.Vibration;
|
import io.github.sspanak.tt9.ui.Vibration;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
|
||||||
import io.github.sspanak.tt9.util.Logger;
|
import io.github.sspanak.tt9.util.Logger;
|
||||||
import io.github.sspanak.tt9.util.Text;
|
import io.github.sspanak.tt9.util.Text;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class SoftKey extends androidx.appcompat.widget.AppCompatButton implements View.OnTouchListener, View.OnLongClickListener {
|
public class SoftKey extends androidx.appcompat.widget.AppCompatButton implements View.OnTouchListener, View.OnLongClickListener {
|
||||||
private final String LOG_TAG = getClass().getSimpleName();
|
private final String LOG_TAG = getClass().getSimpleName();
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import android.content.Context;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.R;
|
import io.github.sspanak.tt9.R;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class SoftKeyF5 extends SoftKeyFn {
|
public class SoftKeyF5 extends SoftKeyFn {
|
||||||
public SoftKeyF5(Context context) {
|
public SoftKeyF5(Context context) {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import androidx.core.graphics.drawable.DrawableCompat;
|
||||||
import androidx.core.widget.TextViewCompat;
|
import androidx.core.widget.TextViewCompat;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.R;
|
import io.github.sspanak.tt9.R;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class SoftKeyFn extends SoftKeyNumber {
|
public class SoftKeyFn extends SoftKeyNumber {
|
||||||
public SoftKeyFn(Context context) { super(context);}
|
public SoftKeyFn(Context context) { super(context);}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import android.util.AttributeSet;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.R;
|
import io.github.sspanak.tt9.R;
|
||||||
import io.github.sspanak.tt9.languages.LanguageKind;
|
import io.github.sspanak.tt9.languages.LanguageKind;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class SoftKeyPunctuation extends SoftKey {
|
public class SoftKeyPunctuation extends SoftKey {
|
||||||
public SoftKeyPunctuation(Context context) {
|
public SoftKeyPunctuation(Context context) {
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,12 @@ import io.github.sspanak.tt9.R;
|
||||||
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
import io.github.sspanak.tt9.preferences.settings.SettingsStore;
|
||||||
import io.github.sspanak.tt9.ui.Vibration;
|
import io.github.sspanak.tt9.ui.Vibration;
|
||||||
import io.github.sspanak.tt9.ui.main.ResizableMainView;
|
import io.github.sspanak.tt9.ui.main.ResizableMainView;
|
||||||
import io.github.sspanak.tt9.util.Characters;
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class SuggestionsBar {
|
public class SuggestionsBar {
|
||||||
private final String STEM_SUFFIX = "… +";
|
private final String STEM_SUFFIX = "… +";
|
||||||
private final String STEM_VARIATION_PREFIX = "…";
|
private final String STEM_VARIATION_PREFIX = "…";
|
||||||
private final String STEM_PUNCTUATION_VARIATION_PREFIX = " ";
|
private final String STEM_PUNCTUATION_VARIATION_PREFIX = "";
|
||||||
@NonNull private String stem = "";
|
@NonNull private String stem = "";
|
||||||
|
|
||||||
private double lastClickTime = 0;
|
private double lastClickTime = 0;
|
||||||
|
|
@ -199,7 +199,11 @@ public class SuggestionsBar {
|
||||||
// shorten the stem variations
|
// shorten the stem variations
|
||||||
if (!stem.isEmpty() && suggestion.length() == stem.length() + 1 && suggestion.toLowerCase().startsWith(stem.toLowerCase())) {
|
if (!stem.isEmpty() && suggestion.length() == stem.length() + 1 && suggestion.toLowerCase().startsWith(stem.toLowerCase())) {
|
||||||
String trimmedSuggestion = suggestion.substring(stem.length());
|
String trimmedSuggestion = suggestion.substring(stem.length());
|
||||||
trimmedSuggestion = Character.isAlphabetic(trimmedSuggestion.charAt(0)) ? STEM_VARIATION_PREFIX + trimmedSuggestion : STEM_PUNCTUATION_VARIATION_PREFIX + trimmedSuggestion;
|
char firstChar = trimmedSuggestion.charAt(0);
|
||||||
|
|
||||||
|
String prefix = Character.isAlphabetic(firstChar) && !Characters.isCombiningPunctuation(firstChar) ? STEM_VARIATION_PREFIX : STEM_PUNCTUATION_VARIATION_PREFIX;
|
||||||
|
trimmedSuggestion = prefix + trimmedSuggestion;
|
||||||
|
|
||||||
suggestions.add(trimmedSuggestion);
|
suggestions.add(trimmedSuggestion);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,159 +0,0 @@
|
||||||
package io.github.sspanak.tt9.util;
|
|
||||||
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.os.Build;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import io.github.sspanak.tt9.languages.Language;
|
|
||||||
import io.github.sspanak.tt9.languages.LanguageKind;
|
|
||||||
|
|
||||||
public class Characters {
|
|
||||||
public static final String GR_QUESTION_MARK = ";";
|
|
||||||
public static final String NEW_LINE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && new Paint().hasGlyph("⏎") ? "⏎" : "\\n";
|
|
||||||
public static final String ZWJ = "\u200D";
|
|
||||||
public static final String ZWJ_GRAPHIC = "ZWJ";
|
|
||||||
public static final String ZWNJ = "\u200C";
|
|
||||||
public static final String ZWNJ_GRAPHIC = "ZWNJ";
|
|
||||||
|
|
||||||
final public static ArrayList<String> ArabicNumbers = new ArrayList<>(Arrays.asList(
|
|
||||||
"٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<Character> CombiningPunctuation = new ArrayList<>(Arrays.asList(
|
|
||||||
',', '-', '\'', ':', ';', '!', '?', '.'
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<Character> CombiningPunctuationHebrew = new ArrayList<>(Arrays.asList(
|
|
||||||
',' , '-', '\'', ':', ';', '!', '?', '.', '"',
|
|
||||||
'·', GR_QUESTION_MARK.charAt(0), // Greek
|
|
||||||
'،', '؛', ':', '!', '؟' // Arabic
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> PunctuationArabic = new ArrayList<>(Arrays.asList(
|
|
||||||
"،", ".", "-", "(", ")", "&", "~", "`", "'", "\"", "؛", ":", "!", "؟"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> PunctuationEnglish = new ArrayList<>(Arrays.asList(
|
|
||||||
",", ".", "-", "(", ")", "&", "~", "`", ";", ":", "'", "\"", "!", "?"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> PunctuationFrench = new ArrayList<>(Arrays.asList(
|
|
||||||
",", ".", "-", "«", "»", "(", ")", "&", "`", "~", ";", ":", "'", "\"", "!", "?"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> PunctuationGerman = new ArrayList<>(Arrays.asList(
|
|
||||||
",", ".", "-", "„", "“", "(", ")", "&", "~", "`", "'", "\"", ";", ":", "!", "?"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> PunctuationGreek = new ArrayList<>(Arrays.asList(
|
|
||||||
",", ".", "-", "«", "»", "(", ")", "&", "~", "`", "'", "\"", "·", ":", "!", GR_QUESTION_MARK
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> PunctuationIndic = new ArrayList<>(Arrays.asList(
|
|
||||||
",", ".", "-", ZWJ, ZWNJ, "(", ")", "।", "॰", "॥", "&", "~", "`", ";", ":", "'", "\"", "!", "?"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> PunctuationKorean = new ArrayList<>(Arrays.asList(
|
|
||||||
",", ".", "~", "1", "(", ")", "&", "-", "`", ";", ":", "'", "\"", "!", "?"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> Currency = new ArrayList<>(Arrays.asList(
|
|
||||||
"$", "€", "₹", "₿", "₩", "¢", "¤", "₺", "₱", "¥", "₽", "£"
|
|
||||||
));
|
|
||||||
|
|
||||||
final public static ArrayList<String> Special = new ArrayList<>(Arrays.asList(
|
|
||||||
" ", "\n", "@", "_", "#", "%", "[", "]", "{", "}", "§", "|", "^", "<", ">", "\\", "/", "=", "*", "+"
|
|
||||||
));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The English punctuation filtered to contain only valid email characters.
|
|
||||||
*/
|
|
||||||
final public static ArrayList<ArrayList<String>> Email = new ArrayList<>(Arrays.asList(
|
|
||||||
new ArrayList<>(Arrays.asList("@", "_", "#", "%", "{", "}", "|", "^", "/", "=", "*", "+")),
|
|
||||||
new ArrayList<>(Arrays.asList(".", "-", "&", "~", "`", "'", "!", "?"))
|
|
||||||
));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Special characters for phone number fields, including both characters for conveniently typing a phone number: "()-",
|
|
||||||
* as well as command characters such as "," = "slight pause" and ";" = "wait" used in Japan and some other countries.
|
|
||||||
*/
|
|
||||||
final public static ArrayList<ArrayList<String>> Phone = new ArrayList<>(Arrays.asList(
|
|
||||||
new ArrayList<>(Arrays.asList("+", " ")),
|
|
||||||
new ArrayList<>(Arrays.asList("-", "(", ")", ".", ";", ","))
|
|
||||||
));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Special characters for all kinds of numeric fields: integer, decimal with +/- included as necessary.
|
|
||||||
*/
|
|
||||||
public static ArrayList<ArrayList<String>> getNumberSpecialCharacters(boolean decimal, boolean signed) {
|
|
||||||
ArrayList<ArrayList<String>> keyCharacters = new ArrayList<>();
|
|
||||||
keyCharacters.add(signed ? new ArrayList<>(Arrays.asList("-", "+")) : new ArrayList<>());
|
|
||||||
if (decimal) {
|
|
||||||
keyCharacters.add(new ArrayList<>(Arrays.asList(".", ",")));
|
|
||||||
}
|
|
||||||
return keyCharacters;
|
|
||||||
}
|
|
||||||
|
|
||||||
final private static ArrayList<String> TextEmoticons = new ArrayList<>(Arrays.asList(
|
|
||||||
":)", ":D", ":P", ";)", "\\m/", ":-O", ":|", ":("
|
|
||||||
));
|
|
||||||
|
|
||||||
final private static ArrayList<ArrayList<String>> Emoji = new ArrayList<>(Arrays.asList(
|
|
||||||
// positive
|
|
||||||
new ArrayList<>(Arrays.asList(
|
|
||||||
"🙂", "😀", "🤣", "🤓", "😎", "😛", "😉"
|
|
||||||
)),
|
|
||||||
// negative
|
|
||||||
new ArrayList<>(Arrays.asList(
|
|
||||||
"🙁", "😢", "😭", "😱", "😲", "😳", "😐", "😠"
|
|
||||||
)),
|
|
||||||
// hands
|
|
||||||
new ArrayList<>(Arrays.asList(
|
|
||||||
"👍", "👋", "✌️", "👏", "🖖", "🤘", "🤝", "💪", "👎"
|
|
||||||
)),
|
|
||||||
// emotions
|
|
||||||
new ArrayList<>(Arrays.asList(
|
|
||||||
"❤", "🤗", "😍", "😘", "😇", "😈", "🍺", "🎉", "🥱", "🤔", "🥶", "😬"
|
|
||||||
))
|
|
||||||
));
|
|
||||||
|
|
||||||
public static boolean isGraphic(char ch) {
|
|
||||||
return !(ch < 256 || Character.isLetterOrDigit(ch) || Character.isAlphabetic(ch));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean noEmojiSupported() {
|
|
||||||
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ArrayList<String> getEmoji(int level) {
|
|
||||||
if (noEmojiSupported()) {
|
|
||||||
return new ArrayList<>(TextEmoticons);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (level < 0 || level >= Emoji.size()) {
|
|
||||||
return new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Paint paint = new Paint();
|
|
||||||
ArrayList<String> availableEmoji = new ArrayList<>();
|
|
||||||
for (String emoji : Emoji.get(level)) {
|
|
||||||
if (paint.hasGlyph(emoji)) {
|
|
||||||
availableEmoji.add(emoji);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return availableEmoji.isEmpty() ? new ArrayList<>(TextEmoticons) : availableEmoji;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getMaxEmojiLevel() {
|
|
||||||
return Emoji.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isCombiningPunctuation(Language language, char ch) {
|
|
||||||
return
|
|
||||||
CombiningPunctuation.contains(ch)
|
|
||||||
|| (LanguageKind.isHebrew(language) && CombiningPunctuationHebrew.contains(ch));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -6,6 +6,7 @@ import java.util.Locale;
|
||||||
|
|
||||||
import io.github.sspanak.tt9.ime.modes.InputMode;
|
import io.github.sspanak.tt9.ime.modes.InputMode;
|
||||||
import io.github.sspanak.tt9.languages.Language;
|
import io.github.sspanak.tt9.languages.Language;
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class Text extends TextTools {
|
public class Text extends TextTools {
|
||||||
private final Language language;
|
private final Language language;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import io.github.sspanak.tt9.util.chars.Characters;
|
||||||
|
|
||||||
public class TextTools {
|
public class TextTools {
|
||||||
private static final Pattern containsOtherThan1 = Pattern.compile("[02-9]");
|
private static final Pattern containsOtherThan1 = Pattern.compile("[02-9]");
|
||||||
private static final Pattern combiningString = Pattern.compile("^\\p{M}+$");
|
private static final Pattern combiningString = Pattern.compile("^\\p{M}+$");
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package io.github.sspanak.tt9.util.chars;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class Characters extends Emoji {
|
||||||
|
final public static ArrayList<String> Currency = new ArrayList<>(Arrays.asList(
|
||||||
|
"$", "€", "₹", "₿", "₩", "¢", "¤", "₺", "₱", "¥", "₽", "£"
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> Special = new ArrayList<>(Arrays.asList(
|
||||||
|
" ", "\n", "@", "_", "#", "%", "[", "]", "{", "}", "§", "|", "^", "<", ">", "\\", "/", "=", "*", "+"
|
||||||
|
));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The English punctuation filtered to contain only valid email characters.
|
||||||
|
*/
|
||||||
|
final public static ArrayList<ArrayList<String>> Email = new ArrayList<>(Arrays.asList(
|
||||||
|
new ArrayList<>(Arrays.asList("@", "_", "#", "%", "{", "}", "|", "^", "/", "=", "*", "+")),
|
||||||
|
new ArrayList<>(Arrays.asList(".", "-", "&", "~", "`", "'", "!", "?"))
|
||||||
|
));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Special characters for phone number fields, including both characters for conveniently typing a phone number: "()-",
|
||||||
|
* as well as command characters such as "," = "slight pause" and ";" = "wait" used in Japan and some other countries.
|
||||||
|
*/
|
||||||
|
final public static ArrayList<ArrayList<String>> Phone = new ArrayList<>(Arrays.asList(
|
||||||
|
new ArrayList<>(Arrays.asList("+", " ")),
|
||||||
|
new ArrayList<>(Arrays.asList("-", "(", ")", ".", ";", ","))
|
||||||
|
));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Special characters for all kinds of numeric fields: integer, decimal with +/- included as necessary.
|
||||||
|
*/
|
||||||
|
public static ArrayList<ArrayList<String>> getNumberSpecialCharacters(boolean decimal, boolean signed) {
|
||||||
|
ArrayList<ArrayList<String>> keyCharacters = new ArrayList<>();
|
||||||
|
keyCharacters.add(signed ? new ArrayList<>(Arrays.asList("-", "+")) : new ArrayList<>());
|
||||||
|
if (decimal) {
|
||||||
|
keyCharacters.add(new ArrayList<>(Arrays.asList(".", ",")));
|
||||||
|
}
|
||||||
|
return keyCharacters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
package io.github.sspanak.tt9.util.chars;
|
||||||
|
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.os.Build;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
class Emoji extends Punctuation {
|
||||||
|
final private static ArrayList<String> TextEmoticons = new ArrayList<>(Arrays.asList(
|
||||||
|
":)", ":D", ":P", ";)", "\\m/", ":-O", ":|", ":("
|
||||||
|
));
|
||||||
|
|
||||||
|
final private static ArrayList<ArrayList<String>> Emoji = new ArrayList<>(Arrays.asList(
|
||||||
|
// positive
|
||||||
|
new ArrayList<>(Arrays.asList(
|
||||||
|
"🙂", "😀", "🤣", "🤓", "😎", "😛", "😉"
|
||||||
|
)),
|
||||||
|
// negative
|
||||||
|
new ArrayList<>(Arrays.asList(
|
||||||
|
"🙁", "😢", "😭", "😱", "😲", "😳", "😐", "😠"
|
||||||
|
)),
|
||||||
|
// hands
|
||||||
|
new ArrayList<>(Arrays.asList(
|
||||||
|
"👍", "👋", "✌️", "👏", "🖖", "🤘", "🤝", "💪", "👎"
|
||||||
|
)),
|
||||||
|
// emotions
|
||||||
|
new ArrayList<>(Arrays.asList(
|
||||||
|
"❤", "🤗", "😍", "😘", "😇", "😈", "🍺", "🎉", "🥱", "🤔", "🥶", "😬"
|
||||||
|
))
|
||||||
|
));
|
||||||
|
|
||||||
|
public static boolean isGraphic(char ch) {
|
||||||
|
return !(ch < 256 || Character.isLetterOrDigit(ch) || Character.isAlphabetic(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean noEmojiSupported() {
|
||||||
|
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ArrayList<String> getEmoji(int level) {
|
||||||
|
if (noEmojiSupported()) {
|
||||||
|
return new ArrayList<>(TextEmoticons);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (level < 0 || level >= Emoji.size()) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
Paint paint = new Paint();
|
||||||
|
ArrayList<String> availableEmoji = new ArrayList<>();
|
||||||
|
for (String emoji : Emoji.get(level)) {
|
||||||
|
if (paint.hasGlyph(emoji)) {
|
||||||
|
availableEmoji.add(emoji);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return availableEmoji.isEmpty() ? new ArrayList<>(TextEmoticons) : availableEmoji;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getMaxEmojiLevel() {
|
||||||
|
return Emoji.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
package io.github.sspanak.tt9.util.chars;
|
||||||
|
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.os.Build;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import io.github.sspanak.tt9.languages.Language;
|
||||||
|
import io.github.sspanak.tt9.languages.LanguageKind;
|
||||||
|
|
||||||
|
class Punctuation {
|
||||||
|
public static final String GR_QUESTION_MARK = ";";
|
||||||
|
public static final String NEW_LINE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && new Paint().hasGlyph("⏎") ? "⏎" : "\\n";
|
||||||
|
public static final String ZWJ = "\u200D";
|
||||||
|
public static final String ZWJ_GRAPHIC = "ZWJ";
|
||||||
|
public static final String ZWNJ = "\u200C";
|
||||||
|
public static final String ZWNJ_GRAPHIC = "ZWNJ";
|
||||||
|
|
||||||
|
final public static ArrayList<String> ArabicNumbers = new ArrayList<>(Arrays.asList(
|
||||||
|
"٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<Character> CombiningPunctuation = new ArrayList<>(Arrays.asList(
|
||||||
|
',', '-', '\'', ':', ';', '!', '?', '.'
|
||||||
|
));
|
||||||
|
|
||||||
|
final private static ArrayList<Character> CombiningPunctuationIndic = new ArrayList<>(Arrays.asList(
|
||||||
|
'्', '़', 'ऽ', 'ः', '।', '॰', '॥'
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
final private static ArrayList<Character> CombiningPunctuationHebrew = new ArrayList<>(Arrays.asList(
|
||||||
|
',' , '-', '\'', ':', ';', '!', '?', '.', '"'
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> PunctuationArabic = new ArrayList<>(Arrays.asList(
|
||||||
|
"،", ".", "-", "(", ")", "&", "~", "`", "'", "\"", "؛", ":", "!", "؟"
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> PunctuationEnglish = new ArrayList<>(Arrays.asList(
|
||||||
|
",", ".", "-", "(", ")", "&", "~", "`", ";", ":", "'", "\"", "!", "?"
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> PunctuationFrench = new ArrayList<>(Arrays.asList(
|
||||||
|
",", ".", "-", "«", "»", "(", ")", "&", "`", "~", ";", ":", "'", "\"", "!", "?"
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> PunctuationGerman = new ArrayList<>(Arrays.asList(
|
||||||
|
",", ".", "-", "„", "“", "(", ")", "&", "~", "`", "'", "\"", ";", ":", "!", "?"
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> PunctuationGreek = new ArrayList<>(Arrays.asList(
|
||||||
|
",", ".", "-", "«", "»", "(", ")", "&", "~", "`", "'", "\"", "·", ":", "!", GR_QUESTION_MARK
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> PunctuationIndic = new ArrayList<>(Arrays.asList(
|
||||||
|
",", ".", "-", ZWJ, ZWNJ, "(", ")", "।", "॰", "॥", "&", "~", "`", ";", ":", "'", "\"", "!", "?"
|
||||||
|
));
|
||||||
|
|
||||||
|
final public static ArrayList<String> PunctuationKorean = new ArrayList<>(Arrays.asList(
|
||||||
|
",", ".", "~", "1", "(", ")", "&", "-", "`", ";", ":", "'", "\"", "!", "?"
|
||||||
|
));
|
||||||
|
|
||||||
|
public static boolean isCombiningPunctuation(Language language, char ch) {
|
||||||
|
return
|
||||||
|
CombiningPunctuation.contains(ch)
|
||||||
|
|| (LanguageKind.isIndic(language) && CombiningPunctuationIndic.contains(ch))
|
||||||
|
|| (LanguageKind.isHebrew(language) && CombiningPunctuationHebrew.contains(ch));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isCombiningPunctuation(char ch) {
|
||||||
|
return CombiningPunctuation.contains(ch) || CombiningPunctuationIndic.contains(ch) || CombiningPunctuationHebrew.contains(ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue