// SPDX-License-Identifier: GPL-3.0-only /* * Prism Launcher - Minecraft Launcher * Copyright (c) 2023 Trial97 * * 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 . */ #include "ExportToModList.h" #include #include #include namespace { QString toHTML(const QList& 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("%2").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("
  • %1
  • ").arg(line)); } return QString("
      \n\t%1\n
    ").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& 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& 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& 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& 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& 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& 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