Copyright 2010 Comarch S.A.
*******************************************************************************/
+/*!
+ \file StarDictPlugin.cpp
+ \brief Implementation of stardict plugin's main class.
-/*! \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;
+ _iconPath = "/usr/share/mdictionary/stardict.png";
+ _icon = QIcon(_iconPath);
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;
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;
}
QByteArray StarDictPlugin::read(QByteArray::iterator it,
QByteArray::iterator end, int bytes) {
QByteArray ret;
- if(bytes == 0 && it != end)
- while(*it != '\0')
+
+ if(bytes == 0 && it != end){
+ while(*it != '\0' && it != end)
ret.append(*it++);
+ }
else
for(int i = 0; i < bytes && it != end; i++)
ret.append(*it++);
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 += QString::fromUtf8(read(it++, end));
- else if(mode == 'l')
- result += QString::fromUtf8(read(it++, end));
- else if(mode == 'g'){
+ 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 += QString::fromUtf8(read(it++, end));
- else if(mode == 'x'){
+
+ 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>");
+ }
+ }
+ if(mode == 'x'){
result += QString::fromUtf8(read(it++, end));
result.replace("</k>","</key><t>");
result.replace("<k>","</t><key>");
if(result.contains("<t>"))
result+="</t>";
}
- 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));
-// 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)
+// 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>";
if(!last) {
QByteArray tmp ;
tmp.append(*(it++));
} else
result += read(it++, end);
} else if(mode == 'P') {
+ result += "<key>" + key + "</key>";
if(!last) {
QByteArray tmp ;
tmp.append(*(it++));
}
-
QString StarDictPlugin::search(QString key, qint64 offset, qint32 len) {
- if(!dictReader)
- return "";
- QByteArray raw = dictReader->readString(offset, len);
- qDebug()<<"mod"<<settings()->value("sametypesequence");
- return format(raw, settings()->value("sametypesequence"),key);
-}
+ QString dictPath = settings()->value("dictFileName");
+ StarDictReader *reader = StarDictReaderFactory::createReader(dictPath);
+ QByteArray raw = reader->readString(offset, len);
+ QString result= format(raw, settings()->value("sametypesequence"),key);
+ delete reader;
+ return result;
+}
void StarDictPlugin::stop() {
((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();
- plugin->dictReader = StarDictReaderFactory::
- createReader(settings->value("dictFileName"));
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;
+QString StarDictPlugin::iconPath(){
+ return _iconPath;
}
-
-
-void StarDictPlugin::clean() {
-
-}
-
-
Q_EXPORT_PLUGIN2(stardict, StarDictPlugin)