1 /*
2     SPDX-FileCopyrightText: 2013 Andreas Cord-Landwehr <cordlandwehr@kde.org>
3 
4     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5 */
6 
7 #include "language.h"
8 #include "artikulate_debug.h"
9 #include "models/languagemodel.h"
10 #include "phoneme.h"
11 #include "phonemegroup.h"
12 #include <KLocalizedString>
13 #include <QFile>
14 #include <QIODevice>
15 #include <QQmlEngine>
16 #include <QXmlStreamReader>
17 
create(QUrl file)18 std::shared_ptr<Language> Language::create(QUrl file)
19 {
20     auto language = std::shared_ptr<Language>(new Language());
21     // load basic information from language file, but does not parse everything
22     QXmlStreamReader xml;
23     QFile handle(file.toLocalFile());
24     if (handle.open(QIODevice::ReadOnly)) {
25         xml.setDevice(&handle);
26         xml.readNextStartElement();
27         while (xml.readNext() && !xml.atEnd()) {
28             if (xml.name() == "id") {
29                 language->setId(xml.readElementText());
30             }
31             if (xml.name() == "title") {
32                 language->setTitle(xml.readElementText());
33             }
34             if (xml.name() == "i18nTitle") {
35                 language->seti18nTitle(xml.readElementText());
36             }
37             if (xml.name() == "phonemeGroup") {
38                 std::shared_ptr<PhonemeGroup> group = std::shared_ptr<PhonemeGroup>(new PhonemeGroup);
39                 while (xml.readNext() && !xml.atEnd() && xml.name() != "phonemeGroup") {
40                     if (xml.name() == "id") {
41                         group->setId(xml.readElementText());
42                     }
43                     if (xml.name() == "title") {
44                         group->setTitle(xml.readElementText());
45                     }
46                     if (xml.name() == "description") {
47                         group->setDescription(xml.readElementText());
48                     }
49                     if (xml.name() == "phoneme") {
50                         std::unique_ptr<Phoneme> phoneme = std::unique_ptr<Phoneme>(new Phoneme);
51                         while (xml.readNext() && !xml.atEnd() && xml.name() != "phoneme") {
52                             if (xml.name() == "id") {
53                                 phoneme->setId(xml.readElementText());
54                             }
55                             if (xml.name() == "title") {
56                                 phoneme->setTitle(xml.readElementText());
57                             }
58                         }
59                         group->addPhoneme(std::move(phoneme));
60                     }
61                 }
62                 language->m_phonemeGroups.append(group);
63             }
64         }
65         if (xml.hasError()) {
66             qCritical() << "Error occurred when reading Language XML file:" << file.toLocalFile();
67         }
68     }
69     xml.clear();
70     handle.close();
71 
72     return language;
73 }
74 
Language()75 Language::Language()
76     : ILanguage()
77 {
78     QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
79 }
80 
81 Language::~Language() = default;
82 
id() const83 QString Language::id() const
84 {
85     return m_id;
86 }
87 
setId(const QString & id)88 void Language::setId(const QString &id)
89 {
90     if (id != m_id) {
91         m_id = id;
92         emit idChanged();
93     }
94 }
95 
title() const96 QString Language::title() const
97 {
98     return m_title;
99 }
100 
setTitle(const QString & title)101 void Language::setTitle(const QString &title)
102 {
103     if (QString::compare(title, m_title) != 0) {
104         m_title = title;
105         emit titleChanged();
106     }
107 }
108 
i18nTitle() const109 QString Language::i18nTitle() const
110 {
111     return i18n(m_i18nTitle.toUtf8());
112 }
113 
seti18nTitle(const QString & title)114 void Language::seti18nTitle(const QString &title)
115 {
116     if (m_i18nTitle == title) {
117         return;
118     }
119     m_i18nTitle = title;
120     emit i18nTitleChanged();
121 }
122 
file() const123 QUrl Language::file() const
124 {
125     return m_file;
126 }
127 
setFile(const QUrl & file)128 void Language::setFile(const QUrl &file)
129 {
130     m_file = file;
131 }
132 
phonemes() const133 QVector<std::shared_ptr<Phoneme>> Language::phonemes() const
134 {
135     QVector<std::shared_ptr<Phoneme>> list;
136     for (auto group : m_phonemeGroups) {
137         list << group->phonemes();
138     }
139     return list;
140 }
141 
phonemeGroups() const142 QVector<std::shared_ptr<PhonemeGroup>> Language::phonemeGroups() const
143 {
144     return m_phonemeGroups;
145 }
146