From 4f86e9d494d5bf0d30e6769a752d08935ebbcc91 Mon Sep 17 00:00:00 2001 From: leriomaggio Date: Thu, 16 Sep 2021 19:12:35 +0100 Subject: [PATCH] adding support to sb as for sideboard, multicolo(u)r and swapping non-token recognition prior to card tokens. Signed-off-by: leriomaggio --- .../main/java/forge/deck/DeckRecognizer.java | 18 +++++++++--------- .../java/forge/deck/DeckRecognizerTest.java | 8 +++++++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index 8b05469f42e..2ecf0cf9fd2 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -204,7 +204,7 @@ public class DeckRecognizer { public static final String REX_NOCARD = String.format("^(?
[^a-zA-Z]*)\\s*(?(\\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_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 CMC_PATTERN = Pattern.compile(REX_CMC, 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
     private static final CharSequence[] CARD_TYPES = allCardTypes();
-    private static final CharSequence[] DECK_SECTION_NAMES = {"avatar", "commander",
-            "schemes", "conspiracy", "planes", "deck",
-            "main", "card", "mainboard", "side", "sideboard"};
+    private static final CharSequence[] DECK_SECTION_NAMES = {
+            "side", "sideboard", "sb",
+            "main", "card", "mainboard",
+            "avatar", "commander", "schemes",
+            "conspiracy", "planes", "deck", };
 
     private static CharSequence[] allCardTypes(){
         List<String> cardTypesList = new ArrayList<>();
@@ -314,9 +316,9 @@ public class DeckRecognizer {
         if (StringUtils.startsWith(line, ASTERISK))  // markdown lists (tappedout md export)
             line = line.substring(2);
 
-        Token result = recogniseCardToken(line, referenceSection);
+        Token result = recogniseNonCardToken(line);
         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) ?
                 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 foilGr = getRexGroup(matcher, REGRP_FOIL_GFISH);
             String deckSec = getRexGroup(matcher, REGRP_DECK_SEC_XMAGE_STYLE);
-            boolean isFoil = false;
-            if (foilGr != null)
-                isFoil = true;
+            boolean isFoil = foilGr != null;
             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).
             String collectorNumber = collNo != null ? collNo : IPaperCard.NO_COLLECTOR_NUMBER;
diff --git a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java
index 53cc3c16e25..e6d460af058 100644
--- a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java
+++ b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java
@@ -239,6 +239,11 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
             assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry);
     }
 
+    @Test void testSBshortAsPlaceholderForSideboard(){
+        String dckSec = "SB:";
+        assertTrue(DeckRecognizer.isDeckSectionName(dckSec));
+    }
+
     @Test void testMatchCardTypes(){
         String[] cardTypes = new String[] {"Spell", "instants", "Sorceries", "Sorcery",
                 "Artifact", "creatures", "land"};
@@ -287,7 +292,8 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
     }
 
     @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)
             assertTrue(DeckRecognizer.isManaToken(line), "Fail on " + line);