mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-28 00:42:19 -07:00
This commit is contained in:
parent
6823d54c1e
commit
276873f0bd
2 changed files with 112 additions and 17 deletions
|
|
@ -65,7 +65,7 @@ RegexMatcherString <- ('\\/' / !'/' .)+
|
|||
FlexStringValue <- CompactStringSet / String / [(] StringList [)]
|
||||
CompactStringSet <- StringListString ([,+] StringListString)+
|
||||
|
||||
SetExpression <- NumericOperator ws? String
|
||||
SetExpression <- <NumericOperator> ws? String
|
||||
|
||||
NumericExpression <- NumericOperator ws? NumericValue
|
||||
NumericOperator <- [=:] / <[><!][=]?>
|
||||
|
|
@ -114,16 +114,8 @@ static void setupParserRules()
|
|||
};
|
||||
}
|
||||
|
||||
auto matcher = std::any_cast<NumberMatcher>(sv[0]);
|
||||
return [=](const CardData &x) -> bool {
|
||||
const auto &sets = x->getSets().values();
|
||||
auto matchesSet = [&](const PrintingInfo &printing) {
|
||||
return printing.getSet()->getEnabled() && matcher(printing.getSet()->getReleaseDate().toJulianDay());
|
||||
};
|
||||
return std::any_of(sets.begin(), sets.end(), [&](const auto &printings) {
|
||||
return std::any_of(printings.begin(), printings.end(), matchesSet);
|
||||
});
|
||||
};
|
||||
auto matcher = std::any_cast<Filter>(sv[0]);
|
||||
return matcher;
|
||||
};
|
||||
search["Rarity"] = [](const peg::SemanticValues &sv) -> QString {
|
||||
switch (tolower(std::string(sv.sv())[0])) {
|
||||
|
|
@ -300,17 +292,57 @@ static void setupParserRules()
|
|||
return [=](int s) { return comparer(s, arg); };
|
||||
};
|
||||
|
||||
search["SetExpression"] = [](const peg::SemanticValues &sv) -> NumberMatcher {
|
||||
search["SetExpression"] = [](const peg::SemanticValues &sv) -> Filter {
|
||||
const auto comparer = std::any_cast<NumberComparer>(sv[0]);
|
||||
const auto setCode = std::any_cast<QString>(sv[1]);
|
||||
const auto operatorText = QString::fromStdString(std::string(sv.token(0)));
|
||||
|
||||
auto printingsOf = [](const CardData &x) {
|
||||
QList<PrintingInfo> printings;
|
||||
for (const auto &printingsPerSet : x->getSets()) {
|
||||
printings.append(printingsPerSet);
|
||||
}
|
||||
return printings;
|
||||
};
|
||||
auto isExactSet = [setCode](const PrintingInfo &printing) {
|
||||
return printing.getSet()->getEnabled() &&
|
||||
printing.getSet()->getShortName().compare(setCode, Qt::CaseInsensitive) == 0;
|
||||
};
|
||||
|
||||
if (operatorText == ":" || operatorText == "=") {
|
||||
return [=](const CardData &x) {
|
||||
const auto printings = printingsOf(x);
|
||||
return std::any_of(printings.begin(), printings.end(), isExactSet);
|
||||
};
|
||||
}
|
||||
if (operatorText == "!" || operatorText == "!=") {
|
||||
return [=](const CardData &x) {
|
||||
const auto printings = printingsOf(x);
|
||||
return std::none_of(printings.begin(), printings.end(), isExactSet);
|
||||
};
|
||||
}
|
||||
|
||||
const auto allSets = CardDatabaseManager::getInstance()->getSetList();
|
||||
for (auto &set : allSets) {
|
||||
if (set->getShortName() == setCode) {
|
||||
const int releaseDate = set->getReleaseDate().toJulianDay();
|
||||
return [=](int s) { return comparer(s, releaseDate); };
|
||||
int releaseDate = 0;
|
||||
bool setFound = false;
|
||||
for (const auto &set : allSets) {
|
||||
if (set->getShortName().compare(setCode, Qt::CaseInsensitive) == 0) {
|
||||
releaseDate = set->getReleaseDate().toJulianDay();
|
||||
setFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return [](int) { return false; };
|
||||
if (!setFound) {
|
||||
return [](const CardData &) { return false; };
|
||||
}
|
||||
auto matchesReleaseDate = [comparer, releaseDate](const PrintingInfo &printing) {
|
||||
return printing.getSet()->getEnabled() &&
|
||||
comparer(printing.getSet()->getReleaseDate().toJulianDay(), releaseDate);
|
||||
};
|
||||
return [=](const CardData &x) {
|
||||
const auto printings = printingsOf(x);
|
||||
return std::any_of(printings.begin(), printings.end(), matchesReleaseDate);
|
||||
};
|
||||
};
|
||||
|
||||
search["NormalMatcher"] = [](const peg::SemanticValues &sv) -> StringMatcher {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue