Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libraries/text-components/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ library_name = Text Components
library_description = Versatile text components.
library_version = 0.1.0-alpha.6

entrypoint_init = net.ornithemc.osl.text.impl.TextResolversInit
entrypoint_init = net.ornithemc.osl.text.impl.TextInit
osl_dependencies = core:0.7.0,entrypoints:0.5.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.ornithemc.osl.text.api;

/**
* Common interface for objects accepting {@linkplain TextComponent} messages.
*
* @see TextComponent
* @see TextComponents
*/
public interface MessageConsumer {

/**
* Send a {@linkplain TextComponent} message.
*/
void sendMessage(TextComponent message);

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
import net.ornithemc.osl.text.impl.LiteralTextComponent;
import net.ornithemc.osl.text.impl.TranslatableTextComponent;

/**
* @see TextComponents
*/
public interface TextComponent {

Style getStyle();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.ornithemc.osl.text.api.TextComponent.Serializer.LowercaseEnumTypeAdapterFactory;
import net.ornithemc.osl.text.impl.LiteralTextComponent;
import net.ornithemc.osl.text.impl.TextComponentBuilder;
import net.ornithemc.osl.text.impl.TextConverters;
import net.ornithemc.osl.text.impl.TextResolvers;
import net.ornithemc.osl.text.impl.TranslatableTextComponent;

Expand Down Expand Up @@ -69,4 +70,8 @@ public static String toJson(TextComponent t) {
public static JsonElement toJsonTree(TextComponent t) {
return GSON.toJsonTree(t);
}

public static <T> T convert(TextComponent t, Class<T> type) {
return TextConverters.convert(t, type);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.ornithemc.osl.text.impl;

import net.ornithemc.osl.text.api.MessageConsumer;
import net.ornithemc.osl.text.api.TextComponent;

public interface MessageConsumerImpl extends MessageConsumer {

@Override
default void sendMessage(TextComponent message) {
throw new AbstractMethodError();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package net.ornithemc.osl.text.impl;

import net.ornithemc.osl.text.api.TextComponent;

public interface TextConverter<T> {

T convert(TextComponent text);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package net.ornithemc.osl.text.impl;

import java.util.HashMap;
import java.util.Map;

import net.ornithemc.osl.text.api.TextComponent;

public class TextConverters {

private static Map<Class<?>, TextConverter<?>> converters = new HashMap<>();

static {
register(String.class, TextComponent::buildFormattedString);
}

public static <T> void register(Class<T> type, TextConverter<T> resolver) {
if (converters.containsKey(type)) {
throw new IllegalStateException("cannot register multiple text component converters for type " + type.getName());
} else {
converters.put(type, resolver);
}
}

public static <T> T convert(TextComponent text, Class<T> type) {
TextConverter<?> converter = converters.get(type);

if (converter == null) {
return null;
}

return convert(converter, text);
}

@SuppressWarnings("unchecked")
private static <T> T convert(TextConverter<?> converter, TextComponent text) {
return (T) converter.convert(text);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
min_mc_version = a1.0.1_01
min_mc_version = 13w21a
max_mc_version = 1.6.4

minecraft_version = 1.6.4
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package net.ornithemc.osl.text.impl;

import net.ornithemc.osl.text.api.Style;
import net.ornithemc.osl.text.api.TextComponent;
import net.minecraft.text.Text;

public class BaseTextConverter implements TextConverter<Text> {

@Override
public Text convert(TextComponent component) {
Text text;

if (component instanceof LiteralTextComponent) {
text = Text.literal(((LiteralTextComponent) component).getValue());
} else if (component instanceof TranslatableTextComponent) {
text = Text.translatable(((TranslatableTextComponent) component).getKey(), ((TranslatableTextComponent) component).getArgs());
} else {
text = Text.literal("");
}

Style style = component.getStyle();

if (style.getColor() != null && style.getColor().isFormatting())
text.setColor(net.minecraft.text.Formatting.byName(style.getColor().serialize()));
if (style.withBold(style.isBold()) != style)
text.setBold(style.isBold());
if (style.withItalic(style.isItalic()) != style)
text.setItalic(style.isItalic());
if (style.withUnderlined(style.isUnderlined()) != style)
text.setUnderlined(style.isUnderlined());
if (style.withObfuscated(style.isObfuscated()) != style)
text.setObfuscated(style.isObfuscated());

for (TextComponent sibling : component.getSiblings()) {
text.append(this.convert(sibling));
}

return text;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package net.ornithemc.osl.text.impl;

import net.ornithemc.osl.text.api.Formatting;
import net.ornithemc.osl.text.api.Style;
import net.ornithemc.osl.text.api.TextComponent;
import net.minecraft.text.Text;

import net.ornithemc.osl.text.api.TextComponents;

import java.util.List;
import java.util.stream.Collectors;

public class BaseTextResolver implements TextResolver<Text> {

@Override
public TextComponent resolve(Text o) {
List<Text> siblings = o.getSiblings();

TextComponent component;
if (o.getTranslated() != null) {
if (siblings == null) {
component = TextComponents.translatable(o.getTranslated());
} else {
List<TextComponent> args = siblings.stream().map(this::resolve).collect(Collectors.toList());
component = TextComponents.translatable(o.getTranslated(), args.toArray());
}
} else if (o.getText() != null) {
component = TextComponents.literal(o.getText());
} else if (siblings != null) {
component = TextComponents.composite(siblings.toArray());
} else {
component = TextComponents.literal("");
}

return component.format(Style.EMPTY
.withColor(o.getColor() != null ? Formatting.byCode(o.getColor().getCode()) : null)
.withBold(o.isBold())
.withItalic(o.isItalic())
.withUnderlined(o.isUnderlined())
.withObfuscated(o.isObfuscated()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package net.ornithemc.osl.text.impl;

import net.minecraft.text.Text;

import net.ornithemc.osl.entrypoints.api.ModInitializer;

public class TextInit implements ModInitializer {

@Override
public void init() {
TextResolvers.register(Text.class, new BaseTextResolver());
TextConverters.register(Text.class, new BaseTextConverter());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package net.ornithemc.osl.text.impl.mixin.common;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;

import net.minecraft.server.command.source.CommandSource;
import net.minecraft.text.Text;

import net.ornithemc.osl.text.api.MessageConsumer;
import net.ornithemc.osl.text.api.TextComponent;
import net.ornithemc.osl.text.api.TextComponents;

@Mixin(CommandSource.class)
public interface CommandSourceMixin extends MessageConsumer {

@Shadow
void sendMessage(Text messae);

@Override
default void sendMessage(TextComponent message) {
this.sendMessage(TextComponents.convert(message, Text.class));
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
{
"schemaVersion": 1,
"id": "osl-text-components",
"version": "0.1.0-alpha.6+mca1.0.1_01-mc1.6.4",
"version": "0.1.0-alpha.6+mc13w21a-mc1.6.4",
"environment": "*",
"entrypoints": {
"init": [
"net.ornithemc.osl.text.impl.TextResolversInit"
"net.ornithemc.osl.text.impl.TextInit"
]
},
"mixins": [
"osl.text-components.mixins.json"
],
"accessWidener": "osl.text-components.classtweaker",
"depends": {
"fabricloader": "\u003e\u003d0.18.0",
"minecraft": "\u003e\u003d1.0.0-alpha.0.1.1 \u003c\u003d1.6.4",
"minecraft": "\u003e\u003d1.6-alpha.13.21.a \u003c\u003d1.6.4",
"osl-core": "\u003e\u003d0.7.0",
"osl-entrypoints": "\u003e\u003d0.5.0"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
classTweaker v1 named

accessible method net/minecraft/text/Text getTranslated ()Ljava/lang/String;
accessible method net/minecraft/text/Text getSiblings ()Ljava/util/List;
accessible method net/minecraft/text/Text getText ()Ljava/lang/String;

transitive-inject-interface net/minecraft/server/command/source/CommandSource net/ornithemc/osl/text/impl/MessageConsumerImpl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"package": "net.ornithemc.osl.text.impl.mixin",
"compatibilityLevel": "JAVA_8",
"mixins": [
"common.CommandSourceMixin"
],
"client": [
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.ornithemc.osl.text.impl;

import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;

import net.ornithemc.osl.text.api.TextComponent;

public class BaseTextConverter implements TextConverter<Text> {

@Override
public Text convert(TextComponent component) {
Text text;

if (component instanceof LiteralTextComponent) {
text = new LiteralText(((LiteralTextComponent) component).getValue());
} else if (component instanceof TranslatableTextComponent) {
text = new TranslatableText(((TranslatableTextComponent) component).getKey(), ((TranslatableTextComponent) component).getArgs());
} else {
text = new LiteralText("");
}

text.setStyle(StyleConverter.convert(component.getStyle()));

for (TextComponent sibling : component.getSiblings()) {
text.append(this.convert(sibling));
}

return text;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package net.ornithemc.osl.text.impl;

import net.minecraft.text.Text;

import net.ornithemc.osl.core.impl.util.MinecraftVersion;
import net.ornithemc.osl.text.api.ClickEvent;
import net.ornithemc.osl.text.api.HoverEvent;
import net.ornithemc.osl.text.api.Style;
import net.ornithemc.osl.text.api.TextColor;
import net.ornithemc.osl.text.api.TextComponents;

public final class StyleConverter {

public static final boolean INSERTION_EXISTS = MinecraftVersion.resolve().compareTo("14w02a") >= 0;

public static net.minecraft.text.Style convert(Style style) {
net.minecraft.text.Style s = new net.minecraft.text.Style();

if (style.getColor() != null)
s.setColor(convertTextColor(style.getColor()));
if (style.withBold(style.isBold()) != style)
s.setBold(style.isBold());
if (style.withItalic(style.isItalic()) != style)
s.setItalic(style.isItalic());
if (style.withUnderlined(style.isUnderlined()) != style)
s.setUnderlined(style.isUnderlined());
if (style.withStrikethrough(style.isStrikethrough()) != style)
s.setStrikethrough(style.isStrikethrough());
if (style.withObfuscated(style.isObfuscated()) != style)
s.setObfuscated(style.isObfuscated());
if (style.getClickEvent() != null)
s.setClickEvent(convertClickEvent(style.getClickEvent()));
if (style.getHoverEvent() != null)
s.setHoverEvent(convertHoverEvent(style.getHoverEvent()));
if (INSERTION_EXISTS && style.getInsertion() != null)
s.setInsertion(style.getInsertion());

return s;
}

public static net.minecraft.text.Formatting convertTextColor(TextColor color) {
if (!color.isFormatting()) {
return null;
}

return net.minecraft.text.Formatting.valueOf(color.getFormatting().name());
}

public static net.minecraft.text.ClickEvent convertClickEvent(ClickEvent event) {
switch (event.getAction()) {
case OPEN_URL:
return new net.minecraft.text.ClickEvent(net.minecraft.text.ClickEvent.Action.OPEN_URL, event.getValue());
case RUN_COMMAND:
return new net.minecraft.text.ClickEvent(net.minecraft.text.ClickEvent.Action.RUN_COMMAND, event.getValue());
case SUGGEST_COMMAND:
return new net.minecraft.text.ClickEvent(net.minecraft.text.ClickEvent.Action.SUGGEST_COMMAND, event.getValue());
default:
return null; // TODO
}
}

public static net.minecraft.text.HoverEvent convertHoverEvent(HoverEvent event) {
switch (event.getAction()) {
case SHOW_TEXT:
return new net.minecraft.text.HoverEvent(net.minecraft.text.HoverEvent.Action.SHOW_TEXT, TextComponents.convert(event.getValue(), Text.class));
default:
return null; // TODO
}
}
}
Loading
Loading