1b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi/* 2b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project 3b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * 4b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * use this file except in compliance with the License. You may obtain a copy of 6b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * the License at 7b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * 8b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 9b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * 10b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 11b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * License for the specific language governing permissions and limitations under 14b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi * the License. 15b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi */ 16b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi 17b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagipackage com.android.inputmethod.latin.utils; 18b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi 19b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagiimport com.android.inputmethod.latin.makedict.DictionaryHeader; 20b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagiimport com.android.inputmethod.latin.makedict.ProbabilityInfo; 21516f86815ddec465e3d3ff59540d26913b05236fKeisuke Kuroyanagiimport com.android.inputmethod.latin.makedict.WeightedString; 22b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagiimport com.android.inputmethod.latin.makedict.WordProperty; 23b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi 24b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagiimport java.util.HashMap; 25b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi 26b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagipublic class CombinedFormatUtils { 27b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String DICTIONARY_TAG = "dictionary"; 28b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String BIGRAM_TAG = "bigram"; 29b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String SHORTCUT_TAG = "shortcut"; 30b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String PROBABILITY_TAG = "f"; 31b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String HISTORICAL_INFO_TAG = "historicalInfo"; 32b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String HISTORICAL_INFO_SEPARATOR = ":"; 33b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String WORD_TAG = "word"; 3488fa47a27d45f6460971d0d223aa558e121b3478Keisuke Kuroyanagi public static final String BEGINNING_OF_SENTENCE_TAG = "beginning_of_sentence"; 35b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String NOT_A_WORD_TAG = "not_a_word"; 36b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static final String BLACKLISTED_TAG = "blacklisted"; 37b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi 38b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static String formatAttributeMap(final HashMap<String, String> attributeMap) { 39b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi final StringBuilder builder = new StringBuilder(); 40b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(DICTIONARY_TAG + "="); 41fc9ca59cc1dccc8353528c42a7eb710ad6d90e14Keisuke Kuroyanagi if (attributeMap.containsKey(DictionaryHeader.DICTIONARY_ID_KEY)) { 42fc9ca59cc1dccc8353528c42a7eb710ad6d90e14Keisuke Kuroyanagi builder.append(attributeMap.get(DictionaryHeader.DICTIONARY_ID_KEY)); 43b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 44b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi for (final String key : attributeMap.keySet()) { 45fc9ca59cc1dccc8353528c42a7eb710ad6d90e14Keisuke Kuroyanagi if (key.equals(DictionaryHeader.DICTIONARY_ID_KEY)) { 46b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi continue; 47b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 48b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi final String value = attributeMap.get(key); 49b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append("," + key + "=" + value); 50b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 51b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append("\n"); 52b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi return builder.toString(); 53b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 54b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi 55b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static String formatWordProperty(final WordProperty wordProperty) { 56b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi final StringBuilder builder = new StringBuilder(); 57b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(" " + WORD_TAG + "=" + wordProperty.mWord); 58b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(","); 59b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(formatProbabilityInfo(wordProperty.mProbabilityInfo)); 6088fa47a27d45f6460971d0d223aa558e121b3478Keisuke Kuroyanagi if (wordProperty.mIsBeginningOfSentence) { 6188fa47a27d45f6460971d0d223aa558e121b3478Keisuke Kuroyanagi builder.append("," + BEGINNING_OF_SENTENCE_TAG + "=true"); 6288fa47a27d45f6460971d0d223aa558e121b3478Keisuke Kuroyanagi } 63b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi if (wordProperty.mIsNotAWord) { 64b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append("," + NOT_A_WORD_TAG + "=true"); 65b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 66b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi if (wordProperty.mIsBlacklistEntry) { 67b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append("," + BLACKLISTED_TAG + "=true"); 68b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 69b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append("\n"); 70b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi if (wordProperty.mShortcutTargets != null) { 71b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi for (final WeightedString shortcutTarget : wordProperty.mShortcutTargets) { 72b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(" " + SHORTCUT_TAG + "=" + shortcutTarget.mWord); 73b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(","); 74b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(formatProbabilityInfo(shortcutTarget.mProbabilityInfo)); 75b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append("\n"); 76b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 77b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 78b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi if (wordProperty.mBigrams != null) { 79b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi for (final WeightedString bigram : wordProperty.mBigrams) { 80b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(" " + BIGRAM_TAG + "=" + bigram.mWord); 81b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(","); 82b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(formatProbabilityInfo(bigram.mProbabilityInfo)); 83b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append("\n"); 84b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 85b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 86b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi return builder.toString(); 87b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 88b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi 89b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi public static String formatProbabilityInfo(final ProbabilityInfo probabilityInfo) { 90b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi final StringBuilder builder = new StringBuilder(); 91b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(PROBABILITY_TAG + "=" + probabilityInfo.mProbability); 92b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi if (probabilityInfo.hasHistoricalInfo()) { 93b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(","); 94b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(HISTORICAL_INFO_TAG + "="); 95b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(probabilityInfo.mTimestamp); 96b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(HISTORICAL_INFO_SEPARATOR); 97b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(probabilityInfo.mLevel); 98b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(HISTORICAL_INFO_SEPARATOR); 99b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi builder.append(probabilityInfo.mCount); 100b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 101b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi return builder.toString(); 102b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi } 103b24de426fc98b7550406f54075de4bbbdb2e0ee2Keisuke Kuroyanagi} 104