/* * Copyright (C) 2011 Darren Salt * * Licensed under the Apache License, Version 2.0 (the "Licence"); you may * not use this file except in compliance with the Licence. You may obtain * a copy of the Licence at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * Licence for the specific language governing permissions and limitations * under the Licence. */ package com.s16.inputmethod.skeyboard; import java.util.HashMap; import java.util.Map; public class DeadAccentSequence { @SuppressWarnings("unused") private static final String TAG = DeadAccentSequence.class.getSimpleName(); //public final static char DEAD_KEY_PLACEHOLDER = 0x25cc; // dotted small circle public final static char DEAD_KEY_PLACEHOLDER = 0x2013; public final static char DEAD_KEY_PLACEHOLDER_X2 = 0x2015; public final static String DEAD_KEY_PLACEHOLDER_STRING = Character.toString(DEAD_KEY_PLACEHOLDER); // 0x2013 0x2015 protected static final Map<String, String> mMap = new HashMap<String, String>(); public DeadAccentSequence() { } protected static String get(String key) { if (key == null || key.length() == 0) { return null; } return mMap.get(key); } protected static void put(String key, String value) { mMap.put(key, value); } private static void putAccent(String nonSpacing, String spacing, String ascii) { if (ascii == null) ascii = spacing; put("" + nonSpacing + " ", ascii); put(nonSpacing + nonSpacing, spacing); put(DEAD_KEY_PLACEHOLDER + nonSpacing, spacing); } private static void putMM(String nonSpacing, String spacing) { put(nonSpacing, spacing); put(DEAD_KEY_PLACEHOLDER + nonSpacing, spacing); } public static boolean isDeadAccent(CharSequence value) { if(value.length() == 2) { return value.charAt(0) == DEAD_KEY_PLACEHOLDER || value.charAt(0) == DEAD_KEY_PLACEHOLDER_X2 || value.charAt(1) == DEAD_KEY_PLACEHOLDER || value.charAt(1) == DEAD_KEY_PLACEHOLDER_X2; } String spacing = get("" + DEAD_KEY_PLACEHOLDER + value); return (spacing != null); } public static String getSpacing(char nonSpacing) { String spacing = get("" + DEAD_KEY_PLACEHOLDER + nonSpacing); if (spacing == null) return "" + nonSpacing; return spacing; } static { // space + combining diacritical // cf. http://unicode.org/charts/PDF/U0300.pdf putAccent("\u0300", "\u02cb", "`"); // grave putAccent("\u0301", "\u02ca", "´"); // acute putAccent("\u0302", "\u02c6", "^"); // circumflex putAccent("\u0303", "\u02dc", "~"); // small tilde putAccent("\u0304", "\u02c9", "¯"); // macron putAccent("\u0305", "\u00af", "¯"); // overline putAccent("\u0306", "\u02d8", null); // breve putAccent("\u0307", "\u02d9", null); // dot above putAccent("\u0308", "\u00a8", "¨"); // diaeresis putAccent("\u0309", "\u02c0", null); // hook above putAccent("\u030a", "\u02da", "°"); // ring above putAccent("\u030b", "\u02dd", "\""); // double acute putAccent("\u030c", "\u02c7", null); // caron putAccent("\u030d", "\u02c8", null); // vertical line above putAccent("\u030e", "\"", "\""); // double vertical line above putAccent("\u0313", "\u02bc", null); // comma above putAccent("\u0314", "\u02bd", null); // reversed comma above put("\u0308\u0301\u03b9", "\u0390"); // Greek Dialytika+Tonos, iota put("\u0301\u0308\u03b9", "\u0390"); // Greek Dialytika+Tonos, iota put("\u0301\u03ca", "\u0390"); // Greek Dialytika+Tonos, iota put("\u0308\u0301\u03c5", "\u03b0"); // Greek Dialytika+Tonos, upsilon put("\u0301\u0308\u03c5", "\u03b0"); // Greek Dialytika+Tonos, upsilon put("\u0301\u03cb", "\u03b0"); // Greek Dialytika+Tonos, upsilon // For My_MM putMM("\u1060", DEAD_KEY_PLACEHOLDER + "\u1060"); putMM("\u1061", DEAD_KEY_PLACEHOLDER + "\u1061"); putMM("\u1062", DEAD_KEY_PLACEHOLDER + "\u1062"); putMM("\u1063", DEAD_KEY_PLACEHOLDER + "\u1063"); putMM("\u1065", DEAD_KEY_PLACEHOLDER + "\u1065"); putMM("\u1066", DEAD_KEY_PLACEHOLDER + "\u1066"); putMM("\u1067", DEAD_KEY_PLACEHOLDER + "\u1067"); putMM("\u1068", DEAD_KEY_PLACEHOLDER + "\u1068"); putMM("\u1069", DEAD_KEY_PLACEHOLDER + "\u1069"); putMM("\u106C", DEAD_KEY_PLACEHOLDER + "\u106C"); putMM("\u106D", DEAD_KEY_PLACEHOLDER + "\u106D"); putMM("\u1070", DEAD_KEY_PLACEHOLDER + "\u1070"); putMM("\u1071", DEAD_KEY_PLACEHOLDER + "\u1071"); putMM("\u1072", DEAD_KEY_PLACEHOLDER + "\u1072"); putMM("\u1073", DEAD_KEY_PLACEHOLDER + "\u1073"); putMM("\u1074", DEAD_KEY_PLACEHOLDER + "\u1074"); putMM("\u1075", DEAD_KEY_PLACEHOLDER + "\u1075"); putMM("\u1076", DEAD_KEY_PLACEHOLDER + "\u1076"); putMM("\u1077", DEAD_KEY_PLACEHOLDER + "\u1077"); putMM("\u1078", DEAD_KEY_PLACEHOLDER + "\u1078"); putMM("\u1079", DEAD_KEY_PLACEHOLDER + "\u1079"); putMM("\u107A", DEAD_KEY_PLACEHOLDER + "\u107A"); putMM("\u107B", DEAD_KEY_PLACEHOLDER + "\u107B"); putMM("\u107C", DEAD_KEY_PLACEHOLDER + "\u107C"); putMM("\u1085", DEAD_KEY_PLACEHOLDER + "\u1085"); putMM("\u1093", DEAD_KEY_PLACEHOLDER + "\u1093"); putMM("\u1096", DEAD_KEY_PLACEHOLDER + "\u1096"); putMM("\u102B", DEAD_KEY_PLACEHOLDER + "\u102B"); putMM("\u102C", DEAD_KEY_PLACEHOLDER + "\u102C"); putMM("\u102D", DEAD_KEY_PLACEHOLDER + "\u102D"); putMM("\u102E", DEAD_KEY_PLACEHOLDER + "\u102E"); putMM("\u102F", DEAD_KEY_PLACEHOLDER + "\u102F"); putMM("\u1030", DEAD_KEY_PLACEHOLDER + "\u1030"); putMM("\u1032", DEAD_KEY_PLACEHOLDER + "\u1032"); putMM("\u1033", DEAD_KEY_PLACEHOLDER + "\u1033"); putMM("\u1034", DEAD_KEY_PLACEHOLDER + "\u1034"); putMM("\u1036", DEAD_KEY_PLACEHOLDER + "\u1036"); putMM("\u1037", DEAD_KEY_PLACEHOLDER + "\u1037"); putMM("\u1038", DEAD_KEY_PLACEHOLDER + "\u1038"); putMM("\u1039", DEAD_KEY_PLACEHOLDER + "\u1039"); putMM("\u103A", DEAD_KEY_PLACEHOLDER + "\u103A"); putMM("\u103B", "\u103B" + DEAD_KEY_PLACEHOLDER); putMM("\u103C", DEAD_KEY_PLACEHOLDER + "\u103C"); putMM("\u103D", DEAD_KEY_PLACEHOLDER + "\u103D"); putMM("\u105A", DEAD_KEY_PLACEHOLDER + "\u105A"); putMM("\u1064", DEAD_KEY_PLACEHOLDER + "\u1064"); putMM("\u107D", DEAD_KEY_PLACEHOLDER + "\u107D"); putMM("\u107E", "\u107E" + DEAD_KEY_PLACEHOLDER_X2); putMM("\u107F", "\u107F" + DEAD_KEY_PLACEHOLDER); putMM("\u1080", "\u1080" + DEAD_KEY_PLACEHOLDER_X2); putMM("\u1081", "\u1081" + DEAD_KEY_PLACEHOLDER); putMM("\u1082", "\u1082" + DEAD_KEY_PLACEHOLDER_X2); putMM("\u1083", "\u1083" + DEAD_KEY_PLACEHOLDER); putMM("\u1084", "\u1084" + DEAD_KEY_PLACEHOLDER_X2); putMM("\u1087", DEAD_KEY_PLACEHOLDER + "\u1087"); putMM("\u1088", DEAD_KEY_PLACEHOLDER + "\u1088"); putMM("\u1089", DEAD_KEY_PLACEHOLDER + "\u1089"); putMM("\u108A", DEAD_KEY_PLACEHOLDER + "\u108A"); putMM("\u108B", DEAD_KEY_PLACEHOLDER + "\u108B"); putMM("\u108C", DEAD_KEY_PLACEHOLDER + "\u108C"); putMM("\u108D", DEAD_KEY_PLACEHOLDER + "\u108D"); putMM("\u108E", DEAD_KEY_PLACEHOLDER + "\u108E"); putMM("\u1094", DEAD_KEY_PLACEHOLDER + "\u1094"); putMM("\u1095", DEAD_KEY_PLACEHOLDER + "\u1095"); } }