7#include "filemetadatautil_p.h"
8#include <KFileMetaData/PropertyInfo>
9#include <KFileMetaData/UserMetaData>
55 return QVariant(s1.intersect(s2).values());
69 auto propIndex = commonProperties.
indexOf(prop);
73 for (
const QVariantMap &file : files) {
74 QVariantMap::const_iterator it = file.constFind(prop);
75 Q_ASSERT(it != file.constEnd());
77 total += it.value().toInt();
80 target.insert(prop,
QVariant(total));
82 commonProperties.
removeAt(propIndex);
91QMap<KFileMetaData::UserMetaData::Attribute, QVariant>
100 if (attributes & Attribute::Tags) {
101 QStringList tags = metaData.tags();
107 if (attributes & Attribute::Rating) {
108 int rating = metaData.rating();
114 if (attributes & Attribute::Comment) {
115 QString comment = metaData.userComment();
117 properties.insert(Attribute::Comment, comment);
121 if (attributes & Attribute::OriginUrl) {
122 const QString originUrl = metaData.originUrl().toDisplayString();
124 properties.insert(Attribute::OriginUrl, originUrl);
131QVariantMap convertUserMetaData(
const QMap<KFileMetaData::UserMetaData::Attribute, QVariant>& metaData)
136 for (
auto it = metaData.
begin(); it != metaData.
end(); ++it) {
137 if (it.key() == Attribute::Tags) {
138 properties.insert(QStringLiteral(
"tags"), it.value());
140 }
else if (it.key() == Attribute::Rating) {
141 properties.insert(QStringLiteral(
"rating"), it.value());
143 }
else if (it.key() == Attribute::Comment) {
144 properties.insert(QStringLiteral(
"userComment"), it.value());
146 }
else if (it.key() == Attribute::OriginUrl) {
147 properties.insert(QStringLiteral(
"originUrl"), it.value());
154QVariantMap convertUserMetaData(
const KFileMetaData::UserMetaData &metaData)
158 auto attributeData = fetchUserMetaData(metaData, Attribute::Tags | Attribute::Rating | Attribute::Comment | Attribute::OriginUrl);
160 return convertUserMetaData(attributeData);
163QVariantMap toNamedVariantMap(
const KFileMetaData::PropertyMultiMap &propMap)
166 if (propMap.isEmpty()) {
170 using entry = std::pair<const KFileMetaData::Property::Property &, const QVariant &>;
172 auto begin = propMap.constKeyValueBegin();
174 while (begin != propMap.constKeyValueEnd()) {
175 auto key = (*begin).first;
176 KFileMetaData::PropertyInfo property(key);
177 auto rangeEnd = std::find_if(begin, propMap.constKeyValueEnd(), [key](
const entry &e) {
178 return e.first != key;
181 auto distance = std::distance(begin, rangeEnd);
185 std::for_each(begin, rangeEnd, [&list](
const entry &s) {
188 map.insert(property.name(), list);
190 map.insert(property.name(), (*begin).second);
198void mergeCommonData(QVariantMap& target,
const QList<QVariantMap> &files)
205 if (files.
size() == 1) {
213 QList<QString> commonProperties = files[0].keys();
214 auto end = commonProperties.
end();
215 for (
const QVariantMap &fileData : files) {
216 end = std::remove_if(commonProperties.
begin(), end,
217 [&fileData](
const QString& prop) { return !fileData.contains(prop); }
220 commonProperties.
erase(end, commonProperties.
end());
223 totalProperties(target, QStringLiteral(
"duration"), files, commonProperties);
224 totalProperties(target, QStringLiteral(
"characterCount"), files, commonProperties);
225 totalProperties(target, QStringLiteral(
"wordCount"), files, commonProperties);
226 totalProperties(target, QStringLiteral(
"lineCount"), files, commonProperties);
228 for (
const QString &propUri : std::as_const(commonProperties)) {
229 QVariant value = files[0][propUri];
230 for (
const QVariantMap &file : files) {
231 QVariantMap::const_iterator it = file.find(propUri);
232 Q_ASSERT(it != file.constEnd());
234 value = intersect(it.value(), value);
241 target[propUri] = value;
245QStringList sortTags(
const QStringList &tags)
249 QStringList sortedTags = tags;
250 std::sort(sortedTags.
begin(), sortedTags.
end(), [&](
const QString &s1,
const QString &s2) {
251 return coll.compare(s1, s2) < 0;
KIOCORE_EXPORT QStringList list(const QString &fileClass)
const QList< QKeySequence > & begin()
const QList< QKeySequence > & end()
KOSM_EXPORT double distance(const std::vector< const OSM::Node * > &path, Coordinate coord)
void setNumericMode(bool on)
void append(QList< T > &&value)
const_iterator cbegin() const const
const_iterator cend() const const
iterator erase(const_iterator begin, const_iterator end)
qsizetype indexOf(const AT &value, qsizetype from) const const
bool isEmpty() const const
void removeAt(qsizetype i)
void reserve(qsizetype size)
qsizetype size() const const
bool isEmpty() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)
bool isValid() const const
QString toString() const const
QStringList toStringList() const const