You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
3.8 KiB
C++

// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "cgooglefonts.h"
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
#include <QUrl>
#include <QUrlQuery>
#include <QJsonDocument>
#include <QJsonArray>
QStringList arrayToString(const QJsonArray& array) {
QStringList list;
foreach (const QJsonValue& item, array) {
list.append(item.toString());
}
return list;
}
QMap<QString, QString> objectToMap(const QJsonObject& object) {
QMap<QString, QString> list;
for (const QString &key : object.keys()) {
QJsonValue value = object.value(key);
list.insert(key, value.toString());
}
return list;
}
cGoogleFonts::cGoogleFonts() {
m_key = tr("AIzaSyCqPgQFvG-k4lbPF7L0oqJLKJxoC1O6R90");
}
cGoogleFonts::~cGoogleFonts() {
}
QString cGoogleFonts::pluginAPIVersion() {
return tr("1.0");
}
QString cGoogleFonts::name() {
return tr("Google Fonts");
}
QString cGoogleFonts::version() {
return tr("0.1");
}
QList<cFontInfo> cGoogleFonts::search(const QString& family, const QString& subset, const Sort& sort) {
QNetworkAccessManager networkManager;
QString urlString = "https://www.googleapis.com/webfonts/v1/webfonts";
QUrlQuery query;
query.addQueryItem("key", m_key);
if(!family.isEmpty())
query.addQueryItem("family", family);
if(!subset.isEmpty())
query.addQueryItem("subset", subset);
switch(sort)
{
case Sort::alpha:
query.addQueryItem("sort", "alpha");
break;
case Sort::date:
query.addQueryItem("sort", "date");
break;
case Sort::popularity:
query.addQueryItem("sort", "popularity");
break;
case Sort::style:
query.addQueryItem("sort", "style");
break;
default:
query.addQueryItem("sort", "alpha");
break;
}
QUrl url(urlString);
url.setQuery(query);
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QNetworkReply* reply = networkManager.get(request);
QEventLoop loop;
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
QByteArray data = reply->readAll();
delete reply;
QJsonDocument doc = QJsonDocument::fromJson(data);
if(doc.isNull()) {
qDebug() << "Error: JSON return is empty";
return QList<cFontInfo>();
}
if(!doc.isObject()) {
qDebug() << "Error: invalid JSON";
return QList<cFontInfo>();
}
QJsonObject root = doc.object();
if(!root.contains("items")) {
qDebug() << "Error: no fonts found";
return QList<cFontInfo>();
}
QJsonValue itemsV = root.value("items");
if(!itemsV.isArray()) {
qDebug() << "Error: no fonts found";
return QList<cFontInfo>();
}
QJsonArray items = itemsV.toArray();
if(!items.count())
return QList<cFontInfo>();
QList<cFontInfo> fontList;
foreach (const QJsonValue& item, items) {
if (item.isObject()) {
cFontInfo font;
QJsonObject obj = item.toObject();
if(obj.contains("family"))
font.setFamily(obj.value("family").toString());
else
continue;
if(obj.contains("variants"))
font.setVariants(arrayToString(obj.value("variants").toArray()));
if(obj.contains("subsets"))
font.setSubsets(arrayToString(obj.value("subsets").toArray()));
if(obj.contains("version"))
font.setVersion(obj.value("version").toString());
if(obj.contains("lastModified"))
font.setLastModified(QDate::fromString(obj.value("lastModified").toString()));
if(obj.contains("files")) {
QJsonObject filesObj = obj.value("files").toObject();
font.setFiles(objectToMap(filesObj));
}
if(obj.contains("category"))
font.setCategory(obj.value("category").toString());
if(obj.contains("kind"))
font.setKind(obj.value("kind").toString());
fontList.append(font);
}
}
return fontList;
}