Copyright 2010 Comarch S.A.
*******************************************************************************/
-
-/*! \file stardictplugin.cpp
+/*!
+ \file StarDictPlugin.cpp
+ \author Jakub Jaszczynski
*/
#include "StarDictPlugin.h"
+/**/
uint qHash(const TranslationStarDict &key) {
return qHash(key.key());
}
+
StarDictPlugin::StarDictPlugin(QObject *parent) : CommonDictInterface(parent),
_langFrom(""), _langTo(""),_name(""), _infoNote("") {
_settings = new Settings();
connect(_dictDialog, SIGNAL(notify(Notify::NotifyType,QString)),
this, SIGNAL(notify(Notify::NotifyType,QString)));
-
_settings->setValue("type","stardict");
_icon = QIcon("/usr/share/mdictionary/stardict.png");
- _wordsCount = -1;
stopped = false;
+ _settings->setValue("strip_accents","true");
+
initAccents();
+
}
+
void StarDictPlugin::retranslate() {
QString locale = QLocale::system().name();
-
QTranslator *translator = new QTranslator(this);
- if(!translator->load(":/xdxf/translations/" + locale)) {
- translator->load(":/xdxf/translations/en_US");
+ if(!translator->load(":/stardict/translations/" + locale)) {
+ translator->load(":/stardict/translations/en_US");
}
QCoreApplication::installTranslator(translator);
}
QList<Translation*> StarDictPlugin::searchWordList(QString word, int limit) {
- qDebug() << "StarDict searachWordList" << word;
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*>();
-
+ int counter = 0;
+ int counterLimit = 0;
QString idxPath = settings()->value("idxFileName");
StarDictReader * reader = StarDictReaderFactory::createReader(idxPath);
QString fkey;
- qint64 offset = 0, len = 0;
+ qint64 offset = 0,
+ len = 0;
+
+ if( word.indexOf("*")==-1 && word.indexOf("?")==-1 &&
+ word.indexOf("_")==-1 && word.indexOf("%")==-1)
+ word+="*";
QRegExp keyword(word, Qt::CaseInsensitive, QRegExp::Wildcard);
- int counter = 0;
- int counterLimit = 0;
- while(counter < wordcount && (counterLimit<limit || limit==0)) {
+ if((settings()->value("idxoffsetbits") == "32") ||
+ (settings()->value("idxoffsetbits") == ""))
+ is32b = true;
+
+ if(!err)
+ return QList<Translation*>();
+
+ stopped=false;
+ while(counter < wordcount && (counterLimit<limit || limit==0) && !stopped) {
counter++;
fkey = reader->readKeyword();
if(is32b)
offset = reader->readInt64BigEndian();
len = reader->readInt32BigEndian();
- if(keyword.exactMatch(fkey)) {
- qDebug()<<"InfoNote"<<infoNote();
+ if(keyword.exactMatch(fkey) ) {
TranslationStarDict tran(fkey, infoNote(), this);
- qDebug() << "off/len" << offset << len;
+ // qDebug() << "off/len" << offset << len;
int id = translations.indexOf(tran);
if(id == -1) {
tran.add(offset, len);
QListIterator<TranslationStarDict> it(translations);
while(it.hasNext())
ret.push_back(new TranslationStarDict(it.next()));
-
-
return ret;
}
if(bytes == 0 && it != end){
while(*it != '\0' && it != end)
ret.append(*it++);
- if(it == end) qDebug()<<"end";
- else qDebug()<<"000";
}
else
for(int i = 0; i < bytes && it != end; i++)
QString StarDictPlugin::interpret(QByteArray::iterator it,
- QByteArray::iterator end, QChar mode,QString key, bool last) {
+ QByteArray::iterator end, QChar mode,QString key, bool) {
QString result;
- if(mode == 'm'){
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
- }
- else if(mode == 'l'){
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
- }
- else if(mode == 'g'){
+// qDebug()<<"****** mode: "<<mode;
+ if(mode == 'm'
+ || mode == 'l'
+ || mode == 'g'
+ || mode == 't'
+ || mode == 'y'
+ || mode == 'k'
+ || mode == 'w'
+ || mode == 'h'
+ || mode == 'r'){
result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
+ result += "<t>" + QString::fromUtf8(read(it++, end)) + "</t>";
}
- else if(mode == 't'){
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
+
+ if(mode == 'g'){
+ /* delete "small" tag from g translation*/
+ int indexOfSmall=result.indexOf("<small>");
+ while(indexOfSmall!=-1){
+ int indexOfEndSmall= result.indexOf("</small>");
+ if(indexOfEndSmall!=-1)
+ result.remove(indexOfSmall,indexOfEndSmall-indexOfSmall+8);
+ indexOfSmall=result.indexOf("<small>");
+ }
}
- else if(mode == 'x'){
+ if(mode == 'x'){
result += QString::fromUtf8(read(it++, end));
result.replace("</k>","</key><t>");
result.replace("<k>","</t><key>");
int pos=result.indexOf("</t>");
if(pos!=-1)
result.remove(pos,4);
- result+="</t>";
- }
- else if(mode == 'y') {
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
+ if(result.contains("<t>"))
+ result+="</t>";
}
- else if(mode == 'k'){
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
- }
- else if(mode == 'w'){
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
- }
- else if(mode == 'h'){
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
- }
- else if(mode == 'r'){
- result += "<key>" + key + "</key>";
- result += QString::fromUtf8(read(it++, end));
+
+// W & P Dont know whether mDictionary would ever handle binary stardict format
+// to be honest dont see any kind of adventages (can't find any binary dict)
+ /*
}
else if(mode == 'W') {
result += "<key>" + key + "</key>";
tmp.append(*(it++));
tmp.append(*(it++));
tmp.append(*(it));
- result += read(it++, end, (qint32)qFromBigEndian(tmp.data()));
+ result += read(it++, end, (qint32)qFromBigEndian(*(qint32*)tmp.data()));
} else
result += read(it++, end);
} else if(mode == 'P') {
tmp.append(*(it++));
tmp.append(*(it++));
tmp.append(*(it));
- result += read(it++, end, (qint32)qFromBigEndian(tmp.data()));
+ result += read(it++, end, (qint32)qFromBigEndian(*(qint32*)tmp.data()));
} else
result += read(it++, end);
- }
+ } */
return result;
}
+
QString StarDictPlugin::format(QByteArray raw, QString mode,QString key) {
QString result;
if(mode == "") {
}
-
QString StarDictPlugin::search(QString key, qint64 offset, qint32 len) {
QString dictPath = settings()->value("dictFileName");
StarDictReader *reader = StarDictReaderFactory::createReader(dictPath);
-
QByteArray raw = reader->readString(offset, len);
- qDebug()<<"mod"<<settings()->value("sametypesequence");
QString result= format(raw, settings()->value("sametypesequence"),key);
+
delete reader;
return result;
}
-
void StarDictPlugin::stop() {
stopped=true;
}
((StarDictDialog*)plugin->dictDialog())->
setLastDialogParent(_dictDialog->lastDialogParent());
-
-
if(settings && plugin->setSettings(settings)) {
-
- disconnect(plugin, SIGNAL(notify(Notify::NotifyType,QString)),
- this, SIGNAL(notify(Notify::NotifyType,QString)));
+ disconnect( plugin, SIGNAL(notify(Notify::NotifyType,QString)),
+ this, SIGNAL(notify(Notify::NotifyType,QString)));
plugin->getDictionaryInfo();
return plugin;
}
else {
- disconnect(plugin, SIGNAL(notify(Notify::NotifyType,QString)),
- this, SIGNAL(notify(Notify::NotifyType,QString)));
+ disconnect( plugin, SIGNAL(notify(Notify::NotifyType,QString)),
+ this, SIGNAL(notify(Notify::NotifyType,QString)));
delete plugin;
return 0;
}
}
-bool StarDictPlugin::isCached() {
- return false;
-}
-
-
bool StarDictPlugin::setSettings(const Settings *sett) {
if(sett) {
foreach(QString key, sett->keys())
QFile file(settings()->value("ifoFileName"));
if(!QFile::exists(_settings->value("ifoFileName"))
|| !file.open(QFile::ReadOnly | QFile::Text)) {
- Q_EMIT notify(Notify::Warning,
+ Q_EMIT notify(Notify::Warning,
QString(tr("StarDict dictionary cannot be read from file")));
qDebug()<<"Error: could not open the file";
return false;
}
-
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
settings()->setValue(list.at(0),list.at(1));
}
}
-
_name = settings()->value("bookname");
return true;
}
return &_icon;
}
-
-int StarDictPlugin::countWords() {
- return 0;
-}
-
-
-
-void StarDictPlugin::clean() {
-
-}
-
-
Q_EXPORT_PLUGIN2(stardict, StarDictPlugin)