*/
#include "StarDictPlugin.h"
-#include <QDebug>
-#include "../../include/Notify.h"
-#include <QTranslator>
-#include <QCoreApplication>
-#include <QThread>
+
+uint qHash(const TranslationStarDict &key) {
+ return qHash(key.key());
+}
StarDictPlugin::StarDictPlugin(QObject *parent) : CommonDictInterface(parent),
_langFrom(""), _langTo(""),_name(""), _infoNote("") {
QList<Translation*> StarDictPlugin::searchWordList(QString word, int limit) {
- QSet<Translation*> translations;
- return translations.toList();
+ QList<TranslationStarDict> translations;
+ bool is32b = false;
+ if(settings()->value("idxoffsetbits") == "32" ||
+ settings()->value("idxoffsetbits") == "")
+ is32b = true;
+
+ bool err = 0;
+ int wordcount = settings()->value("wordcount").toInt(&err);
+ if(err)
+ return QList<Translation*>();
+
+ QString idxPath = settings()->value("idxFileName");
+ StarDictReader * reader = StarDictReaderFactory::createReader(idxPath);
+
+ QString fkey;
+ qint64 offset = 0, len = 0;
+ QRegExp keyword(word, Qt::CaseInsensitive, QRegExp::Wildcard);
+
+ int counter = 0;
+ while(counter < wordcount) {
+ counter++;
+ fkey = reader->readKeyword();
+ if(is32b)
+ offset = reader->readInt32BigEndian();
+ else
+ offset = reader->readInt64BigEndian();
+ len = reader->readInt32BigEndian();
+
+ if(keyword.exactMatch(fkey)) {
+ TranslationStarDict tran(fkey, infoNote(), this);
+ int id = translations.indexOf(tran);
+ if(id == -1) {
+ tran.add(offset, len);
+ translations.push_front(tran);
+ } else
+ translations[id].add(offset, len);
+ }
+
+
+ }
+ QList<Translation*> ret;
+ QListIterator<TranslationStarDict> it(translations);
+ while(it.hasNext())
+ ret.push_back(new TranslationStarDict(it.next()));
+
+
+ return ret;
}
void StarDictPlugin::parseIfoFile()
{
QFile file(settings()->value("path"));
- if (!file.open(QIODevice::ReadOnly))
- {
- return 0;
+ if (!file.open(QIODevice::ReadOnly)) {
+ // TODO notification
+ return ;
}
QTextStream in(&file);
while (!in.atEnd()) {
}
+TranslationStarDict::TranslationStarDict(const TranslationStarDict &base) {
+ _key = base.key();
+ _dictHash = base._dictHash;
+ _dictionaryInfo = base._dictionaryInfo;
+ lengths = base.lengths;
+ offsets = base.offsets;
+}
+
+
+void TranslationStarDict::add(qint64 offset, qint32 len) {
+ offsets.append(offset);
+ lengths.append(len);
+}
+
+
QString TranslationStarDict::key() const {
return _key;
}
#define TRANSLATIONSTARDICT_H
#include <QString>
+#include <QHash>
+#include <QDebug>
+#include <QTranslator>
+#include <QCoreApplication>
+#include <QThread>
+#include <QSet>
+
+#include "StarDictReaderFactory.h"
#include "../../include/translation.h"
#include "StarDictPlugin.h"
+#include "../../include/Notify.h"
+#include "TranslationStarDict.h"
class TranslationStarDict : public Translation
{
TranslationStarDict(QString _key,
QString _dictionaryInfo,
StarDictPlugin *starDictPlugin);
+ TranslationStarDict(const TranslationStarDict &base);
//! \return word to be translated
QString key() const;
//! returns corresponding dict object
uint dict() const {return _dictHash;}
+ /*! Add another hit in *.id(x) file
+ \param offset offset from begining of file to searched keyword
+ \param len lenght of searched keyword
+ */
+ void add(qint64 offset, qint32 len);
+
+
+
+ bool operator==(const TranslationStarDict &key) {
+ if (this->key() == key.key())
+ return true;
+ return false;
+ }
+
private:
QString _key;
QString _dictionaryInfo;
StarDictPlugin *starDictPlugin;
int _dictHash;
+ QVector<qint64> offsets;
+ QVector<qint32> lengths;
};
+
#endif // TRANSLATIONSTARDICT_H