From 47fa69a06cefc904a83af7bfe9c229cbaa13fe5d Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 03:45:00 +0300 Subject: [PATCH 01/20] added early color object support --- .../dev/cattyn/catformat/stylist/Stylist.java | 6 ++++ .../stylist/impl/members/FieldStylist.java | 17 ++++++---- .../stylist/impl/members/MemberStylist.java | 33 +++++++++++++++++-- .../stylist/impl/members/MethodStylist.java | 13 +++++--- .../stylist/wrappers/AwtWrapper.java | 15 +++++++++ .../stylist/wrappers/ColorWrapper.java | 11 +++++++ .../catformat/utils/ReflectionUtils.java | 4 +++ .../cattyn/catformat/test/StylistTest.java | 9 +++++ .../catformat/test/style/IllegalStyle.java | 8 +++++ .../catformat/test/style/NonStaticStyle.java | 2 +- .../catformat/test/style/SimpleStyle.java | 2 +- 11 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java create mode 100644 catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java index 3af4186..1ec3d11 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java @@ -1,10 +1,16 @@ package dev.cattyn.catformat.stylist; import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.stylist.wrappers.AwtWrapper; +import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; +import java.util.ArrayList; import java.util.List; public interface Stylist { + // TODO no. This way it sucks... + List> WRAPPERS = new ArrayList<>(List.of(new AwtWrapper())); + List getEntries(T target); default List getEntries0(Object object) { diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java index 73d7c3b..edb3571 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java @@ -12,7 +12,7 @@ public FieldStylist(Object parent) { } @Override - public Supplier getColorSupplier(Field member) { + public Supplier getColorSupplier(Field member) { access(member, parent); if (isFinal(member)) { return immutable(member); @@ -20,19 +20,24 @@ public Supplier getColorSupplier(Field member) { return mutable(member); } - private Supplier immutable(Field field) { + @Override + public Class getReturnType(Field member) { + return member.getType(); + } + + private Supplier immutable(Field field) { try { Object o = field.get(parent); - return () -> (Integer) o; + return () -> o; } catch (IllegalAccessException e) { throw new RuntimeException(e); } } - private Supplier mutable(Field field) { + private Supplier mutable(Field field) { VarHandle handle = unreflect(field); if (parent != null) - return () -> (Integer) handle.get(parent); - return () -> (Integer) handle.get(); + return () -> handle.get(parent); + return handle::get; } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java index 4f03665..35fa419 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java @@ -3,6 +3,7 @@ import dev.cattyn.catformat.formatter.FormatEntry; import dev.cattyn.catformat.stylist.Stylist; import dev.cattyn.catformat.stylist.annotations.Style; +import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; import dev.cattyn.catformat.utils.ReflectionUtils; import java.lang.reflect.AnnotatedElement; @@ -11,6 +12,8 @@ import java.util.List; import java.util.function.Supplier; +import static dev.cattyn.catformat.utils.ReflectionUtils.isInteger; + public abstract class MemberStylist implements Stylist { protected final Object parent; @@ -27,18 +30,23 @@ public List getEntries(T[] members) { if (style == null || isInvalid(member)) continue; - Supplier supplier = getColorSupplier(member); + Class type = getReturnType(member); + ColorWrapper wrapper = getWrapper(type); + + Supplier supplier = getColorSupplier(member); if (supplier == null) continue; String name = getName(member, style); - entries.add(new FormatEntry(name, supplier)); + entries.add(buildEntry(name, supplier, wrapper)); } return entries; } - public abstract Supplier getColorSupplier(T member); + public abstract Supplier getColorSupplier(T member); + + public abstract Class getReturnType(T member); protected boolean isInvalid(T member) { if (parent != null) return false; @@ -50,4 +58,23 @@ private String getName(T member, Style style) { if (name.isEmpty()) name = member.getName(); return name; } + + private ColorWrapper getWrapper(Class klass) { + if (isInteger(klass)) return null; + + for (ColorWrapper wrapper : Stylist.WRAPPERS) { + if (wrapper.getType().isAssignableFrom(klass)) { + return wrapper; + } + } + + throw new IllegalArgumentException("Color wrapper for class %s not found!".formatted(klass)); + } + + private FormatEntry buildEntry(String name, Supplier object, ColorWrapper wrapper) { + if (wrapper == null) + return new FormatEntry(name, (Supplier) object); + + return new FormatEntry(name, () -> wrapper.getRGB0(object.get())); + } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java index b37532a..d4f6591 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java @@ -12,7 +12,7 @@ public MethodStylist(Object parent) { } @Override - public Supplier getColorSupplier(Method member) { + public Supplier getColorSupplier(Method member) { access(member, parent); try { MethodHandles.Lookup lookup = lookup(member); @@ -37,17 +37,22 @@ public Supplier getColorSupplier(Method member) { } } + @Override + public Class getReturnType(Method member) { + return member.getReturnType(); + } + @Override protected boolean isInvalid(Method member) { if (member.getParameterCount() != 0) return true; return super.isInvalid(member); } - private Supplier buildSupplier(MethodHandle handle, boolean isStatic) + private Supplier buildSupplier(MethodHandle handle, boolean isStatic) throws Throwable { if (isStatic) { - return (Supplier) handle.invokeExact(); + return (Supplier) handle.invokeExact(); } - return (Supplier) handle.bindTo(parent).invokeExact(); + return (Supplier) handle.bindTo(parent).invokeExact(); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java new file mode 100644 index 0000000..93ab4a2 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java @@ -0,0 +1,15 @@ +package dev.cattyn.catformat.stylist.wrappers; + +import java.awt.*; + +public class AwtWrapper implements ColorWrapper { + @Override + public int getRGB(Color o) { + return o.hashCode(); + } + + @Override + public Class getType() { + return Color.class; + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java new file mode 100644 index 0000000..0586104 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java @@ -0,0 +1,11 @@ +package dev.cattyn.catformat.stylist.wrappers; + +public interface ColorWrapper { + int getRGB(T o); + + Class getType(); + + default int getRGB0(Object o) { + return getRGB((T) o); + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java index 6444ca9..8ba0e38 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java @@ -20,6 +20,10 @@ public static boolean isFinal(Member field) { return Modifier.isFinal(field.getModifiers()); } + public static boolean isInteger(Class klass) { + return int.class == klass || Integer.class == klass; + } + public static void access(AccessibleObject object, Object obj) { if (object.canAccess(obj)) { return; diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java index f4cf125..0df7425 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java @@ -2,6 +2,7 @@ import dev.cattyn.catformat.CatFormat; import dev.cattyn.catformat.test.content.ContentWrapper; +import dev.cattyn.catformat.test.style.IllegalStyle; import dev.cattyn.catformat.test.style.NonStaticStyle; import dev.cattyn.catformat.test.style.SimpleStyle; import org.junit.jupiter.api.Test; @@ -9,8 +10,16 @@ import java.awt.*; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class StylistTest { + @Test + public void illegalStyleTest() { + CatFormat format = new CatFormat<>(new ContentWrapper()); + assertThrows(IllegalArgumentException.class, + () -> format.add(new IllegalStyle())); + } + @Test public void stylistTest() { CatFormat format = new CatFormat<>(new ContentWrapper()); diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java new file mode 100644 index 0000000..b2594eb --- /dev/null +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java @@ -0,0 +1,8 @@ +package dev.cattyn.catformat.test.style; + +import dev.cattyn.catformat.stylist.annotations.Style; + +public class IllegalStyle { + @Style + boolean color = false; +} diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java index 0541008..ccc6b9a 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java @@ -11,7 +11,7 @@ public class NonStaticStyle { int MAGENTA_LIGHT_COLOR = Color.magenta.brighter().hashCode(); @Style("black") - int BLACK_COLOR = Color.black.hashCode(); + Color BLACK_COLOR = Color.black; @Style("dynamic") public int dynamic = Color.blue.hashCode(); diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java index 6567ad9..c598afa 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java @@ -11,7 +11,7 @@ public class SimpleStyle { static final int MAGENTA_LIGHT_COLOR = Color.magenta.brighter().hashCode(); @Style("black") - static final int BLACK_COLOR = Color.black.hashCode(); + static final Color BLACK_COLOR = Color.black; @Style("dynamic") public static int DYNAMIC = Color.blue.hashCode(); From cece7fd3dabaf59d5a144f3b272161b6eeb02770 Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 18:40:12 +0300 Subject: [PATCH 02/20] no more pseudocode --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6cc373b..81e381b 100644 --- a/README.md +++ b/README.md @@ -52,10 +52,10 @@ import dev.cattyn.catformat.fabric.FabricCatFormat; import java.awt.Color; import java.util.Random; -public static final FabricCatFormat formatter = // you can create only one static instance - new FabricCatFormat().addVanilla(); // of the Formatter and use it everywhere! +FabricCatFormat formatter = // you can create only one static instance + new FabricCatFormat().addVanilla(); // of the Formatter and use it everywhere! -void func() { +void main() { formatter.format("${red} Hello world!"); // red colored 'Hello world!' formatter.format("#{f0f} Hello world!"); // magenta colored 'Hello world!' formatter.format("#{0000ff} Hello world!"); // blue colored 'Hello world!' From aff0f40c46b82b0bf40a63c91d4838c92979b040 Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 19:23:36 +0300 Subject: [PATCH 03/20] added more abstraction --- README.md | 4 +- .../java/dev/cattyn/catformat/CatFormat.java | 61 ++++++------------- .../dev/cattyn/catformat/CatFormatImpl.java | 27 ++++++++ .../catformat/{formatter => }/Formatter.java | 10 +-- .../catformat/entry/EntryContainer.java | 15 +++++ .../catformat/entry/EntryContainerImpl.java | 36 +++++++++++ .../{formatter => entry}/FormatEntry.java | 2 +- .../cattyn/catformat/parser/HexParser.java | 4 +- .../cattyn/catformat/parser/NameParser.java | 6 +- .../dev/cattyn/catformat/parser/Parser.java | 4 +- .../dev/cattyn/catformat/stylist/Stylist.java | 2 +- .../catformat/stylist/impl/ClassStylist.java | 2 +- .../stylist/impl/members/MemberStylist.java | 2 +- .../{formatter => utils}/ChunkType.java | 2 +- .../cattyn/catformat/test/CatFormatTest.java | 8 ++- .../cattyn/catformat/test/StylistTest.java | 19 +++--- .../catformat/fabric/FabricCatFormat.java | 14 +++-- .../catformat/legacy/LegacyCatFormat.java | 13 +++- 18 files changed, 150 insertions(+), 81 deletions(-) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java rename catformat-core/src/main/java/dev/cattyn/catformat/{formatter => }/Formatter.java (93%) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java rename catformat-core/src/main/java/dev/cattyn/catformat/{formatter => entry}/FormatEntry.java (80%) rename catformat-core/src/main/java/dev/cattyn/catformat/{formatter => utils}/ChunkType.java (58%) diff --git a/README.md b/README.md index 81e381b..782f9e3 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ import dev.cattyn.catformat.fabric.FabricCatFormat; import java.awt.Color; import java.util.Random; -FabricCatFormat formatter = // you can create only one static instance - new FabricCatFormat().addVanilla(); // of the Formatter and use it everywhere! +// you can create only one static instance of the Formatter and use it everywhere! +FabricCatFormat formatter = new FabricCatFormat(); void main() { formatter.format("${red} Hello world!"); // red colored 'Hello world!' diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java index 5669b87..721447f 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java @@ -1,62 +1,37 @@ package dev.cattyn.catformat; -import dev.cattyn.catformat.formatter.FormatEntry; -import dev.cattyn.catformat.formatter.Formatter; -import dev.cattyn.catformat.stylist.Stylist; -import dev.cattyn.catformat.stylist.impl.ClassStylist; -import dev.cattyn.catformat.text.TextWrapper; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; +import dev.cattyn.catformat.entry.EntryContainer; +import dev.cattyn.catformat.entry.FormatEntry; -public class CatFormat { - private static final FormatEntry NULL_FORMAT = new FormatEntry("null", () -> -1); - private final List formats = new ArrayList<>(); - private final TextWrapper wrapper; +import java.util.function.Consumer; +import java.util.function.Supplier; - private Stylist stylist = new ClassStylist(); +public interface CatFormat { + EntryContainer entries(); - public CatFormat(TextWrapper wrapper) { - this.wrapper = wrapper; - } + T format(String s); - public FormatEntry getEntry(String name) { - for (FormatEntry format : formats) { - if (format.name().equalsIgnoreCase(name)) - return format; - } - return NULL_FORMAT; + default T format(String s, Object... o) { + return format(s.formatted(o)); } - public CatFormat add(Object o) { - formats.addAll(stylist.getEntries0(o)); + default CatFormat styled(Consumer consumer) { + consumer.accept(entries()); return this; } - public CatFormat add(String name, int color) { - return add(name, () -> color); - } - - public CatFormat add(String name, Supplier color) { - formats.add(new FormatEntry(name, color)); + default CatFormat add(String name, Supplier color) { + entries().add(new FormatEntry(name, color)); return this; } - public T format(String s, Object... objects) { - return format(s.formatted(objects)); - } - - public T format(String s) { - return new Formatter<>(this, s).handle(); - } - - public CatFormat stylist(Stylist stylist) { - this.stylist = stylist; + default CatFormat add(Object o) { + EntryContainer entries = entries(); + entries.stylist().getEntries0(o).forEach(entries::add); return this; } - public TextWrapper getWrapper() { - return wrapper; + default CatFormat add(String name, int color) { + return add(name, () -> color); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java new file mode 100644 index 0000000..1102c75 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java @@ -0,0 +1,27 @@ +package dev.cattyn.catformat; + +import dev.cattyn.catformat.entry.EntryContainer; +import dev.cattyn.catformat.entry.EntryContainerImpl; +import dev.cattyn.catformat.text.TextWrapper; + +public class CatFormatImpl implements CatFormat { + private final EntryContainer container = new EntryContainerImpl(); + private final TextWrapper wrapper; + + public CatFormatImpl(TextWrapper wrapper) { + this.wrapper = wrapper; + } + + @Override + public EntryContainer entries() { + return container; + } + + public T format(String s) { + return new Formatter<>(this, s).handle(); + } + + public TextWrapper getWrapper() { + return wrapper; + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java similarity index 93% rename from catformat-core/src/main/java/dev/cattyn/catformat/formatter/Formatter.java rename to catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index 2f1c521..b1ba08c 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -1,11 +1,11 @@ -package dev.cattyn.catformat.formatter; +package dev.cattyn.catformat; -import dev.cattyn.catformat.CatFormat; import dev.cattyn.catformat.parser.HexParser; import dev.cattyn.catformat.parser.Parser; import dev.cattyn.catformat.parser.NameParser; import dev.cattyn.catformat.text.Modifier; import dev.cattyn.catformat.text.TextWrapper; +import dev.cattyn.catformat.utils.ChunkType; import dev.cattyn.catformat.utils.StringUtils; import java.util.EnumSet; @@ -26,7 +26,7 @@ NAME_TYPE_ALT, new NameParser() private final StringBuilder expr = new StringBuilder(); private final StringBuilder chunk = new StringBuilder(); - private final CatFormat catFormat; + private final CatFormatImpl catFormat; private final String target; private final TextWrapper wrapper; private ChunkType type = ChunkType.TEXT; @@ -37,7 +37,7 @@ NAME_TYPE_ALT, new NameParser() private char lastOpcode; - public Formatter(CatFormat catFormat, String target) { + public Formatter(CatFormatImpl catFormat, String target) { this.catFormat = catFormat; this.target = target; this.wrapper = catFormat.getWrapper(); @@ -128,7 +128,7 @@ private boolean endExpr(char c) { type = ChunkType.ESCAPE; if (colored()) { - color = parser.getColor(catFormat, expr.toString()); + color = parser.getColor(catFormat.entries(), expr.toString()); } StringUtils.clear(expr); return true; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java new file mode 100644 index 0000000..f72e45b --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java @@ -0,0 +1,15 @@ +package dev.cattyn.catformat.entry; + +import dev.cattyn.catformat.stylist.Stylist; + +public interface EntryContainer { + FormatEntry NULL_FORMAT = new FormatEntry("null", () -> -1); + + void add(FormatEntry entry); + + FormatEntry get(String name); + + Stylist stylist(); + + void stylist(Stylist stylist); +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java new file mode 100644 index 0000000..fa01ba5 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java @@ -0,0 +1,36 @@ +package dev.cattyn.catformat.entry; + +import dev.cattyn.catformat.stylist.Stylist; +import dev.cattyn.catformat.stylist.impl.ClassStylist; + +import java.util.ArrayList; +import java.util.List; + +public class EntryContainerImpl implements EntryContainer{ + private final List formats = new ArrayList<>(); + private Stylist stylist = new ClassStylist(); + + @Override + public void add(FormatEntry entry) { + formats.add(entry); + } + + @Override + public FormatEntry get(String name) { + for (FormatEntry format : formats) { + if (format.name().equalsIgnoreCase(name)) + return format; + } + return NULL_FORMAT; + } + + @Override + public Stylist stylist() { + return stylist; + } + + @Override + public void stylist(Stylist stylist) { + this.stylist = stylist; + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/FormatEntry.java b/catformat-core/src/main/java/dev/cattyn/catformat/entry/FormatEntry.java similarity index 80% rename from catformat-core/src/main/java/dev/cattyn/catformat/formatter/FormatEntry.java rename to catformat-core/src/main/java/dev/cattyn/catformat/entry/FormatEntry.java index 432c831..cc47135 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/FormatEntry.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/entry/FormatEntry.java @@ -1,4 +1,4 @@ -package dev.cattyn.catformat.formatter; +package dev.cattyn.catformat.entry; import java.util.function.Supplier; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java b/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java index 098e029..f64b37e 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java @@ -1,10 +1,10 @@ package dev.cattyn.catformat.parser; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; public class HexParser implements Parser { @Override - public int getColor(CatFormat format, String expr) { + public int getColor(EntryContainer entries, String expr) { if (expr.length() == 3) { // css color support char[] c = expr.toCharArray(); diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java b/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java index 210bc70..558d6f2 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java @@ -1,10 +1,10 @@ package dev.cattyn.catformat.parser; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; public class NameParser implements Parser { @Override - public int getColor(CatFormat format, String expr) { - return format.getEntry(expr).getColor(); + public int getColor(EntryContainer entries, String expr) { + return entries.get(expr).getColor(); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java b/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java index 8db17b1..a84e84c 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java @@ -1,7 +1,7 @@ package dev.cattyn.catformat.parser; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; public interface Parser { - int getColor(CatFormat format, String expr); + int getColor(EntryContainer entries, String expr); } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java index 1ec3d11..f30fdbd 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java @@ -1,6 +1,6 @@ package dev.cattyn.catformat.stylist; -import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.entry.FormatEntry; import dev.cattyn.catformat.stylist.wrappers.AwtWrapper; import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java index a66c63f..f1bca8c 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java @@ -1,6 +1,6 @@ package dev.cattyn.catformat.stylist.impl; -import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.entry.FormatEntry; import dev.cattyn.catformat.stylist.Stylist; import dev.cattyn.catformat.stylist.impl.members.FieldStylist; import dev.cattyn.catformat.stylist.impl.members.MethodStylist; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java index 35fa419..d0e42e1 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java @@ -1,6 +1,6 @@ package dev.cattyn.catformat.stylist.impl.members; -import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.entry.FormatEntry; import dev.cattyn.catformat.stylist.Stylist; import dev.cattyn.catformat.stylist.annotations.Style; import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/ChunkType.java b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ChunkType.java similarity index 58% rename from catformat-core/src/main/java/dev/cattyn/catformat/formatter/ChunkType.java rename to catformat-core/src/main/java/dev/cattyn/catformat/utils/ChunkType.java index fd0bee3..6319f85 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/ChunkType.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ChunkType.java @@ -1,4 +1,4 @@ -package dev.cattyn.catformat.formatter; +package dev.cattyn.catformat.utils; public enum ChunkType { TEXT, EXPR, MOD, ESCAPE; diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java index c8cd589..6c316aa 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java @@ -1,9 +1,11 @@ package dev.cattyn.catformat.test; +import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; import dev.cattyn.catformat.test.colored.ColoredText; import dev.cattyn.catformat.test.colored.ColoredTextWrapper; import dev.cattyn.catformat.test.content.ContentWrapper; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; import dev.cattyn.catformat.text.Modifier; import org.junit.jupiter.api.Test; @@ -15,7 +17,7 @@ public class CatFormatTest { @Test public void contentTest() { - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); String result = format.format("${red} Lorem ipsum dolor sit ${blue} amet, consectetur adipiscing {}elit{}"); @@ -24,7 +26,7 @@ public void contentTest() { @Test public void colorTest() { - CatFormat format = new CatFormat<>(new ColoredTextWrapper()); + CatFormat format = new CatFormatImpl<>(new ColoredTextWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); ColoredText result = format.format("${red} Lorem ipsum ${blue+b} dolor {} sit"); diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java index 0df7425..af6f62a 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java @@ -1,6 +1,7 @@ package dev.cattyn.catformat.test; import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; import dev.cattyn.catformat.test.content.ContentWrapper; import dev.cattyn.catformat.test.style.IllegalStyle; import dev.cattyn.catformat.test.style.NonStaticStyle; @@ -15,14 +16,14 @@ public class StylistTest { @Test public void illegalStyleTest() { - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); assertThrows(IllegalArgumentException.class, () -> format.add(new IllegalStyle())); } @Test public void stylistTest() { - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add(SimpleStyle.class); assertStyle( format, @@ -34,7 +35,7 @@ public void stylistTest() { @Test public void stylistNonStaticTest() { NonStaticStyle style = new NonStaticStyle(); - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add(style); assertStyle( format, @@ -45,15 +46,15 @@ public void stylistNonStaticTest() { // maybe its autistic But I don't really Care. private void assertStyle(CatFormat format, Runnable setDynamicToGreen, Runnable enableDarkMode) { - assertEquals(format.getEntry("MAGENTA_LIGHT_COLOR").getColor(), Color.magenta.brighter().hashCode()); - assertEquals(format.getEntry("black").getColor(), Color.black.hashCode()); + assertEquals(format.entries().get("MAGENTA_LIGHT_COLOR").getColor(), Color.magenta.brighter().hashCode()); + assertEquals(format.entries().get("black").getColor(), Color.black.hashCode()); - assertEquals(format.getEntry("dynamic").getColor(), Color.blue.hashCode()); + assertEquals(format.entries().get("dynamic").getColor(), Color.blue.hashCode()); setDynamicToGreen.run(); - assertEquals(format.getEntry("dynamic").getColor(), Color.green.hashCode()); + assertEquals(format.entries().get("dynamic").getColor(), Color.green.hashCode()); - assertEquals(format.getEntry("theme-color").getColor(), Color.black.hashCode()); + assertEquals(format.entries().get("theme-color").getColor(), Color.black.hashCode()); enableDarkMode.run(); - assertEquals(format.getEntry("theme-color").getColor(), Color.white.hashCode()); + assertEquals(format.entries().get("theme-color").getColor(), Color.white.hashCode()); } } diff --git a/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java b/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java index e5ad7c1..8de09dc 100644 --- a/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java +++ b/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java @@ -1,21 +1,27 @@ package dev.cattyn.catformat.fabric; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; import net.minecraft.text.MutableText; import net.minecraft.util.Formatting; -public class FabricCatFormat extends CatFormat { +public class FabricCatFormat extends CatFormatImpl { public FabricCatFormat() { + this(true); + } + + public FabricCatFormat(boolean vanilla) { super(new FabricWrapper()); + if (vanilla) { + addVanilla(); + } } - public FabricCatFormat addVanilla() { + private void addVanilla() { for (Formatting value : Formatting.values()) { if (!value.isColor() || value.getColorValue() == null) { continue; } add(value.getName(), value.getColorValue()); } - return this; } } diff --git a/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java b/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java index 6d2536f..41f631a 100644 --- a/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java +++ b/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java @@ -1,13 +1,20 @@ package dev.cattyn.catformat.legacy; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; -public class LegacyCatFormat extends CatFormat { +public class LegacyCatFormat extends CatFormatImpl { public LegacyCatFormat() { + this(true); + } + + public LegacyCatFormat(boolean vanilla) { super(new LegacyWrapper()); + if (vanilla) { + addDefaults(); + } } - public LegacyCatFormat addDefaults() { + private LegacyCatFormat addDefaults() { for (Formatting value : Formatting.values()) { if (value == Formatting.OBFUSCATED) break; add(value.getName(), value.ordinal()); From 7afca216d36c93373fb193efe3b3d0c2047589db Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 19:25:40 +0300 Subject: [PATCH 04/20] refactored `getWrapper` to `wrapper` --- .../src/main/java/dev/cattyn/catformat/CatFormat.java | 3 +++ .../main/java/dev/cattyn/catformat/CatFormatImpl.java | 9 +++++---- .../src/main/java/dev/cattyn/catformat/Formatter.java | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java index 721447f..89a745d 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java @@ -2,6 +2,7 @@ import dev.cattyn.catformat.entry.EntryContainer; import dev.cattyn.catformat.entry.FormatEntry; +import dev.cattyn.catformat.text.TextWrapper; import java.util.function.Consumer; import java.util.function.Supplier; @@ -9,6 +10,8 @@ public interface CatFormat { EntryContainer entries(); + TextWrapper wrapper(); + T format(String s); default T format(String s, Object... o) { diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java index 1102c75..a29af8b 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java @@ -17,11 +17,12 @@ public EntryContainer entries() { return container; } - public T format(String s) { - return new Formatter<>(this, s).handle(); + @Override + public TextWrapper wrapper() { + return wrapper; } - public TextWrapper getWrapper() { - return wrapper; + public T format(String s) { + return new Formatter<>(this, s).handle(); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index b1ba08c..21f0d6f 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -40,7 +40,7 @@ NAME_TYPE_ALT, new NameParser() public Formatter(CatFormatImpl catFormat, String target) { this.catFormat = catFormat; this.target = target; - this.wrapper = catFormat.getWrapper(); + this.wrapper = catFormat.wrapper(); this.core = this.wrapper.newText(); } From 7eb15b0b9b4ad6924f4d33427510108ddbab0163 Mon Sep 17 00:00:00 2001 From: cattyn Date: Mon, 3 Feb 2025 11:12:01 +0300 Subject: [PATCH 05/20] removed `$` prefix from the formatting --- README.md | 16 ++++++++-------- .../java/dev/cattyn/catformat/Formatter.java | 18 +++++++++++------- .../cattyn/catformat/test/CatFormatTest.java | 4 ++-- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 782f9e3..43f5580 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ I got tired of using Minecraft's `Text` objects like huge builders (e.g `Text.li There are a few placeholders that you need to know about: - `{}` - Resets the current color and style to the default one. -- `${}` - Sets the text color to the given variable color (e.g `${red}`, `${cyan}`, check [Minecraft Color Codes](https://minecraft.tools/en/color-code.php)). -- `#{}` - Sets the text color to the given hex value (e.g `#{fff}`, `#{ff00ff}`). +- `{var}` - Sets the text color to the given variable color (e.g `${red}`, `${cyan}`, check [Minecraft Color Codes](https://minecraft.tools/en/color-code.php)). +- `{#hex}` - Sets the text color to the given hex value (e.g `#{fff}`, `#{ff00ff}`). - `+obius` modifiers - Sets the modifier of the text. You can also combine modifiers, e.g `${+bi}` - ***bold + italic***. - o - [obfuscated text](images/obfuscated.gif) @@ -56,20 +56,20 @@ import java.util.Random; FabricCatFormat formatter = new FabricCatFormat(); void main() { - formatter.format("${red} Hello world!"); // red colored 'Hello world!' - formatter.format("#{f0f} Hello world!"); // magenta colored 'Hello world!' - formatter.format("#{0000ff} Hello world!"); // blue colored 'Hello world!' - formatter.format("${red+b} Hello {} world!"); // red colored 'Hello' with bold style and ' world!' without any style + formatter.format("{red} Hello world!"); // red colored 'Hello world!' + formatter.format("{#f0f} Hello world!"); // magenta colored 'Hello world!' + formatter.format("{#0000ff} Hello world!"); // blue colored 'Hello world!' + formatter.format("{red+b} Hello {} world!"); // red colored 'Hello' with bold style and ' world!' without any style // It also supports Java's default formatting tool - String.format() - formatter.format("${red} Hello %s!", "world"); // red colored 'Hello world!' + formatter.format("{red} Hello %s!", "world"); // red colored 'Hello world!' // You can create your own color namespaces too! formatter.add("light_green", 0x99FF99); formatter.add("pink", Color.PINK.hashCode()); formatter.add("random_color", () -> new Random().nextInt(0xFFFFFF)); - formatter.format("${light_green} Hello ${random_color} world ${pink}!"); + formatter.format("{light_green} Hello {random_color} world {pink}!"); } ``` diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index 21f0d6f..a0a6d1b 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -65,19 +65,13 @@ private void handleText(char opcode) { return; } - // garbage begin if (opcode == BEGIN_EXPR) { - Parser parser = PARSER_MAP.get(lastOpcode); type = ChunkType.EXPR; - if (parser != null) { - StringUtils.shrink(chunk); - } concat(); modifiers.clear(); - this.parser = parser; + parser = null; return; } - // garbage end chunk.append(opcode); } @@ -92,6 +86,16 @@ private void handleExpr(char opcode) { return; } + if (lastOpcode == BEGIN_EXPR + && opcode == HEX_TYPE) { + parser = new HexParser(); + return; + } + + if (parser == null) { + parser = new NameParser(); + } + expr.append(opcode); } diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java index 6c316aa..45f9a4a 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java @@ -20,7 +20,7 @@ public void contentTest() { CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); - String result = format.format("${red} Lorem ipsum dolor sit ${blue} amet, consectetur adipiscing {}elit{}"); + String result = format.format("{red} Lorem ipsum dolor sit {blue} amet, consectetur adipiscing {}elit{}"); assertEquals("Lorem ipsum dolor sit amet, consectetur adipiscing elit", result); } @@ -29,7 +29,7 @@ public void colorTest() { CatFormat format = new CatFormatImpl<>(new ColoredTextWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); - ColoredText result = format.format("${red} Lorem ipsum ${blue+b} dolor {} sit"); + ColoredText result = format.format("{#f00} Lorem ipsum {blue+b} dolor {} sit"); List children = result.getChildren(); EnumSet modifiers = EnumSet.noneOf(Modifier.class); From 7acee91c7dfc1862d2c9ec6aab9a21cd66715123 Mon Sep 17 00:00:00 2001 From: cattyn Date: Mon, 3 Feb 2025 17:51:36 +0300 Subject: [PATCH 06/20] kotlin dsl (BIG) --- catformat-kotlin-dsl/build.gradle.kts | 15 +++++++++++ .../dev/cattyn/catformat/CatFormatDSL.kt | 26 +++++++++++++++++++ settings.gradle.kts | 1 + 3 files changed, 42 insertions(+) create mode 100644 catformat-kotlin-dsl/build.gradle.kts create mode 100644 catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt diff --git a/catformat-kotlin-dsl/build.gradle.kts b/catformat-kotlin-dsl/build.gradle.kts new file mode 100644 index 0000000..b25d3fb --- /dev/null +++ b/catformat-kotlin-dsl/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + kotlin("jvm") version "1.9.23" +} + +repositories { + mavenCentral() +} + +dependencies { + implementation(project(":catformat-core")) +} + +kotlin { + jvmToolchain(17) +} \ No newline at end of file diff --git a/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt new file mode 100644 index 0000000..5a991e8 --- /dev/null +++ b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt @@ -0,0 +1,26 @@ +package dev.cattyn.catformat + +import dev.cattyn.catformat.entry.FormatEntry +import java.awt.Color +import java.util.function.Supplier + +// the most useless shit ever + +class Config(private val format: CatFormat) { + infix fun String.by(color: Supplier) { + format.entries().add(FormatEntry(this, color)) + } + + infix fun String.by(color: Int) { + by { color } + } + + infix fun String.by(color: Color) { + by(color.hashCode()) + } +} + +fun CatFormat.config(unit: Config.() -> Unit): CatFormat { + Config(this).unit() + return this +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 5f597ae..141734a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,3 +11,4 @@ pluginManagement { include("catformat-legacy-text") include("catformat-fabric") include("catformat-core") +include("catformat-kotlin-dsl") From 06b07605fb9fe68c4043ca06e5bc87a6f2fb838f Mon Sep 17 00:00:00 2001 From: cattyn Date: Mon, 3 Feb 2025 18:06:29 +0300 Subject: [PATCH 07/20] fixed readme typos --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 43f5580..9328c79 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,10 @@ I got tired of using Minecraft's `Text` objects like huge builders (e.g `Text.li There are a few placeholders that you need to know about: - `{}` - Resets the current color and style to the default one. -- `{var}` - Sets the text color to the given variable color (e.g `${red}`, `${cyan}`, check [Minecraft Color Codes](https://minecraft.tools/en/color-code.php)). -- `{#hex}` - Sets the text color to the given hex value (e.g `#{fff}`, `#{ff00ff}`). +- `{var}` - Sets the text color to the given variable color (e.g `{red}`, `{cyan}`, check [Minecraft Color Codes](https://minecraft.tools/en/color-code.php)). +- `{#hex}` - Sets the text color to the given hex value (e.g `{#fff}`, `{#ff00ff}`). - `+obius` modifiers - Sets the modifier of the text. You can also combine modifiers, -e.g `${+bi}` - ***bold + italic***. +e.g `{+bi}` - ***bold + italic***. - o - [obfuscated text](images/obfuscated.gif) - b - **bold text** - i - *italic text* From 7c986885e3916e4b9ad491eca9541472bc1dbef2 Mon Sep 17 00:00:00 2001 From: cattyn Date: Tue, 4 Feb 2025 23:52:24 +0300 Subject: [PATCH 08/20] kotlin dsl stylist support --- .../src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt index 5a991e8..c6b4cec 100644 --- a/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt +++ b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt @@ -1,12 +1,17 @@ package dev.cattyn.catformat import dev.cattyn.catformat.entry.FormatEntry +import dev.cattyn.catformat.stylist.Stylist import java.awt.Color import java.util.function.Supplier // the most useless shit ever class Config(private val format: CatFormat) { + var stylist: Stylist<*> + get() = format.entries().stylist() + set(value) = format.entries().stylist(value) + infix fun String.by(color: Supplier) { format.entries().add(FormatEntry(this, color)) } From 45c1629b7f298aee503012da4687e44573edb2b6 Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 03:45:00 +0300 Subject: [PATCH 09/20] added early color object support --- .../dev/cattyn/catformat/stylist/Stylist.java | 6 ++++ .../stylist/impl/members/FieldStylist.java | 17 ++++++---- .../stylist/impl/members/MemberStylist.java | 33 +++++++++++++++++-- .../stylist/impl/members/MethodStylist.java | 13 +++++--- .../stylist/wrappers/AwtWrapper.java | 15 +++++++++ .../stylist/wrappers/ColorWrapper.java | 11 +++++++ .../catformat/utils/ReflectionUtils.java | 4 +++ .../cattyn/catformat/test/StylistTest.java | 9 +++++ .../catformat/test/style/IllegalStyle.java | 8 +++++ .../catformat/test/style/NonStaticStyle.java | 2 +- .../catformat/test/style/SimpleStyle.java | 2 +- 11 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java create mode 100644 catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java index 3af4186..1ec3d11 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java @@ -1,10 +1,16 @@ package dev.cattyn.catformat.stylist; import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.stylist.wrappers.AwtWrapper; +import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; +import java.util.ArrayList; import java.util.List; public interface Stylist { + // TODO no. This way it sucks... + List> WRAPPERS = new ArrayList<>(List.of(new AwtWrapper())); + List getEntries(T target); default List getEntries0(Object object) { diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java index 73d7c3b..edb3571 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java @@ -12,7 +12,7 @@ public FieldStylist(Object parent) { } @Override - public Supplier getColorSupplier(Field member) { + public Supplier getColorSupplier(Field member) { access(member, parent); if (isFinal(member)) { return immutable(member); @@ -20,19 +20,24 @@ public Supplier getColorSupplier(Field member) { return mutable(member); } - private Supplier immutable(Field field) { + @Override + public Class getReturnType(Field member) { + return member.getType(); + } + + private Supplier immutable(Field field) { try { Object o = field.get(parent); - return () -> (Integer) o; + return () -> o; } catch (IllegalAccessException e) { throw new RuntimeException(e); } } - private Supplier mutable(Field field) { + private Supplier mutable(Field field) { VarHandle handle = unreflect(field); if (parent != null) - return () -> (Integer) handle.get(parent); - return () -> (Integer) handle.get(); + return () -> handle.get(parent); + return handle::get; } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java index 4f03665..35fa419 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java @@ -3,6 +3,7 @@ import dev.cattyn.catformat.formatter.FormatEntry; import dev.cattyn.catformat.stylist.Stylist; import dev.cattyn.catformat.stylist.annotations.Style; +import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; import dev.cattyn.catformat.utils.ReflectionUtils; import java.lang.reflect.AnnotatedElement; @@ -11,6 +12,8 @@ import java.util.List; import java.util.function.Supplier; +import static dev.cattyn.catformat.utils.ReflectionUtils.isInteger; + public abstract class MemberStylist implements Stylist { protected final Object parent; @@ -27,18 +30,23 @@ public List getEntries(T[] members) { if (style == null || isInvalid(member)) continue; - Supplier supplier = getColorSupplier(member); + Class type = getReturnType(member); + ColorWrapper wrapper = getWrapper(type); + + Supplier supplier = getColorSupplier(member); if (supplier == null) continue; String name = getName(member, style); - entries.add(new FormatEntry(name, supplier)); + entries.add(buildEntry(name, supplier, wrapper)); } return entries; } - public abstract Supplier getColorSupplier(T member); + public abstract Supplier getColorSupplier(T member); + + public abstract Class getReturnType(T member); protected boolean isInvalid(T member) { if (parent != null) return false; @@ -50,4 +58,23 @@ private String getName(T member, Style style) { if (name.isEmpty()) name = member.getName(); return name; } + + private ColorWrapper getWrapper(Class klass) { + if (isInteger(klass)) return null; + + for (ColorWrapper wrapper : Stylist.WRAPPERS) { + if (wrapper.getType().isAssignableFrom(klass)) { + return wrapper; + } + } + + throw new IllegalArgumentException("Color wrapper for class %s not found!".formatted(klass)); + } + + private FormatEntry buildEntry(String name, Supplier object, ColorWrapper wrapper) { + if (wrapper == null) + return new FormatEntry(name, (Supplier) object); + + return new FormatEntry(name, () -> wrapper.getRGB0(object.get())); + } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java index b37532a..d4f6591 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java @@ -12,7 +12,7 @@ public MethodStylist(Object parent) { } @Override - public Supplier getColorSupplier(Method member) { + public Supplier getColorSupplier(Method member) { access(member, parent); try { MethodHandles.Lookup lookup = lookup(member); @@ -37,17 +37,22 @@ public Supplier getColorSupplier(Method member) { } } + @Override + public Class getReturnType(Method member) { + return member.getReturnType(); + } + @Override protected boolean isInvalid(Method member) { if (member.getParameterCount() != 0) return true; return super.isInvalid(member); } - private Supplier buildSupplier(MethodHandle handle, boolean isStatic) + private Supplier buildSupplier(MethodHandle handle, boolean isStatic) throws Throwable { if (isStatic) { - return (Supplier) handle.invokeExact(); + return (Supplier) handle.invokeExact(); } - return (Supplier) handle.bindTo(parent).invokeExact(); + return (Supplier) handle.bindTo(parent).invokeExact(); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java new file mode 100644 index 0000000..93ab4a2 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/AwtWrapper.java @@ -0,0 +1,15 @@ +package dev.cattyn.catformat.stylist.wrappers; + +import java.awt.*; + +public class AwtWrapper implements ColorWrapper { + @Override + public int getRGB(Color o) { + return o.hashCode(); + } + + @Override + public Class getType() { + return Color.class; + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java new file mode 100644 index 0000000..0586104 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/wrappers/ColorWrapper.java @@ -0,0 +1,11 @@ +package dev.cattyn.catformat.stylist.wrappers; + +public interface ColorWrapper { + int getRGB(T o); + + Class getType(); + + default int getRGB0(Object o) { + return getRGB((T) o); + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java index 6444ca9..8ba0e38 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ReflectionUtils.java @@ -20,6 +20,10 @@ public static boolean isFinal(Member field) { return Modifier.isFinal(field.getModifiers()); } + public static boolean isInteger(Class klass) { + return int.class == klass || Integer.class == klass; + } + public static void access(AccessibleObject object, Object obj) { if (object.canAccess(obj)) { return; diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java index f4cf125..0df7425 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java @@ -2,6 +2,7 @@ import dev.cattyn.catformat.CatFormat; import dev.cattyn.catformat.test.content.ContentWrapper; +import dev.cattyn.catformat.test.style.IllegalStyle; import dev.cattyn.catformat.test.style.NonStaticStyle; import dev.cattyn.catformat.test.style.SimpleStyle; import org.junit.jupiter.api.Test; @@ -9,8 +10,16 @@ import java.awt.*; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class StylistTest { + @Test + public void illegalStyleTest() { + CatFormat format = new CatFormat<>(new ContentWrapper()); + assertThrows(IllegalArgumentException.class, + () -> format.add(new IllegalStyle())); + } + @Test public void stylistTest() { CatFormat format = new CatFormat<>(new ContentWrapper()); diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java new file mode 100644 index 0000000..b2594eb --- /dev/null +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/IllegalStyle.java @@ -0,0 +1,8 @@ +package dev.cattyn.catformat.test.style; + +import dev.cattyn.catformat.stylist.annotations.Style; + +public class IllegalStyle { + @Style + boolean color = false; +} diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java index 0541008..ccc6b9a 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/NonStaticStyle.java @@ -11,7 +11,7 @@ public class NonStaticStyle { int MAGENTA_LIGHT_COLOR = Color.magenta.brighter().hashCode(); @Style("black") - int BLACK_COLOR = Color.black.hashCode(); + Color BLACK_COLOR = Color.black; @Style("dynamic") public int dynamic = Color.blue.hashCode(); diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java index 6567ad9..c598afa 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/style/SimpleStyle.java @@ -11,7 +11,7 @@ public class SimpleStyle { static final int MAGENTA_LIGHT_COLOR = Color.magenta.brighter().hashCode(); @Style("black") - static final int BLACK_COLOR = Color.black.hashCode(); + static final Color BLACK_COLOR = Color.black; @Style("dynamic") public static int DYNAMIC = Color.blue.hashCode(); From db70cbf6c54d1d13896599dfaae0437faae31a59 Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 18:40:12 +0300 Subject: [PATCH 10/20] no more pseudocode --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 581b195..4f24042 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,10 @@ import dev.cattyn.catformat.fabric.FabricCatFormat; import java.awt.Color; import java.util.Random; -public static final FabricCatFormat formatter = // you can create only one static instance - new FabricCatFormat().addVanilla(); // of the Formatter and use it everywhere! +FabricCatFormat formatter = // you can create only one static instance + new FabricCatFormat().addVanilla(); // of the Formatter and use it everywhere! -void func() { +void main() { formatter.format("${red} Hello world!"); // red colored 'Hello world!' formatter.format("#{f0f} Hello world!"); // magenta colored 'Hello world!' formatter.format("#{0000ff} Hello world!"); // blue colored 'Hello world!' From 9f6a103528edef5786884384f1eb3133b4bfcff0 Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 19:23:36 +0300 Subject: [PATCH 11/20] added more abstraction --- README.md | 4 +- .../java/dev/cattyn/catformat/CatFormat.java | 61 ++++++------------- .../dev/cattyn/catformat/CatFormatImpl.java | 27 ++++++++ .../catformat/{formatter => }/Formatter.java | 10 +-- .../catformat/entry/EntryContainer.java | 15 +++++ .../catformat/entry/EntryContainerImpl.java | 36 +++++++++++ .../{formatter => entry}/FormatEntry.java | 2 +- .../cattyn/catformat/parser/HexParser.java | 4 +- .../cattyn/catformat/parser/NameParser.java | 6 +- .../dev/cattyn/catformat/parser/Parser.java | 4 +- .../dev/cattyn/catformat/stylist/Stylist.java | 2 +- .../catformat/stylist/impl/ClassStylist.java | 2 +- .../stylist/impl/members/MemberStylist.java | 2 +- .../{formatter => utils}/ChunkType.java | 2 +- .../cattyn/catformat/test/CatFormatTest.java | 8 ++- .../cattyn/catformat/test/StylistTest.java | 19 +++--- .../catformat/fabric/FabricCatFormat.java | 14 +++-- .../catformat/legacy/LegacyCatFormat.java | 13 +++- 18 files changed, 150 insertions(+), 81 deletions(-) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java rename catformat-core/src/main/java/dev/cattyn/catformat/{formatter => }/Formatter.java (93%) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java rename catformat-core/src/main/java/dev/cattyn/catformat/{formatter => entry}/FormatEntry.java (80%) rename catformat-core/src/main/java/dev/cattyn/catformat/{formatter => utils}/ChunkType.java (58%) diff --git a/README.md b/README.md index 4f24042..5aca71f 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,8 @@ import dev.cattyn.catformat.fabric.FabricCatFormat; import java.awt.Color; import java.util.Random; -FabricCatFormat formatter = // you can create only one static instance - new FabricCatFormat().addVanilla(); // of the Formatter and use it everywhere! +// you can create only one static instance of the Formatter and use it everywhere! +FabricCatFormat formatter = new FabricCatFormat(); void main() { formatter.format("${red} Hello world!"); // red colored 'Hello world!' diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java index 5669b87..721447f 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java @@ -1,62 +1,37 @@ package dev.cattyn.catformat; -import dev.cattyn.catformat.formatter.FormatEntry; -import dev.cattyn.catformat.formatter.Formatter; -import dev.cattyn.catformat.stylist.Stylist; -import dev.cattyn.catformat.stylist.impl.ClassStylist; -import dev.cattyn.catformat.text.TextWrapper; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; +import dev.cattyn.catformat.entry.EntryContainer; +import dev.cattyn.catformat.entry.FormatEntry; -public class CatFormat { - private static final FormatEntry NULL_FORMAT = new FormatEntry("null", () -> -1); - private final List formats = new ArrayList<>(); - private final TextWrapper wrapper; +import java.util.function.Consumer; +import java.util.function.Supplier; - private Stylist stylist = new ClassStylist(); +public interface CatFormat { + EntryContainer entries(); - public CatFormat(TextWrapper wrapper) { - this.wrapper = wrapper; - } + T format(String s); - public FormatEntry getEntry(String name) { - for (FormatEntry format : formats) { - if (format.name().equalsIgnoreCase(name)) - return format; - } - return NULL_FORMAT; + default T format(String s, Object... o) { + return format(s.formatted(o)); } - public CatFormat add(Object o) { - formats.addAll(stylist.getEntries0(o)); + default CatFormat styled(Consumer consumer) { + consumer.accept(entries()); return this; } - public CatFormat add(String name, int color) { - return add(name, () -> color); - } - - public CatFormat add(String name, Supplier color) { - formats.add(new FormatEntry(name, color)); + default CatFormat add(String name, Supplier color) { + entries().add(new FormatEntry(name, color)); return this; } - public T format(String s, Object... objects) { - return format(s.formatted(objects)); - } - - public T format(String s) { - return new Formatter<>(this, s).handle(); - } - - public CatFormat stylist(Stylist stylist) { - this.stylist = stylist; + default CatFormat add(Object o) { + EntryContainer entries = entries(); + entries.stylist().getEntries0(o).forEach(entries::add); return this; } - public TextWrapper getWrapper() { - return wrapper; + default CatFormat add(String name, int color) { + return add(name, () -> color); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java new file mode 100644 index 0000000..1102c75 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java @@ -0,0 +1,27 @@ +package dev.cattyn.catformat; + +import dev.cattyn.catformat.entry.EntryContainer; +import dev.cattyn.catformat.entry.EntryContainerImpl; +import dev.cattyn.catformat.text.TextWrapper; + +public class CatFormatImpl implements CatFormat { + private final EntryContainer container = new EntryContainerImpl(); + private final TextWrapper wrapper; + + public CatFormatImpl(TextWrapper wrapper) { + this.wrapper = wrapper; + } + + @Override + public EntryContainer entries() { + return container; + } + + public T format(String s) { + return new Formatter<>(this, s).handle(); + } + + public TextWrapper getWrapper() { + return wrapper; + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java similarity index 93% rename from catformat-core/src/main/java/dev/cattyn/catformat/formatter/Formatter.java rename to catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index 2f1c521..b1ba08c 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -1,11 +1,11 @@ -package dev.cattyn.catformat.formatter; +package dev.cattyn.catformat; -import dev.cattyn.catformat.CatFormat; import dev.cattyn.catformat.parser.HexParser; import dev.cattyn.catformat.parser.Parser; import dev.cattyn.catformat.parser.NameParser; import dev.cattyn.catformat.text.Modifier; import dev.cattyn.catformat.text.TextWrapper; +import dev.cattyn.catformat.utils.ChunkType; import dev.cattyn.catformat.utils.StringUtils; import java.util.EnumSet; @@ -26,7 +26,7 @@ NAME_TYPE_ALT, new NameParser() private final StringBuilder expr = new StringBuilder(); private final StringBuilder chunk = new StringBuilder(); - private final CatFormat catFormat; + private final CatFormatImpl catFormat; private final String target; private final TextWrapper wrapper; private ChunkType type = ChunkType.TEXT; @@ -37,7 +37,7 @@ NAME_TYPE_ALT, new NameParser() private char lastOpcode; - public Formatter(CatFormat catFormat, String target) { + public Formatter(CatFormatImpl catFormat, String target) { this.catFormat = catFormat; this.target = target; this.wrapper = catFormat.getWrapper(); @@ -128,7 +128,7 @@ private boolean endExpr(char c) { type = ChunkType.ESCAPE; if (colored()) { - color = parser.getColor(catFormat, expr.toString()); + color = parser.getColor(catFormat.entries(), expr.toString()); } StringUtils.clear(expr); return true; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java new file mode 100644 index 0000000..f72e45b --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainer.java @@ -0,0 +1,15 @@ +package dev.cattyn.catformat.entry; + +import dev.cattyn.catformat.stylist.Stylist; + +public interface EntryContainer { + FormatEntry NULL_FORMAT = new FormatEntry("null", () -> -1); + + void add(FormatEntry entry); + + FormatEntry get(String name); + + Stylist stylist(); + + void stylist(Stylist stylist); +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java new file mode 100644 index 0000000..fa01ba5 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/entry/EntryContainerImpl.java @@ -0,0 +1,36 @@ +package dev.cattyn.catformat.entry; + +import dev.cattyn.catformat.stylist.Stylist; +import dev.cattyn.catformat.stylist.impl.ClassStylist; + +import java.util.ArrayList; +import java.util.List; + +public class EntryContainerImpl implements EntryContainer{ + private final List formats = new ArrayList<>(); + private Stylist stylist = new ClassStylist(); + + @Override + public void add(FormatEntry entry) { + formats.add(entry); + } + + @Override + public FormatEntry get(String name) { + for (FormatEntry format : formats) { + if (format.name().equalsIgnoreCase(name)) + return format; + } + return NULL_FORMAT; + } + + @Override + public Stylist stylist() { + return stylist; + } + + @Override + public void stylist(Stylist stylist) { + this.stylist = stylist; + } +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/FormatEntry.java b/catformat-core/src/main/java/dev/cattyn/catformat/entry/FormatEntry.java similarity index 80% rename from catformat-core/src/main/java/dev/cattyn/catformat/formatter/FormatEntry.java rename to catformat-core/src/main/java/dev/cattyn/catformat/entry/FormatEntry.java index 432c831..cc47135 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/FormatEntry.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/entry/FormatEntry.java @@ -1,4 +1,4 @@ -package dev.cattyn.catformat.formatter; +package dev.cattyn.catformat.entry; import java.util.function.Supplier; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java b/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java index 098e029..f64b37e 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/parser/HexParser.java @@ -1,10 +1,10 @@ package dev.cattyn.catformat.parser; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; public class HexParser implements Parser { @Override - public int getColor(CatFormat format, String expr) { + public int getColor(EntryContainer entries, String expr) { if (expr.length() == 3) { // css color support char[] c = expr.toCharArray(); diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java b/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java index 210bc70..558d6f2 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/parser/NameParser.java @@ -1,10 +1,10 @@ package dev.cattyn.catformat.parser; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; public class NameParser implements Parser { @Override - public int getColor(CatFormat format, String expr) { - return format.getEntry(expr).getColor(); + public int getColor(EntryContainer entries, String expr) { + return entries.get(expr).getColor(); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java b/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java index 8db17b1..a84e84c 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/parser/Parser.java @@ -1,7 +1,7 @@ package dev.cattyn.catformat.parser; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; public interface Parser { - int getColor(CatFormat format, String expr); + int getColor(EntryContainer entries, String expr); } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java index 1ec3d11..f30fdbd 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java @@ -1,6 +1,6 @@ package dev.cattyn.catformat.stylist; -import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.entry.FormatEntry; import dev.cattyn.catformat.stylist.wrappers.AwtWrapper; import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java index a66c63f..f1bca8c 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java @@ -1,6 +1,6 @@ package dev.cattyn.catformat.stylist.impl; -import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.entry.FormatEntry; import dev.cattyn.catformat.stylist.Stylist; import dev.cattyn.catformat.stylist.impl.members.FieldStylist; import dev.cattyn.catformat.stylist.impl.members.MethodStylist; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java index 35fa419..d0e42e1 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java @@ -1,6 +1,6 @@ package dev.cattyn.catformat.stylist.impl.members; -import dev.cattyn.catformat.formatter.FormatEntry; +import dev.cattyn.catformat.entry.FormatEntry; import dev.cattyn.catformat.stylist.Stylist; import dev.cattyn.catformat.stylist.annotations.Style; import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/ChunkType.java b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ChunkType.java similarity index 58% rename from catformat-core/src/main/java/dev/cattyn/catformat/formatter/ChunkType.java rename to catformat-core/src/main/java/dev/cattyn/catformat/utils/ChunkType.java index fd0bee3..6319f85 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/formatter/ChunkType.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/utils/ChunkType.java @@ -1,4 +1,4 @@ -package dev.cattyn.catformat.formatter; +package dev.cattyn.catformat.utils; public enum ChunkType { TEXT, EXPR, MOD, ESCAPE; diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java index c8cd589..6c316aa 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java @@ -1,9 +1,11 @@ package dev.cattyn.catformat.test; +import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.entry.EntryContainer; import dev.cattyn.catformat.test.colored.ColoredText; import dev.cattyn.catformat.test.colored.ColoredTextWrapper; import dev.cattyn.catformat.test.content.ContentWrapper; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; import dev.cattyn.catformat.text.Modifier; import org.junit.jupiter.api.Test; @@ -15,7 +17,7 @@ public class CatFormatTest { @Test public void contentTest() { - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); String result = format.format("${red} Lorem ipsum dolor sit ${blue} amet, consectetur adipiscing {}elit{}"); @@ -24,7 +26,7 @@ public void contentTest() { @Test public void colorTest() { - CatFormat format = new CatFormat<>(new ColoredTextWrapper()); + CatFormat format = new CatFormatImpl<>(new ColoredTextWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); ColoredText result = format.format("${red} Lorem ipsum ${blue+b} dolor {} sit"); diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java index 0df7425..af6f62a 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/StylistTest.java @@ -1,6 +1,7 @@ package dev.cattyn.catformat.test; import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; import dev.cattyn.catformat.test.content.ContentWrapper; import dev.cattyn.catformat.test.style.IllegalStyle; import dev.cattyn.catformat.test.style.NonStaticStyle; @@ -15,14 +16,14 @@ public class StylistTest { @Test public void illegalStyleTest() { - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); assertThrows(IllegalArgumentException.class, () -> format.add(new IllegalStyle())); } @Test public void stylistTest() { - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add(SimpleStyle.class); assertStyle( format, @@ -34,7 +35,7 @@ public void stylistTest() { @Test public void stylistNonStaticTest() { NonStaticStyle style = new NonStaticStyle(); - CatFormat format = new CatFormat<>(new ContentWrapper()); + CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add(style); assertStyle( format, @@ -45,15 +46,15 @@ public void stylistNonStaticTest() { // maybe its autistic But I don't really Care. private void assertStyle(CatFormat format, Runnable setDynamicToGreen, Runnable enableDarkMode) { - assertEquals(format.getEntry("MAGENTA_LIGHT_COLOR").getColor(), Color.magenta.brighter().hashCode()); - assertEquals(format.getEntry("black").getColor(), Color.black.hashCode()); + assertEquals(format.entries().get("MAGENTA_LIGHT_COLOR").getColor(), Color.magenta.brighter().hashCode()); + assertEquals(format.entries().get("black").getColor(), Color.black.hashCode()); - assertEquals(format.getEntry("dynamic").getColor(), Color.blue.hashCode()); + assertEquals(format.entries().get("dynamic").getColor(), Color.blue.hashCode()); setDynamicToGreen.run(); - assertEquals(format.getEntry("dynamic").getColor(), Color.green.hashCode()); + assertEquals(format.entries().get("dynamic").getColor(), Color.green.hashCode()); - assertEquals(format.getEntry("theme-color").getColor(), Color.black.hashCode()); + assertEquals(format.entries().get("theme-color").getColor(), Color.black.hashCode()); enableDarkMode.run(); - assertEquals(format.getEntry("theme-color").getColor(), Color.white.hashCode()); + assertEquals(format.entries().get("theme-color").getColor(), Color.white.hashCode()); } } diff --git a/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java b/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java index e5ad7c1..8de09dc 100644 --- a/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java +++ b/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricCatFormat.java @@ -1,21 +1,27 @@ package dev.cattyn.catformat.fabric; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; import net.minecraft.text.MutableText; import net.minecraft.util.Formatting; -public class FabricCatFormat extends CatFormat { +public class FabricCatFormat extends CatFormatImpl { public FabricCatFormat() { + this(true); + } + + public FabricCatFormat(boolean vanilla) { super(new FabricWrapper()); + if (vanilla) { + addVanilla(); + } } - public FabricCatFormat addVanilla() { + private void addVanilla() { for (Formatting value : Formatting.values()) { if (!value.isColor() || value.getColorValue() == null) { continue; } add(value.getName(), value.getColorValue()); } - return this; } } diff --git a/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java b/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java index 6d2536f..41f631a 100644 --- a/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java +++ b/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyCatFormat.java @@ -1,13 +1,20 @@ package dev.cattyn.catformat.legacy; -import dev.cattyn.catformat.CatFormat; +import dev.cattyn.catformat.CatFormatImpl; -public class LegacyCatFormat extends CatFormat { +public class LegacyCatFormat extends CatFormatImpl { public LegacyCatFormat() { + this(true); + } + + public LegacyCatFormat(boolean vanilla) { super(new LegacyWrapper()); + if (vanilla) { + addDefaults(); + } } - public LegacyCatFormat addDefaults() { + private LegacyCatFormat addDefaults() { for (Formatting value : Formatting.values()) { if (value == Formatting.OBFUSCATED) break; add(value.getName(), value.ordinal()); From fe89f0943923157d2bde44c7483646e1a0719c67 Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 1 Feb 2025 19:25:40 +0300 Subject: [PATCH 12/20] refactored `getWrapper` to `wrapper` --- .../src/main/java/dev/cattyn/catformat/CatFormat.java | 3 +++ .../main/java/dev/cattyn/catformat/CatFormatImpl.java | 9 +++++---- .../src/main/java/dev/cattyn/catformat/Formatter.java | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java index 721447f..89a745d 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormat.java @@ -2,6 +2,7 @@ import dev.cattyn.catformat.entry.EntryContainer; import dev.cattyn.catformat.entry.FormatEntry; +import dev.cattyn.catformat.text.TextWrapper; import java.util.function.Consumer; import java.util.function.Supplier; @@ -9,6 +10,8 @@ public interface CatFormat { EntryContainer entries(); + TextWrapper wrapper(); + T format(String s); default T format(String s, Object... o) { diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java index 1102c75..a29af8b 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/CatFormatImpl.java @@ -17,11 +17,12 @@ public EntryContainer entries() { return container; } - public T format(String s) { - return new Formatter<>(this, s).handle(); + @Override + public TextWrapper wrapper() { + return wrapper; } - public TextWrapper getWrapper() { - return wrapper; + public T format(String s) { + return new Formatter<>(this, s).handle(); } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index b1ba08c..21f0d6f 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -40,7 +40,7 @@ NAME_TYPE_ALT, new NameParser() public Formatter(CatFormatImpl catFormat, String target) { this.catFormat = catFormat; this.target = target; - this.wrapper = catFormat.getWrapper(); + this.wrapper = catFormat.wrapper(); this.core = this.wrapper.newText(); } From 3e511cff1cd4b0116dda614153106cba62fb16b1 Mon Sep 17 00:00:00 2001 From: cattyn Date: Mon, 3 Feb 2025 11:12:01 +0300 Subject: [PATCH 13/20] removed `$` prefix from the formatting --- README.md | 7 +++---- .../java/dev/cattyn/catformat/Formatter.java | 18 +++++++++++------- .../cattyn/catformat/test/CatFormatTest.java | 4 ++-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5aca71f..58c357d 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,9 @@ I got tired of using Minecraft's `Text` objects like huge builders (e.g `Text.li There are a few placeholders that you need to know about: -- `{}` - Resets the current color and style to the default one. -- `${}` - Sets the text color to the given variable color (e.g `${red}`, `${cyan}`, check [Minecraft Color Codes](https://minecraft.tools/en/color-code.php)). -- `@{}` - Alternative for `${}`. Use this one if you're on Kotlin. -- `#{}` - Sets the text color to the given hex value (e.g `#{fff}`, `#{ff00ff}`). +- `{}` - Resets the current color and style to the default one. +- `{var}` - Sets the text color to the given variable color (e.g `{red}`, `{cyan}`, check [Minecraft Color Codes](https://minecraft.tools/en/color-code.php)). +- `{#hex}` - Sets the text color to the given hex value (e.g `{#fff}`, `{#ff00ff}`). - `+obius` modifiers - Sets the modifier of the text. You can also combine modifiers, e.g `${+bi}` - ***bold + italic***. - o - [obfuscated text](images/obfuscated.gif) diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index 21f0d6f..a0a6d1b 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -65,19 +65,13 @@ private void handleText(char opcode) { return; } - // garbage begin if (opcode == BEGIN_EXPR) { - Parser parser = PARSER_MAP.get(lastOpcode); type = ChunkType.EXPR; - if (parser != null) { - StringUtils.shrink(chunk); - } concat(); modifiers.clear(); - this.parser = parser; + parser = null; return; } - // garbage end chunk.append(opcode); } @@ -92,6 +86,16 @@ private void handleExpr(char opcode) { return; } + if (lastOpcode == BEGIN_EXPR + && opcode == HEX_TYPE) { + parser = new HexParser(); + return; + } + + if (parser == null) { + parser = new NameParser(); + } + expr.append(opcode); } diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java index 6c316aa..45f9a4a 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java @@ -20,7 +20,7 @@ public void contentTest() { CatFormat format = new CatFormatImpl<>(new ContentWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); - String result = format.format("${red} Lorem ipsum dolor sit ${blue} amet, consectetur adipiscing {}elit{}"); + String result = format.format("{red} Lorem ipsum dolor sit {blue} amet, consectetur adipiscing {}elit{}"); assertEquals("Lorem ipsum dolor sit amet, consectetur adipiscing elit", result); } @@ -29,7 +29,7 @@ public void colorTest() { CatFormat format = new CatFormatImpl<>(new ColoredTextWrapper()); format.add("red", 0xff0000); format.add("blue", 0x0000ff); - ColoredText result = format.format("${red} Lorem ipsum ${blue+b} dolor {} sit"); + ColoredText result = format.format("{#f00} Lorem ipsum {blue+b} dolor {} sit"); List children = result.getChildren(); EnumSet modifiers = EnumSet.noneOf(Modifier.class); From dbe86ce65142a58e3e181de3c373b26923e913f2 Mon Sep 17 00:00:00 2001 From: cattyn Date: Mon, 3 Feb 2025 17:51:36 +0300 Subject: [PATCH 14/20] kotlin dsl (BIG) --- catformat-kotlin-dsl/build.gradle.kts | 15 +++++++++++ .../dev/cattyn/catformat/CatFormatDSL.kt | 26 +++++++++++++++++++ settings.gradle.kts | 1 + 3 files changed, 42 insertions(+) create mode 100644 catformat-kotlin-dsl/build.gradle.kts create mode 100644 catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt diff --git a/catformat-kotlin-dsl/build.gradle.kts b/catformat-kotlin-dsl/build.gradle.kts new file mode 100644 index 0000000..b25d3fb --- /dev/null +++ b/catformat-kotlin-dsl/build.gradle.kts @@ -0,0 +1,15 @@ +plugins { + kotlin("jvm") version "1.9.23" +} + +repositories { + mavenCentral() +} + +dependencies { + implementation(project(":catformat-core")) +} + +kotlin { + jvmToolchain(17) +} \ No newline at end of file diff --git a/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt new file mode 100644 index 0000000..5a991e8 --- /dev/null +++ b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt @@ -0,0 +1,26 @@ +package dev.cattyn.catformat + +import dev.cattyn.catformat.entry.FormatEntry +import java.awt.Color +import java.util.function.Supplier + +// the most useless shit ever + +class Config(private val format: CatFormat) { + infix fun String.by(color: Supplier) { + format.entries().add(FormatEntry(this, color)) + } + + infix fun String.by(color: Int) { + by { color } + } + + infix fun String.by(color: Color) { + by(color.hashCode()) + } +} + +fun CatFormat.config(unit: Config.() -> Unit): CatFormat { + Config(this).unit() + return this +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 5f597ae..141734a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,3 +11,4 @@ pluginManagement { include("catformat-legacy-text") include("catformat-fabric") include("catformat-core") +include("catformat-kotlin-dsl") From cae3ce488a90b0733420ea4de032109476ba4b3e Mon Sep 17 00:00:00 2001 From: cattyn Date: Mon, 3 Feb 2025 18:06:29 +0300 Subject: [PATCH 15/20] fixed readme typos --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58c357d..a94437e 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ There are a few placeholders that you need to know about: - `{var}` - Sets the text color to the given variable color (e.g `{red}`, `{cyan}`, check [Minecraft Color Codes](https://minecraft.tools/en/color-code.php)). - `{#hex}` - Sets the text color to the given hex value (e.g `{#fff}`, `{#ff00ff}`). - `+obius` modifiers - Sets the modifier of the text. You can also combine modifiers, -e.g `${+bi}` - ***bold + italic***. +e.g `{+bi}` - ***bold + italic***. - o - [obfuscated text](images/obfuscated.gif) - b - **bold text** - i - *italic text* From 8ea0c1cf13389a784f2f452ff62bb6935d1f37ba Mon Sep 17 00:00:00 2001 From: cattyn Date: Tue, 4 Feb 2025 23:52:24 +0300 Subject: [PATCH 16/20] kotlin dsl stylist support --- .../src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt index 5a991e8..c6b4cec 100644 --- a/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt +++ b/catformat-kotlin-dsl/src/main/kotlin/dev/cattyn/catformat/CatFormatDSL.kt @@ -1,12 +1,17 @@ package dev.cattyn.catformat import dev.cattyn.catformat.entry.FormatEntry +import dev.cattyn.catformat.stylist.Stylist import java.awt.Color import java.util.function.Supplier // the most useless shit ever class Config(private val format: CatFormat) { + var stylist: Stylist<*> + get() = format.entries().stylist() + set(value) = format.entries().stylist(value) + infix fun String.by(color: Supplier) { format.entries().add(FormatEntry(this, color)) } From 93110242700f0f3e84527ebd0adba1c85b6ab303 Mon Sep 17 00:00:00 2001 From: cattyn Date: Wed, 5 Feb 2025 01:17:30 +0300 Subject: [PATCH 17/20] made modifiers use bitflags instead of EnumSet --- .../java/dev/cattyn/catformat/Formatter.java | 10 +++--- .../dev/cattyn/catformat/text/Modifier.java | 22 +++++++++++++ .../cattyn/catformat/text/TextWrapper.java | 4 +-- .../cattyn/catformat/test/CatFormatTest.java | 31 +++++++++++++------ .../catformat/test/colored/ColoredText.java | 8 ++--- .../test/colored/ColoredTextWrapper.java | 5 +-- .../test/content/ContentWrapper.java | 2 +- .../catformat/fabric/FabricWrapper.java | 14 ++++----- .../catformat/legacy/LegacyWrapper.java | 10 +++--- 9 files changed, 66 insertions(+), 40 deletions(-) diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index a0a6d1b..8543f7c 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -10,7 +10,6 @@ import java.util.EnumSet; import java.util.Map; -import java.util.Set; import static dev.cattyn.catformat.utils.Constants.*; @@ -21,8 +20,6 @@ NAME_TYPE, new NameParser(), NAME_TYPE_ALT, new NameParser() ); - private final Set modifiers = EnumSet.noneOf(Modifier.class); - private final StringBuilder expr = new StringBuilder(); private final StringBuilder chunk = new StringBuilder(); @@ -34,6 +31,7 @@ NAME_TYPE_ALT, new NameParser() private Parser parser = null; private int color = 0xFFFFFF; + private int modifiers = 0; private char lastOpcode; @@ -68,7 +66,7 @@ private void handleText(char opcode) { if (opcode == BEGIN_EXPR) { type = ChunkType.EXPR; concat(); - modifiers.clear(); + modifiers = 0; parser = null; return; } @@ -104,7 +102,7 @@ private void handleMod(char opcode) { return; } - Modifier.from(opcode).ifPresent(modifiers::add); + Modifier.from(opcode).ifPresent(mod -> modifiers = mod.with(modifiers)); } private void handleEscape(char opcode) { @@ -143,7 +141,7 @@ private T build(StringBuilder chunk) { if (colored()) { built = wrapper.colored(built, color); } - built = wrapper.modify(built, EnumSet.copyOf(modifiers)); + built = wrapper.modify(built, modifiers); StringUtils.clear(chunk); return built; } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/text/Modifier.java b/catformat-core/src/main/java/dev/cattyn/catformat/text/Modifier.java index e2b43ba..810cfd6 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/text/Modifier.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/text/Modifier.java @@ -11,6 +11,8 @@ public enum Modifier { UNDERLINE, ITALIC; + private final int flag = 1 << ordinal(); + public static Optional from(char c) { return Optional.ofNullable(switch (c) { case OBFUSCATED_MOD -> OBFUSCATED; @@ -21,4 +23,24 @@ public static Optional from(char c) { default -> null; }); } + + public static int asBits(Modifier... modifiers) { + int mod = 0; + for (Modifier m : modifiers) { + mod = m.with(mod); + } + return mod; + } + + public int getFlag() { + return flag; + } + + public boolean isIn(int flags) { + return (flags & getFlag()) > 0; + } + + public int with(int flags) { + return flags | getFlag(); + } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/text/TextWrapper.java b/catformat-core/src/main/java/dev/cattyn/catformat/text/TextWrapper.java index 5e726cf..81497c6 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/text/TextWrapper.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/text/TextWrapper.java @@ -1,13 +1,11 @@ package dev.cattyn.catformat.text; -import java.util.Set; - public interface TextWrapper { T colored(T text, int color); T concat(T text, T text2); - T modify(T text, Set modifiers); + T modify(T text, int modifiers); T newText(String content); diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java index 45f9a4a..ee7572b 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java @@ -7,6 +7,7 @@ import dev.cattyn.catformat.test.content.ContentWrapper; import dev.cattyn.catformat.CatFormatImpl; import dev.cattyn.catformat.text.Modifier; +import dev.cattyn.catformat.text.TextWrapper; import org.junit.jupiter.api.Test; import java.util.EnumSet; @@ -17,29 +18,41 @@ public class CatFormatTest { @Test public void contentTest() { - CatFormat format = new CatFormatImpl<>(new ContentWrapper()); - format.add("red", 0xff0000); - format.add("blue", 0x0000ff); + CatFormat format = createFormat(new ContentWrapper()); String result = format.format("{red} Lorem ipsum dolor sit {blue} amet, consectetur adipiscing {}elit{}"); assertEquals("Lorem ipsum dolor sit amet, consectetur adipiscing elit", result); } @Test public void colorTest() { - CatFormat format = new CatFormatImpl<>(new ColoredTextWrapper()); - format.add("red", 0xff0000); - format.add("blue", 0x0000ff); + CatFormat format = createFormat(new ColoredTextWrapper()); ColoredText result = format.format("{#f00} Lorem ipsum {blue+b} dolor {} sit"); List children = result.getChildren(); - EnumSet modifiers = EnumSet.noneOf(Modifier.class); + int modifiers = 0; assertEquals("Lorem ipsum dolor sit", result.getString()); assertEquals(3, children.size()); assertEquals(new ColoredText("Lorem ipsum ", modifiers, 0xff0000), children.get(0)); - modifiers.add(Modifier.BOLD); + modifiers = Modifier.BOLD.getFlag(); assertEquals(new ColoredText("dolor ", modifiers, 0x0000ff), children.get(1)); - modifiers.remove(Modifier.BOLD); + modifiers = 0; assertEquals(new ColoredText("sit", modifiers, -1), children.get(2)); } + + @Test + public void multiModifiersTest() { + CatFormat format = new CatFormatImpl<>(new ColoredTextWrapper()); + ColoredText result = format.format("{#f00+bi} Lorem ipsum"); + List children = result.getChildren(); + int modifiers = Modifier.asBits(Modifier.BOLD, Modifier.ITALIC); + assertEquals(new ColoredText("Lorem ipsum", modifiers, 0xff0000), children.getFirst()); + } + + private CatFormat createFormat(TextWrapper wrapper) { + CatFormat format = new CatFormatImpl<>(wrapper); + format.add("red", 0xff0000); + format.add("blue", 0x0000ff); + return format; + } } diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredText.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredText.java index 05f9d5c..1c51a90 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredText.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredText.java @@ -9,15 +9,15 @@ public class ColoredText { private final List children = new ArrayList<>(); private final String content; - private Set modifiers; + private int modifiers; private int color = -1; public ColoredText(String content) { this.content = content; - this.modifiers = EnumSet.noneOf(Modifier.class); + this.modifiers = 0; } - public ColoredText(String content, Set modifiers, int color) { + public ColoredText(String content, int modifiers, int color) { this.content = content; this.modifiers = modifiers; this.color = color; @@ -38,7 +38,7 @@ public List getChildren() { return children; } - public void setModifiers(Set modifiers) { + public void setModifiers(int modifiers) { this.modifiers = modifiers; } diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredTextWrapper.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredTextWrapper.java index 971a8a6..c4ca6ff 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredTextWrapper.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/colored/ColoredTextWrapper.java @@ -1,10 +1,7 @@ package dev.cattyn.catformat.test.colored; -import dev.cattyn.catformat.text.Modifier; import dev.cattyn.catformat.text.TextWrapper; -import java.util.Set; - public class ColoredTextWrapper implements TextWrapper { @Override public ColoredText colored(ColoredText text, int color) { @@ -19,7 +16,7 @@ public ColoredText concat(ColoredText text, ColoredText text2) { } @Override - public ColoredText modify(ColoredText text, Set modifiers) { + public ColoredText modify(ColoredText text, int modifiers) { text.setModifiers(modifiers); return text; } diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/content/ContentWrapper.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/content/ContentWrapper.java index 2516f59..87c31dd 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/content/ContentWrapper.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/content/ContentWrapper.java @@ -17,7 +17,7 @@ public String concat(String text, String text2) { } @Override - public String modify(String text, Set modifiers) { + public String modify(String text, int modifiers) { return text; } diff --git a/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricWrapper.java b/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricWrapper.java index 243cdc3..816a090 100644 --- a/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricWrapper.java +++ b/catformat-fabric/src/main/java/dev/cattyn/catformat/fabric/FabricWrapper.java @@ -6,8 +6,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import java.util.Set; - public class FabricWrapper implements TextWrapper { @Override public MutableText colored(MutableText text, int color) { @@ -20,12 +18,12 @@ public MutableText concat(MutableText text, MutableText text2) { } @Override - public MutableText modify(MutableText text, Set modifiers) { - if (modifiers.contains(Modifier.BOLD)) text.formatted(Formatting.BOLD); - if (modifiers.contains(Modifier.ITALIC)) text.formatted(Formatting.ITALIC); - if (modifiers.contains(Modifier.UNDERLINE)) text.formatted(Formatting.UNDERLINE); - if (modifiers.contains(Modifier.STRIKETHROUGH)) text.formatted(Formatting.STRIKETHROUGH); - if (modifiers.contains(Modifier.OBFUSCATED)) text.formatted(Formatting.OBFUSCATED); + public MutableText modify(MutableText text, int modifiers) { + if (Modifier.BOLD.isIn(modifiers)) text.formatted(Formatting.BOLD); + if (Modifier.ITALIC.isIn(modifiers)) text.formatted(Formatting.ITALIC); + if (Modifier.UNDERLINE.isIn(modifiers)) text.formatted(Formatting.UNDERLINE); + if (Modifier.STRIKETHROUGH.isIn(modifiers)) text.formatted(Formatting.STRIKETHROUGH); + if (Modifier.OBFUSCATED.isIn(modifiers)) text.formatted(Formatting.OBFUSCATED); return text; } diff --git a/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyWrapper.java b/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyWrapper.java index 945e421..bd25e4b 100644 --- a/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyWrapper.java +++ b/catformat-legacy-text/src/main/java/dev/cattyn/catformat/legacy/LegacyWrapper.java @@ -3,8 +3,6 @@ import dev.cattyn.catformat.text.Modifier; import dev.cattyn.catformat.text.TextWrapper; -import java.util.Set; - public class LegacyWrapper implements TextWrapper { @Override public String colored(String text, int color) { @@ -19,12 +17,14 @@ public String concat(String text, String text2) { } @Override - public String modify(String text, Set modifiers) { + public String modify(String text, int modifiers) { StringBuilder sb = new StringBuilder(); - for (Modifier modifier : modifiers) { + + for (Modifier modifier : Modifier.values()) { int i = Formatting.OBFUSCATED.ordinal() + modifier.ordinal(); Formatting formatting = Formatting.fromOrdinal(i); - if (formatting == null) continue; // ??? + if (!modifier.isIn(modifiers) || formatting == null) + continue; sb.append(formatting.getString()); } sb.append(text); From 4378475f16b8a5448b75f24b704e5cc02326102c Mon Sep 17 00:00:00 2001 From: cattyn Date: Wed, 5 Feb 2025 18:24:06 +0300 Subject: [PATCH 18/20] style history --- .../java/dev/cattyn/catformat/Formatter.java | 32 ++++++++----------- .../dev/cattyn/catformat/text/TextStyle.java | 4 +++ .../cattyn/catformat/test/CatFormatTest.java | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/text/TextStyle.java diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java index 8543f7c..9260c48 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/Formatter.java @@ -4,25 +4,21 @@ import dev.cattyn.catformat.parser.Parser; import dev.cattyn.catformat.parser.NameParser; import dev.cattyn.catformat.text.Modifier; +import dev.cattyn.catformat.text.TextStyle; import dev.cattyn.catformat.text.TextWrapper; import dev.cattyn.catformat.utils.ChunkType; import dev.cattyn.catformat.utils.StringUtils; -import java.util.EnumSet; -import java.util.Map; +import java.util.Stack; import static dev.cattyn.catformat.utils.Constants.*; public class Formatter { - private static final Map PARSER_MAP = Map.of( - HEX_TYPE, new HexParser(), - NAME_TYPE, new NameParser(), - NAME_TYPE_ALT, new NameParser() - ); - private final StringBuilder expr = new StringBuilder(); private final StringBuilder chunk = new StringBuilder(); + private final Stack styles = new Stack<>(); + private final CatFormatImpl catFormat; private final String target; private final TextWrapper wrapper; @@ -30,8 +26,7 @@ NAME_TYPE_ALT, new NameParser() private T core; private Parser parser = null; - private int color = 0xFFFFFF; - private int modifiers = 0; + private int modifiers; private char lastOpcode; @@ -129,8 +124,11 @@ private boolean endExpr(char c) { if (c != END_EXPR) return false; type = ChunkType.ESCAPE; - if (colored()) { - color = parser.getColor(catFormat.entries(), expr.toString()); + if (parser != null) { + int color = parser.getColor(catFormat.entries(), expr.toString()); + styles.push(new TextStyle(color, modifiers)); + } else { + styles.pop(); } StringUtils.clear(expr); return true; @@ -138,10 +136,11 @@ private boolean endExpr(char c) { private T build(StringBuilder chunk) { T built = wrapper.newText(chunk.toString()); - if (colored()) { - built = wrapper.colored(built, color); + if (!styles.isEmpty()) { + TextStyle style = styles.peek(); + built = wrapper.colored(built, style.color()); + built = wrapper.modify(built, style.modifiers()); } - built = wrapper.modify(built, modifiers); StringUtils.clear(chunk); return built; } @@ -152,7 +151,4 @@ private void concat() { } } - private boolean colored() { - return parser != null; - } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/text/TextStyle.java b/catformat-core/src/main/java/dev/cattyn/catformat/text/TextStyle.java new file mode 100644 index 0000000..9d81d35 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/text/TextStyle.java @@ -0,0 +1,4 @@ +package dev.cattyn.catformat.text; + +public record TextStyle(int color, int modifiers) { +} diff --git a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java index ee7572b..5a0e194 100644 --- a/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java +++ b/catformat-core/src/test/java/dev/cattyn/catformat/test/CatFormatTest.java @@ -37,7 +37,7 @@ public void colorTest() { assertEquals(new ColoredText("dolor ", modifiers, 0x0000ff), children.get(1)); modifiers = 0; - assertEquals(new ColoredText("sit", modifiers, -1), children.get(2)); + assertEquals(new ColoredText("sit", modifiers, 0xff0000), children.get(2)); } @Test From 7445c662ec2d1613779101820c03cac72ec3469b Mon Sep 17 00:00:00 2001 From: cattyn Date: Wed, 5 Feb 2025 18:48:16 +0300 Subject: [PATCH 19/20] =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=8F=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B5=D0=B1=D0=B0=D0=BB=D0=BE=20=D1=8D=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catformat/stylist/ColorStylist.java | 9 +++++++ .../dev/cattyn/catformat/stylist/Stylist.java | 6 ----- .../catformat/stylist/impl/ClassStylist.java | 25 ++++++++++++++++--- .../stylist/impl/members/FieldStylist.java | 6 +++-- .../stylist/impl/members/MemberStylist.java | 13 ++++------ .../stylist/impl/members/MethodStylist.java | 6 +++-- 6 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 catformat-core/src/main/java/dev/cattyn/catformat/stylist/ColorStylist.java diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/ColorStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/ColorStylist.java new file mode 100644 index 0000000..a8bc323 --- /dev/null +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/ColorStylist.java @@ -0,0 +1,9 @@ +package dev.cattyn.catformat.stylist; + +import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; + +public interface ColorStylist extends Stylist { + void addColor(ColorWrapper color); + + ColorWrapper getColor(Class klass); +} diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java index f30fdbd..1f51c01 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/Stylist.java @@ -1,16 +1,10 @@ package dev.cattyn.catformat.stylist; import dev.cattyn.catformat.entry.FormatEntry; -import dev.cattyn.catformat.stylist.wrappers.AwtWrapper; -import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; -import java.util.ArrayList; import java.util.List; public interface Stylist { - // TODO no. This way it sucks... - List> WRAPPERS = new ArrayList<>(List.of(new AwtWrapper())); - List getEntries(T target); default List getEntries0(Object object) { diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java index f1bca8c..03ae5f1 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java @@ -1,14 +1,17 @@ package dev.cattyn.catformat.stylist.impl; import dev.cattyn.catformat.entry.FormatEntry; -import dev.cattyn.catformat.stylist.Stylist; +import dev.cattyn.catformat.stylist.ColorStylist; import dev.cattyn.catformat.stylist.impl.members.FieldStylist; import dev.cattyn.catformat.stylist.impl.members.MethodStylist; +import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; import java.util.ArrayList; import java.util.List; -public class ClassStylist implements Stylist { +public class ClassStylist implements ColorStylist { + private final List> wrappers = new ArrayList<>(); + @Override public List getEntries(Object target) { List entries = new ArrayList<>(); @@ -18,12 +21,12 @@ public List getEntries(Object target) { } private List methods(Object o) { - return new MethodStylist(getInstance(o)) + return new MethodStylist(this, getInstance(o)) .getEntries(getClass(o).getDeclaredMethods()); } private List fields(Object o) { - return new FieldStylist(getInstance(o)) + return new FieldStylist(this, getInstance(o)) .getEntries(getClass(o).getDeclaredFields()); } @@ -36,4 +39,18 @@ private Class getClass(Object o) { if (o instanceof Class klass) return klass; return o.getClass(); } + + @Override + public void addColor(ColorWrapper color) { + wrappers.add(color); + } + + @Override + public ColorWrapper getColor(Class klass) { + for (ColorWrapper wrapper : wrappers) { + if (wrapper.getType().isAssignableFrom(klass)) + return wrapper; + } + throw new IllegalArgumentException("Color wrapper for class %s not found!".formatted(klass)); + } } diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java index edb3571..7d99996 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/FieldStylist.java @@ -1,5 +1,7 @@ package dev.cattyn.catformat.stylist.impl.members; +import dev.cattyn.catformat.stylist.ColorStylist; + import java.lang.invoke.VarHandle; import java.lang.reflect.Field; import java.util.function.Supplier; @@ -7,8 +9,8 @@ import static dev.cattyn.catformat.utils.ReflectionUtils.*; public final class FieldStylist extends MemberStylist { - public FieldStylist(Object parent) { - super(parent); + public FieldStylist(ColorStylist stylist, Object parent) { + super(stylist, parent); } @Override diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java index d0e42e1..3882b73 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MemberStylist.java @@ -1,6 +1,7 @@ package dev.cattyn.catformat.stylist.impl.members; import dev.cattyn.catformat.entry.FormatEntry; +import dev.cattyn.catformat.stylist.ColorStylist; import dev.cattyn.catformat.stylist.Stylist; import dev.cattyn.catformat.stylist.annotations.Style; import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; @@ -15,9 +16,11 @@ import static dev.cattyn.catformat.utils.ReflectionUtils.isInteger; public abstract class MemberStylist implements Stylist { + protected final ColorStylist stylist; protected final Object parent; - protected MemberStylist(Object parent) { + protected MemberStylist(ColorStylist stylist, Object parent) { + this.stylist = stylist; this.parent = parent; } @@ -62,13 +65,7 @@ private String getName(T member, Style style) { private ColorWrapper getWrapper(Class klass) { if (isInteger(klass)) return null; - for (ColorWrapper wrapper : Stylist.WRAPPERS) { - if (wrapper.getType().isAssignableFrom(klass)) { - return wrapper; - } - } - - throw new IllegalArgumentException("Color wrapper for class %s not found!".formatted(klass)); + return stylist.getColor(klass); } private FormatEntry buildEntry(String name, Supplier object, ColorWrapper wrapper) { diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java index d4f6591..06a0ec5 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/members/MethodStylist.java @@ -1,5 +1,7 @@ package dev.cattyn.catformat.stylist.impl.members; +import dev.cattyn.catformat.stylist.ColorStylist; + import java.lang.invoke.*; import java.lang.reflect.Method; import java.util.function.Supplier; @@ -7,8 +9,8 @@ import static dev.cattyn.catformat.utils.ReflectionUtils.*; public final class MethodStylist extends MemberStylist { - public MethodStylist(Object parent) { - super(parent); + public MethodStylist(ColorStylist stylist, Object parent) { + super(stylist, parent); } @Override From bd4d3bdc387259b4676b86e15dd039e6d7aca6cc Mon Sep 17 00:00:00 2001 From: cattyn Date: Wed, 5 Feb 2025 18:49:12 +0300 Subject: [PATCH 20/20] ok --- .../java/dev/cattyn/catformat/stylist/impl/ClassStylist.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java index 03ae5f1..9f4020d 100644 --- a/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java +++ b/catformat-core/src/main/java/dev/cattyn/catformat/stylist/impl/ClassStylist.java @@ -4,6 +4,7 @@ import dev.cattyn.catformat.stylist.ColorStylist; import dev.cattyn.catformat.stylist.impl.members.FieldStylist; import dev.cattyn.catformat.stylist.impl.members.MethodStylist; +import dev.cattyn.catformat.stylist.wrappers.AwtWrapper; import dev.cattyn.catformat.stylist.wrappers.ColorWrapper; import java.util.ArrayList; @@ -12,6 +13,10 @@ public class ClassStylist implements ColorStylist { private final List> wrappers = new ArrayList<>(); + public ClassStylist() { + wrappers.add(new AwtWrapper()); + } + @Override public List getEntries(Object target) { List entries = new ArrayList<>();