X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=trunk%2Fsrc%2Fplugins%2Fxdxf%2Fsrc%2Fxdxfplugin.cpp;h=64d5fce17e4be39bc825d9fdb86f7b107623b7c9;hb=c88dd54e68415f56dec8c6ec568ff72bc2a1bf8a;hp=0a0a5461ad402185b27f8cf26a3b04a7652981d3;hpb=4cdaafcc773201d53dc935910f920a9a4b39625b;p=mdictionary diff --git a/trunk/src/plugins/xdxf/src/xdxfplugin.cpp b/trunk/src/plugins/xdxf/src/xdxfplugin.cpp index 0a0a546..64d5fce 100644 --- a/trunk/src/plugins/xdxf/src/xdxfplugin.cpp +++ b/trunk/src/plugins/xdxf/src/xdxfplugin.cpp @@ -19,32 +19,43 @@ *******************************************************************************/ +/*! \file xdxfplugin.cpp +\author Jakub Jaszczynski +*/ + #include "xdxfplugin.h" #include -#include -#include -#include -#include "TranslationXdxf.h" -#include "../../../includes/settings.h" +#include "../../../includes/Notify.h" XdxfPlugin::XdxfPlugin(QObject *parent) : CommonDictInterface(parent), _langFrom(tr("")), _langTo(tr("")),_name(tr("")), _type(tr("xdxf")), _infoNote(tr("")) { _wordsCount = -1; _settings = new Settings(); - _dictDialog = new XdxfDictDialog(this, this); - cachingDialog = new XdxfCachingDialog(this); + _dictDialog = new XdxfDictDialog(this); + cachingDialog = new XdxfCachingDialog(); connect(cachingDialog, SIGNAL(cancelCaching()), this, SLOT(stop())); + connect(this, SIGNAL(updateCachingProgress(int,int)), + cachingDialog, SLOT(updateCachingProgress(int,int))); + _settings->setValue("type","xdxf"); stopped = false; _icon = QIcon(":/icons/xdxf.png"); + initAccents(); +} + + + +XdxfPlugin::~XdxfPlugin() { + delete _settings; } + QString XdxfPlugin::langFrom() const { return _langFrom; } @@ -58,7 +69,6 @@ QString XdxfPlugin::name() const { } QString XdxfPlugin::type() const { -// return _settings->value("type"); return _type; } @@ -67,7 +77,10 @@ QString XdxfPlugin::infoNote() const { } QList XdxfPlugin::searchWordList(QString word, int limit) { - if(_settings->value("cached") == "true") + if(word.indexOf("*")==-1 && word.indexOf("?")==-1 && word.indexOf("_")==-1 + && word.indexOf("%")==-1) + word+="*"; + if(isCached()) return searchWordListCache(word,limit); return searchWordListFile(word, limit); } @@ -79,68 +92,88 @@ QList XdxfPlugin::searchWordListCache(QString word, int limit) { db.setDatabaseName(cacheFilePath); if(!db.open()) { qDebug() << "Database error" << db.lastError().text() << endl; + Q_EMIT notify(Notify::Warning, QString("Cache database cannot be " + "opened for %1 dictionary. Searching in xdxf file. " + "You may want to recache.").arg(name())); return searchWordListFile(word, limit); } stopped = false; - if(word.indexOf("*")==-1 && word.indexOf("?")== 0) - word+="%"; + word = word.toLower(); word = word.replace("*", "%"); word = word.replace("?", "_"); - word = removeAccents(word); - qDebug() << word; QSqlQuery cur(db); - cur.prepare("select word from dict where word like ? limit ?"); + if(limit !=0) + cur.prepare("select word from dict where word like ? or normalized like ? limit ?"); + else + cur.prepare("select word from dict where word like ? or normalized like ?"); + cur.addBindValue(word); cur.addBindValue(word); - cur.addBindValue(limit); + if(limit !=0) + cur.addBindValue(limit); cur.exec(); - while(cur.next()) - translations.insert(new TranslationXdxf(cur.value(0).toString(), - _infoNote, this)); - return translations.toList(); + bool in = false; + while(cur.next()){ + in = true; + bool ok=true; + Translation *tran; + foreach(tran,translations) { + if(tran->key().toLower()==cur.value(0).toString().toLower()) + ok=false; + } + if(ok) /*add key word to list*/ + translations.insert(new TranslationXdxf( + cur.value(0).toString().toLower(), + _infoNote, this)); + } + db.close(); + return translations.toList(); } - - QList XdxfPlugin::searchWordListFile(QString word, int limit) { + QTime time; + time.start(); QSet translations; QFile dictionaryFile(path); - word = removeAccents(word); + word = word.toLower(); + //word = removeAccents(word); stopped = false; - if(word.indexOf("*")==-1) - word+="*"; QRegExp regWord(word); regWord.setCaseSensitivity(Qt::CaseInsensitive); regWord.setPatternSyntax(QRegExp::Wildcard); if(!dictionaryFile.open(QFile::ReadOnly | QFile::Text)) { qDebug()<<"Error: could not open file"; + Q_EMIT notify(Notify::Warning, + QString("Xdxf file cannot be read for %1").arg(name())); return translations.toList(); } - QXmlStreamReader dictionaryReader(&dictionaryFile); + QXmlStreamReader reader(&dictionaryFile); /*search words list*/ QString a; + int i=0; - while(!dictionaryReader.atEnd() && !stopped){ - dictionaryReader.readNextStartElement(); - if(dictionaryReader.name()=="ar"){ - while(dictionaryReader.name()!="k" && !dictionaryReader.atEnd()) - dictionaryReader.readNextStartElement(); - if(!dictionaryReader.atEnd()) - a = dictionaryReader.readElementText(); - if(regWord.exactMatch(removeAccents(a)) && (ikey()==a) + foreach(tran,translations) { + if(tran->key().toLower()==a.toLower()) ok=false; /*if key word is in the dictionary more that one */ } if(ok) /*add key word to list*/ - translations<<(new TranslationXdxf(a,_infoNote,this)); + translations<<(new TranslationXdxf(a.toLower(), + _infoNote,this)); i++; if(i>=limit && limit!=0) break; @@ -150,82 +183,98 @@ QList XdxfPlugin::searchWordListFile(QString word, int limit) { } stopped=false; dictionaryFile.close(); + qDebug() << time.elapsed(); return translations.toList(); } QString XdxfPlugin::search(QString key) { - if(_settings->value("cached") == "true") +// if(_settings->value("cached") == "true") + if(isCached()) return searchCache(key); return searchFile(key); } - - QString XdxfPlugin::searchCache(QString key) { - QString result; + QString result(""); QString cacheFilePath = _settings->value("cache_path"); db.setDatabaseName(cacheFilePath); + key = key.toLower(); if(!db.open()) { qDebug() << "Database error" << db.lastError().text() << endl; + Q_EMIT notify(Notify::Warning, QString("Cache database cannot be " + "opened for %1 dictionary. Searching in xdxf file. " + "You may want to recache.").arg(name())); return searchFile(key); } QSqlQuery cur(db); - cur.prepare("select translation from dict where word like ? limit 1"); + cur.prepare("select translation from dict where word like ?"); cur.addBindValue(key); cur.exec(); - if(cur.next()) - result = cur.value(0).toString(); - return result; - -} + while(cur.next()) + result += cur.value(0).toString(); + db.close(); + return result; +} QString XdxfPlugin::searchFile(QString key) { + key = key.toLower(); QFile dictionaryFile(path); QString resultString(""); if(!dictionaryFile.open(QFile::ReadOnly | QFile::Text)) { + Q_EMIT notify(Notify::Warning, + QString("Xdxf file cannot be read for %1").arg(name())); qDebug()<<"Error: could not open file"; return ""; } - QXmlStreamReader dictionaryReader(&dictionaryFile); - - + QXmlStreamReader reader(&dictionaryFile); QString a; bool match =false; stopped = false; - while (!dictionaryReader.atEnd()&& !stopped) { - dictionaryReader.readNext(); - if(dictionaryReader.tokenType() == QXmlStreamReader::StartElement) { - if(dictionaryReader.name()=="k") { - a = dictionaryReader.readElementText(); - if(a==key) + while (!reader.atEnd()&& !stopped) { + reader.readNext(); + if(reader.tokenType() == QXmlStreamReader::StartElement) { + if(reader.name()=="k") { + a = reader.readElementText(); + if(a.toLower()==key.toLower()) match = true; } } - else if(dictionaryReader.tokenType() == QXmlStreamReader::Characters) { - if(match) { - QString temp(dictionaryReader.text().toString()); - temp.replace("\n",""); - if(temp == ""){ - while(dictionaryReader.name()!="ar"&& - !dictionaryReader.atEnd()){ - dictionaryReader.readNext(); - temp+=dictionaryReader.text().toString(); - } + if(match) { + QString temp(""); + while(reader.name()!="ar" && !reader.atEnd()) { + if(reader.name()!="" && reader.name()!="k") { + if(reader.tokenType()==QXmlStreamReader::EndElement) + temp+=tr(""); } - resultString+=temp.replace("\n","")+"\n"; - match=false; + temp+= reader.text().toString().replace("<","<"). + replace(">",">"); + reader.readNext(); } + if(temp.at(0)==QChar('\n')) + temp.remove(0,1); + resultString+=tr("") + a +tr(""); + resultString+=tr("") + temp + tr(""); + match=false; } this->thread()->yieldCurrentThread(); } stopped=false; dictionaryFile.close(); + return resultString; } @@ -243,27 +292,25 @@ void XdxfPlugin::setPath(QString path){ //getDictionaryInfo(); } - CommonDictInterface* XdxfPlugin::getNew(const Settings *settings) const { XdxfPlugin *plugin = new XdxfPlugin(); if(settings){ plugin->setPath(settings->value("path")); - QStringList list = settings->keys(); - foreach(QString key, list) - plugin->settings()->setValue(key, settings->value(key)); - plugin->db_name = plugin->_settings->value("type") - + plugin->_settings->value("path"); + + plugin->_settings->value("path"); plugin->db = QSqlDatabase::addDatabase("QSQLITE", plugin->db_name); if(settings->value("cached").isEmpty() && settings->value("generateCache") == "true") { plugin->makeCache(""); } + foreach(QString key, list) + if(key != "generateCache") + plugin->settings()->setValue(key, settings->value(key)); + delete settings; } - plugin->getDictionaryInfo(); return plugin; } @@ -272,25 +319,34 @@ bool XdxfPlugin::isAvailable() const { return true; } -void XdxfPlugin::setHash(uint _hash) -{ + + +void XdxfPlugin::setHash(uint _hash) { this->_hash=_hash; } -uint XdxfPlugin::hash() const -{ + + +uint XdxfPlugin::hash() const { return _hash; } + + Settings* XdxfPlugin::settings() { return _settings; } -bool XdxfPlugin::isCached() -{ + + +bool XdxfPlugin::isCached() { + if(_settings->value("cached") == "true") + return true; return false; } + + void XdxfPlugin::setSettings(Settings *settings) { QString oldPath = _settings->value("path"); @@ -298,60 +354,59 @@ void XdxfPlugin::setSettings(Settings *settings) { setPath(settings->value("path")); } + foreach(QString key, settings->keys()) + if(key != "generateCache") + _settings->setValue(key, settings->value(key)); + if((_settings->value("cached") == "false" || - _settings->value("cached").isEmpty()) && - settings->value("generateCache") == "true") { + _settings->value("cached").isEmpty()) && + settings->value("generateCache") == "true") { makeCache(""); } - else { + else if (settings->value("generateCache") != "true") { _settings->setValue("cached", "false"); } - emit settingsChanged(); + + delete settings; + + Q_EMIT settingsChanged(); } + void XdxfPlugin::getDictionaryInfo() { QFile dictionaryFile(path); if(!dictionaryFile.open(QFile::ReadOnly | QFile::Text)) { + Q_EMIT notify(Notify::Warning, + QString("Xdxf file cannot be read dictionary")); qDebug()<<"Error: could not open file"; return; } - QXmlStreamReader dictionaryReader(&dictionaryFile); - dictionaryReader.readNextStartElement(); - if(dictionaryReader.name()=="xdxf") { - if(dictionaryReader.attributes().hasAttribute("lang_from")) - _langFrom = dictionaryReader.attributes().value("lang_from").toString(); - if(dictionaryReader.attributes().hasAttribute("lang_to")) - _langTo = dictionaryReader.attributes().value("lang_to").toString(); + QXmlStreamReader reader(&dictionaryFile); + reader.readNextStartElement(); + if(reader.name()=="xdxf") { + if(reader.attributes().hasAttribute("lang_from")) + _langFrom = reader.attributes().value("lang_from").toString(); + if(reader.attributes().hasAttribute("lang_to")) + _langTo = reader.attributes().value("lang_to").toString(); } - dictionaryReader.readNextStartElement(); - if(dictionaryReader.name()=="full_name") - _name=dictionaryReader.readElementText(); - dictionaryReader.readNextStartElement(); - if(dictionaryReader.name()=="description") - _infoNote=dictionaryReader.readElementText(); + reader.readNextStartElement(); + if(reader.name()=="full_name") + _name=reader.readElementText(); + reader.readNextStartElement(); + if(reader.name()=="description") + _infoNote=reader.readElementText(); + + QString format = "png"; + QString initialPath = QDir::currentPath() + tr("/xdxf.") + format; + _infoNote="path=\""+initialPath+"\"> \n" + _name + " [" + _langFrom + "-" + _langTo + "] (" + _type + ")"; dictionaryFile.close(); } -QString XdxfPlugin::removeAccents(QString string) { - - string = string.replace(QString::fromUtf8("ł"), "l", Qt::CaseInsensitive); - QString normalized = string.normalized(QString::NormalizationForm_D); - normalized = normalized; - for(int i=0; isetVisible(true); QCoreApplication::processEvents(); @@ -398,15 +454,22 @@ bool XdxfPlugin::makeCache(QString dir) { if (!dictionaryFile.open(QFile::ReadOnly | QFile::Text)) { + Q_EMIT updateCachingProgress(100, 0); + Q_EMIT notify(Notify::Warning, + QString("Xdxf file cannot be read for %1 dictionary") + .arg(name())); return 0; } - QXmlStreamReader reader(&dictionaryFile); db.setDatabaseName(cachePathN); if(!db.open()) { - qDebug() << "Database error" << endl; + qDebug() << "Database error" << db.lastError().text() << endl; + Q_EMIT updateCachingProgress(100, 0); + Q_EMIT notify(Notify::Warning, QString("Cache database cannot be " + "opened for %1 dictionary. Searching in xdxf file. " + "You may want to recache.").arg(name())); return false; } QCoreApplication::processEvents(); @@ -414,7 +477,7 @@ bool XdxfPlugin::makeCache(QString dir) { cur.exec("PRAGMA synchronous = 0"); cur.exec("drop table dict"); QCoreApplication::processEvents(); - cur.exec("create table dict(word text ,translation text)"); + cur.exec("create table dict(word text, normalized text ,translation text)"); int counter = 0; cur.exec("BEGIN;"); @@ -426,12 +489,14 @@ bool XdxfPlugin::makeCache(QString dir) { int lastProg = -1; + QString stripAcc = settings()->value("strip_accents"); + settings()->setValue("strip_accents", "true"); + counter=0; while (!reader.atEnd() && !stopped) { QCoreApplication::processEvents(); - usleep(50); reader.readNext(); if(reader.tokenType() == QXmlStreamReader::StartElement) { @@ -440,47 +505,62 @@ bool XdxfPlugin::makeCache(QString dir) { match = true; } } - else if(reader.tokenType() == QXmlStreamReader::Characters) { - if(match) { - QString temp(reader.text().toString()); - temp.replace("\n",""); - if(temp == ""){ - while(reader.name()!="ar"&& - !reader.atEnd()){ - reader.readNext(); - temp+=reader.text().toString(); - } - } - match = false; - cur.prepare("insert into dict values(?,?)"); - cur.addBindValue(a); - cur.addBindValue(temp); - cur.exec(); - counter++; - int prog = counter*100/_wordsCount; - if(prog % 5 == 0 && lastProg != prog) { - Q_EMIT updateCachingProgress(prog, - timer.restart()); - lastProg = prog; + if(match) { + QString temp(""); + while(reader.name()!="ar" && !reader.atEnd()) { + if(reader.name()!="" && reader.name()!="k") { + if(reader.tokenType()==QXmlStreamReader::EndElement) + temp+=tr(""); } + temp+= reader.text().toString().replace("<","<").replace(">",">");; + reader.readNext(); + } + if(temp.at(0)==QChar('\n')) + temp.remove(0,1); + temp=tr("") + a + tr("") + tr("") + temp+ tr(""); + match=false; + cur.prepare("insert into dict values(?,?,?)"); + cur.addBindValue(a); + cur.addBindValue(removeAccents(a)); + cur.addBindValue(temp); + cur.exec(); + counter++; + int prog = counter*100/_wordsCount; + if(prog % 5 == 0 && lastProg != prog) { + Q_EMIT updateCachingProgress(prog, + timer.restart()); + lastProg = prog; } - } } cur.exec("END;"); cur.exec("select count(*) from dict"); + settings()->setValue("strip_accents", stripAcc); countWords(); cachingDialog->setVisible(false); if(!cur.next() || countWords() != cur.value(0).toInt()) + { + Q_EMIT updateCachingProgress(100, timer.restart()); + Q_EMIT notify(Notify::Warning, + QString("Database caching error, please try againg.")); + db.close(); return false; + } _settings->setValue("cache_path", cachePathN); _settings->setValue("cached", "true"); + + db.close(); return true; } - Q_EXPORT_PLUGIN2(xdxf, XdxfPlugin)