diff --git a/src/main/antlr/SearchExpressionLexer.g4 b/src/main/antlr/SearchExpressionLexer.g4 index 64dde9b0..a509ded5 100644 --- a/src/main/antlr/SearchExpressionLexer.g4 +++ b/src/main/antlr/SearchExpressionLexer.g4 @@ -18,20 +18,22 @@ public SearchExpressionLexer(CharStream input, SearchTokenParser searchParser) { // Lexer rules REGEX_LEFT : 'r'? '/' -> pushMode(REGEX) ; QUOTE_LEFT : '"' -> pushMode(QUOTED) ; + DASH : '-' ; + RECIPE_INGREDIENTS : '<&' | '<' ; RECIPE_RESULT : '>&' | '>' ; RECIPE_OTHERS : '^&' | '^' ; -PREFIX : CLEAN_SYMBOL {searchParser.hasRedefinedPrefix(getText().charAt(0))}? ; + OR : '|' ; LEFT_BRACKET : '{' ; RIGHT_BRACKET : '}' ; -PLAIN_TEXT : (CLEAN_SYMBOL | ESCAPED_SYMBOL)+ {!searchParser.hasRedefinedPrefix(getText().charAt(0))}? ; NEWLINE_OR_TAB : [\t\r\n] -> skip ; SPACE : ' ' ; +ESCAPED_SYMBOL : '\\' . ; -fragment ESCAPED_SYMBOL : '\\' . ; -fragment CLEAN_SYMBOL : ~[-<>^{}|/\\ "] ; +PREFIX : CLEAN_SYMBOL {searchParser.hasRedefinedPrefix(getText().charAt(0))}? ; +CLEAN_SYMBOL : ~[-<>^{}|/\\ "] ; mode REGEX; diff --git a/src/main/antlr/SearchExpressionParser.g4 b/src/main/antlr/SearchExpressionParser.g4 index 4abcf184..6051825a 100644 --- a/src/main/antlr/SearchExpressionParser.g4 +++ b/src/main/antlr/SearchExpressionParser.g4 @@ -56,7 +56,7 @@ prefixedExpression token[Character prefix] : regex[prefix] | quoted[prefix] - | PLAIN_TEXT + | plainText ; regex[Character prefix] @@ -67,4 +67,7 @@ quoted[Character prefix] : QUOTE_LEFT QUOTED_CONTENT QUOTE_RIGHT? ; +plainText + : (CLEAN_SYMBOL | ESCAPED_SYMBOL)+ + ; diff --git a/src/main/java/codechicken/nei/search/ItemFilterVisitor.java b/src/main/java/codechicken/nei/search/ItemFilterVisitor.java index ae5e2c79..b42ecbf5 100644 --- a/src/main/java/codechicken/nei/search/ItemFilterVisitor.java +++ b/src/main/java/codechicken/nei/search/ItemFilterVisitor.java @@ -20,7 +20,7 @@ import codechicken.nei.api.ItemFilter; public class ItemFilterVisitor extends AbstractSearchExpressionVisitor { private static final Pattern REGEX_ESCAPED_SPACE_PATTERN = Pattern.compile("([^\\\\](?:\\\\\\\\)+)?\\\\ "); - private static final Pattern PLAIN_TEXT_ESCAPED_PATTERN = Pattern.compile("\\\\(.)"); + private static final Pattern ESCAPED_SYMBOL_PATTERN = Pattern.compile("\\\\(.)"); private static final Pattern ESCAPED_QUOTE_PATTERN = Pattern.compile("\\\\\""); private static final Pattern ESCAPED_SPACE_PATTERN = Pattern.compile("\\\\ "); @@ -69,21 +69,21 @@ public class ItemFilterVisitor extends AbstractSearchExpressionVisitor, ItemFilter> filterConstructor) { diff --git a/src/main/java/codechicken/nei/search/SearchExpressionFormatVisitor.java b/src/main/java/codechicken/nei/search/SearchExpressionFormatVisitor.java index 66909b45..55ba1b9e 100644 --- a/src/main/java/codechicken/nei/search/SearchExpressionFormatVisitor.java +++ b/src/main/java/codechicken/nei/search/SearchExpressionFormatVisitor.java @@ -62,8 +62,8 @@ public class SearchExpressionFormatVisitor extends AbstractSearchExpressionVisit private String getTokenCleanText(SearchExpressionParser.TokenContext ctx, Character prefix) { String cleanText = null; final int spaceModeEnabled = NEIClientConfig.getIntSetting("inventory.search.spaceMode"); - if (ctx.PLAIN_TEXT() != null) { - cleanText = ctx.PLAIN_TEXT().getSymbol().getText(); + if (ctx.plainText() != null) { + cleanText = ctx.plainText().getText(); // Unescape spaces if (spaceModeEnabled == 1) { cleanText = ESCAPED_SPACE_PATTERN.matcher(cleanText).replaceAll(" "); diff --git a/src/test/java/codechicken/nei/SearchTokenParserTest.java b/src/test/java/codechicken/nei/SearchTokenParserTest.java index 792cf92a..273c7d50 100644 --- a/src/test/java/codechicken/nei/SearchTokenParserTest.java +++ b/src/test/java/codechicken/nei/SearchTokenParserTest.java @@ -88,6 +88,11 @@ public class SearchTokenParserTest { protected String getIdentifier(ItemStack stack) { return getStringIdentifier(stack); } + + @Override + public String toString() { + return "PREFIX(" + pattern.toString() + ")"; + } }; private static MockedStatic config; @@ -284,12 +289,14 @@ public class SearchTokenParserTest { searchParser.addProvider(defaultParserProvider); searchParser .addProvider(parserProvider('?', "custom", SearchTokenParser.SearchMode.PREFIX, customCreateFilter)); + searchParser + .addProvider(parserProvider('*', "custom2", SearchTokenParser.SearchMode.PREFIX, customCreateFilter)); Set matchedItems = testFilterAgainstAllItems( spaceMode, patternMode, searchParser, - "\"" + itemA.getDisplayName() + "\"?A"); + "\"" + itemA.getDisplayName() + "\"?A*A"); assertEquals(1, matchedItems.size()); assertTrue(matchedItems.contains(itemA));