Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_xmp_io.cpp File Reference
#include "kis_xmp_io.h"
#include <string>
#include <QIODevice>
#include <QRegularExpression>
#include <kis_exiv2_common.h>
#include <kis_meta_data_entry.h>
#include <kis_meta_data_parser.h>
#include <kis_meta_data_schema.h>
#include <kis_meta_data_schema_registry.h>
#include <kis_meta_data_store.h>
#include <kis_meta_data_type_info.h>
#include <kis_meta_data_value.h>
#include <kis_debug.h>

Go to the source code of this file.

Functions

std::string exiv2Prefix (const KisMetaData::Schema *_schema)
 
bool parseTagName (const QString &tagString, QString &structName, int &arrayIndex, QString &tagName, const KisMetaData::TypeInfo **typeInfo, const KisMetaData::Schema *schema)
 

Function Documentation

◆ exiv2Prefix()

std::string exiv2Prefix ( const KisMetaData::Schema * _schema)
inline

Definition at line 35 of file kis_xmp_io.cpp.

36{
37 const QByteArray latin1SchemaUri = _schema->uri().toLatin1();
38 std::string prefix = Exiv2::XmpProperties::prefix(latin1SchemaUri.constData());
39 if (prefix.empty()) {
40 dbgMetaData << "Unknown namespace " << ppVar(_schema->uri()) << ppVar(_schema->prefix());
41 prefix = _schema->prefix().toLatin1().constData();
42 Exiv2::XmpProperties::registerNs(latin1SchemaUri.constData(), prefix);
43 }
44 return prefix;
45}
#define ppVar(var)
Definition kis_debug.h:155
#define dbgMetaData
Definition kis_debug.h:61

References dbgMetaData, ppVar, KisMetaData::Schema::prefix, and KisMetaData::Schema::uri.

◆ parseTagName()

bool parseTagName ( const QString & tagString,
QString & structName,
int & arrayIndex,
QString & tagName,
const KisMetaData::TypeInfo ** typeInfo,
const KisMetaData::Schema * schema )

We use Unicode-matching mode, because according to XML specification the name of an entity can contain Unicode characters.

Definition at line 163 of file kis_xmp_io.cpp.

169{
170 arrayIndex = -1;
171 *typeInfo = 0;
172
173 int numSubNames = tagString.count('/') + 1;
174
175 if (numSubNames == 1) {
176 structName.clear();
177 tagName = tagString;
178 *typeInfo = schema->propertyType(tagName);
179 return true;
180 }
181
182 if (numSubNames == 2) {
187 QRegularExpression regexp("([A-Za-z]\\w+)/([A-Za-z]\\w+):([A-Za-z]\\w+)");
188 regexp.setPatternOptions(QRegularExpression::UseUnicodePropertiesOption);
189
190 QRegularExpressionMatch match;
191 if (tagString.contains(regexp, &match)) {
192 structName = match.captured(1);
193 tagName = match.captured(3);
194 *typeInfo = schema->propertyType(structName);
195
196 if (*typeInfo && (*typeInfo)->propertyType() == KisMetaData::TypeInfo::StructureType) {
197 *typeInfo = (*typeInfo)->structureSchema()->propertyType(tagName);
198 }
199
200 return true;
201 }
202
203 QRegularExpression regexp2("([A-Za-z]\\w+)\\[(\\d+)\\]/([A-Za-z]\\w+):([A-Za-z]\\w+)");
204 regexp2.setPatternOptions(QRegularExpression::UseUnicodePropertiesOption);
205
206 QRegularExpressionMatch match2;
207 if (tagString.contains(regexp2, &match2)) {
208 structName = match2.captured(1);
209 arrayIndex = match2.captured(2).toInt() - 1;
210 tagName = match2.captured(4);
211
212 if (schema->propertyType(structName)) {
213 *typeInfo = schema->propertyType(structName)->embeddedPropertyType();
214 Q_ASSERT(*typeInfo);
215
216 if ((*typeInfo)->propertyType() == KisMetaData::TypeInfo::StructureType) {
217 *typeInfo = (*typeInfo)->structureSchema()->propertyType(tagName);
218 }
219 }
220
221 return true;
222 }
223 }
224
225 warnKrita << "WARNING: Unsupported tag. We do not yet support nested tags. The tag will be dropped!";
226 warnKrita << " Failing tag:" << tagString;
227 return false;
228}
const TypeInfo * propertyType(const QString &_propertyName) const
const TypeInfo * embeddedPropertyType() const
#define warnKrita
Definition kis_debug.h:87

References KisMetaData::TypeInfo::embeddedPropertyType(), KisMetaData::TypeInfo::propertyType(), KisMetaData::Schema::propertyType(), KisMetaData::TypeInfo::structureSchema(), KisMetaData::TypeInfo::StructureType, and warnKrita.