@@ -22,59 +22,229 @@ namespace LyricTool {
22
22
bool LanguageManager::load (QString *errorMessage) {
23
23
return false ;
24
24
}
25
+
25
26
ILanguageAnalyzer *LanguageManager::language (const QString &id) const {
26
- return nullptr ;
27
+ Q_D (const LanguageManager);
28
+ return d->languages .value (id);
27
29
}
30
+
28
31
QList<ILanguageAnalyzer *> LanguageManager::languages () const {
29
- return {};
32
+ Q_D (const LanguageManager);
33
+ return d->languages .values_qlist ();
30
34
}
31
- bool LanguageManager::addLanguage (ILanguageAnalyzer *factory) {
32
- return false ;
35
+
36
+ bool LanguageManager::addLanguage (ILanguageAnalyzer *analyzer) {
37
+ Q_D (LanguageManager);
38
+ if (!analyzer) {
39
+ qWarning () << " LyricTool::LanguageManager::addLanguage(): trying to add null analyzer" ;
40
+ return false ;
41
+ }
42
+ if (d->languages .contains (analyzer->id ())) {
43
+ qWarning ()
44
+ << " LyricTool::LanguageManager::addLanguage(): trying to add duplicated analyzer:"
45
+ << analyzer->id ();
46
+ return false ;
47
+ }
48
+ analyzer->setParent (this );
49
+ d->languages .append (analyzer->id (), analyzer);
50
+ return true ;
33
51
}
34
- bool LanguageManager::removeLanguage (const ILanguageAnalyzer *factory) {
35
- return false ;
52
+
53
+ bool LanguageManager::removeLanguage (const ILanguageAnalyzer *analyzer) {
54
+ if (analyzer == nullptr ) {
55
+ qWarning ()
56
+ << " LyricTool::LanguageManager::removeLanguage(): trying to remove null analyzer" ;
57
+ return false ;
58
+ }
59
+ return removeLanguage (analyzer->id ());
36
60
}
61
+
37
62
bool LanguageManager::removeLanguage (const QString &id) {
38
- return false ;
63
+ Q_D (LanguageManager);
64
+ const auto it = d->languages .find (id);
65
+ if (it == d->languages .end ()) {
66
+ qWarning () << " LyricTool::LanguageManager::removeLanguage(): analyzer does not exist:"
67
+ << id;
68
+ return false ;
69
+ }
70
+ it.value ()->setParent (nullptr );
71
+ d->languages .erase (it);
72
+ return true ;
39
73
}
74
+
40
75
void LanguageManager::clearLanguages () {
76
+ Q_D (LanguageManager);
77
+ d->languages .clear ();
41
78
}
79
+
42
80
IG2pConverter *LanguageManager::g2p (const QString &id) const {
43
- return nullptr ;
81
+ Q_D (const LanguageManager);
82
+ return d->g2ps .value (id);
44
83
}
84
+
45
85
QList<IG2pConverter *> LanguageManager::g2ps () const {
46
- return {};
86
+ Q_D (const LanguageManager);
87
+ return d->g2ps .values_qlist ();
47
88
}
48
- bool LanguageManager::addG2p (ILanguageAnalyzer *factory) {
49
- return false ;
89
+
90
+ bool LanguageManager::addG2p (IG2pConverter *converter) {
91
+ Q_D (LanguageManager);
92
+ if (!converter) {
93
+ qWarning () << " LyricTool::LanguageManager::addG2p(): trying to add null converter" ;
94
+ return false ;
95
+ }
96
+ if (d->g2ps .contains (converter->id ())) {
97
+ qWarning ()
98
+ << " LyricTool::LanguageManager::addG2p(): trying to add duplicated converter:"
99
+ << converter->id ();
100
+ return false ;
101
+ }
102
+ converter->setParent (this );
103
+ d->g2ps .append (converter->id (), converter);
104
+ return true ;
50
105
}
51
- bool LanguageManager::removeG2p (const ILanguageAnalyzer *factory) {
52
- return false ;
106
+
107
+ bool LanguageManager::removeG2p (const IG2pConverter *converter) {
108
+ if (converter == nullptr ) {
109
+ qWarning ()
110
+ << " LyricTool::LanguageManager::removeG2p(): trying to remove null converter" ;
111
+ return false ;
112
+ }
113
+ return removeG2p (converter->id ());
53
114
}
115
+
54
116
bool LanguageManager::removeG2p (const QString &id) {
55
- return false ;
117
+ Q_D (LanguageManager);
118
+ auto it = d->g2ps .find (id);
119
+ if (it == d->g2ps .end ()) {
120
+ qWarning () << " LyricTool::LanguageManager::removeG2p(): converter does not exist:"
121
+ << id;
122
+ return false ;
123
+ }
124
+ it.value ()->setParent (nullptr );
125
+ d->g2ps .erase (it);
126
+ return true ;
56
127
}
128
+
57
129
void LanguageManager::clearG2ps () {
130
+ Q_D (LanguageManager);
131
+ d->g2ps .clear ();
58
132
}
133
+
59
134
QStringList LanguageManager::sortedLanguages () const {
60
- return QStringList ();
135
+ Q_D (const LanguageManager);
136
+ return d->defaultSort ;
61
137
}
62
- void LanguageManager::setSortedLanguages (const QString &sortedLanguages) {
138
+
139
+ void LanguageManager::setSortedLanguages (const QStringList &sortedLanguages) {
140
+ Q_D (LanguageManager);
141
+ d->defaultSort = sortedLanguages;
142
+ }
143
+
144
+ QList<ILanguageAnalyzer *>
145
+ LanguageManager::priorityLanguages (const QStringList &priorityList) const {
146
+ Q_D (const LanguageManager);
147
+ QStringList order = d->defaultSort ;
148
+
149
+ QList<ILanguageAnalyzer *> result;
150
+ for (const auto &category : priorityList) {
151
+ for (const auto &lang : order) {
152
+ const auto analyzer = language (lang);
153
+ if (analyzer->category () == category) {
154
+ result.append (analyzer);
155
+ }
156
+ }
157
+ }
158
+
159
+ for (const auto &id : order) {
160
+ const auto analyzer = language (id);
161
+ if (!result.contains (analyzer)) {
162
+ result.append (analyzer);
163
+ }
164
+ }
165
+ return result;
63
166
}
167
+
64
168
QList<LyricInfo> LanguageManager::split (const QString &input) const {
65
- return QList<LyricInfo>();
169
+ const auto analyzers = this ->priorityLanguages ();
170
+ LyricInfo lyricInfo;
171
+ lyricInfo.setLyric (input);
172
+ QList<LyricInfo> result = {lyricInfo};
173
+
174
+ for (const auto &analyzer : analyzers) {
175
+ result = analyzer->split (result);
176
+ }
177
+ return result;
66
178
}
179
+
67
180
QList<LyricInfo> LanguageManager::correct (const QList<LyricInfo> &input) const {
68
- return QList<LyricInfo>();
181
+ QList<LyricInfo> result = input;
182
+ const auto analyzers = this ->priorityLanguages ();
183
+ for (const auto &analyzer : analyzers) {
184
+ analyzer->correct (result);
185
+ }
186
+ return result;
69
187
}
188
+
70
189
QList<LyricInfo> LanguageManager::convert (const QList<LyricInfo> &input) const {
71
- return QList<LyricInfo>();
190
+ QList<LyricInfo> result = input;
191
+
192
+ QMap<QString, QList<int >> languageIndexMap;
193
+ QMap<QString, QStringList> languageLyricMap;
194
+
195
+ for (int i = 0 ; i < input.size (); ++i) {
196
+ const LyricInfo &info = input.at (i);
197
+ languageIndexMap[info.language ()].append (i);
198
+ languageLyricMap[info.language ()].append (info.lyric ());
199
+ }
200
+
201
+ const auto languages = languageIndexMap.keys ();
202
+ for (const auto &language : languages) {
203
+ const auto rawLyrics = languageLyricMap[language];
204
+ const auto g2pFactory = this ->g2p (this ->language (language)->selectedG2p ());
205
+ const auto g2pConfig = this ->language (language)->g2pConfig ();
206
+
207
+ const auto tempRes = g2pFactory->convert (rawLyrics, g2pConfig);
208
+ for (int i = 0 ; i < tempRes.size (); i++) {
209
+ const auto index = languageIndexMap[language][i];
210
+ result[index].setSyllable (tempRes[i].syllable ());
211
+ result[index].setError (tempRes[i].error ());
212
+ result[index].setCandidates (tempRes[i].candidates ());
213
+ }
214
+ }
215
+ return result;
72
216
}
217
+
73
218
QString LanguageManager::analysis (const QString &input) const {
74
- return QString ();
219
+ QString result = QStringLiteral (" Unknown" );
220
+ auto analyzers = this ->priorityLanguages ();
221
+
222
+ for (const auto &analyzer : analyzers) {
223
+ result = analyzer->analyze (input);
224
+ if (result != QStringLiteral (" Unknown" ))
225
+ break ;
226
+ }
227
+
228
+ return result;
75
229
}
230
+
76
231
QStringList LanguageManager::analysis (const QStringList &input) const {
77
- return QStringList ();
232
+ auto analyzers = this ->priorityLanguages ();
233
+ QList<LyricInfo> rawInfo;
234
+ for (const auto &lyric : input) {
235
+ LyricInfo lyricInfo;
236
+ lyricInfo.setLyric (lyric);
237
+ rawInfo.append (lyricInfo);
238
+ }
239
+
240
+ for (const auto &analyzer : analyzers) {
241
+ analyzer->correct (rawInfo);
242
+ }
243
+
244
+ QStringList result;
245
+ for (const auto &info : rawInfo)
246
+ result.append (info.language ());
247
+ return result;
78
248
}
79
249
80
250
LanguageManager::LanguageManager (LanguageManagerPrivate &d, QObject *parent)
0 commit comments