diff --git a/src/main/java/codechicken/nei/SearchTextFormatter.java b/src/main/java/codechicken/nei/SearchTextFormatter.java index 8bd3ea12..534a4108 100644 --- a/src/main/java/codechicken/nei/SearchTextFormatter.java +++ b/src/main/java/codechicken/nei/SearchTextFormatter.java @@ -29,7 +29,7 @@ public class SearchTextFormatter implements TextFormatter { text = SearchTokenParser.SPACE_PATTERN.matcher(text).replaceAll("\\\\ "); } final SearchExpressionFormatVisitor visitor = new SearchExpressionFormatVisitor(searchParser); - return SearchExpressionUtils.visitSearchExpression(text, visitor); + return SearchExpressionUtils.visitRecipeSearchExpression(text, visitor); } else { final StringBuilder formattedText = new StringBuilder(); diff --git a/src/main/java/codechicken/nei/SearchTokenParser.java b/src/main/java/codechicken/nei/SearchTokenParser.java index 2ad6dc20..9cabada3 100644 --- a/src/main/java/codechicken/nei/SearchTokenParser.java +++ b/src/main/java/codechicken/nei/SearchTokenParser.java @@ -238,9 +238,13 @@ public class SearchTokenParser { if (spaceMode == 1) { text = SearchTokenParser.SPACE_PATTERN.matcher(text).replaceAll("\\\\ "); } - - return new IsRegisteredItemFilter( - SearchExpressionUtils.visitSearchExpression(text, new ItemFilterVisitor(this))); + if (skipRecipeTokens) { + return new IsRegisteredItemFilter( + SearchExpressionUtils.visitRecipeSearchExpression(text, new ItemFilterVisitor(this))); + } else { + return new IsRegisteredItemFilter( + SearchExpressionUtils.visitSearchExpression(text, new ItemFilterVisitor(this))); + } }); } @@ -320,7 +324,7 @@ public class SearchTokenParser { text = SearchTokenParser.SPACE_PATTERN.matcher(text).replaceAll("\\\\ "); } - return SearchExpressionUtils.visitSearchExpression(text, new RecipeFilterVisitor(this)); + return SearchExpressionUtils.visitRecipeSearchExpression(text, new RecipeFilterVisitor(this)); }); } diff --git a/src/main/java/codechicken/nei/search/AbstractSearchExpressionVisitor.java b/src/main/java/codechicken/nei/search/AbstractSearchExpressionVisitor.java index 749d07b5..09a06521 100644 --- a/src/main/java/codechicken/nei/search/AbstractSearchExpressionVisitor.java +++ b/src/main/java/codechicken/nei/search/AbstractSearchExpressionVisitor.java @@ -14,4 +14,8 @@ public abstract class AbstractSearchExpressionVisitor extends SearchExpressio return searchParser; } + public T fail() { + return defaultResult(); + } + } diff --git a/src/main/java/codechicken/nei/search/ItemFilterVisitor.java b/src/main/java/codechicken/nei/search/ItemFilterVisitor.java index 2e7b0a47..ae5e2c79 100644 --- a/src/main/java/codechicken/nei/search/ItemFilterVisitor.java +++ b/src/main/java/codechicken/nei/search/ItemFilterVisitor.java @@ -37,6 +37,20 @@ public class ItemFilterVisitor extends AbstractSearchExpressionVisitor anyFilters = new ArrayList<>(); + final List allFilters = new ArrayList<>(); + for (SearchExpressionParser.RecipeClauseExpressionContext clauseCtx : ctx.recipeClauseExpression()) { + addIngredientPermutationItemFilter(clauseCtx.searchExpression(), anyFilters, allFilters); + } + return constructFilter(anyFilters, allFilters); + } + return defaultResult(); + } + @Override public ItemFilter visitOrExpression(SearchExpressionParser.OrExpressionContext ctx) { return visitChildren(ctx, AnyMultiItemFilter::new); @@ -79,6 +93,31 @@ public class ItemFilterVisitor extends AbstractSearchExpressionVisitor anyFilters, List allFilters) { + // Only for ingredients or default + if (ctx.type == 0 || ctx.type == 3) { + if (ctx.allRecipe) { + allFilters.add(visit(ctx)); + } else { + anyFilters.add(visit(ctx)); + } + } + } + + private ItemFilter constructFilter(List anyFilters, List allFilters) { + if (anyFilters.isEmpty()) { + return constructFilter(allFilters, AllMultiItemFilter::new); + } + if (allFilters.isEmpty()) { + return constructFilter(anyFilters, AnyMultiItemFilter::new); + } + final List filters = new ArrayList<>(); + filters.add(constructFilter(allFilters, AllMultiItemFilter::new)); + filters.add(constructFilter(anyFilters, AnyMultiItemFilter::new)); + return constructFilter(filters, AllMultiItemFilter::new); + } + private String getTokenCleanText(SearchExpressionParser.TokenContext ctx) { String cleanText = null; if (ctx.PLAIN_TEXT() != null) { diff --git a/src/main/java/codechicken/nei/search/SearchExpressionUtils.java b/src/main/java/codechicken/nei/search/SearchExpressionUtils.java index 5e3e47b1..67049196 100644 --- a/src/main/java/codechicken/nei/search/SearchExpressionUtils.java +++ b/src/main/java/codechicken/nei/search/SearchExpressionUtils.java @@ -52,6 +52,17 @@ public class SearchExpressionUtils { } public static T visitSearchExpression(String text, AbstractSearchExpressionVisitor visitor) { + SearchExpressionParser parser = createSearchExpressionParser(text, visitor.getSearchParser(), visitor); + SearchExpressionParser.RecipeSearchExpressionContext recipeCtx = parser.recipeSearchExpression(); + // Manually check whether it's not a recipe expression, because parser would parse it either way + if (recipeCtx.recipeClauseExpression() != null && recipeCtx.recipeClauseExpression().size() == 1 + && recipeCtx.recipeClauseExpression(0).searchExpression().type == 3) { + return visitor.visitSearchExpression(recipeCtx.recipeClauseExpression(0).searchExpression()); + } + return visitor.fail(); + } + + public static T visitRecipeSearchExpression(String text, AbstractSearchExpressionVisitor visitor) { SearchExpressionParser parser = createSearchExpressionParser(text, visitor.getSearchParser(), visitor); return visitor.visitRecipeSearchExpression(parser.recipeSearchExpression()); }