File: ManagerDictionaries.cpp

package info (click to toggle)
ulcc 1.0.2-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 4,420 kB
  • sloc: cpp: 852; xml: 23; sh: 17; makefile: 6
file content (123 lines) | stat: -rw-r--r-- 4,995 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "ManagerDictionaries.h"

#include <QFile>
#include <QDir>
#include <QRegExp>
#include <QMessageBox>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMessageBox>
#include <QDebug>

#include <functional>

DICTIONARY ManagerDictionaries::loadDictionary(QString fileName){
    DICTIONARY result;

    QByteArray val;
    QFile file;
    file.setFileName(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        QMessageBox::critical(0,"ulcc",QObject::tr("Error while opening")+" "+fileName+"\n"+file.errorString());
        return result;
    }
    val = "{"+file.readAll()+"}";
    file.close();

    QJsonDocument document = QJsonDocument::fromJson(val);
    if (document.isEmpty()){
        QMessageBox::critical(0,"ulcc",fileName+" "+QObject::tr("is not valid"));
        return result;
    }
    QJsonObject root = document.object();

    result.filename=fileName;

    QStringList folders = fileName.split(QRegExp("[/\\\\]"));
    result.folder =fileName.mid(0,fileName.size()-folders.at(folders.size()-1).size()-1);

    result.author = root.value("author").toString();
    result.description[""] = root.value("description").toString();

    QJsonArray arrImages = root.value("images").toArray();
    for (int i=0;i<arrImages.size();i++){
        DICTIONARY_IMAGES image;

        image.image = arrImages.at(i).toObject().value("image").toString();
        image.answer1[""] = arrImages.at(i).toObject().value("answer1").toString().toUpper();
        image.answer2[""] = arrImages.at(i).toObject().value("answer2").toString().toUpper();
        image.answer3[""] = arrImages.at(i).toObject().value("answer3").toString().toUpper();
        image.answer4[""] = arrImages.at(i).toObject().value("answer4").toString().toUpper();

        if (image.answer1[""]==""){
            image.answer1[""] = arrImages.at(i).toObject().value("answer").toString().toUpper();
        }

        result.listImages.push_back(image);
    }

    std::function<QString(int)> findWord = [&result](int ind) {
        QString string1 = result.listImages[ind].answer1[""];
        QString string2 = result.listImages[ind].answer2[""];
        QString string3 = result.listImages[ind].answer3[""];
        QString string4 = result.listImages[ind].answer4[""];

        while(true){
            int index = qrand()%result.listImages.size();
            QString findString = result.listImages.at(index).answer1[""];
            if (findString!=string1){
                if (result.listImages.size()>4){
                    if (findString!=string2 and findString!=string3 and findString!=string4){
                        return findString;
                    }
                }else{
                    return findString;
                }
            }
        }
    };

    // add answers where there are none
    for (int i = 0; i < result.listImages.size(); ++i) {
        if (result.listImages.at(i).answer2[""]=="") result.listImages[i].answer2[""]=findWord(i);
        if (result.listImages.at(i).answer3[""]=="") result.listImages[i].answer3[""]=findWord(i);
        if (result.listImages.at(i).answer4[""]=="") result.listImages[i].answer4[""]=findWord(i);
    }


    // answer translations
    QDir dir(result.folder+"/languages");
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot);
    QRegExp rx("^(.*)(.lng)$");
    QFileInfoList list = dir.entryInfoList();
    for (QFileInfo fileInfo : list) {
        if (rx.indexIn(fileInfo.fileName())!=-1){
            QString lang_code = rx.cap(1);
            if (lang_code.indexOf("_")==-1) lang_code+="_"+lang_code.toUpper();

            QFile file(result.folder+"/languages/"+fileInfo.fileName());
            if (file.open(QIODevice::ReadOnly | QIODevice::Text)){
                while (!file.atEnd()) {
                    QString line = file.readLine();
                    line.replace(QRegExp("(\\s+)$"),"");
                    QStringList pairs = line.split("=");
                    if (pairs.size()!=2) continue;

                    for (int i=0;i<result.listImages.size();i++){
                        if(result.listImages[i].answer1[""].toUpper()==pairs.at(0).toUpper()) result.listImages[i].answer1[lang_code] = pairs.at(1).toUpper();
                        if(result.listImages[i].answer2[""].toUpper()==pairs.at(0).toUpper()) result.listImages[i].answer2[lang_code] = pairs.at(1).toUpper();
                        if(result.listImages[i].answer3[""].toUpper()==pairs.at(0).toUpper()) result.listImages[i].answer3[lang_code] = pairs.at(1).toUpper();
                        if(result.listImages[i].answer4[""].toUpper()==pairs.at(0).toUpper()) result.listImages[i].answer4[lang_code] = pairs.at(1).toUpper();
                        if(result.description[""].toUpper()==pairs.at(0).toUpper()) result.description[lang_code] = pairs.at(1);
                    }
                }
                file.close();
            }
        }
    }



    return result;
}