From 825e327903ab55e9bf5c230a2936f0e95257c77d Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 16 Nov 2019 01:08:20 +0100 Subject: [PATCH 1/6] Fix underscore pattern - it was wrong all along Fix test - in IntelliJ anyways --- .idea/ButtonChat.iml | 2 +- pom.xml | 15 +++++++++++++++ .../chat/components/formatter/ChatProcessing.java | 2 +- .../chat/components/formatter/ChatFormatIT.java | 4 ++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/.idea/ButtonChat.iml b/.idea/ButtonChat.iml index 28193ee..43f0ec8 100644 --- a/.idea/ButtonChat.iml +++ b/.idea/ButtonChat.iml @@ -1,6 +1,6 @@ - + diff --git a/pom.xml b/pom.xml index 987b17c..d0a8e52 100644 --- a/pom.xml +++ b/pom.xml @@ -135,6 +135,21 @@ + + maven-compiler-plugin + + + default-testCompile + + testCompile + + + 1.8 + 1.8 + + + + buttondevteam diff --git a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java index e94372c..e3ea8fa 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java +++ b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java @@ -49,7 +49,7 @@ public class ChatProcessing { private static final Pattern HASHTAG_PATTERN = Pattern.compile("#(\\w+)"); private static final Pattern URL_PATTERN = Pattern.compile("(http[\\w:/?=$\\-_.+!*'(),&]+(?:#[\\w]+)?)"); public static final Pattern ENTIRE_MESSAGE_PATTERN = Pattern.compile(".+"); - private static final Pattern UNDERLINED_PATTERN = Pattern.compile("_"); + private static final Pattern UNDERLINED_PATTERN = Pattern.compile("__"); private static final Pattern ITALIC_PATTERN = Pattern.compile("\\*"); private static final Pattern BOLD_PATTERN = Pattern.compile("\\*\\*"); private static final Pattern CODE_PATTERN = Pattern.compile("`"); diff --git a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java index 438155d..a3bc569 100644 --- a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java +++ b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java @@ -38,9 +38,9 @@ public class ChatFormatIT { list.add(new ChatFormatIT(sender, "**test**", new TellrawPart("test").setBold(true).setColor(Color.White))); list.add(new ChatFormatIT(sender, "***test***", new TellrawPart("test").setBold(true).setItalic(true).setColor(Color.White))); - list.add(new ChatFormatIT(sender, "***_test_***", + list.add(new ChatFormatIT(sender, "***__test__***", new TellrawPart("test").setBold(true).setItalic(true).setUnderlined(true).setColor(Color.White))); - list.add(new ChatFormatIT(sender, "***_~~test~~_***", new TellrawPart("test").setBold(true).setItalic(true) + list.add(new ChatFormatIT(sender, "***__~~test~~__***", new TellrawPart("test").setBold(true).setItalic(true) .setUnderlined(true).setStrikethrough(true).setColor(Color.White))); list.add(new ChatFormatIT(sender, "¯\\\\\\_(ツ)\\_/¯", new TellrawPart("¯\\_(ツ)_/¯").setColor(Color.White))); list.add(new ChatFormatIT(sender, "https://google.hu/", From 22c7fed75deef9dc0b2e1ae7a98345057f096b86 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 17 Nov 2019 03:14:28 +0100 Subject: [PATCH 2/6] F i x remchars, improve combine Also a newCombine method from yesterday #71 --- .../components/formatter/ChatProcessing.java | 19 +++-- .../formatter/formatting/ChatFormatter.java | 69 +++++++++++++++---- .../components/formatter/ChatFormatIT.java | 9 ++- 3 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java index e3ea8fa..fbbacca 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java +++ b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java @@ -25,6 +25,7 @@ import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.player.TBMCPlayer; import buttondevteam.lib.player.TBMCPlayerBase; import com.earth2me.essentials.User; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -51,6 +52,7 @@ public class ChatProcessing { public static final Pattern ENTIRE_MESSAGE_PATTERN = Pattern.compile(".+"); private static final Pattern UNDERLINED_PATTERN = Pattern.compile("__"); private static final Pattern ITALIC_PATTERN = Pattern.compile("\\*"); + private static final Pattern ITALIC_PATTERN_2 = Pattern.compile("_"); private static final Pattern BOLD_PATTERN = Pattern.compile("\\*\\*"); private static final Pattern CODE_PATTERN = Pattern.compile("`"); private static final Pattern MASKED_LINK_PATTERN = Pattern.compile("\\[([^\\[\\]]+)]\\(([^()]+)\\)"); @@ -68,7 +70,8 @@ public class ChatProcessing { ChatFormatter.builder("bold", BOLD_PATTERN).bold(true).removeCharCount((short) 2).type(ChatFormatter.Type.Range) .priority(Priority.High).build(), ChatFormatter.builder("italic", ITALIC_PATTERN).italic(true).removeCharCount((short) 1).type(ChatFormatter.Type.Range).build(), - ChatFormatter.builder("underlined", UNDERLINED_PATTERN).underlined(true).removeCharCount((short) 1).type(ChatFormatter.Type.Range) + ChatFormatter.builder("italic2", ITALIC_PATTERN_2).italic(true).removeCharCount((short) 1).type(ChatFormatter.Type.Range).build(), + ChatFormatter.builder("underlined", UNDERLINED_PATTERN).underlined(true).removeCharCount((short) 2).type(ChatFormatter.Type.Range) .build(), ChatFormatter.builder("strikethrough", STRIKETHROUGH_PATTERN).strikethrough(true).removeCharCount((short) 2).type(ChatFormatter.Type.Range) .build(), @@ -98,7 +101,15 @@ public class ChatProcessing { builder.setOpenlink(link); return text; }).type(ChatFormatter.Type.Excluder).build(), - ChatFormatter.builder("url", URL_PATTERN).underlined(true).openlink("$1").type(ChatFormatter.Type.Excluder).build()); + ChatFormatter.builder("url", URL_PATTERN).underlined(true).openlink("$1").type(ChatFormatter.Type.Excluder).build(), + ChatFormatter.builder("someone", SOMEONE_PATTERN).color(Color.Aqua).onmatch((match, builder, section) -> { + if (Bukkit.getOnlinePlayers().size() == 0) return match; + var players = ImmutableList.copyOf(Bukkit.getOnlinePlayers()); + var playerC = new Random().nextInt(players.size()); + var player = players.get(playerC); + playPingSound(player); + return "@someone (" + player.getDisplayName() + ")"; + }).build()); private static Gson gson = new GsonBuilder() .registerTypeHierarchyAdapter(TellrawSerializableEnum.class, new TellrawSerializer.TwEnum()) .registerTypeHierarchyAdapter(Collection.class, new TellrawSerializer.TwCollection()) @@ -211,8 +222,8 @@ public class ChatProcessing { } static TellrawPart createTellraw(CommandSender sender, String message, @Nullable Player player, - @Nullable ChatPlayer mp, @Nullable ChromaGamerBase cg, final String channelidentifier, - String origin) { + @Nullable ChatPlayer mp, @Nullable ChromaGamerBase cg, final String channelidentifier, + String origin) { TellrawPart json = new TellrawPart(""); ChatOnlyComponent.tellrawCreate(mp, json); //TODO: Make nice API json.addExtra( 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 e39eef5..dd2a450 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java @@ -45,6 +45,13 @@ public final class ChatFormatter { String hoverText; String name; + @Override + public String toString() { + return "ChatFormatter{" + + "name='" + name + '\'' + + '}'; + } + public static ChatFormatterBuilder builder(String name, Pattern regex) { return builder().regex(regex).name(name); } @@ -98,7 +105,7 @@ public final class ChatFormatter { sections = convertRangeSections(str, sections, remchars); header("Adding remove chars (RC)"); // Important to add after the range section conversion - addRemChars(sections, remchars); + addRemChars(sections, remchars, str); header("Section combining"); combineSections(str, sections); @@ -134,6 +141,19 @@ public final class ChatFormatter { } } + private static void newCombine(String str, ArrayList sections, ArrayList remchars) { + var stack = new Stack(); + for (int i = 0; i < str.length(); i++) { + for (Iterator iterator = sections.iterator(); iterator.hasNext(); ) { + FormattedSection section = iterator.next(); + if (section.Start <= i) { + stack.push(section); + iterator.remove(); + } + } + } + } + private static ArrayList convertRangeSections(String str, ArrayList sections, ArrayList remchars) { ArrayList combined = new ArrayList<>(); Map nextSection = new HashMap<>(); @@ -200,7 +220,7 @@ public final class ChatFormatter { return sections; } - private static void addRemChars(ArrayList sections, ArrayList remchars) { + private static void addRemChars(ArrayList sections, ArrayList remchars, String str) { sections.stream() .flatMap(fs -> fs.Formatters.stream().filter(cf -> cf.removeCharCount > 0) .mapToInt(cf -> cf.removeCharCount).mapToObj(rcc -> new int[]{fs.Start, fs.Start + rcc - 1})) @@ -210,8 +230,9 @@ public final class ChatFormatter { .mapToInt(cf -> cf.removeCharCount).mapToObj(rcc -> new int[]{fs.End - rcc + 1, fs.End})) .forEach(remchars::add); DebugCommand.SendDebugMessage("Added remchars:"); - DebugCommand - .SendDebugMessage(remchars.stream().map(Arrays::toString).collect(Collectors.joining("; "))); + DebugCommand.SendDebugMessage(remchars.stream().map(Arrays::toString).collect(Collectors.joining("; "))); + sendMessageWithPointer(str, + remchars.stream().flatMapToInt(Arrays::stream).toArray()); } private static void combineSections(String str, ArrayList sections) { @@ -222,10 +243,21 @@ public final class ChatFormatter { if (sections.size() < 2) break; DebugCommand.SendDebugMessage("i: " + i); - FormattedSection firstSection = sections.get(i - 1); + final FormattedSection firstSection; + final FormattedSection lastSection; + { + FormattedSection firstSect = sections.get(i - 1); + FormattedSection lastSect = sections.get(i); + if (firstSect.Start > lastSect.Start) { //The first can't start later + var section = firstSect; + firstSect = lastSect; + lastSect = section; + } + firstSection = firstSect; + lastSection = lastSect; + } DebugCommand.SendDebugMessage("Combining sections " + firstSection); sendMessageWithPointer(str, firstSection.Start, firstSection.End); - final FormattedSection lastSection = sections.get(i); DebugCommand.SendDebugMessage(" and " + lastSection); sendMessageWithPointer(str, lastSection.Start, lastSection.End); if (firstSection.Start == lastSection.Start && firstSection.End == lastSection.End) { @@ -256,7 +288,7 @@ public final class ChatFormatter { Predicate removeIfNeeded = s -> { if (s.Start < 0 || s.End < 0 || s.Start > s.End) { - DebugCommand.SendDebugMessage("Removing section: " + s); + DebugCommand.SendDebugMessage(" Removed: " + s); sendMessageWithPointer(str, s.Start, s.End); sections.remove(s); return true; @@ -310,11 +342,13 @@ public final class ChatFormatter { int start = section.Start, end = section.End; DebugCommand.SendDebugMessage("Start: " + start + " - End: " + end); sendMessageWithPointer(str, start, end); - val rcs = remchars.stream().filter(rc -> rc[0] <= start && start <= rc[1]).findAny(); - val rce = remchars.stream().filter(rc -> rc[0] <= end && end <= rc[1]).findAny(); - val rci = remchars.stream().filter(rc -> start < rc[0] && rc[1] < end).toArray(int[][]::new); - int s = start, e = end; - if (rcs.isPresent()) + /*DebugCommand.SendDebugMessage("RCS: "+remchars.stream().filter(rc -> rc[0] <= start && start <= rc[1]).count()); + DebugCommand.SendDebugMessage("RCE: "+remchars.stream().filter(rc -> rc[0] <= end && end <= rc[1]).count()); + DebugCommand.SendDebugMessage("RCI: "+remchars.stream().filter(rc -> start < rc[0] || rc[1] < end).count());*/ + val rci = remchars.stream().filter(rc -> (rc[0] <= start && rc[1] >= start) + || (rc[0] >= start && rc[1] <= end) + || (rc[0] <= end && rc[1] >= end)).sorted(Comparator.comparingInt(rc -> rc[0] * 10000 + rc[1])).toArray(int[][]::new); + /*if (rcs.isPresent()) s = rcs.get()[1] + 1; if (rce.isPresent()) e = rce.get()[0] - 1; @@ -322,12 +356,17 @@ public final class ChatFormatter { if (e - s < 0) { //e-s==0 means the end char is the same as start char, so one char message DebugCommand.SendDebugMessage("Skipping section because of remchars (length would be " + (e - s + 1) + ")"); continue; - } - originaltext = str.substring(s, e + 1); + }*/ + DebugCommand.SendDebugMessage("Applying RC: " + Arrays.stream(rci).map(Arrays::toString).collect(Collectors.joining(", ", "[", "]"))); + originaltext = str.substring(start, end + 1); val sb = new StringBuilder(originaltext); for (int x = rci.length - 1; x >= 0; x--) - sb.delete(rci[x][0] - start - 1, rci[x][1] - start); //Delete going backwards + sb.delete(Math.max(rci[x][0] - start, 0), Math.min(rci[x][1] - start, end) + 1); //Delete going backwards originaltext = sb.toString(); + if (originaltext.length() == 0) { + DebugCommand.SendDebugMessage("Skipping section because of remchars"); + continue; + } DebugCommand.SendDebugMessage("Section text: " + originaltext); String openlink = null; section.Formatters.sort(Comparator.comparing(cf2 -> cf2.priority.GetValue())); //Apply the highest last, to overwrite previous ones diff --git a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java index a3bc569..ecd3def 100644 --- a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java +++ b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java @@ -65,8 +65,13 @@ public class ChatFormatIT { .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))); - 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))); + 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))); + list.add(new ChatFormatIT(sender, "**test __test__ test**", new TellrawPart("test ").setBold(true).setColor(Color.White), + new TellrawPart("test").setBold(true).setUnderlined(true).setColor(Color.White), new TellrawPart(" test").setBold(true).setColor(Color.White))); + list.add(new ChatFormatIT(sender, "**test _test_ test**", new TellrawPart("test ").setBold(true).setColor(Color.White), + new TellrawPart("test").setItalic(true).setBold(true).setColor(Color.White), new TellrawPart(" test").setBold(true).setColor(Color.White))); list.add(new ChatFormatIT(sender, "https://norbipeti.github.io/test?test&test#test", new TellrawPart("https://norbipeti.github.io/test?test&test#test") .setColor(Color.White).setUnderlined(true) .setHoverEvent(TellrawEvent.create(HoverAction.SHOW_TEXT, From 2a9bc58157fa6e3bad5b6bf1c688c2b53a0509f0 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 15 Dec 2019 03:49:32 +0100 Subject: [PATCH 3/6] F i x & clean combining and attempt to fix range conversion It might do too many sorts but hey #71 --- .idea/ButtonChat.iml | 2 +- pom.xml | 2 +- .../formatter/formatting/ChatFormatter.java | 62 +++++++++++-------- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/.idea/ButtonChat.iml b/.idea/ButtonChat.iml index 43f0ec8..d69e1d2 100644 --- a/.idea/ButtonChat.iml +++ b/.idea/ButtonChat.iml @@ -34,7 +34,7 @@ - + diff --git a/pom.xml b/pom.xml index d0a8e52..aad8659 100644 --- a/pom.xml +++ b/pom.xml @@ -213,7 +213,7 @@ com.palmergames.bukkit.towny Towny - 0.95.0.0 + 0.95.2.0 provided