Fix all remaining issues with the chat processing
Checking regex formatters first, then string, then range Fix section combining 24/24 #71
This commit is contained in:
parent
4d0c7c170e
commit
4952923f9b
7 changed files with 25 additions and 15 deletions
|
@ -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;
|
||||
|
|
|
@ -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<MatchProviderBase> formatters, String str, ArrayList<FormattedSection> sections,
|
||||
ArrayList<int[]> excludedAreas, ArrayList<int[]> 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<FormattedSection> removeIfNeeded = s -> {
|
||||
if (s.Start < 0 || s.End < 0 || s.Start > s.End) {
|
||||
|
|
|
@ -20,7 +20,9 @@ public abstract class MatchProviderBase implements MatchProvider {
|
|||
public abstract FormattedSection getNextSection(String message, ArrayList<int[]> ignoredAreas, ArrayList<int[]> removedCharacters);
|
||||
|
||||
@Override
|
||||
public abstract String toString();
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
|
||||
protected abstract void resetSubclass();
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)));
|
||||
|
|
Loading…
Reference in a new issue