forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathextension_ime_util.cc
132 lines (112 loc) · 4.83 KB
/
extension_ime_util.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/ime/extension_ime_util.h"
#include "base/strings/string_util.h"
namespace chromeos {
namespace {
const char kExtensionIMEPrefix[] = "_ext_ime_";
const int kExtensionIMEPrefixLength =
sizeof(kExtensionIMEPrefix) / sizeof(kExtensionIMEPrefix[0]) - 1;
const char kComponentExtensionIMEPrefix[] = "_comp_ime_";
const int kComponentExtensionIMEPrefixLength =
sizeof(kComponentExtensionIMEPrefix) /
sizeof(kComponentExtensionIMEPrefix[0]) - 1;
const int kExtensionIdLength = 32;
} // namespace
namespace extension_ime_util {
std::string GetInputMethodID(const std::string& extension_id,
const std::string& engine_id) {
DCHECK(!extension_id.empty());
DCHECK(!engine_id.empty());
return kExtensionIMEPrefix + extension_id + engine_id;
}
std::string GetComponentInputMethodID(const std::string& extension_id,
const std::string& engine_id) {
DCHECK(!extension_id.empty());
DCHECK(!engine_id.empty());
return kComponentExtensionIMEPrefix + extension_id + engine_id;
}
std::string GetExtensionIDFromInputMethodID(
const std::string& input_method_id) {
if (IsExtensionIME(input_method_id)) {
return input_method_id.substr(kExtensionIMEPrefixLength,
kExtensionIdLength);
}
if (IsComponentExtensionIME(input_method_id)) {
return input_method_id.substr(kComponentExtensionIMEPrefixLength,
kExtensionIdLength);
}
return "";
}
std::string GetComponentIDByInputMethodID(const std::string& input_method_id) {
if (IsComponentExtensionIME(input_method_id))
return input_method_id.substr(kComponentExtensionIMEPrefixLength +
kExtensionIdLength);
if (IsExtensionIME(input_method_id))
return input_method_id.substr(kExtensionIMEPrefixLength +
kExtensionIdLength);
return input_method_id;
}
std::string GetInputMethodIDByEngineID(const std::string& engine_id) {
if (StartsWithASCII(engine_id, kComponentExtensionIMEPrefix, true) ||
StartsWithASCII(engine_id, kExtensionIMEPrefix, true)) {
return engine_id;
}
if (StartsWithASCII(engine_id, "xkb:", true))
return GetComponentInputMethodID(kXkbExtensionId, engine_id);
if (StartsWithASCII(engine_id, "vkd_", true))
return GetComponentInputMethodID(kM17nExtensionId, engine_id);
if (StartsWithASCII(engine_id, "nacl_mozc_", true))
return GetComponentInputMethodID(kMozcExtensionId, engine_id);
if (StartsWithASCII(engine_id, "hangul_", true))
return GetComponentInputMethodID(kHangulExtensionId, engine_id);
if (StartsWithASCII(engine_id, "zh-", true) &&
engine_id.find("pinyin") != std::string::npos) {
return GetComponentInputMethodID(kChinesePinyinExtensionId, engine_id);
}
if (StartsWithASCII(engine_id, "zh-", true) &&
engine_id.find("zhuyin") != std::string::npos) {
return GetComponentInputMethodID(kChineseZhuyinExtensionId, engine_id);
}
if (StartsWithASCII(engine_id, "zh-", true) &&
engine_id.find("cangjie") != std::string::npos) {
return GetComponentInputMethodID(kChineseCangjieExtensionId, engine_id);
}
if (engine_id.find("-t-i0-") != std::string::npos)
return GetComponentInputMethodID(kT13nExtensionId, engine_id);
return engine_id;
}
bool IsExtensionIME(const std::string& input_method_id) {
return StartsWithASCII(input_method_id,
kExtensionIMEPrefix,
true /* Case sensitive */) &&
input_method_id.size() > kExtensionIMEPrefixLength +
kExtensionIdLength;
}
bool IsComponentExtensionIME(const std::string& input_method_id) {
return StartsWithASCII(input_method_id,
kComponentExtensionIMEPrefix,
true /* Case sensitive */) &&
input_method_id.size() > kComponentExtensionIMEPrefixLength +
kExtensionIdLength;
}
bool IsMemberOfExtension(const std::string& input_method_id,
const std::string& extension_id) {
return StartsWithASCII(input_method_id,
kExtensionIMEPrefix + extension_id,
true /* Case sensitive */);
}
bool IsKeyboardLayoutExtension(const std::string& input_method_id) {
if (IsComponentExtensionIME(input_method_id))
return StartsWithASCII(GetComponentIDByInputMethodID(input_method_id),
"xkb:", true);
return false;
}
std::string MaybeGetLegacyXkbId(const std::string& input_method_id) {
if (IsKeyboardLayoutExtension(input_method_id))
return GetComponentIDByInputMethodID(input_method_id);
return input_method_id;
}
} // namespace extension_ime_util
} // namespace chromeos