[DeckList] Refactor load from plaintext to take normalizer as param

This commit is contained in:
RickyRister 2026-03-04 16:46:21 -08:00
parent b36ab66583
commit 7782b35f6e
5 changed files with 73 additions and 37 deletions

View file

@ -19,6 +19,7 @@ set(cockatrice_SOURCES
src/client/settings/card_counter_settings.cpp
src/client/settings/shortcut_treeview.cpp
src/client/settings/shortcuts_settings.cpp
src/interface/deck_loader/card_name_normalizer.cpp
src/interface/deck_loader/card_node_function.cpp
src/interface/deck_loader/deck_file_format.cpp
src/interface/deck_loader/deck_loader.cpp

View file

@ -0,0 +1,45 @@
#include "card_name_normalizer.h"
#include "libcockatrice/card/database/card_database_manager.h"
QString CardNameNormalizer::operator()(const QString &cardNameString) const
{
QString cardName = cardNameString;
// Regex for advanced card parsing
static const QRegularExpression reSplitCard(R"( ?\/\/ ?)");
static const QRegularExpression reBrace(R"( ?[\[\{][^\]\}]*[\]\}] ?)"); // not nested
static const QRegularExpression reRoundBrace(R"(^\([^\)]*\) ?)"); // () are only matched at start of string
static const QRegularExpression reDigitBrace(R"( ?\(\d*\) ?)"); // () are matched if containing digits
static const QRegularExpression reBraceDigit(
R"( ?\([\dA-Z]+\) *\d+$)"); // () are matched if containing setcode then a number
static const QRegularExpression reDoubleFacedMarker(R"( ?\(Transform\) ?)");
static const QHash<QRegularExpression, QString> differences{{QRegularExpression(""), "'"},
{QRegularExpression("Æ"), "Ae"},
{QRegularExpression("æ"), "ae"},
{QRegularExpression(" ?[|/]+ ?"), " // "}};
// Handle advanced card types
if (cardName.contains(reSplitCard)) {
cardName = cardName.split(reSplitCard).join(" // ");
}
if (cardName.contains(reDoubleFacedMarker)) {
QStringList faces = cardName.split(reDoubleFacedMarker);
cardName = faces.first().trimmed();
}
// Remove unnecessary characters
cardName.remove(reBrace);
cardName.remove(reRoundBrace); // I'll be entirely honest here, these are split to accommodate just three cards
cardName.remove(reDigitBrace); // from un-sets that have a word in between round braces at the end
cardName.remove(reBraceDigit); // very specific format with the set code in () and collectors number after
// Normalize characters
for (auto diff = differences.constBegin(); diff != differences.constEnd(); ++diff) {
cardName.replace(diff.key(), diff.value());
}
return cardName;
}

View file

@ -0,0 +1,15 @@
#ifndef COCKATRICE_CARD_NAME_NORMALIZER_H
#define COCKATRICE_CARD_NAME_NORMALIZER_H
#include <QString>
/**
* Functor that normalizes the raw card name parsed during a plaintext deck import into the card name that Cockatrice
* uses.
*/
struct CardNameNormalizer
{
QString operator()(const QString &cardNameString) const;
};
#endif // COCKATRICE_CARD_NAME_NORMALIZER_H