Extended implementing StarDict *.dict file
[mdictionary] / src / plugins / stardict / StarDictPlugin.cpp
index 8e27f51..bdd5218 100644 (file)
@@ -140,13 +140,95 @@ QList<Translation*> StarDictPlugin::searchWordList(QString word, int limit) {
 }
 
 
+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"));
 }