diff --git a/Mage/src/main/java/mage/cards/decks/CardNameUtil.java b/Mage/src/main/java/mage/cards/decks/CardNameUtil.java new file mode 100644 index 00000000000..0389aa8774b --- /dev/null +++ b/Mage/src/main/java/mage/cards/decks/CardNameUtil.java @@ -0,0 +1,22 @@ +package mage.cards.decks; + +import java.util.regex.Pattern; + +public class CardNameUtil { + + public static final Pattern CARD_NAME_PATTERN = Pattern.compile("[ !\"&',\\-./0-9:A-Za-z]+"); + + public static String normalizeCardName(String name) { + return name + .replace("&", "//") + .replace("Æ", "Ae") + .replace("ö", "o") + .replace("û", "u") + .replace("í", "i") + .replace("â", "a") + .replace("á", "a") + .replace("ú", "u") + .replace("\"", "'"); + } + +} diff --git a/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java b/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java index 2a7aa1ae3e1..73d07878e9d 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java +++ b/Mage/src/main/java/mage/cards/decks/importer/CardLookup.java @@ -9,14 +9,47 @@ import mage.cards.repository.CardRepository; public class CardLookup { - public static final CardLookup instance = new CardLookup(); + public static final CardLookup instance = new CardLookup(); - public Optional lookupCardInfo(String name) { - return Optional.ofNullable(CardRepository.instance.findPreferedCoreExpansionCard(name, true)); - } + public Optional lookupCardInfo(String name) { + return Optional.ofNullable(CardRepository.instance.findPreferedCoreExpansionCard(name, true)); + } - public List lookupCardInfo(CardCriteria criteria) { - return CardRepository.instance.findCards(criteria); - } + public List lookupCardInfo(CardCriteria criteria) { + return CardRepository.instance.findCards(criteria); + } + + public Optional lookupCardInfo(String name, String set) { + Optional result = lookupCardInfo(new CardCriteria().name(name).setCodes(set)) + .stream() + .findAny(); + if (result.isPresent()) { + return result; + } + + return lookupCardInfo(name); + } + + public Optional lookupCardInfo(String name, String set, String cardNumber) { + Optional result; + try { + int intCardNumber = Integer.parseInt(cardNumber); + result = lookupCardInfo( + new CardCriteria() + .name(name) + .setCodes(set) + .minCardNumber(intCardNumber) + .maxCardNumber(intCardNumber)) + .stream() + .findAny(); + if (result.isPresent()) { + return result; + } + } catch (NumberFormatException ignored) { + /* ignored */ + } + + return lookupCardInfo(name, set); + } } diff --git a/Mage/src/main/java/mage/cards/decks/importer/MtgaImporter.java b/Mage/src/main/java/mage/cards/decks/importer/MtgaImporter.java index eedbfddb690..4949690873e 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/MtgaImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/MtgaImporter.java @@ -1,6 +1,7 @@ package mage.cards.decks.importer; import com.google.common.collect.ImmutableMap; +import mage.cards.decks.CardNameUtil; import mage.cards.decks.DeckCardInfo; import mage.cards.decks.DeckCardLists; import mage.cards.repository.CardCriteria; @@ -13,13 +14,15 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static mage.cards.decks.CardNameUtil.CARD_NAME_PATTERN; + public class MtgaImporter extends PlainTextDeckImporter { private static final Map SET_REMAPPING = ImmutableMap.of("DAR", "DOM"); private static final Pattern MTGA_PATTERN = Pattern.compile( "(\\p{Digit}+)" + "\\p{javaWhitespace}+" + - "([ !\"&',\\-./0-9:A-Za-zé]+)" + + "(" + CARD_NAME_PATTERN.pattern() + ")" + "\\p{javaWhitespace}+" + "\\((\\p{Alnum}+)\\)" + "\\p{javaWhitespace}+" + @@ -35,15 +38,14 @@ public class MtgaImporter extends PlainTextDeckImporter { return; } - Matcher m = MTGA_PATTERN.matcher(line); + Matcher m = MTGA_PATTERN.matcher(CardNameUtil.normalizeCardName(line)); if (m.matches()) { int count = Integer.parseInt(m.group(1)); String name = m.group(2); String set = SET_REMAPPING.getOrDefault(m.group(3), m.group(3)); + String cardNumber = m.group(4); final List zone = sideboard ? deckList.getSideboard() : deckList.getCards(); - Optional found = lookup.lookupCardInfo(new CardCriteria().name(name).setCodes(set)) - .stream() - .findAny(); + Optional found = lookup.lookupCardInfo(name, set, cardNumber); if (!found.isPresent()) { sbMessage.append("Cound not find card for '").append(line).append("'\n"); } else { diff --git a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java index 2941efcd6b6..e38a19e6ebf 100644 --- a/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java +++ b/Mage/src/main/java/mage/cards/decks/importer/TxtDeckImporter.java @@ -1,5 +1,6 @@ package mage.cards.decks.importer; +import mage.cards.decks.CardNameUtil; import mage.cards.decks.DeckCardInfo; import mage.cards.decks.DeckCardLists; import mage.cards.repository.CardInfo; @@ -109,16 +110,7 @@ public class TxtDeckImporter extends PlainTextDeckImporter { cardAmount = 1; } - lineName = lineName - .replace("&", "//") - .replace("Æ", "Ae") - .replace("ö", "o") - .replace("û", "u") - .replace("í", "i") - .replace("â", "a") - .replace("á", "a") - .replace("ú", "u") - .replace("\"", "'"); + lineName = CardNameUtil.normalizeCardName(lineName); if (lineName.contains("//") && !lineName.contains(" // ")) { lineName = lineName.replace("//", " // "); }