change in interpreter
authorJakub Jaszczynski <j.j.jaszczynski@gmail.com>
Fri, 8 Oct 2010 10:30:46 +0000 (12:30 +0200)
committerJakub Jaszczynski <j.j.jaszczynski@gmail.com>
Fri, 8 Oct 2010 10:30:46 +0000 (12:30 +0200)
src/mdictionary/gui/TranslationWidget.cpp
src/mdictionary/gui/TranslationWidget.h
src/plugins/stardict/StarDictPlugin.cpp
src/plugins/stardict/StarDictPlugin.h
src/plugins/stardict/StarDictReaderFactory.cpp

index 468087b..cf796c7 100644 (file)
@@ -80,10 +80,13 @@ void TranslationWidget::show(QStringList translations) {
         trans += t + "\n";
     }
 
+
     trans=QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") + QString("\n <ar>")
            + trans + QString("\n </ar>");
 
-    qDebug()<<trans;
+    //qDebug()<<"\n\n\n\n\n\n\n\n\n before"<<trans;
+    trans=checkTranslation(trans);
+    //qDebug()<<"\n\n after"<<trans;
     trans=XslConversion(trans);
 
     QString head = "<html><head>";
@@ -112,6 +115,77 @@ QString TranslationWidget::XslConversion(QString translation)
     return result;
 }
 
+QString TranslationWidget::checkTranslation(QString trans){
+    /*check all "&"*/
+    int pos=0;
+    int pos2;
+    while(pos!=-1){
+        pos=trans.indexOf("&",pos+1);
+        pos2=trans.indexOf("amp;",pos);
+        if(pos!=-1 && pos2!=-1 && pos+1==pos2)
+            continue;
+        pos2=trans.indexOf("gt;",pos);
+        if(pos!=-1 && pos2!=-1 && pos+1==pos2)
+            continue;
+        pos2=trans.indexOf("lt;",pos);
+        if(pos!=-1 && pos2!=-1 && pos+1==pos2)
+            continue;
+        pos2=trans.indexOf("apos;",pos);
+        if(pos!=-1 && pos2!=-1 && pos+1==pos2)
+            continue;
+        pos2=trans.indexOf("quot;",pos);
+        if(pos!=-1 && pos2!=-1 && pos+1==pos2)
+            continue;
+        if(pos!=-1)
+            trans.insert(pos+1,"amp;");
+        if(pos>40)
+            while(1);
+    }
+
+    /*check all "<" and ">" */
+    pos=0;
+    int count=0;
+    while(pos!=-1){
+        pos=trans.indexOf("<",pos+1);
+        pos2=trans.indexOf(">",pos+1);
+        if(pos!=-1 && pos2!=-1){
+            if(trans.at(pos2-1)!='/' && trans.at(pos+1)!='/')
+                count++;
+            if(trans.at(pos+1)=='/')
+                count--;
+        }
+ /*     else if(pos==-1 && pos2!=-1){
+            qDebug()<<"pos=-1";
+            trans.remove(pos2,1);
+        }
+        else if(pos2==-1 && pos!=-1){
+            qDebug()<<"pos2=-1";
+            trans.remove(pos,1);
+        }
+        else {
+            qDebug()<<"pos i pos2 = -1";
+            break;
+        }
+        qDebug()<<"count"<<count;
+*/
+    }
+
+    /*check all """ and "'" */
+    pos=0;
+    count=0;
+    while(pos<trans.size()){
+        if(trans.at(pos)=='<')
+            count++;
+        else if(trans.at(pos)=='>')
+            count--;
+        else if(trans.at(pos)=='\"' && count==0)
+            trans.replace(pos,1,"&quot;");
+        else if(trans.at(pos)=='\'' && count==0)
+            trans.replace(pos,1,"&apos;");
+        pos++;
+    }
+    return trans;
+}
 
 #ifdef Q_WS_MAEMO_5
 void TranslationWidget::initButtons() {
index 9954fcd..3f34f55 100644 (file)
@@ -72,6 +72,7 @@ private Q_SLOTS:
 
 private:
     QString XslConversion(QString translation);
+    QString checkTranslation(QString trans);
     QToolButton* zoomInToolButton;
     QToolButton* zoomOutToolButton;
     TranslationView *webkit;
index 14691e7..2f19bcc 100644 (file)
@@ -144,9 +144,13 @@ 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')
+
+    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++)
             ret.append(*it++);
