From 28d653a3b503eff0eb474d1e4fc6a653ebabfba6 Mon Sep 17 00:00:00 2001 From: slprime Date: Thu, 13 Jun 2024 08:25:33 +0300 Subject: [PATCH] add matching language to searh parser --- .../java/codechicken/nei/LayoutManager.java | 4 +- .../java/codechicken/nei/NEIClientConfig.java | 14 +- .../codechicken/nei/RecipeSearchField.java | 3 +- .../java/codechicken/nei/SearchField.java | 266 +----------------- .../codechicken/nei/SearchTextFormatter.java | 79 ++++++ .../codechicken/nei/SearchTokenParser.java | 192 +++++++++++++ .../java/codechicken/nei/SubsetWidget.java | 4 +- src/main/java/codechicken/nei/api/API.java | 4 +- .../java/codechicken/nei/api/ItemInfo.java | 51 +++- .../nei/search/IdentifierFilter.java | 18 +- .../codechicken/nei/search/TooltipFilter.java | 2 +- src/main/resources/assets/nei/lang/en_US.lang | 6 - 12 files changed, 353 insertions(+), 290 deletions(-) create mode 100644 src/main/java/codechicken/nei/SearchTextFormatter.java create mode 100644 src/main/java/codechicken/nei/SearchTokenParser.java diff --git a/src/main/java/codechicken/nei/LayoutManager.java b/src/main/java/codechicken/nei/LayoutManager.java index e5a6bcdf8..5a8162ddb 100644 --- a/src/main/java/codechicken/nei/LayoutManager.java +++ b/src/main/java/codechicken/nei/LayoutManager.java @@ -185,7 +185,7 @@ protected boolean isAllowedGuiAutoSearchFocus(GuiContainer gui) { protected void searchFocusInitCancelCheck() { if (searchInitFocusedCancellable) { - if (searchField.isVisible() && NEIClientConfig.isFocusSearchWidgetOnOpen() + if (searchField.isVisible() && NEIClientConfig.searchWidgetAutofocus() && getInputFocused() == searchField) { searchField.setFocus(false); setInputFocused(null); @@ -676,7 +676,7 @@ public void load(GuiContainer gui) { mousePriorX = -1; mousePriorY = -1; - if (searchField.isVisible() && NEIClientConfig.isFocusSearchWidgetOnOpen() + if (searchField.isVisible() && NEIClientConfig.searchWidgetAutofocus() && isAllowedGuiAutoSearchFocus(gui)) { searchField.setFocus(true); setInputFocused(searchField); diff --git a/src/main/java/codechicken/nei/NEIClientConfig.java b/src/main/java/codechicken/nei/NEIClientConfig.java index a39623957..444fb10a3 100644 --- a/src/main/java/codechicken/nei/NEIClientConfig.java +++ b/src/main/java/codechicken/nei/NEIClientConfig.java @@ -173,7 +173,8 @@ public boolean optionValid(int index) { API.addOption(new OptionToggleButton("inventory.search.widgetPosition", true)); tag.getTag("inventory.search.widgetAutofocus") - .setComment("Focus Search Widget on Open, blurs on mouse move unless typing has started first") + .setComment( + "Focus Search Widget on Open, blurs/unfocuses on mouse move unless typing has started first") .getBooleanValue(false); API.addOption(new OptionToggleButton("inventory.search.widgetAutofocus", true)); @@ -342,15 +343,6 @@ public boolean onClick(int button) { tag.getTag("inventory.showItemQuantityWidget").setComment("Show Item Quantity Widget").getBooleanValue(true); API.addOption(new OptionToggleButton("inventory.showItemQuantityWidget", true)); - tag.getTag("inventory.centerSearchWidget").setComment("Center Search Widget").getBooleanValue(true); - API.addOption(new OptionToggleButton("inventory.centerSearchWidget", true)); - - tag.getTag("inventory.focusSearchWidgetOnOpen") - .setComment( - "Focus Search Widget on Open, blurs/unfocuses on mouse move unless typing has started first") - .getBooleanValue(false); - API.addOption(new OptionToggleButton("inventory.focusSearchWidgetOnOpen", true)); - tag.getTag("inventory.firstInvCloseClosesInSearch").setComment( "Pressing the open inventory key when the inventory was just opened when the search is focused will close it instead of typing in the search") .getBooleanValue(true); @@ -698,7 +690,7 @@ public static boolean isSearchWidgetCentered() { return getBooleanSetting("inventory.search.widgetPosition"); } - public static boolean isFocusSearchWidgetOnOpen() { + public static boolean searchWidgetAutofocus() { return getBooleanSetting("inventory.search.widgetAutofocus"); } diff --git a/src/main/java/codechicken/nei/RecipeSearchField.java b/src/main/java/codechicken/nei/RecipeSearchField.java index 65f55777d..ee3c5abb5 100644 --- a/src/main/java/codechicken/nei/RecipeSearchField.java +++ b/src/main/java/codechicken/nei/RecipeSearchField.java @@ -3,7 +3,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.util.EnumChatFormatting; -import codechicken.nei.SearchField.SearchTextFormatter; import codechicken.nei.api.ItemFilter; import codechicken.nei.util.TextHistory; @@ -19,7 +18,7 @@ public RecipeSearchField(String ident) { @Override protected void initInternalTextField() { field = new FormattedTextField(Minecraft.getMinecraft().fontRenderer, 0, 0, 0, 0); - ((FormattedTextField) field).setFormatter(new SearchTextFormatter()); + ((FormattedTextField) field).setFormatter(new SearchTextFormatter(SearchField.searchParser)); field.setMaxStringLength(maxSearchLength); field.setCursorPositionZero(); } diff --git a/src/main/java/codechicken/nei/SearchField.java b/src/main/java/codechicken/nei/SearchField.java index 461d5854b..2cec6863f 100644 --- a/src/main/java/codechicken/nei/SearchField.java +++ b/src/main/java/codechicken/nei/SearchField.java @@ -2,18 +2,12 @@ import static codechicken.nei.NEIClientConfig.world; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.StringJoiner; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import java.util.stream.Collectors; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; @@ -21,46 +15,17 @@ import net.minecraftforge.fluids.FluidStack; import codechicken.lib.gui.GuiDraw; -import codechicken.nei.FormattedTextField.TextFormatter; -import codechicken.nei.ItemList.AllMultiItemFilter; -import codechicken.nei.ItemList.AnyMultiItemFilter; -import codechicken.nei.ItemList.EverythingItemFilter; -import codechicken.nei.ItemList.NegatedItemFilter; import codechicken.nei.ItemList.NothingItemFilter; -import codechicken.nei.ItemList.PatternItemFilter; +import codechicken.nei.SearchTokenParser.ISearchParserProvider; +import codechicken.nei.SearchTokenParser.SearchMode; import codechicken.nei.api.API; import codechicken.nei.api.ItemFilter; import codechicken.nei.api.ItemFilter.ItemFilterProvider; import codechicken.nei.recipe.StackInfo; -import codechicken.nei.search.IdentifierFilter; -import codechicken.nei.search.ModNameFilter; -import codechicken.nei.search.OreDictionaryFilter; -import codechicken.nei.search.TooltipFilter; import codechicken.nei.util.TextHistory; -import scala.collection.mutable.StringBuilder; public class SearchField extends TextField implements ItemFilterProvider { - public enum SearchMode { - - ALWAYS, - PREFIX, - NEVER; - - public static SearchMode fromInt(int value) { - switch (value) { - case 0: - return ALWAYS; - case 1: - return PREFIX; - case 2: - return NEVER; - default: - return ALWAYS; - } - } - } - /** * Interface for returning a custom filter based on search field text */ @@ -78,20 +43,9 @@ public static interface ISearchProvider { public ItemFilter getFilter(String searchText); } - public static interface ISearchParserProvider { - - public ItemFilter getFilter(String searchText); - - public char getPrefix(); - - public EnumChatFormatting getHighlightedColor(); - - public SearchMode getSearchMode(); - } - public static class SearchParserProvider implements ISearchParserProvider { - protected final List> subFilters = new ArrayList<>(); + protected final Function createFilter; protected final String name; protected final char prefix; protected final EnumChatFormatting highlightedColor; @@ -101,11 +55,7 @@ public SearchParserProvider(char prefix, String name, EnumChatFormatting highlig this.prefix = prefix; this.name = name; this.highlightedColor = highlightedColor; - this.addSubFilter(createFilter); - } - - public void addSubFilter(Function subFilter) { - this.subFilters.add(subFilter); + this.createFilter = createFilter; } @Override @@ -116,21 +66,13 @@ public ItemFilter getFilter(String searchText) { return this.createFilter(pattern); } - return null; + return new NothingItemFilter(); } protected ItemFilter createFilter(Pattern pattern) { - final List filters = new ArrayList<>(); - - for (Function createFilter : this.subFilters) { - ItemFilter filter = createFilter.apply(pattern); - if (filter != null) { - filters.add(filter); - } - - } + final ItemFilter filter = this.createFilter.apply(pattern); - return filters.isEmpty() ? null : new AnyMultiItemFilter(filters); + return filter == null ? new NothingItemFilter() : filter; } @Override @@ -149,72 +91,9 @@ public SearchMode getSearchMode() { } } - public static class SearchTextFormatter implements TextFormatter { - - public String format(String text) { - final String[] parts = text.split("\\|"); - StringJoiner formattedText = new StringJoiner(EnumChatFormatting.GRAY + "|"); - - for (String filterText : parts) { - Matcher filterMatcher = SearchField.getFilterSplitPattern().matcher(filterText); - StringBuilder formattedPart = new StringBuilder(); - int startIndex = 0; - - while (filterMatcher.find()) { - boolean ignore = "-".equals(filterMatcher.group(2)); - String firstChar = filterMatcher.group(3); - String token = filterMatcher.group(4); - boolean quotes = token.length() > 1 && token.startsWith("\"") && token.endsWith("\""); - - if (quotes) { - token = token.substring(1, token.length() - 1); - } - - formattedPart.append(filterText.substring(startIndex, filterMatcher.start())); - EnumChatFormatting tokenColor = EnumChatFormatting.RESET; - - if (!firstChar.isEmpty()) { - tokenColor = SearchField.searchParserProviders.get(firstChar.charAt(0)).getHighlightedColor(); - } - - if (ignore) { - formattedPart.append(EnumChatFormatting.BLUE + "-"); - } - - if (!firstChar.isEmpty()) { - formattedPart.append(tokenColor + firstChar); - } - - if (quotes) { - formattedPart.append(EnumChatFormatting.GOLD + "\""); - } - - if (!token.isEmpty()) { - formattedPart.append(tokenColor + token); - } - - if (quotes) { - formattedPart.append(EnumChatFormatting.GOLD + "\""); - } - - startIndex = filterMatcher.end(); - } - - formattedPart.append(filterText.substring(startIndex, filterText.length())); - formattedText.add(formattedPart); - } - - if (text.endsWith("|")) { - formattedText.add(""); - } - - return formattedText.toString(); - } - } - @Deprecated public static List searchProviders = new LinkedList<>(); - public static final Map searchParserProviders = new HashMap<>(); + public static SearchTokenParser searchParser = new SearchTokenParser(); private static final TextHistory history = new TextHistory(); private boolean isVisible = true; private long lastclicktime; @@ -222,49 +101,12 @@ public String format(String text) { public SearchField(String ident) { super(ident); API.addItemFilter(this); - API.addSearchProvider( - new SearchParserProvider( - '\0', - "default", - EnumChatFormatting.RESET, - (pattern) -> new PatternItemFilter(pattern)) { - - @Override - public SearchMode getSearchMode() { - return SearchMode.ALWAYS; - } - - }); - API.addSearchProvider( - new SearchParserProvider( - '@', - "modName", - EnumChatFormatting.LIGHT_PURPLE, - (pattern) -> new ModNameFilter(pattern))); - API.addSearchProvider( - new SearchParserProvider( - '$', - "oreDict", - EnumChatFormatting.AQUA, - (pattern) -> new OreDictionaryFilter(pattern))); - API.addSearchProvider( - new SearchParserProvider( - '#', - "tooltip", - EnumChatFormatting.YELLOW, - (pattern) -> new TooltipFilter(pattern))); - API.addSearchProvider( - new SearchParserProvider( - '&', - "identifier", - EnumChatFormatting.GOLD, - (pattern) -> new IdentifierFilter(pattern))); } @Override protected void initInternalTextField() { field = new FormattedTextField(Minecraft.getMinecraft().fontRenderer, 0, 0, 0, 0); - ((FormattedTextField) field).setFormatter(new SearchTextFormatter()); + ((FormattedTextField) field).setFormatter(new SearchTextFormatter(SearchField.searchParser)); field.setMaxStringLength(maxSearchLength); field.setCursorPositionZero(); } @@ -292,7 +134,6 @@ public int getTextColour() { @Override public void draw(int mousex, int mousey) { - super.draw(mousex, mousey); if (searchInventories()) { @@ -317,9 +158,11 @@ public boolean handleClick(int mousex, int mousey, int button) { @Override public void onTextChange(String oldText) { final String newText = text(); - if (newText.length() > 0) NEIClientConfig.logger.debug("Searching for " + newText); - NEIClientConfig.setSearchExpression(newText); - ItemList.updateFilter.restart(); + if (!newText.equals(oldText)) { + if (newText.length() > 0) NEIClientConfig.logger.debug("Searching for " + newText); + NEIClientConfig.setSearchExpression(newText); + ItemList.updateFilter.restart(); + } } @Override @@ -428,87 +271,8 @@ public ItemFilter getFilter() { return getFilter(text()); } - protected static Pattern getFilterSplitPattern() { - StringJoiner prefixes = new StringJoiner(""); - prefixes.add(String.valueOf('\0')); - - for (ISearchParserProvider provider : SearchField.searchParserProviders.values()) { - if (provider.getSearchMode() == SearchMode.PREFIX) { - prefixes.add(String.valueOf(provider.getPrefix())); - } - } - - return Pattern.compile("((-*)([" + Pattern.quote(prefixes.toString()) + "]*)(\\\".*?(?:\\\"|$)|\\S+))"); - } - public static ItemFilter getFilter(String filterText) { - final String[] parts = EnumChatFormatting.getTextWithoutFormattingCodes(filterText).toLowerCase().split("\\|"); - final List searchTokens = Arrays.stream(parts).map(SearchField::parseSearchTokens) - .filter(s -> s != null).collect(Collectors.toCollection(ArrayList::new)); - - if (searchTokens.isEmpty()) { - return new EverythingItemFilter(); - } else { - return new AnyMultiItemFilter(searchTokens); - } - } - - private static ItemFilter parseSearchTokens(String filterText) { - - if (filterText.isEmpty()) { - return null; - } - - final Matcher filterMatcher = getFilterSplitPattern().matcher(filterText); - final AllMultiItemFilter searchTokens = new AllMultiItemFilter(); - - while (filterMatcher.find()) { - boolean ignore = "-".equals(filterMatcher.group(2)); - String firstChar = filterMatcher.group(3); - String token = filterMatcher.group(4); - boolean quotes = token.length() > 1 && token.startsWith("\"") && token.endsWith("\""); - - if (quotes) { - token = token.substring(1, token.length() - 1); - } - - if (!token.isEmpty()) { - ItemFilter result = parseToken(firstChar, token); - - if (ignore) { - searchTokens.filters.add(new NegatedItemFilter(result)); - } else { - searchTokens.filters.add(result); - } - } else if (!ignore) { - searchTokens.filters.add(new NothingItemFilter()); - } - } - - return searchTokens; - } - - private static ItemFilter parseToken(String firstChar, String token) { - final ISearchParserProvider provider = firstChar.isEmpty() ? null - : SearchField.searchParserProviders.get(firstChar.charAt(0)); - - if (provider == null || provider.getSearchMode() == SearchMode.NEVER) { - final List filters = new ArrayList<>(); - - for (ISearchParserProvider _provider : SearchField.searchParserProviders.values()) { - if (_provider.getSearchMode() == SearchMode.ALWAYS) { - ItemFilter filter = _provider.getFilter(token); - if (filter != null) { - filters.add(filter); - } - } - } - - return filters.isEmpty() ? new NothingItemFilter() : new AnyMultiItemFilter(filters); - } else { - ItemFilter filter = provider.getFilter(token); - return filter != null ? filter : new NothingItemFilter(); - } + return SearchField.searchParser.getFilter(filterText); } @Override diff --git a/src/main/java/codechicken/nei/SearchTextFormatter.java b/src/main/java/codechicken/nei/SearchTextFormatter.java new file mode 100644 index 000000000..3866fca21 --- /dev/null +++ b/src/main/java/codechicken/nei/SearchTextFormatter.java @@ -0,0 +1,79 @@ +package codechicken.nei; + +import java.util.StringJoiner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.minecraft.util.EnumChatFormatting; + +import codechicken.nei.FormattedTextField.TextFormatter; + +public class SearchTextFormatter implements TextFormatter { + + protected final SearchTokenParser searchParser; + + public SearchTextFormatter(SearchTokenParser searchParser) { + this.searchParser = searchParser; + } + + public String format(String text) { + final String[] parts = text.split("\\|"); + final Pattern splitPattern = searchParser.getSplitPattern(); + StringJoiner formattedText = new StringJoiner(EnumChatFormatting.GRAY + "|"); + + for (String filterText : parts) { + Matcher filterMatcher = splitPattern.matcher(filterText); + StringBuilder formattedPart = new StringBuilder(); + int startIndex = 0; + + while (filterMatcher.find()) { + boolean ignore = "-".equals(filterMatcher.group(2)); + String firstChar = filterMatcher.group(3); + String token = filterMatcher.group(4); + boolean quotes = token.length() > 1 && token.startsWith("\"") && token.endsWith("\""); + + if (quotes) { + token = token.substring(1, token.length() - 1); + } + + formattedPart.append(filterText.substring(startIndex, filterMatcher.start())); + EnumChatFormatting tokenColor = EnumChatFormatting.RESET; + + if (!firstChar.isEmpty()) { + tokenColor = searchParser.getProvider(firstChar.charAt(0)).getHighlightedColor(); + } + + if (ignore) { + formattedPart.append(EnumChatFormatting.BLUE + "-"); + } + + if (!firstChar.isEmpty()) { + formattedPart.append(tokenColor + firstChar); + } + + if (quotes) { + formattedPart.append(EnumChatFormatting.GOLD + "\""); + } + + if (!token.isEmpty()) { + formattedPart.append(tokenColor + token); + } + + if (quotes) { + formattedPart.append(EnumChatFormatting.GOLD + "\""); + } + + startIndex = filterMatcher.end(); + } + + formattedPart.append(filterText.substring(startIndex, filterText.length())); + formattedText.add(formattedPart); + } + + if (text.endsWith("|")) { + formattedText.add(""); + } + + return formattedText.toString(); + } +} diff --git a/src/main/java/codechicken/nei/SearchTokenParser.java b/src/main/java/codechicken/nei/SearchTokenParser.java new file mode 100644 index 000000000..2192a60ea --- /dev/null +++ b/src/main/java/codechicken/nei/SearchTokenParser.java @@ -0,0 +1,192 @@ +package codechicken.nei; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.Language; +import net.minecraft.util.EnumChatFormatting; + +import codechicken.nei.ItemList.AllMultiItemFilter; +import codechicken.nei.ItemList.AnyMultiItemFilter; +import codechicken.nei.ItemList.EverythingItemFilter; +import codechicken.nei.ItemList.NegatedItemFilter; +import codechicken.nei.ItemList.NothingItemFilter; +import codechicken.nei.api.ItemFilter; + +public class SearchTokenParser { + + public enum SearchMode { + + ALWAYS, + PREFIX, + NEVER; + + public static SearchMode fromInt(int value) { + switch (value) { + case 0: + return ALWAYS; + case 1: + return PREFIX; + case 2: + return NEVER; + default: + return ALWAYS; + } + } + } + + public static interface ISearchParserProvider { + + public ItemFilter getFilter(String searchText); + + @SuppressWarnings("unchecked") + public static ArrayList getAllLanguages() { + return new ArrayList<>(Minecraft.getMinecraft().getLanguageManager().getLanguages()); + } + + default List getMatchingLanguages() { + return getAllLanguages(); + } + + public char getPrefix(); + + public EnumChatFormatting getHighlightedColor(); + + public SearchMode getSearchMode(); + } + + private static class ProvidersCache { + + protected String languageCode = null; + protected List providers; + } + + protected final List searchProviders; + protected ProvidersCache providersCache = new ProvidersCache(); + + public SearchTokenParser(List searchProviders) { + this.searchProviders = searchProviders; + } + + public SearchTokenParser() { + this(new ArrayList<>()); + } + + public void addProvider(ISearchParserProvider provider) { + this.searchProviders.add(provider); + } + + protected List getProviders() { + Language currentLanguage = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage(); + + if (!currentLanguage.getLanguageCode().equals(providersCache.languageCode)) { + Map providers = new HashMap<>(); + + for (int index = this.searchProviders.size() - 1; index >= 0; index--) { + ISearchParserProvider provider = this.searchProviders.get(index); + + if (!providers.containsKey(provider.getPrefix()) && provider.getSearchMode() != SearchMode.NEVER + && provider.getMatchingLanguages().contains(currentLanguage)) { + providers.put(provider.getPrefix(), provider); + } + } + + providersCache.providers = new ArrayList<>(providers.values()); + providersCache.languageCode = currentLanguage.getLanguageCode(); + } + + return providersCache.providers; + } + + public ISearchParserProvider getProvider(char ch) { + return getProviders().stream().filter(provider -> provider.getPrefix() == ch).findFirst().orElse(null); + } + + public ItemFilter getFilter(String filterText) { + final String[] parts = EnumChatFormatting.getTextWithoutFormattingCodes(filterText).toLowerCase().split("\\|"); + final List searchTokens = Arrays.stream(parts).map(s -> parseSearchText(s)).filter(s -> s != null) + .collect(Collectors.toCollection(ArrayList::new)); + + if (searchTokens.isEmpty()) { + return new EverythingItemFilter(); + } else if (searchTokens.size() == 1) { + return searchTokens.get(0); + } else { + return new AnyMultiItemFilter(searchTokens); + } + } + + public Pattern getSplitPattern() { + StringJoiner prefixes = new StringJoiner(""); + prefixes.add(String.valueOf('\0')); + + for (ISearchParserProvider provider : getProviders()) { + if (provider.getSearchMode() == SearchMode.PREFIX) { + prefixes.add(String.valueOf(provider.getPrefix())); + } + } + + return Pattern.compile("((-*)([" + Pattern.quote(prefixes.toString()) + "]*)(\\\".*?(?:\\\"|$)|\\S+))"); + } + + private ItemFilter parseSearchText(String filterText) { + + if (filterText.isEmpty()) { + return null; + } + + final Matcher filterMatcher = getSplitPattern().matcher(filterText); + final AllMultiItemFilter searchTokens = new AllMultiItemFilter(); + + while (filterMatcher.find()) { + boolean ignore = "-".equals(filterMatcher.group(2)); + String firstChar = filterMatcher.group(3); + String token = filterMatcher.group(4); + boolean quotes = token.length() > 1 && token.startsWith("\"") && token.endsWith("\""); + + if (quotes) { + token = token.substring(1, token.length() - 1); + } + + if (!token.isEmpty()) { + ItemFilter result = parseToken(firstChar, token); + + if (ignore) { + searchTokens.filters.add(new NegatedItemFilter(result)); + } else { + searchTokens.filters.add(result); + } + } else if (!ignore) { + searchTokens.filters.add(new NothingItemFilter()); + } + } + + return searchTokens; + } + + private ItemFilter parseToken(String firstChar, String token) { + final ISearchParserProvider provider = firstChar.isEmpty() ? null : this.getProvider(firstChar.charAt(0)); + + if (provider == null || provider.getSearchMode() == SearchMode.NEVER) { + final List filters = new ArrayList<>(); + + for (ISearchParserProvider _provider : getProviders()) { + if (_provider.getSearchMode() == SearchMode.ALWAYS) { + filters.add(_provider.getFilter(token)); + } + } + + return filters.isEmpty() ? new NothingItemFilter() : new AnyMultiItemFilter(filters); + } else { + return provider.getFilter(token); + } + } +} diff --git a/src/main/java/codechicken/nei/SubsetWidget.java b/src/main/java/codechicken/nei/SubsetWidget.java index a2717fd53..96f0e59d4 100644 --- a/src/main/java/codechicken/nei/SubsetWidget.java +++ b/src/main/java/codechicken/nei/SubsetWidget.java @@ -28,8 +28,8 @@ import codechicken.nei.ItemList.AnyMultiItemFilter; import codechicken.nei.ItemList.ItemsLoadedCallback; import codechicken.nei.ItemList.NothingItemFilter; -import codechicken.nei.SearchField.ISearchParserProvider; -import codechicken.nei.SearchField.SearchMode; +import codechicken.nei.SearchTokenParser.ISearchParserProvider; +import codechicken.nei.SearchTokenParser.SearchMode; import codechicken.nei.api.API; import codechicken.nei.api.ItemFilter; import codechicken.nei.api.ItemFilter.ItemFilterProvider; diff --git a/src/main/java/codechicken/nei/api/API.java b/src/main/java/codechicken/nei/api/API.java index a45aeb792..96c747cab 100644 --- a/src/main/java/codechicken/nei/api/API.java +++ b/src/main/java/codechicken/nei/api/API.java @@ -24,8 +24,8 @@ import codechicken.nei.NEIClientConfig; import codechicken.nei.OffsetPositioner; import codechicken.nei.SearchField; -import codechicken.nei.SearchField.ISearchParserProvider; import codechicken.nei.SearchField.ISearchProvider; +import codechicken.nei.SearchTokenParser.ISearchParserProvider; import codechicken.nei.SubsetWidget; import codechicken.nei.SubsetWidget.SubsetTag; import codechicken.nei.api.IRecipeFilter.IRecipeFilterProvider; @@ -322,7 +322,7 @@ public static void addSearchProvider(ISearchProvider provider) {} * Adds a new search provider to the search field */ public static void addSearchProvider(ISearchParserProvider provider) { - SearchField.searchParserProviders.put(provider.getPrefix(), provider); + SearchField.searchParser.addProvider(provider); } /** diff --git a/src/main/java/codechicken/nei/api/ItemInfo.java b/src/main/java/codechicken/nei/api/ItemInfo.java index e2d190200..15495388d 100644 --- a/src/main/java/codechicken/nei/api/ItemInfo.java +++ b/src/main/java/codechicken/nei/api/ItemInfo.java @@ -44,11 +44,14 @@ import codechicken.nei.InfiniteStackSizeHandler; import codechicken.nei.InfiniteToolHandler; import codechicken.nei.ItemList; +import codechicken.nei.ItemList.PatternItemFilter; import codechicken.nei.ItemMobSpawner; import codechicken.nei.ItemStackMap; import codechicken.nei.ItemStackSet; import codechicken.nei.NEIClientConfig; import codechicken.nei.PopupInputHandler; +import codechicken.nei.SearchField.SearchParserProvider; +import codechicken.nei.SearchTokenParser.SearchMode; import codechicken.nei.config.ArrayDumper; import codechicken.nei.config.HandlerDumper; import codechicken.nei.config.ItemPanelDumper; @@ -56,6 +59,9 @@ import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.recipe.BrewingRecipeHandler; import codechicken.nei.recipe.RecipeItemInputHandler; +import codechicken.nei.search.IdentifierFilter; +import codechicken.nei.search.ModNameFilter; +import codechicken.nei.search.OreDictionaryFilter; import codechicken.nei.search.TooltipFilter; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.ModContainer; @@ -125,10 +131,7 @@ public static void load(World world) { addInputHandlers(); addIDDumps(); addHiddenItemFilter(); - addSearchOptimisation(); - } - - private static void addSearchOptimisation() { + addSearchProviders(); ItemList.loadCallbacks.add(TooltipFilter::populateSearchMap); } @@ -136,6 +139,46 @@ private static void addHiddenItemFilter() { API.addItemFilter(() -> item -> !hiddenItems.contains(item)); } + private static void addSearchProviders() { + API.addSearchProvider( + new SearchParserProvider( + '\0', + "default", + EnumChatFormatting.RESET, + (pattern) -> new PatternItemFilter(pattern)) { + + @Override + public SearchMode getSearchMode() { + return SearchMode.ALWAYS; + } + + }); + API.addSearchProvider( + new SearchParserProvider( + '@', + "modName", + EnumChatFormatting.LIGHT_PURPLE, + (pattern) -> new ModNameFilter(pattern))); + API.addSearchProvider( + new SearchParserProvider( + '$', + "oreDict", + EnumChatFormatting.AQUA, + (pattern) -> new OreDictionaryFilter(pattern))); + API.addSearchProvider( + new SearchParserProvider( + '#', + "tooltip", + EnumChatFormatting.YELLOW, + (pattern) -> new TooltipFilter(pattern))); + API.addSearchProvider( + new SearchParserProvider( + '&', + "identifier", + EnumChatFormatting.GOLD, + (pattern) -> new IdentifierFilter(pattern))); + } + private static void addIDDumps() { API.addOption(new RegistryDumper("tools.dump.item") { diff --git a/src/main/java/codechicken/nei/search/IdentifierFilter.java b/src/main/java/codechicken/nei/search/IdentifierFilter.java index 5c2178c24..05ce07129 100644 --- a/src/main/java/codechicken/nei/search/IdentifierFilter.java +++ b/src/main/java/codechicken/nei/search/IdentifierFilter.java @@ -6,6 +6,7 @@ import net.minecraft.item.ItemStack; import codechicken.nei.api.ItemFilter; +import cpw.mods.fml.common.registry.GameData; public class IdentifierFilter implements ItemFilter { @@ -16,18 +17,17 @@ public IdentifierFilter(Pattern pattern) { } @Override - public boolean matches(ItemStack itemStack) { - return this.pattern.matcher(getIdentifier(itemStack)).find(); + public boolean matches(ItemStack stack) { + return this.pattern.matcher(getStringIdentifier(stack) + "\n" + getIdentifier(stack)).find(); } - private String getIdentifier(ItemStack itemStack) { - String mainname = String.valueOf(Item.getIdFromItem(itemStack.getItem())); - - if (itemStack.getItemDamage() != 0) { - mainname += ":" + itemStack.getItemDamage(); - } + protected String getIdentifier(ItemStack stack) { + return Item.getIdFromItem(stack.getItem()) + ":" + stack.getItemDamage(); + } - return mainname; + protected String getStringIdentifier(ItemStack stack) { + String name = GameData.getItemRegistry().getNameForObject(stack.getItem()); + return name == null || name.isEmpty() ? "Unknown:Unknown" : name; } } diff --git a/src/main/java/codechicken/nei/search/TooltipFilter.java b/src/main/java/codechicken/nei/search/TooltipFilter.java index 4c653179b..16626f324 100644 --- a/src/main/java/codechicken/nei/search/TooltipFilter.java +++ b/src/main/java/codechicken/nei/search/TooltipFilter.java @@ -68,7 +68,7 @@ public static void populateSearchMap() { itemSearchNames.keySet().removeAll(oldItems); } - private static String getSearchName(ItemStack stack) { + protected static String getSearchName(ItemStack stack) { return itemSearchNames.computeIfAbsent(new ItemStackKey(stack), key -> getTooltip(key.stack)); } diff --git a/src/main/resources/assets/nei/lang/en_US.lang b/src/main/resources/assets/nei/lang/en_US.lang index dc9b74221..1d03c1497 100644 --- a/src/main/resources/assets/nei/lang/en_US.lang +++ b/src/main/resources/assets/nei/lang/en_US.lang @@ -210,12 +210,6 @@ nei.options.inventory.search.subsetsSearchMode=Item Subsets Search nei.options.inventory.search.subsetsSearchMode.0=Always nei.options.inventory.search.subsetsSearchMode.1=Prefix: %s nei.options.inventory.search.subsetsSearchMode.2=Never -nei.options.inventory.centerSearchWidget=Center Search Widget -nei.options.inventory.centerSearchWidget.true=Yes -nei.options.inventory.centerSearchWidget.false=No -nei.options.inventory.focusSearchWidgetOnOpen=Focus Search Widget on Open -nei.options.inventory.focusSearchWidgetOnOpen.true=Yes -nei.options.inventory.focusSearchWidgetOnOpen.false=No nei.options.inventory.firstInvCloseClosesInSearch=First Inventory Close Closes in Search nei.options.inventory.firstInvCloseClosesInSearch.true=Yes nei.options.inventory.firstInvCloseClosesInSearch.false=No