mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2026-06-29 01:54:20 +03:00
251 lines
8.4 KiB
C++
251 lines
8.4 KiB
C++
// SPDX-License-Identifier: GPL-3.0-only
|
|
/*
|
|
* Prism Launcher - Minecraft Launcher
|
|
* Copyright (c) 2023 Trial97 <alexandru.tripon97@gmail.com>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, version 3.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "ExportToModList.h"
|
|
#include <QJsonArray>
|
|
#include <QJsonDocument>
|
|
#include <QJsonObject>
|
|
|
|
namespace {
|
|
QString toHTML(const QList<Mod*>& mods, ExportToModList::OptionalData extraData)
|
|
{
|
|
QStringList lines;
|
|
for (auto* mod : mods) {
|
|
auto meta = mod->metadata();
|
|
auto modName = mod->name().toHtmlEscaped();
|
|
if ((extraData & ExportToModList::Url) != 0) {
|
|
auto url = mod->homepage().toHtmlEscaped();
|
|
if (!url.isEmpty()) {
|
|
modName = QString("<a href=\"%1\">%2</a>").arg(url, modName);
|
|
}
|
|
}
|
|
auto line = modName;
|
|
if ((extraData & ExportToModList::Version) != 0) {
|
|
auto ver = mod->version();
|
|
if (ver.isEmpty() && meta != nullptr) {
|
|
ver = meta->version().toString();
|
|
}
|
|
if (!ver.isEmpty()) {
|
|
line += QString(" [%1]").arg(ver.toHtmlEscaped());
|
|
}
|
|
}
|
|
if (((extraData & ExportToModList::Authors) != 0) && !mod->authors().isEmpty()) {
|
|
line += " by " + mod->authors().join(", ").toHtmlEscaped();
|
|
}
|
|
if ((extraData & ExportToModList::FileName) != 0) {
|
|
line += QString(" (%1)").arg(mod->fileinfo().fileName().toHtmlEscaped());
|
|
}
|
|
|
|
lines.append(QString("<li>%1</li>").arg(line));
|
|
}
|
|
return QString("<html><body><ul>\n\t%1\n</ul></body></html>").arg(lines.join("\n\t"));
|
|
}
|
|
|
|
QString toMarkdownEscaped(QString src)
|
|
{
|
|
for (auto ch : "\\`*_{}[]<>()#+-.!|") {
|
|
src.replace(ch, QString("\\%1").arg(ch));
|
|
}
|
|
return src;
|
|
}
|
|
|
|
QString toMarkdown(const QList<Mod*>& mods, ExportToModList::OptionalData extraData)
|
|
{
|
|
QStringList lines;
|
|
|
|
for (auto* mod : mods) {
|
|
auto meta = mod->metadata();
|
|
auto modName = toMarkdownEscaped(mod->name());
|
|
if ((extraData & ExportToModList::Url) != 0) {
|
|
auto url = mod->homepage();
|
|
if (!url.isEmpty()) {
|
|
modName = QString("[%1](%2)").arg(modName, url);
|
|
}
|
|
}
|
|
auto line = modName;
|
|
if ((extraData & ExportToModList::Version) != 0) {
|
|
auto ver = toMarkdownEscaped(mod->version());
|
|
if (ver.isEmpty() && meta != nullptr) {
|
|
ver = toMarkdownEscaped(meta->version().toString());
|
|
}
|
|
if (!ver.isEmpty()) {
|
|
line += QString(" [%1]").arg(ver);
|
|
}
|
|
}
|
|
if (((extraData & ExportToModList::Authors) != 0) && !mod->authors().isEmpty()) {
|
|
line += " by " + toMarkdownEscaped(mod->authors().join(", "));
|
|
}
|
|
if ((extraData & ExportToModList::FileName) != 0) {
|
|
line += QString(" (%1)").arg(toMarkdownEscaped(mod->fileinfo().fileName()));
|
|
}
|
|
lines << "- " + line;
|
|
}
|
|
return lines.join("\n");
|
|
}
|
|
|
|
QString toPlainTXT(const QList<Mod*>& mods, ExportToModList::OptionalData extraData)
|
|
{
|
|
QStringList lines;
|
|
for (auto* mod : mods) {
|
|
auto meta = mod->metadata();
|
|
auto modName = mod->name();
|
|
|
|
auto line = modName;
|
|
if ((extraData & ExportToModList::Url) != 0) {
|
|
auto url = mod->homepage();
|
|
if (!url.isEmpty()) {
|
|
line += QString(" (%1)").arg(url);
|
|
}
|
|
}
|
|
if ((extraData & ExportToModList::Version) != 0) {
|
|
auto ver = mod->version();
|
|
if (ver.isEmpty() && meta != nullptr) {
|
|
ver = meta->version().toString();
|
|
}
|
|
if (!ver.isEmpty()) {
|
|
line += QString(" [%1]").arg(ver);
|
|
}
|
|
}
|
|
if (((extraData & ExportToModList::Authors) != 0) && !mod->authors().isEmpty()) {
|
|
line += " by " + mod->authors().join(", ");
|
|
}
|
|
if ((extraData & ExportToModList::FileName) != 0) {
|
|
line += QString(" (%1)").arg(mod->fileinfo().fileName());
|
|
}
|
|
lines << line;
|
|
}
|
|
return lines.join("\n");
|
|
}
|
|
|
|
QString toJSON(const QList<Mod*>& mods, ExportToModList::OptionalData extraData)
|
|
{
|
|
QJsonArray lines;
|
|
for (auto* mod : mods) {
|
|
auto meta = mod->metadata();
|
|
auto modName = mod->name();
|
|
QJsonObject line;
|
|
line["name"] = modName;
|
|
if ((extraData & ExportToModList::Url) != 0) {
|
|
auto url = mod->homepage();
|
|
if (!url.isEmpty()) {
|
|
line["url"] = url;
|
|
}
|
|
}
|
|
if ((extraData & ExportToModList::Version) != 0) {
|
|
auto ver = mod->version();
|
|
if (ver.isEmpty() && meta != nullptr) {
|
|
ver = meta->version().toString();
|
|
}
|
|
if (!ver.isEmpty()) {
|
|
line["version"] = ver;
|
|
}
|
|
}
|
|
if (((extraData & ExportToModList::Authors) != 0) && !mod->authors().isEmpty()) {
|
|
line["authors"] = QJsonArray::fromStringList(mod->authors());
|
|
}
|
|
if ((extraData & ExportToModList::FileName) != 0) {
|
|
line["filename"] = mod->fileinfo().fileName();
|
|
}
|
|
lines << line;
|
|
}
|
|
QJsonDocument doc;
|
|
doc.setArray(lines);
|
|
return doc.toJson();
|
|
}
|
|
|
|
QString toCSV(const QList<Mod*>& mods, ExportToModList::OptionalData extraData)
|
|
{
|
|
QStringList lines;
|
|
for (auto* mod : mods) {
|
|
QStringList data;
|
|
auto meta = mod->metadata();
|
|
auto modName = mod->name();
|
|
|
|
data << modName;
|
|
if ((extraData & ExportToModList::Url) != 0) {
|
|
data << mod->homepage();
|
|
}
|
|
if ((extraData & ExportToModList::Version) != 0) {
|
|
auto ver = mod->version();
|
|
if (ver.isEmpty() && meta != nullptr) {
|
|
ver = meta->version().toString();
|
|
}
|
|
data << ver;
|
|
}
|
|
if ((extraData & ExportToModList::Authors) != 0) {
|
|
QString authors;
|
|
if (mod->authors().length() == 1) {
|
|
authors = mod->authors().back();
|
|
} else if (mod->authors().length() > 1) {
|
|
authors = QString("\"%1\"").arg(mod->authors().join(","));
|
|
}
|
|
data << authors;
|
|
}
|
|
if ((extraData & ExportToModList::FileName) != 0) {
|
|
data << mod->fileinfo().fileName();
|
|
}
|
|
lines << data.join(",");
|
|
}
|
|
return lines.join("\n");
|
|
}
|
|
} // namespace
|
|
namespace ExportToModList {
|
|
|
|
QString exportToModList(const QList<Mod*>& mods, Formats format, OptionalData extraData)
|
|
{
|
|
switch (format) {
|
|
case HTML:
|
|
return toHTML(mods, extraData);
|
|
case MARKDOWN:
|
|
return toMarkdown(mods, extraData);
|
|
case PLAINTXT:
|
|
return toPlainTXT(mods, extraData);
|
|
case JSON:
|
|
return toJSON(mods, extraData);
|
|
case CSV:
|
|
return toCSV(mods, extraData);
|
|
default: {
|
|
return QString("unknown format:%1").arg(format);
|
|
}
|
|
}
|
|
}
|
|
|
|
QString exportToModList(const QList<Mod*>& mods, const QString& lineTemplate)
|
|
{
|
|
QStringList lines;
|
|
for (auto* mod : mods) {
|
|
auto meta = mod->metadata();
|
|
auto modName = mod->name();
|
|
auto modID = mod->modId();
|
|
auto url = mod->homepage();
|
|
auto ver = mod->version();
|
|
if (ver.isEmpty() && meta != nullptr) {
|
|
ver = meta->version().toString();
|
|
}
|
|
auto authors = mod->authors().join(", ");
|
|
auto filename = mod->fileinfo().fileName();
|
|
lines << QString(lineTemplate)
|
|
.replace("{name}", modName)
|
|
.replace("{mod_id}", modID)
|
|
.replace("{url}", url)
|
|
.replace("{version}", ver)
|
|
.replace("{authors}", authors)
|
|
.replace("{filename}", filename);
|
|
}
|
|
return lines.join("\n");
|
|
}
|
|
} // namespace ExportToModList
|