@@ -157,16 +161,22 @@ QByteArray StarDictPlugin::read(QByteArray::iterator it,
 QString StarDictPlugin::interpret(QByteArray::iterator it,
         QByteArray::iterator end, QChar mode,QString key, bool last) {
     QString result;
-    if(mode == 'm')
+    if(mode == 'm'){
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
-    else if(mode == 'l')
+    }
+    else if(mode == 'l'){
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
+    }
     else if(mode ==  'g'){
         result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
     }
-    else if(mode == 't')
+    else if(mode == 't'){
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
+    }
     else if(mode == 'x'){
         result += QString::fromUtf8(read(it++, end));
         result.replace("</k>","</key><t>");
@@ -176,18 +186,28 @@ QString StarDictPlugin::interpret(QByteArray::iterator it,
             result.remove(pos,4);
         result+="</t>";
     }
-    else if(mode == 'y')
+    else if(mode == 'y') {
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
-    else if(mode == 'k')
+    }
+    else if(mode == 'k'){
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
-    else if(mode == 'w')
+    }
+    else if(mode == 'w'){
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
-    else if(mode == 'h')
+    }
+    else if(mode == 'h'){
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
-    else if(mode == 'r')
+    }
+    else if(mode == 'r'){
+        result += "<key>" + key + "</key>";
         result += QString::fromUtf8(read(it++, end));
-
+    }
     else if(mode == 'W') {
+        result += "<key>" + key + "</key>";
         if(!last) {
             QByteArray tmp ;
             tmp.append(*(it++));
@@ -198,6 +218,7 @@ QString StarDictPlugin::interpret(QByteArray::iterator it,
         } else
             result += read(it++, end);
     } else if(mode == 'P') {
+        result += "<key>" + key + "</key>";
         if(!last) {
             QByteArray tmp ;
             tmp.append(*(it++));
@@ -211,7 +232,6 @@ QString StarDictPlugin::interpret(QByteArray::iterator it,
     return result;
 }
 
-
 QString StarDictPlugin::format(QByteArray raw, QString mode,QString key) {
     QString result;
     if(mode == "") {
@@ -231,11 +251,14 @@ QString StarDictPlugin::format(QByteArray raw, QString mode,QString key) {
 
 
 QString StarDictPlugin::search(QString key, qint64 offset, qint32 len) {
-    if(!dictReader)
-        return "";
-    QByteArray raw = dictReader->readString(offset, len);
+    QString dictPath = settings()->value("dictFileName");
+    StarDictReader *reader = StarDictReaderFactory::createReader(dictPath);
+
+    QByteArray raw = reader->readString(offset, len);
     qDebug()<<"mod"<<settings()->value("sametypesequence");
-    return format(raw, settings()->value("sametypesequence"),key);
+    QString result= format(raw, settings()->value("sametypesequence"),key);
+    delete reader;
+    return result;
 }
 
 
@@ -266,8 +289,6 @@ CommonDictInterface* StarDictPlugin::getNew(const Settings *settings) const {
         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 {
@@ -326,7 +347,6 @@ bool StarDictPlugin::getDictionaryInfo() {
     }
 
     _name = settings()->value("bookname");
-
     return true;
 }
 
index c8efbae..782d783 100644 (file)
@@ -183,7 +183,6 @@ private:
     Settings *_settings;
     StarDictDialog* _dictDialog;
     Settings* _ifoFileSettings;
-    StarDictReader * dictReader;
 
     /*! Reads and process (converting to qstring) data from StarDict dictionary
         file (*.dict[.dz])
index 3ae2242..fc32175 100644 (file)
 
 StarDictReader* StarDictReaderFactory::createReader(QString filename) {
     if(filename.endsWith(".gz", Qt::CaseInsensitive) ||
-           filename.endsWith(".dz", Qt::CaseInsensitive)) {
-       qDebug() << "compressed";
+             filename.endsWith(".dz", Qt::CaseInsensitive))
         return new CompressedReader(filename);
-    }
-    else {
-       qDebug() << "uncompressed";
+    else
         return new UncompressedReader(filename);
-    }
 }