kiten/lib
entryKanjidic.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "entryKanjidic.h"
00022 #include "dictFileKanjidic.h"
00023
00024 #include <klocale.h>
00025 #include <kdebug.h>
00026
00027
00028 #define QSTRINGLISTCHECK(x) (x==NULL?QStringList():*x)
00029
00031 QString EntryKanjidic::toHTML() const
00032 {
00033 QString result="<div class=\"KanjidicBrief\">";
00034
00035 foreach(const QString &field, QSTRINGLISTCHECK(dictFileKanjidic::displayFields)) {
00036
00037 if(field == "--NewLine--") result += "<br>";
00038 else if(field == "Word/Kanji") result += HTMLWord()+' ';
00039 else if(field == "Meaning") result += HTMLMeanings()+' ';
00040 else if(field == "Reading") result += HTMLReadings()+' ';
00041 else if(ExtendedInfo.contains(field)) result+=HTMLExtendedInfo(field) + ' ';
00042 }
00043 result += "</div>";
00044 return result;
00045 }
00046
00048 QString EntryKanjidic::HTMLReadings() const
00049 {
00050 QString htmlReadings;
00051 foreach(const QString &it,originalReadings)
00052 {
00053 if (it == "T1")
00054 htmlReadings += i18n("In names: ");
00055 else
00056 {
00057 if (it == "T2")
00058 htmlReadings += i18n("As radical: ");
00059 else
00060 htmlReadings += makeReadingLink(it) + outputListDelimiter;
00061 }
00062 }
00063 htmlReadings.truncate(htmlReadings.length() - outputListDelimiter.length());
00064
00065
00066 return "<span class=\"Readings\">" + htmlReadings
00067 + "</span>";
00068 }
00069
00070 QString EntryKanjidic::HTMLWord() const {
00071 return "<span class=\"Word\">" + makeLink(Word) + "</span>";
00072 }
00073
00074 QString EntryKanjidic::HTMLExtendedInfo(const QString &field) const {
00075
00076 return "<span class=\"ExtendedInfo\">" + field + ": "+ExtendedInfo[field]+"</span>";
00077 }
00078
00079 QString EntryKanjidic::makeReadingLink(const QString &inReading) const {
00080 QString reading = inReading;
00081 return "<a href=\""+reading.remove(".").remove("-")+"\">"+inReading+"</a>";
00082 }
00083
00084
00087
00088 bool EntryKanjidic::loadEntry(const QString &entryLine)
00089 {
00090 unsigned int length = entryLine.length();
00091
00092
00093
00094
00095
00096
00097
00098 Word = entryLine.left(1);
00099
00100
00101
00102 unsigned int i;
00103 QChar ichar;
00104 QString curString;
00105
00106
00107 #define INCI if(i < length) \
00108 { \
00109 i++; \
00110 ichar = entryLine.at(i); \
00111 }
00112 #define LOADSTRING(stringToLoad) while(entryLine.at(i) != ' ') \
00113 { \
00114 stringToLoad += entryLine.at(i); \
00115 if(i < length) i++; \
00116 else break; \
00117 }
00118
00119
00120
00121
00122
00123
00124
00125 for (i = 7; i < length - 1; i++)
00126 {
00127 ichar = entryLine.at(i);
00128
00129 curString = "";
00130 switch(ichar.toAscii())
00131 {
00132 case ' ':
00133
00134
00135
00136 break;
00137 case 'B':
00138
00139 case 'C':
00140
00141 case 'E':
00142
00143 case 'F':
00144
00145 case 'G':
00146
00147 case 'H':
00148
00149 case 'K':
00150
00151 case 'L':
00152
00153 case 'N':
00154
00155 case 'O':
00156
00157 case 'P':
00158
00159 case 'Q':
00160
00161 case 'U':
00162
00163 case 'V':
00164
00165 case 'W':
00166
00167 case 'X':
00168
00169 case 'Y':
00170
00171 case 'Z':
00172
00173
00174
00175
00176 i++;
00177 LOADSTRING(curString);
00178 ExtendedInfo.insert(QString(ichar), curString);
00179
00180 break;
00181 case 'I':
00182
00183
00184 INCI
00185 if(ichar == 'N')
00186 {
00187
00188 LOADSTRING(curString)
00189 }
00190 else
00191 {
00192
00193 LOADSTRING(curString)
00194 }
00195 ExtendedInfo.insert('I' + QString(ichar), curString);
00196 break;
00197 case 'M':
00198
00199 INCI
00200 if(ichar == 'N')
00201 {
00202 LOADSTRING(curString)
00203
00204 }
00205 else if(ichar == 'P')
00206 {
00207 LOADSTRING(curString)
00208
00209 }
00210 ExtendedInfo.insert('M' + QString(ichar), curString);
00211 break;
00212 case 'S':
00213
00214
00215 i++;
00216 if(!ExtendedInfo.contains("S"))
00217 {
00218 LOADSTRING(curString)
00219 ExtendedInfo.insert(QString(ichar), curString);
00220 }
00221 else
00222 {
00223 LOADSTRING(curString)
00224 ExtendedInfo.insert('_' + QString(ichar), curString);
00225 }
00226 break;
00227 case 'D':
00228
00229 INCI
00230 LOADSTRING(curString)
00231 ExtendedInfo.insert('D' + QString(ichar), curString);
00232 break;
00233 case '{':
00234
00235
00236 INCI
00237 while(ichar != '}')
00238 {
00239 curString += ichar;
00240
00241 if(i < length)
00242 {
00243 i++;
00244 }
00245 else
00246 {
00247 break;
00248 }
00249 ichar = entryLine.at(i);
00250 }
00251 INCI
00252
00253 Meanings.append(curString);
00254 break;
00255 case 'T':
00256
00257 case '-':
00258
00259
00260 LOADSTRING(curString)
00261 originalReadings.append(curString);
00262 curString = curString.remove('-').remove('.');
00263 Readings.append(curString);
00264 break;
00265 default:
00266
00267
00268
00269
00270
00271 if(0x3040 <= ichar.unicode() && ichar.unicode() <= 0x30FF)
00272 {
00273 LOADSTRING(curString)
00274 originalReadings.append(curString);
00275 curString = curString.remove('-').remove('.');
00276 Readings.append(curString);
00277 break;
00278 }
00279
00280
00281
00282
00283 i++;
00284 LOADSTRING(curString);
00285 ExtendedInfo.insert(QString(ichar), curString);
00286
00287 break;
00288 }
00289 }
00290
00291
00292
00293 return true;
00294 }
00295
00298 QString EntryKanjidic::dumpEntry() const
00299 {
00300
00301 QString dumpExtendedInfo;
00302 QHash<QString,QString>::const_iterator it;
00303 for(it=ExtendedInfo.constBegin() ; it != ExtendedInfo.constEnd(); ++it)
00304 dumpExtendedInfo += ' ' + it.key() + it.value();
00305
00306 return Word + ' ' + Readings.join(" ") + dumpExtendedInfo;
00307 }
00308
00309 bool EntryKanjidic::extendedItemCheck(const QString &key, const QString &value) const {
00310 if(key == "common")
00311 return !getExtendedInfoItem("G").isEmpty();
00312 return Entry::extendedItemCheck(key,value);
00313 }