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