From 4952923f9b53ce63c3b0e5dbcff7afbcf4d65fd0 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Thu, 13 Feb 2020 17:20:17 +0100 Subject: [PATCH] Fix all remaining issues with the chat processing Checking regex formatters first, then string, then range Fix section combining 24/24 #71 --- .../components/formatter/ChatProcessing.java | 2 +- .../formatter/formatting/ChatFormatter.java | 29 +++++++++++++------ .../formatting/MatchProviderBase.java | 4 ++- .../formatting/RangeMatchProvider.java | 1 - .../formatting/RegexMatchProvider.java | 1 - .../formatting/StringMatchProvider.java | 1 - .../components/formatter/ChatFormatIT.java | 2 +- 7 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java index fc94817..e4b26b3 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java +++ b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java @@ -68,7 +68,6 @@ public class ChatProcessing { return "@console"; }).build(), true, "@console"), - new RegexMatchProvider("hashtag", HASHTAG_PATTERN, FormatSettings.builder().color(Color.Blue).openlink("https://twitter.com/hashtag/$1").build()), new StringMatchProvider("cyan", FormatSettings.builder().color(Color.Aqua).build(), true, "cyan"), // #55 new RangeMatchProvider("code", "`", FormatSettings.builder().color(Color.DarkGray).build()), new RegexMatchProvider("maskedLink", MASKED_LINK_PATTERN, FormatSettings.builder().underlined(true) @@ -80,6 +79,7 @@ public class ChatProcessing { return text; }).build()), new RegexMatchProvider("url", URL_PATTERN, FormatSettings.builder().underlined(true).openlink("$1").build()), + new RegexMatchProvider("hashtag", HASHTAG_PATTERN, FormatSettings.builder().color(Color.Blue).openlink("https://twitter.com/hashtag/$1").build()), new StringMatchProvider("someone", FormatSettings.builder().color(Color.Aqua) .onmatch((match, builder, section) -> { if (Bukkit.getOnlinePlayers().size() == 0) return match; diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java index 87e3b3a..1b6db79 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java @@ -42,7 +42,13 @@ public final class ChatFormatter { escapeThings(str, excluded, remchars); - createSections(formatters, str, sections, excluded, remchars, defaults); + sections.add(new FormattedSection(defaults, 0, str.length() - 1, Collections.emptyList())); //Add entire message + var providers = formatters.stream().filter(mp -> mp instanceof RegexMatchProvider).collect(Collectors.toList()); + createSections(providers, str, sections, excluded, remchars, defaults); + providers = formatters.stream().filter(mp -> mp instanceof StringMatchProvider).collect(Collectors.toList()); + createSections(providers, str, sections, excluded, remchars, defaults); + providers = formatters.stream().filter(mp -> mp instanceof RangeMatchProvider).collect(Collectors.toList()); + createSections(providers, str, sections, excluded, remchars, defaults); sortSections(sections); header("Section combining"); @@ -66,7 +72,6 @@ public final class ChatFormatter { private static void createSections(List formatters, String str, ArrayList sections, ArrayList excludedAreas, ArrayList removedCharacters, FormatSettings defaults) { - sections.add(new FormattedSection(defaults, 0, str.length() - 1, Collections.emptyList())); //Add entire message formatters.forEach(MatchProviderBase::reset); //Reset state information, as we aren't doing deep cloning while (formatters.size() > 0) { for (var iterator = formatters.iterator(); iterator.hasNext(); ) { @@ -91,7 +96,8 @@ public final class ChatFormatter { { FormattedSection firstSect = sections.get(i - 1); FormattedSection lastSect = sections.get(i); - if (firstSect.Start > lastSect.Start) { //The first can't start later + if (firstSect.Start > lastSect.Start //The first can't start later + || (firstSect.Start == lastSect.Start && firstSect.End < lastSect.End)) { var section = firstSect; firstSect = lastSect; lastSect = section; @@ -112,18 +118,23 @@ public final class ChatFormatter { i = 0; sortSections(sections); continue; - } else if (firstSection.End > lastSection.Start && firstSection.Start < lastSection.End) { - int origend2 = firstSection.End; + } else if (firstSection.End >= lastSection.Start && firstSection.Start <= lastSection.End) { + int firstSectEnd = firstSection.End; firstSection.End = lastSection.Start - 1; - int origend = lastSection.End; - FormattedSection section = new FormattedSection(firstSection.Settings, lastSection.Start, origend, + int lastSectEnd = lastSection.End; + FormattedSection section = new FormattedSection(firstSection.Settings, lastSection.Start, lastSectEnd, firstSection.Matches); section.Settings.copyFrom(lastSection.Settings); section.Matches.addAll(lastSection.Matches); sections.add(i, section); - lastSection.Start = origend + 1; - lastSection.End = origend2; + if (firstSectEnd > lastSection.End) { //Copy first section info to last as the lastSection initially cuts the firstSection in half + lastSection.Settings = FormatSettings.builder().build(); + lastSection.Settings.copyFrom(firstSection.Settings); + } + + lastSection.Start = lastSectEnd + 1; + lastSection.End = firstSectEnd; Predicate removeIfNeeded = s -> { if (s.Start < 0 || s.End < 0 || s.Start > s.End) { diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java index 8bfa824..fd25901 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java @@ -20,7 +20,9 @@ public abstract class MatchProviderBase implements MatchProvider { public abstract FormattedSection getNextSection(String message, ArrayList ignoredAreas, ArrayList removedCharacters); @Override - public abstract String toString(); + public String toString() { + return name; + } protected abstract void resetSubclass(); diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java index 4df0b22..ec94e83 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java @@ -6,7 +6,6 @@ import lombok.ToString; import java.util.ArrayList; import java.util.Collections; -@ToString public class RangeMatchProvider extends MatchProviderBase { private final String pattern; @ToString.Exclude diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java index bbd4b84..c64ddc9 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java @@ -8,7 +8,6 @@ import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; -@ToString public class RegexMatchProvider extends MatchProviderBase { private final Pattern pattern; @ToString.Exclude diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java index 9ed3d8d..a9a1184 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java @@ -7,7 +7,6 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collections; -@ToString public class StringMatchProvider extends MatchProviderBase { private final String[] strings; @ToString.Exclude diff --git a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java index a119584..d54aa5a 100644 --- a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java +++ b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java @@ -62,7 +62,7 @@ public class ChatFormatIT { list.add(new ChatFormatIT(sender, "*https://norbipeti.github.io/ heh*", new TellrawPart("https://norbipeti.github.io/").setItalic(true).setUnderlined(true) .setHoverEvent(TellrawEvent.create(HoverAction.SHOW_TEXT, new TellrawPart("Click to open").setColor(Color.Blue))) - .setClickEvent(TellrawEvent.create(ClickAction.OPEN_URL, "https://norbipeti.github.io/")), new TellrawPart(" heh").setItalic(true))); + .setClickEvent(TellrawEvent.create(ClickAction.OPEN_URL, "https://norbipeti.github.io/")).setColor(Color.White), new TellrawPart(" heh").setItalic(true).setColor(Color.White))); list.add(new ChatFormatIT(sender, "*test _test_ test*", new TellrawPart("test test test").setItalic(true).setColor(Color.White))); list.add(new ChatFormatIT(sender, "*test __test__ test*", new TellrawPart("test ").setItalic(true).setColor(Color.White), new TellrawPart("test").setItalic(true).setUnderlined(true).setColor(Color.White), new TellrawPart(" test").setItalic(true).setColor(Color.White)));