diff --git a/src/main/java/codechicken/nei/RecipeSearchField.java b/src/main/java/codechicken/nei/RecipeSearchField.java index 822990c4..9cb4b6dd 100644 --- a/src/main/java/codechicken/nei/RecipeSearchField.java +++ b/src/main/java/codechicken/nei/RecipeSearchField.java @@ -23,6 +23,7 @@ public abstract class RecipeSearchField extends TextField implements ItemFilterP final GuiSearchField field = new GuiSearchField(); field.setMaxStringLength(maxSearchLength); field.setCursorPositionZero(); + field.setSkipRecipeTokens(true); ((SearchTextFormatter) field.getFormatter()).setContextToken("<>"); this.field = field; } diff --git a/src/main/java/codechicken/nei/SearchField.java b/src/main/java/codechicken/nei/SearchField.java index 818d20a4..b35e0f33 100644 --- a/src/main/java/codechicken/nei/SearchField.java +++ b/src/main/java/codechicken/nei/SearchField.java @@ -93,6 +93,7 @@ public class SearchField extends TextField implements ItemFilterProvider { public static class GuiSearchField extends FormattedTextField implements ItemFilterProvider, IRecipeFilterProvider { protected final SearchTokenParser searchParser; + protected boolean skipRecipeTokens = false; public GuiSearchField() { this(SearchField.searchParser); @@ -106,6 +107,10 @@ public class SearchField extends TextField implements ItemFilterProvider { setPlaceholder(NEIClientUtils.translate("inventory.search.placeholder")); } + public void setSkipRecipeTokens(boolean skipRecipeTokens) { + this.skipRecipeTokens = skipRecipeTokens; + } + @Override public ItemFilter getFilter() { return getFilter(getText()); @@ -117,7 +122,7 @@ public class SearchField extends TextField implements ItemFilterProvider { } public ItemFilter getFilter(String filterText) { - return this.searchParser.getFilter(filterText); + return this.searchParser.getFilter(filterText, this.skipRecipeTokens); } public IRecipeFilter getRecipeFilter(String filterText) { diff --git a/src/main/java/codechicken/nei/SearchTextFormatter.java b/src/main/java/codechicken/nei/SearchTextFormatter.java index ff74a440..8bd3ea12 100644 --- a/src/main/java/codechicken/nei/SearchTextFormatter.java +++ b/src/main/java/codechicken/nei/SearchTextFormatter.java @@ -42,7 +42,9 @@ public class SearchTextFormatter implements TextFormatter { if (!contextPart[0].isEmpty()) { formattedText.append( - SearchExpressionUtils.HIGHLIGHTS.RECIPE + contextPart[0] + EnumChatFormatting.RESET); + SearchExpressionUtils.HIGHLIGHTS.RECIPE + contextPart[0].substring(0, 1) + + EnumChatFormatting.RESET); + contextPart[1] = contextPart[0].substring(1) + contextPart[1]; } if (contextPart[1].isEmpty()) { diff --git a/src/main/java/codechicken/nei/SearchTokenParser.java b/src/main/java/codechicken/nei/SearchTokenParser.java index d50fe890..2ad6dc20 100644 --- a/src/main/java/codechicken/nei/SearchTokenParser.java +++ b/src/main/java/codechicken/nei/SearchTokenParser.java @@ -173,7 +173,11 @@ public class SearchTokenParser { } public synchronized ItemFilter getFilter(String filterText) { - filterText = EnumChatFormatting.getTextWithoutFormattingCodes(filterText).toLowerCase(); + return getFilter(filterText, false); + } + + public synchronized ItemFilter getFilter(String rawText, boolean skipRecipeTokens) { + final String filterText = EnumChatFormatting.getTextWithoutFormattingCodes(rawText).toLowerCase(); if (filterText == null || filterText.isEmpty()) { return new EverythingItemFilter(); @@ -182,10 +186,10 @@ public class SearchTokenParser { final int patternMode = NEIClientConfig.getIntSetting("inventory.search.patternMode"); if (patternMode != 3) { - return this.filtersCache.computeIfAbsent(filterText, text -> { + return this.filtersCache.computeIfAbsent(skipRecipeTokens + ":" + filterText, _t -> { final List searchTokens = new ArrayList<>(); - for (String[] subQuery : splitByDelimiters(text, "|", false)) { + for (String[] subQuery : splitByDelimiters(filterText, "|", false)) { if (subQuery[1].isEmpty()) { continue; @@ -193,11 +197,22 @@ public class SearchTokenParser { final List tokens = new ArrayList<>(); - for (SearchToken token : splitSearchText(subQuery[1])) { - final ItemFilter result = token.getFilter(this); + for (String[] contextQuery : splitByDelimiters(subQuery[1], skipRecipeTokens ? "<>" : "", false)) { - if (result != null) { - tokens.add(result); + if (contextQuery[1].isEmpty() || contextQuery[0].startsWith(">")) { + continue; + } + + if (!contextQuery[0].isEmpty()) { + contextQuery[0] = contextQuery[0].substring(1); + } + + for (SearchToken token : splitSearchText(contextQuery[0] + contextQuery[1])) { + final ItemFilter result = token.getFilter(this); + + if (result != null) { + tokens.add(result); + } } }