diff options
Diffstat (limited to 'runtime/src/main/java')
29 files changed, 626 insertions, 381 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java index ac7a5e0d6..798a1c9e3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java @@ -43,10 +43,13 @@ import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.search.SearchFilter; +import me.shedaniel.rei.api.search.SearchProvider; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.OverlaySearchField; import me.shedaniel.rei.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.SearchArgument; +import me.shedaniel.rei.impl.search.Argument; +import me.shedaniel.rei.impl.search.CompoundArgument; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -103,7 +106,7 @@ public class FilteringScreen extends Screen { private Button backButton; private Rectangle selectionCache; - private List<SearchArgument.SearchArguments> lastSearchArguments = Collections.emptyList(); + private SearchFilter lastFilter = SearchFilter.matchAll(); public FilteringScreen(FilteringEntry filteringEntry) { super(new TranslatableComponent("config.roughlyenoughitems.filteringScreen")); @@ -311,10 +314,10 @@ public class FilteringScreen extends Screen { } public void updateSearch(String searchTerm) { - lastSearchArguments = SearchArgument.processSearchTerm(searchTerm); + lastFilter = SearchProvider.getInstance().createFilter(searchTerm); Set<EntryStack<?>> list = Sets.newLinkedHashSet(); EntryRegistry.getInstance().getEntryStacks().forEach(stack -> { - if (canLastSearchTermsBeAppliedTo(stack)) { + if (matches(stack)) { list.add(stack.normalize()); } }); @@ -323,8 +326,8 @@ public class FilteringScreen extends Screen { updateEntriesPosition(); } - public boolean canLastSearchTermsBeAppliedTo(EntryStack<?> stack) { - return lastSearchArguments.isEmpty() || SearchArgument.canSearchTermsBeAppliedTo(stack, lastSearchArguments); + public boolean matches(EntryStack<?> stack) { + return lastFilter.test(stack); } public void updateEntriesPosition() { diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 8d1a1209a..e466e342b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -557,7 +557,7 @@ public class ContainerScreenOverlay extends REIOverlay { AbstractContainerScreen<?> containerScreen = (AbstractContainerScreen<?>) Minecraft.getInstance().screen; int x = containerScreen.leftPos, y = containerScreen.topPos; for (Slot slot : containerScreen.getMenu().slots) - if (!slot.hasItem() || !ENTRY_LIST_WIDGET.canLastSearchTermsBeAppliedTo(EntryStacks.of(slot.getItem()))) + if (!slot.hasItem() || !ENTRY_LIST_WIDGET.matches(EntryStacks.of(slot.getItem()))) fillGradient(matrices, x + slot.x, y + slot.y, x + slot.x + 16, y + slot.y + 16, -601874400, -601874400); } matrices.popPose(); diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java index 9a06211a2..3591f0ab6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java @@ -35,9 +35,9 @@ import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.api.gui.config.SyntaxHighlightingMode; import me.shedaniel.rei.impl.OverlaySearchFieldSyntaxHighlighter; import me.shedaniel.rei.impl.TextTransformations; -import me.shedaniel.rei.impl.search.Argument; -import me.shedaniel.rei.impl.search.ArgumentsRegistry; -import me.shedaniel.rei.impl.search.TextArgument; +import me.shedaniel.rei.impl.search.ArgumentType; +import me.shedaniel.rei.impl.search.ArgumentTypesRegistry; +import me.shedaniel.rei.impl.search.TextArgumentType; import me.shedaniel.rei.impl.widgets.TextFieldWidget; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -84,11 +84,11 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg style = ERROR_STYLE; } if (arg > 0) { - Argument<?, ?> argument = ArgumentsRegistry.ARGUMENT_LIST.get((arg - 1) / 2); + ArgumentType<?, ?> argumentType = ArgumentTypesRegistry.ARGUMENT_TYPE_LIST.get((arg - 1) / 2); if (!isPlain) { - style = argument.getHighlightedStyle(); + style = argumentType.getHighlightedStyle(); } - if (!(argument instanceof TextArgument) && hasUnderscore && arg % 2 == 1) { + if (!(argumentType instanceof TextArgumentType) && hasUnderscore && arg % 2 == 1) { style = style.withUnderlined(true); } } else if (!isPlain) { diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java index b7d6312b4..85f3e8d86 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java @@ -57,10 +57,12 @@ import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagCollection; import net.minecraft.world.level.material.Fluid; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -69,23 +71,24 @@ public class FluidEntryDefinition implements EntryDefinition<FluidStack>, EntryS private final EntryRenderer<FluidStack> renderer = new FluidEntryRenderer(); @Override - public @NotNull Class<FluidStack> getValueType() { + public Class<FluidStack> getValueType() { return FluidStack.class; } @Override - public @NotNull EntryType<FluidStack> getType() { + public EntryType<FluidStack> getType() { return VanillaEntryTypes.FLUID; } @Override - public @NotNull EntryRenderer<FluidStack> getRenderer() { + public EntryRenderer<FluidStack> getRenderer() { return renderer; } @Override - public @NotNull Optional<ResourceLocation> getIdentifier(EntryStack<FluidStack> entry, FluidStack value) { - return Optional.ofNullable(Registry.FLUID.getKey(value.getFluid())); + @Nullable + public ResourceLocation getIdentifier(EntryStack<FluidStack> entry, FluidStack value) { + return Registry.FLUID.getKey(value.getFluid()); } @Override @@ -153,12 +156,12 @@ public class FluidEntryDefinition implements EntryDefinition<FluidStack>, EntryS } @Override - public @NotNull Component asFormattedText(EntryStack<FluidStack> entry, FluidStack value) { + public Component asFormattedText(EntryStack<FluidStack> entry, FluidStack value) { return value.getFluid().defaultFluidState().createLegacyBlock().getBlock().getName(); } @Override - public @NotNull Collection<ResourceLocation> getTagsFor(EntryStack<FluidStack> entry, FluidStack value) { + public Collection<ResourceLocation> getTagsFor(EntryStack<FluidStack> entry, FluidStack value) { TagCollection<Fluid> collection = Minecraft.getInstance().getConnection().getTags().getFluids(); return collection == null ? Collections.emptyList() : collection.getMatchingTags(value.getFluid()); } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java index f3c913b72..3385ae958 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java @@ -32,8 +32,6 @@ import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceSet; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.ClientHelper; -import me.shedaniel.rei.api.config.ConfigObject; import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.entry.*; @@ -55,8 +53,6 @@ import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagCollection; @@ -90,8 +86,9 @@ public class ItemEntryDefinition implements EntryDefinition<ItemStack>, EntrySer } @Override - public @NotNull Optional<ResourceLocation> getIdentifier(EntryStack<ItemStack> entry, ItemStack value) { - return Optional.ofNullable(Registry.ITEM.getKey(value.getItem())); + @Nullable + public ResourceLocation getIdentifier(EntryStack<ItemStack> entry, ItemStack value) { + return Registry.ITEM.getKey(value.getItem()); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 005f670be..242be27be 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -57,12 +57,15 @@ import me.shedaniel.rei.api.ingredient.util.EntryStacks; import me.shedaniel.rei.api.registry.entry.EntryRegistry; import me.shedaniel.rei.api.registry.screen.OverlayDecider; import me.shedaniel.rei.api.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.search.SearchFilter; +import me.shedaniel.rei.api.search.SearchProvider; import me.shedaniel.rei.api.util.CollectionUtils; import me.shedaniel.rei.api.view.Views; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.ConfigManagerImpl; import me.shedaniel.rei.impl.ConfigObjectImpl; -import me.shedaniel.rei.impl.SearchArgument; +import me.shedaniel.rei.impl.search.Argument; +import me.shedaniel.rei.impl.search.CompoundArgument; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; @@ -128,7 +131,7 @@ public class EntryListWidget extends WidgetWithBounds { private List<EntryListEntry> entries = Collections.emptyList(); private List<Widget> renders = Collections.emptyList(); private List<Widget> widgets = Collections.emptyList(); - private List<SearchArgument.SearchArguments> lastSearchArguments = Collections.emptyList(); + private SearchFilter lastFilter = SearchFilter.matchAll(); private String lastSearchTerm = null; public static int entrySize() { @@ -519,7 +522,7 @@ public class EntryListWidget extends WidgetWithBounds { Stopwatch stopwatch = Stopwatch.createStarted(); if (ignoreLastSearch || this.lastSearchTerm == null || !this.lastSearchTerm.equals(searchTerm)) { this.lastSearchTerm = searchTerm; - this.lastSearchArguments = SearchArgument.processSearchTerm(searchTerm); + this.lastFilter = SearchProvider.getInstance().createFilter(searchTerm); List<EntryStack<?>> list = Lists.newArrayList(); boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ContainerScreenOverlay.getInstance().inventoryStacks.isEmpty(); IntSet workingItems = checkCraftable ? new IntOpenHashSet() : null; @@ -533,7 +536,7 @@ public class EntryListWidget extends WidgetWithBounds { completableFutures.add(CompletableFuture.supplyAsync(() -> { List<EntryStack<?>> filtered = Lists.newArrayList(); for (EntryStack<?> stack : partitionStacks) { - if (canLastSearchTermsBeAppliedTo(stack)) { + if (matches(stack)) { if (workingItems != null && !workingItems.contains(EntryStacks.hashExact(stack))) continue; filtered.add(stack.normalize()); @@ -554,7 +557,7 @@ public class EntryListWidget extends WidgetWithBounds { } } else { for (EntryStack<?> stack : stacks) { - if (canLastSearchTermsBeAppliedTo(stack)) { + if (matches(stack)) { if (workingItems != null && !workingItems.contains(EntryStacks.hashExact(stack))) continue; list.add(stack.normalize()); @@ -580,8 +583,8 @@ public class EntryListWidget extends WidgetWithBounds { updateEntriesPosition(); } - public boolean canLastSearchTermsBeAppliedTo(EntryStack<?> stack) { - return lastSearchArguments.isEmpty() || SearchArgument.canSearchTermsBeAppliedTo(stack, lastSearchArguments); + public boolean matches(EntryStack<?> stack) { + return lastFilter.test(stack); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java index c065ff64e..c77193309 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/AbstractEntryStack.java @@ -36,6 +36,7 @@ import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.entry.comparison.ComparisonContext; import me.shedaniel.rei.api.ingredient.util.EntryStacks; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -107,13 +108,16 @@ public abstract class AbstractEntryStack<A> extends AbstractRenderer implements @Override @Nullable public Tooltip getTooltip(Point mouse) { - Tooltip[] tooltip = {this.getDefinition().getRenderer().getTooltip(this, mouse)}; + Tooltip[] tooltip = {this.get(Settings.RENDER).apply(this).<A>cast().getTooltip(this, mouse)}; if (tooltip[0] == null) return null; tooltip[0].getText().addAll(get(EntryStack.Settings.TOOLTIP_APPEND_EXTRA).apply(this)); tooltip[0] = get(EntryStack.Settings.TOOLTIP_PROCESSOR).apply(this, tooltip[0]); if (tooltip[0] == null) return null; if (ConfigObject.getInstance().shouldAppendModNames()) { - getIdentifier().ifPresent(location -> ClientHelper.getInstance().appendModIdToTooltips(tooltip[0].getText(), location.getNamespace())); + ResourceLocation location = getIdentifier(); + if (location != null) { + ClientHelper.getInstance().appendModIdToTooltips(tooltip[0].getText(), location.getNamespace()); + } } return tooltip[0]; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java index e2e2460a6..a498fd2f1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java @@ -172,9 +172,10 @@ public class ClientHelperImpl implements ClientHelper { return false; } } else { - ResourceLocation identifier = entry.getIdentifier().orElse(null); - if (identifier == null) + ResourceLocation identifier = entry.getIdentifier(); + if (identifier == null) { return false; + } String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().getAsString() : ""; String og = cheatedStack.getCount() == 1 ? ConfigObject.getInstance().getGiveCommand().replaceAll(" \\{count}", "") : ConfigObject.getInstance().getGiveCommand(); String madeUpCommand = og.replaceAll("\\{player_name}", Minecraft.getInstance().player.getScoreboardName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", tagMessage).replaceAll("\\{count}", String.valueOf(cheatedStack.getCount())); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java index 9c019f19a..500713fd3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java @@ -371,6 +371,11 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { } @Override + public SearchMode getIdentifierSearchMode() { + return advanced.search.identifierSearch; + } + + @Override public SearchMode getModSearchMode() { return advanced.search.modSearch; } @@ -512,6 +517,8 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private SearchMode tagSearch = SearchMode.PREFIX; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) + private SearchMode identifierSearch = SearchMode.ALWAYS; + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private SearchMode modSearch = SearchMode.PREFIX; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java b/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java index c2faf9110..25e92b926 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/OverlaySearchFieldSyntaxHighlighter.java @@ -24,7 +24,8 @@ package me.shedaniel.rei.impl; import me.shedaniel.rei.gui.OverlaySearchField; -import me.shedaniel.rei.impl.search.ArgumentsRegistry; +import me.shedaniel.rei.impl.search.ArgumentTypesRegistry; +import me.shedaniel.rei.impl.search.Argument; import net.minecraft.util.IntRange; import org.jetbrains.annotations.ApiStatus; @@ -44,7 +45,7 @@ public class OverlaySearchFieldSyntaxHighlighter implements Consumer<String> { @Override public void accept(String text) { this.highlighted = new byte[text.length()]; - SearchArgument.processSearchTerm(text, new SearchArgument.ProcessedSink() { + Argument.bakeArguments(text, new Argument.ProcessedSink() { @Override public void addQuote(int index) { highlighted[index] = -2; @@ -56,9 +57,9 @@ public class OverlaySearchFieldSyntaxHighlighter implements Consumer<String> { } @Override - public void addPart(SearchArgument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index) { + public void addPart(Argument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index) { if (usingGrammar) { - int argIndex = ArgumentsRegistry.ARGUMENT_LIST.indexOf(argument.getArgument()) * 2 + 1; + int argIndex = ArgumentTypesRegistry.ARGUMENT_TYPE_LIST.indexOf(argument.getArgument()) * 2 + 1; for (int i = argument.start(); i < argument.end(); i++) { highlighted[i] = (byte) argIndex; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java index 031f4b22e..e0d4f7274 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java @@ -38,6 +38,7 @@ import me.shedaniel.rei.api.util.CollectionUtils; import me.shedaniel.rei.impl.entry.ItemComparatorRegistryImpl; import me.shedaniel.rei.impl.registry.CategoryRegistryImpl; import me.shedaniel.rei.impl.registry.DisplayRegistryImpl; +import me.shedaniel.rei.impl.search.SearchProviderImpl; import me.shedaniel.rei.impl.subsets.SubsetsRegistryImpl; import me.shedaniel.rei.impl.transfer.TransferHandlerRegistryImpl; import net.fabricmc.api.EnvType; @@ -62,6 +63,7 @@ public class PluginManagerImpl implements PluginManager { private final List<REIPlugin> plugins = new ArrayList<>(); public PluginManagerImpl() { + registerReloadable(new SearchProviderImpl()); registerReloadable(new ConfigManagerImpl()); registerReloadable(new EntryTypeRegistryImpl()); registerReloadable(new ItemComparatorRegistryImpl()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java b/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java deleted file mode 100644 index bb209c019..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/impl/SearchArgument.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020 shedaniel - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package me.shedaniel.rei.impl; - -import com.google.common.base.MoreObjects; -import com.google.common.collect.Lists; -import me.shedaniel.math.Point; -import me.shedaniel.rei.api.gui.config.SearchMode; -import me.shedaniel.rei.api.gui.widgets.Tooltip; -import me.shedaniel.rei.api.ingredient.EntryStack; -import me.shedaniel.rei.api.util.CollectionUtils; -import me.shedaniel.rei.impl.search.AlwaysMatchingArgument; -import me.shedaniel.rei.impl.search.Argument; -import me.shedaniel.rei.impl.search.ArgumentsRegistry; -import me.shedaniel.rei.impl.search.MatchStatus; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; -import net.minecraft.util.IntRange; -import net.minecraft.util.Unit; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.mutable.Mutable; -import org.apache.commons.lang3.mutable.MutableObject; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; -import java.util.List; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@ApiStatus.Internal -@Environment(EnvType.CLIENT) -public class SearchArgument<T, R> { - public static final String SPACE = " ", EMPTY = ""; - private static final SearchArgument<Unit, Unit> ALWAYS = new SearchArgument<>(AlwaysMatchingArgument.INSTANCE, EMPTY, true, -1, -1); - private Argument<T, R> argument; - private String text; - private T filterData; - private boolean regular; - private final int start; - private final int end; - private static final Pattern SPLIT_PATTERN = Pattern.compile("(?:\"([^\"]*)\")|([^\\s]+)"); - - public SearchArgument(Argument<T, R> argument, String text, boolean regular, int start, int end) { - this(argument, text, regular, start, end, true); - } - - public SearchArgument(Argument<T, R> argument, String text, boolean regular, int start, int end, boolean lowercase) { - this.argument = argument; - this.text = lowercase ? text.toLowerCase(Locale.ROOT) : text; - this.regular = regular; - this.filterData = null; - this.start = start; - this.end = end; - } - - public int start() { - return start; - } - - public int end() { - return end; - } - - public interface ProcessedSink { - void addQuote(int index); - - void addSplitter(int index); - - void addPart(SearchArgument<?, ?> argument, boolean usingGrammar, Collection<IntRange> grammarRanges, int index); - } - - @ApiStatus.Internal - public static List<SearchArgument.SearchArguments> processSearchTerm(String searchTerm) { - return processSearchTerm(searchTerm, null); - } - - @ApiStatus.Internal - public static List<SearchArgument.SearchArguments> processSearchTerm(String searchTerm, @Nullable ProcessedSink sink) { - List<SearchArgument.SearchArguments> searchArguments = Lists.newArrayList(); - int tokenStartIndex = 0; - String[] allTokens = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|"); - for (String token : allTokens) { - Matcher terms = SPLIT_PATTERN.matcher(token); - List<SearchArgument<?, ?>> arguments = Lists.newArrayList(); - while (terms.fin |
