adding support to sb as for sideboard, multicolo(u)r and swapping non-token recognition prior to card tokens.

Signed-off-by: leriomaggio <valeriomaggio@gmail.com>
This commit is contained in:
leriomaggio
2021-09-16 19:12:35 +01:00
parent 00723b462c
commit 4f86e9d494
2 changed files with 16 additions and 10 deletions

View File

@@ -204,7 +204,7 @@ public class DeckRecognizer {
public static final String REX_NOCARD = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<title>(\\w+[:]\\s*))?(?<%s>[a-zA-Z]+)(?<post>[^a-zA-Z]*)?$", REGRP_TOKEN); public static final String REX_NOCARD = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<title>(\\w+[:]\\s*))?(?<%s>[a-zA-Z]+)(?<post>[^a-zA-Z]*)?$", REGRP_TOKEN);
public static final String REX_CMC = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<%s>(C(M)?C(\\s)?\\d{1,2}))(?<post>[^\\d]*)?$", REGRP_TOKEN); public static final String REX_CMC = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<%s>(C(M)?C(\\s)?\\d{1,2}))(?<post>[^\\d]*)?$", REGRP_TOKEN);
public static final String REX_RARITY = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<%s>((un)?common|(mythic)?\\s*(rare)?|land))(?<post>[^a-zA-Z]*)?$", REGRP_TOKEN); public static final String REX_RARITY = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<%s>((un)?common|(mythic)?\\s*(rare)?|land))(?<post>[^a-zA-Z]*)?$", REGRP_TOKEN);
public static final String REX_COLOUR = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<%s>(white|blue|black|red|green|colorless))(?<post>[^a-zA-Z]*)?$", REGRP_TOKEN); public static final String REX_COLOUR = String.format("^(?<pre>[^a-zA-Z]*)\\s*(?<%s>(white|blue|black|red|green|colo(u)?rless|multicolo(u)?r))(?<post>[^a-zA-Z]*)?$", REGRP_TOKEN);
public static final Pattern NONCARD_PATTERN = Pattern.compile(REX_NOCARD, Pattern.CASE_INSENSITIVE); public static final Pattern NONCARD_PATTERN = Pattern.compile(REX_NOCARD, Pattern.CASE_INSENSITIVE);
public static final Pattern CMC_PATTERN = Pattern.compile(REX_CMC, Pattern.CASE_INSENSITIVE); public static final Pattern CMC_PATTERN = Pattern.compile(REX_CMC, Pattern.CASE_INSENSITIVE);
public static final Pattern CARD_RARITY_PATTERN = Pattern.compile(REX_RARITY, Pattern.CASE_INSENSITIVE); public static final Pattern CARD_RARITY_PATTERN = Pattern.compile(REX_RARITY, Pattern.CASE_INSENSITIVE);
@@ -265,9 +265,11 @@ public class DeckRecognizer {
// CoreTypes (to recognise Tokens of type CardType // CoreTypes (to recognise Tokens of type CardType
private static final CharSequence[] CARD_TYPES = allCardTypes(); private static final CharSequence[] CARD_TYPES = allCardTypes();
private static final CharSequence[] DECK_SECTION_NAMES = {"avatar", "commander", private static final CharSequence[] DECK_SECTION_NAMES = {
"schemes", "conspiracy", "planes", "deck", "side", "sideboard", "sb",
"main", "card", "mainboard", "side", "sideboard"}; "main", "card", "mainboard",
"avatar", "commander", "schemes",
"conspiracy", "planes", "deck", };
private static CharSequence[] allCardTypes(){ private static CharSequence[] allCardTypes(){
List<String> cardTypesList = new ArrayList<>(); List<String> cardTypesList = new ArrayList<>();
@@ -314,9 +316,9 @@ public class DeckRecognizer {
if (StringUtils.startsWith(line, ASTERISK)) // markdown lists (tappedout md export) if (StringUtils.startsWith(line, ASTERISK)) // markdown lists (tappedout md export)
line = line.substring(2); line = line.substring(2);
Token result = recogniseCardToken(line, referenceSection); Token result = recogniseNonCardToken(line);
if (result == null) if (result == null)
result = recogniseNonCardToken(line); result = recogniseCardToken(line, referenceSection);
return result != null ? result : StringUtils.startsWith(refLine, DOUBLE_SLASH) || StringUtils.startsWith(refLine, LINE_COMMENT_DELIMITER_OR_MD_HEADER) ? return result != null ? result : StringUtils.startsWith(refLine, DOUBLE_SLASH) || StringUtils.startsWith(refLine, LINE_COMMENT_DELIMITER_OR_MD_HEADER) ?
new Token(TokenType.COMMENT, 0, refLine) : new Token(TokenType.UNKNOWN_TEXT, 0, refLine); new Token(TokenType.COMMENT, 0, refLine) : new Token(TokenType.UNKNOWN_TEXT, 0, refLine);
} }
@@ -352,9 +354,7 @@ public class DeckRecognizer {
String collNo = getRexGroup(matcher, REGRP_COLLNR); String collNo = getRexGroup(matcher, REGRP_COLLNR);
String foilGr = getRexGroup(matcher, REGRP_FOIL_GFISH); String foilGr = getRexGroup(matcher, REGRP_FOIL_GFISH);
String deckSec = getRexGroup(matcher, REGRP_DECK_SEC_XMAGE_STYLE); String deckSec = getRexGroup(matcher, REGRP_DECK_SEC_XMAGE_STYLE);
boolean isFoil = false; boolean isFoil = foilGr != null;
if (foilGr != null)
isFoil = true;
int cardCount = ccount != null ? Integer.parseInt(ccount) : 1; int cardCount = ccount != null ? Integer.parseInt(ccount) : 1;
// if any, it will be tried to convert specific collector number to art index (useful for lands). // if any, it will be tried to convert specific collector number to art index (useful for lands).
String collectorNumber = collNo != null ? collNo : IPaperCard.NO_COLLECTOR_NUMBER; String collectorNumber = collNo != null ? collNo : IPaperCard.NO_COLLECTOR_NUMBER;

View File

@@ -239,6 +239,11 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry); assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry);
} }
@Test void testSBshortAsPlaceholderForSideboard(){
String dckSec = "SB:";
assertTrue(DeckRecognizer.isDeckSectionName(dckSec));
}
@Test void testMatchCardTypes(){ @Test void testMatchCardTypes(){
String[] cardTypes = new String[] {"Spell", "instants", "Sorceries", "Sorcery", String[] cardTypes = new String[] {"Spell", "instants", "Sorceries", "Sorcery",
"Artifact", "creatures", "land"}; "Artifact", "creatures", "land"};
@@ -287,7 +292,8 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testManaTokenMatch(){ @Test void testManaTokenMatch(){
String[] cmcTokens = new String[] {"Blue", "red", "White", "// Black", " //Colorless----", "(green)"}; String[] cmcTokens = new String[] {"Blue", "red", "White", "// Black", " //Colorless----", "(green)",
"// Multicolor", "// MultiColour"};
for (String line : cmcTokens) for (String line : cmcTokens)
assertTrue(DeckRecognizer.isManaToken(line), "Fail on " + line); assertTrue(DeckRecognizer.isManaToken(line), "Fail on " + line);