}
+QByteArray StarDictPlugin::read(QByteArray::iterator it,
+ QByteArray::iterator end, int bytes) {
+ QByteArray ret;
+ if(bytes == 0 && it != end)
+ while(*it != '\0')
+ ret.append(*it++);
+ else
+ for(int i = 0; i < bytes && it != end; i++)
+ ret.append(*it++);
+ return ret;
+}
+
+
+QString StarDictPlugin::interpret(QByteArray::iterator it,
+ QByteArray::iterator end, QChar mode, bool last) {
+ QString result;
+ if(mode == 'm')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'l')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'g')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 't')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'x')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'y')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'k')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'w')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'h')
+ result += QString::fromUtf8(read(it++, end));
+ else if(mode == 'r')
+ result += QString::fromUtf8(read(it++, end));
+
+ else if(mode == 'W') {
+ if(!last) {
+ QByteArray tmp ;
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it));
+ result += read(it++, end, (qint32)qFromBigEndian(tmp.data()));
+ } else
+ result += read(it++, end);
+ } else if(mode == 'P') {
+ if(!last) {
+ QByteArray tmp ;
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it++));
+ tmp.append(*(it));
+ result += read(it++, end, (qint32)qFromBigEndian(tmp.data()));
+ } else
+ result += read(it++, end);
+ }
+ return result;
+}
+
+
+QString StarDictPlugin::format(QByteArray raw, QString mode) {
+ QString result;
+ if(mode == "") {
+ for(QByteArray::iterator it = raw.begin(); it != raw.end(); it++) {
+ char tmp = *(++it);
+ result += interpret(--it, raw.end(), tmp);
+ }
+ } else {
+ QByteArray::iterator it = raw.begin();
+ foreach(QChar tmp, mode) {
+ result += interpret(it, raw.end(), tmp);
+ }
+ }
+
+ return result;
+
+}
+
+
QString StarDictPlugin::search(QString key, qint64 offset, qint32 len) {
if(!dictReader)
return "";
- qDebug() << dictReader->readString(offset, len);
- return dictReader->readString(offset, len);
+ QByteArray raw = dictReader->readString(offset, len);
+
+ return format(raw, settings()->value("sametypesequence"));
}