LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
XmlPropertyReader.cpp
Go to the documentation of this file.
1// Copyright 2002-2021 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6#include "XmlPropertyReader.h"
7#include "common/LimaCommon.h"
8
9#include <QXmlStreamReader>
10
11namespace Lima
12{
13namespace Common
14{
15namespace PropertyCode
16{
17
19{
20 friend class XmlPropertyReader;
21
22public:
23 // -----------------------------------------------------------------------
24 // Constructors
25 // -----------------------------------------------------------------------
28
29 bool parse(QIODevice *device);
31 void readProperty();
32 void readValue();
33 void readSubProperty();
34 void readSubValues();
35 void readSubValue();
36
37 QXmlStreamReader m_reader;
38 std::vector<XmlPropertyReader::PropertyDescription> m_properties;
39 std::vector<XmlPropertyReader::SubPropertyDescription> m_subproperties;
40};
41
45
49
54
55bool XmlPropertyReader::parse(QIODevice *device)
56{
57 return m_d->parse(device);
58}
59
60// <?xml version='1.0' encoding='UTF-8'?>
61// <Linguistic_codes>
62// <property name="GENDER">
63// <value name="MASC"/>
64// …
65// </property>
66// <subproperty name="MICRO" parent="MACRO">
67// <subvalues value="ADJ">
68// <value name="ADJ"/>
69// </subvalues>
70// …
71// </subproperty>
72// …
73// </Linguistic_codes>
74bool XmlPropertyReaderPrivate::parse(QIODevice *device)
75{
76#ifdef DEBUG_LP
78 LDEBUG << "XmlPropertyReaderPrivate::parse";
79#endif
80 m_reader.setDevice(device);
81 if (m_reader.readNextStartElement()) {
82 if (m_reader.name() == QLatin1String("Linguistic_codes"))
83 {
85 }
86 else
87 {
88 m_reader.raiseError(QObject::tr("The file is not a LIMA XML linguistic properties codes file."));
89 }
90 }
91 return !m_reader.error();
92}
93
94// <Linguistic_codes>
95// <property name="GENDER">
96// …
97// </property>
98// <subproperty name="MICRO" parent="MACRO">
99// …
100// </subproperty>
101// …
102// </Linguistic_codes>
104{
106 LTRACE << "XmlPropertyReaderPrivate::readLinguisticCodes" << m_reader.name();
107 Q_ASSERT(m_reader.isStartElement() && m_reader.name() == QLatin1String("Linguistic_codes"));
108
109 while (m_reader.readNextStartElement())
110 {
111 if (m_reader.name() == QLatin1String("property"))
112 readProperty();
113 else if (m_reader.name() == QLatin1String("subproperty"))
115 else
116 m_reader.raiseError(QObject::tr("Expected a property or subproperty but got a %1.").arg(m_reader.name()));
117 }
118#ifdef DEBUG_LP
119 LTRACE << "XmlPropertyReaderPrivate::readLinguisticCodes OUT";
120#endif
121}
122
123// <property name="GENDER">
124// <value name="MASC"/>
125// …
126// </property>
128{
129#ifdef DEBUG_LP
131 LTRACE << "XmlPropertyReaderPrivate::readProperty" << m_reader.name() << m_reader.attributes().value("name");
132#endif
133 Q_ASSERT(m_reader.isStartElement() && m_reader.name() == QLatin1String("property"));
135 m_properties.back().name = m_reader.attributes().value("name").toUtf8().data();
136 while (m_reader.readNextStartElement())
137 {
138 if (m_reader.name() == QLatin1String("value"))
139 readValue();
140 else
141 m_reader.raiseError(QObject::tr("Expected a value but got a %1.").arg(m_reader.name()));
142 }
143#ifdef DEBUG_LP
144 LTRACE << "XmlPropertyReaderPrivate::readProperty OUT";
145#endif
146}
147
148// <value name="MASC"/>
150{
151#ifdef DEBUG_LP
153 LTRACE << "XmlPropertyReaderPrivate::readValue" << m_reader.name() << m_reader.attributes().value("name");
154#endif
155 Q_ASSERT(m_reader.isStartElement() && m_reader.name() == QLatin1String("value"));
156 auto value = m_reader.attributes().value("name").toString().toStdString();
157 m_properties.back().values.push_back(value);
158 m_reader.skipCurrentElement();
159#ifdef DEBUG_LP
160 LTRACE << "XmlPropertyReaderPrivate::readValue OUT";
161#endif
162}
163
164// <subproperty name="MICRO" parent="MACRO">
165// <subvalues value="ADJ">
166// …
167// </subvalues>
168// …
169// </subproperty>
171{
172#ifdef DEBUG_LP
174 LTRACE << "XmlPropertyReaderPrivate::readSubProperty" << m_reader.name() << m_reader.attributes().value("name");
175#endif
176 Q_ASSERT(m_reader.isStartElement() && m_reader.name() == QLatin1String("subproperty"));
178 m_subproperties.back().name = m_reader.attributes().value("name").toString().toStdString();
179 m_subproperties.back().parentName = m_reader.attributes().value("parent").toString().toStdString();
180#ifdef DEBUG_LP
181 LDEBUG << "read subproperty " << m_subproperties.back().name << " of parent property " << m_subproperties.back().parentName;
182#endif
183 while (m_reader.readNextStartElement()) {
184 if (m_reader.name() == QLatin1String("subvalues"))
186 else
187 m_reader.raiseError(QObject::tr("Expected a subvalues but got a %1.").arg(m_reader.name()));
188 }
189}
190
191// <subvalues value="ADJ">
192// <value name="ADJ"/>
193// …
194// </subvalues>
196{
197#ifdef DEBUG_LP
199 LTRACE << "XmlPropertyReaderPrivate::readSubValues" << m_reader.name();
200#endif
201 Q_ASSERT(m_reader.isStartElement() && m_reader.name() == QLatin1String("subvalues"));
202 auto value = m_reader.attributes().value("value").toString().toStdString();
203#ifdef DEBUG_LP
204 LDEBUG << "XmlPropertyReaderPrivate::readSubValues" << value;
205#endif
206 m_subproperties.back().values.push_back(make_pair(value, std::vector<std::string>()));
207 while (m_reader.readNextStartElement()) {
208 if (m_reader.name() == QLatin1String("value"))
209 readSubValue();
210 else
211 m_reader.raiseError(QObject::tr("Expected a subvalues but got a %1.").arg(m_reader.name()));
212 }
213}
214
215// <value name="ADJ"/>
217{
218#ifdef DEBUG_LP
220 LTRACE << "XmlPropertyReaderPrivate::readSubValue" << m_reader.name();
221#endif
222 Q_ASSERT(m_reader.isStartElement() && m_reader.name() == QLatin1String("value"));
223 auto value = m_reader.attributes().value("name").toString();
224 m_reader.skipCurrentElement();
225#ifdef DEBUG_LP
226 LDEBUG << "XmlPropertyReaderPrivate::readSubValue" << value;
227#endif
228 m_subproperties.back().values.back().second.push_back(value.toStdString());
229}
230
231
233{
235 auto errorStr = QObject::tr("%1, Line %2, column %3")
236 .arg(m_d->m_reader.errorString())
237 .arg(m_d->m_reader.lineNumber())
238 .arg(m_d->m_reader.columnNumber());
239 LERROR << errorStr;
240 return errorStr;
241}
242
243
244const std::vector<XmlPropertyReader::PropertyDescription>& XmlPropertyReader::getProperties()
245{
246 return m_d->m_properties;
247}
248
249const std::vector<XmlPropertyReader::SubPropertyDescription>& XmlPropertyReader::getSubProperties()
250{
251 return m_d->m_subproperties;
252}
253
254} // closing namespace PropertyCode
255} // closing namespace Common
256} // closing namespace Lima
#define LTRACE
Definition LimaCommon.h:156
#define LDEBUG
Definition LimaCommon.h:157
#define LERROR
Definition LimaCommon.h:161
#define PROPERTYCODELOGINIT
Definition LimaCommon.h:213
std::vector< XmlPropertyReader::SubPropertyDescription > m_subproperties
std::vector< XmlPropertyReader::PropertyDescription > m_properties
const std::vector< PropertyDescription > & getProperties()
const std::vector< SubPropertyDescription > & getSubProperties()
NAUTITIA.