版本更新至 4.06
新增:TLocale 新增 BOOK 类型,用于发送书本界面(代替 Language2) 新增:TLocale 新增 BAR 类型,用于发送 Bossbar(需要 BossBarAPI) 新增:TLocale#Tellraw 工具用于发送原始 json 信息 新增:TellrawJson 工具用于创建原始 json 信息 新增:VariableFormatter 工具用于变量识别 新增:ArrayUtils 新增数组修改方法 修复:Language2Book 工具失效问题 调整:JsonFormatter 工具已过时,不再维护 从该版本起不再对 1.7.10 版本进行支持与维护,任何在 1.7.10 版本内出现的问题不再修复。 1.7.10 稳定版:v3.832
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
package me.skymc.taboolib.string;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@@ -11,34 +16,80 @@ import java.util.stream.IntStream;
|
||||
* @since 2018-04-16
|
||||
*/
|
||||
public class ArrayUtils {
|
||||
|
||||
public static <T> List<T> asList(T... args) {
|
||||
List<T> list = new ArrayList<>();
|
||||
Collections.addAll(list, args);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static String[] addFirst(String[] args, String... value) {
|
||||
if (args.length < 1) {
|
||||
return value;
|
||||
}
|
||||
List<String> list = asList(args);
|
||||
for (int i = value.length - 1 ; i >= 0 ; i--) {
|
||||
list.add(0, value[i]);
|
||||
}
|
||||
return list.toArray(new String[0]);
|
||||
}
|
||||
|
||||
public static String[] removeFirst(String[] args) {
|
||||
if (args.length <= 1) {
|
||||
return new String[0];
|
||||
}
|
||||
List<String> list = asList(args);
|
||||
list.remove(0);
|
||||
return list.toArray(new String[0]);
|
||||
}
|
||||
|
||||
public static String arrayJoin(String[] args, int start) {
|
||||
return IntStream.range(start, args.length).mapToObj(i -> args[i] + " ").collect(Collectors.joining()).trim();
|
||||
}
|
||||
|
||||
public static String arrayJoin(String[] args, int start) {
|
||||
return IntStream.range(start, args.length).mapToObj(i -> args[i] + " ").collect(Collectors.joining()).trim();
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <T> List<T> asList(T... args) {
|
||||
List<T> list = new ArrayList<>();
|
||||
Collections.addAll(list, args);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static <T> T[] arrayAppend(T[] array, T obj) {
|
||||
T[] arrayNew = arrayExpand(array, 1);
|
||||
arrayNew[array.length] = obj;
|
||||
return arrayNew;
|
||||
}
|
||||
|
||||
public static <T> T[] arrayAddFirst(T[] array, T obj) {
|
||||
T[] arrayNew = arrayExpandAtFirst(array, 1);
|
||||
arrayNew[0] = obj;
|
||||
return arrayNew;
|
||||
}
|
||||
|
||||
@SuppressWarnings("SuspiciousSystemArraycopy")
|
||||
public static <T> T arrayExpand(T oldArray, int expand) {
|
||||
int length = Array.getLength(oldArray);
|
||||
Object newArray = Array.newInstance(oldArray.getClass().getComponentType(), length + expand);
|
||||
System.arraycopy(oldArray, 0, newArray, 0, length);
|
||||
return (T) newArray;
|
||||
}
|
||||
|
||||
@SuppressWarnings("SuspiciousSystemArraycopy")
|
||||
public static <T> T arrayExpandAtFirst(T oldArray, int expand) {
|
||||
int length = Array.getLength(oldArray);
|
||||
Object newArray = Array.newInstance(oldArray.getClass().getComponentType(), length + expand);
|
||||
System.arraycopy(oldArray, 0, newArray, expand, length);
|
||||
return (T) newArray;
|
||||
}
|
||||
|
||||
public static <T> T cloneAsByte(T obj) throws Exception {
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
|
||||
objectOutputStream.writeObject(obj);
|
||||
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
|
||||
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
|
||||
return (T) objectInputStream.readObject();
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Deprecated
|
||||
//
|
||||
// *********************************
|
||||
|
||||
@Deprecated
|
||||
public static String[] addFirst(String[] args, String... value) {
|
||||
if (args.length < 1) {
|
||||
return value;
|
||||
}
|
||||
List<String> list = asList(args);
|
||||
for (int i = value.length - 1; i >= 0; i--) {
|
||||
list.add(0, value[i]);
|
||||
}
|
||||
return list.toArray(new String[0]);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static String[] removeFirst(String[] args) {
|
||||
if (args.length <= 1) {
|
||||
return new String[0];
|
||||
}
|
||||
List<String> list = asList(args);
|
||||
list.remove(0);
|
||||
return list.toArray(new String[0]);
|
||||
}
|
||||
}
|
||||
|
||||
113
src/main/java/me/skymc/taboolib/string/VariableFormatter.java
Normal file
113
src/main/java/me/skymc/taboolib/string/VariableFormatter.java
Normal file
@@ -0,0 +1,113 @@
|
||||
package me.skymc.taboolib.string;
|
||||
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @Author sky
|
||||
* @Since 2018-05-27 11:33
|
||||
*/
|
||||
public class VariableFormatter {
|
||||
|
||||
private Pattern pattern;
|
||||
private String text;
|
||||
private String textOrigin;
|
||||
private List<Variable> variableList = new ArrayList<>();
|
||||
|
||||
public VariableFormatter(String text) {
|
||||
this(text, "<([^<>]+)>");
|
||||
}
|
||||
|
||||
public VariableFormatter(String text, String regex) {
|
||||
this(text, Pattern.compile(regex));
|
||||
}
|
||||
|
||||
public VariableFormatter(String text, Pattern pattern) {
|
||||
this.text = text;
|
||||
this.textOrigin = text;
|
||||
this.pattern = pattern;
|
||||
}
|
||||
|
||||
public VariableFormatter reset() {
|
||||
text = textOrigin;
|
||||
variableList.clear();
|
||||
return this;
|
||||
}
|
||||
|
||||
public VariableFormatter find() {
|
||||
reset();
|
||||
Matcher matcher = pattern.matcher(text);
|
||||
while (matcher.find()) {
|
||||
String group = matcher.group();
|
||||
String[] textOther = text.split(group);
|
||||
String textLeft = text.indexOf(group) > 0 ? textOther[0] : null;
|
||||
String textRight = textOther.length >= 2 ? text.substring(text.indexOf(group) + group.length()) : null;
|
||||
if (textLeft != null) {
|
||||
variableList.add(new Variable(textLeft, false));
|
||||
}
|
||||
variableList.add(new Variable(group.substring(1, group.length() - 1), true));
|
||||
if (textRight != null && !pattern.matcher(textRight).find()) {
|
||||
variableList.add(new Variable(textRight, false));
|
||||
} else {
|
||||
text = String.valueOf(textRight);
|
||||
}
|
||||
}
|
||||
if (variableList.size() == 0) {
|
||||
variableList.add(new Variable(text, false));
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Strings.replaceWithOrder("VariableFormatter'{'pattern={0}, text=''{1}'', textOrigin=''{2}'', variableList={3}'}'", pattern, text, textOrigin, variableList);
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Getter and Setter
|
||||
//
|
||||
// *********************************
|
||||
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public List<Variable> getVariableList() {
|
||||
return variableList;
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Public classes
|
||||
//
|
||||
// *********************************
|
||||
|
||||
public static class Variable {
|
||||
|
||||
private final String text;
|
||||
private final boolean variable;
|
||||
|
||||
public Variable(String text, boolean variable) {
|
||||
this.text = text;
|
||||
this.variable = variable;
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public boolean isVariable() {
|
||||
return variable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Strings.replaceWithOrder("Variable'{'text=''{0}'', variable={1}'}'", text, variable);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,9 @@
|
||||
package me.skymc.taboolib.string.language2.value;
|
||||
|
||||
import com.ilummc.tlib.bungee.api.chat.BaseComponent;
|
||||
import com.ilummc.tlib.bungee.api.chat.ClickEvent;
|
||||
import com.ilummc.tlib.bungee.api.chat.HoverEvent;
|
||||
import com.ilummc.tlib.bungee.api.chat.TextComponent;
|
||||
import me.skymc.taboolib.bookformatter.BookFormatter;
|
||||
import me.skymc.taboolib.bookformatter.action.ClickAction;
|
||||
import me.skymc.taboolib.bookformatter.action.HoverAction;
|
||||
@@ -8,6 +12,7 @@ import me.skymc.taboolib.bookformatter.builder.PageBuilder;
|
||||
import me.skymc.taboolib.bookformatter.builder.TextBuilder;
|
||||
import me.skymc.taboolib.inventory.ItemUtils;
|
||||
import me.skymc.taboolib.other.NumberUtils;
|
||||
import me.skymc.taboolib.string.VariableFormatter;
|
||||
import me.skymc.taboolib.string.language2.Language2Format;
|
||||
import me.skymc.taboolib.string.language2.Language2Line;
|
||||
import me.skymc.taboolib.string.language2.Language2Value;
|
||||
@@ -21,7 +26,6 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
@@ -52,17 +56,15 @@ public class Language2Book implements Language2Line {
|
||||
// 变量
|
||||
this.player = player;
|
||||
this.value = format.getLanguage2Value();
|
||||
|
||||
// 获取书本设置
|
||||
this.book = BookFormatter.writtenBook();
|
||||
// 设置
|
||||
formatOptions(list);
|
||||
// 书本
|
||||
book = BookFormatter.writtenBook();
|
||||
// 内容
|
||||
PageBuilder page = new PageBuilder();
|
||||
// 遍历内容
|
||||
for (String line : list) {
|
||||
// 翻页
|
||||
if ("[page]".equals(line)) {
|
||||
if (line.equals("[page]")) {
|
||||
book.addPages(page.build());
|
||||
page = new PageBuilder();
|
||||
}
|
||||
@@ -70,57 +72,50 @@ public class Language2Book implements Language2Line {
|
||||
else if (line.startsWith("@option")) {
|
||||
break;
|
||||
} else {
|
||||
Matcher matcher = pattern.matcher(line);
|
||||
boolean find = false;
|
||||
while (matcher.find()) {
|
||||
find = true;
|
||||
String optionName = matcher.group(1);
|
||||
String optionFullName = "<@" + matcher.group(1) + ">";
|
||||
// 判断设置是否存在
|
||||
if (!options.containsKey(optionName)) {
|
||||
page.add("§4[<ERROR-50: " + format.getLanguage2Value().getLanguageKey() + ">]");
|
||||
} else {
|
||||
String[] line_split = line.split(optionFullName);
|
||||
try {
|
||||
// 单独一行
|
||||
if (line_split.length == 0) {
|
||||
page.add(options.get(optionName).build()).endLine();
|
||||
} else {
|
||||
// 前段
|
||||
page.add(line_split[0]);
|
||||
// 变量
|
||||
page.add(options.get(optionName).build());
|
||||
// 后段
|
||||
if (line_split.length >= 2) {
|
||||
// 获取文本
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 1; i < line_split.length; i++) {
|
||||
sb.append(line_split[i]).append(optionFullName);
|
||||
}
|
||||
// 更改文本
|
||||
line = sb.substring(0, sb.length() - optionFullName.length());
|
||||
// 如果后段还有变量
|
||||
if (!pattern.matcher(line).find()) {
|
||||
page.add(line_split[1]).endLine();
|
||||
}
|
||||
} else {
|
||||
page.endLine();
|
||||
}
|
||||
for (VariableFormatter.Variable variable : new VariableFormatter(line, pattern).find().getVariableList()) {
|
||||
if (variable.isVariable()) {
|
||||
String node = variable.getText().substring(1);
|
||||
if (!options.containsKey(node)) {
|
||||
page.add("§4[<ERROR-50: " + format.getLanguage2Value().getLanguageKey() + ">]");
|
||||
} else {
|
||||
TextBuilder builder = options.get(node);
|
||||
BaseComponent component = new TextComponent(builder.getText());
|
||||
if (builder.getHover() != null) {
|
||||
component.setHoverEvent(new HoverEvent(builder.getHover().action(), builder.getHover().value()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
page.add("§4[<ERROR-51: " + format.getLanguage2Value().getLanguageKey() + ">]");
|
||||
if (builder.getClick() != null) {
|
||||
component.setClickEvent(new ClickEvent(builder.getClick().action(), builder.getClick().value()));
|
||||
}
|
||||
page.add(component);
|
||||
}
|
||||
} else {
|
||||
page.add(variable.getText());
|
||||
}
|
||||
}
|
||||
if (!find) {
|
||||
page.add(line).endLine();
|
||||
}
|
||||
page.newLine();
|
||||
}
|
||||
}
|
||||
// 结尾
|
||||
book.addPages(page.build());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void send(Player player) {
|
||||
BookFormatter.forceOpen(player, book.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void console() {
|
||||
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[<ERROR-40: " + value.getLanguageKey() + ">]");
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Getter and Setter
|
||||
//
|
||||
// *********************************
|
||||
|
||||
public static Pattern getPattern() {
|
||||
return pattern;
|
||||
}
|
||||
@@ -141,6 +136,46 @@ public class Language2Book implements Language2Line {
|
||||
return book;
|
||||
}
|
||||
|
||||
// *********************************
|
||||
//
|
||||
// Private Methods
|
||||
//
|
||||
// *********************************
|
||||
|
||||
private List<List<String>> getBookPages(List<String> source) {
|
||||
List<List<String>> list = new ArrayList<>();
|
||||
for (String line : removeOption(source)) {
|
||||
if (line.equalsIgnoreCase("[page]")) {
|
||||
list.add(new ArrayList<>());
|
||||
} else {
|
||||
getLatestList(list).add(line);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public List<String> getLatestList(List<List<String>> list) {
|
||||
if (list.size() == 0) {
|
||||
List<String> newList = new ArrayList<>();
|
||||
list.add(newList);
|
||||
return newList;
|
||||
} else {
|
||||
return list.get(list.size() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> removeOption(List<String> source) {
|
||||
List<String> list = new ArrayList<>();
|
||||
for (String line : source) {
|
||||
if (!line.contains("@option")) {
|
||||
list.add(line);
|
||||
} else {
|
||||
return list;
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private void formatOptions(List<String> list) {
|
||||
// 获取书本设置
|
||||
HashMap<String, List<String>> _options = getOptions(list);
|
||||
@@ -204,14 +239,4 @@ public class Language2Book implements Language2Line {
|
||||
options_source.put(optionName, option);
|
||||
return options_source;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void send(Player player) {
|
||||
BookFormatter.forceOpen(player, book.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void console() {
|
||||
Bukkit.getConsoleSender().sendMessage(ChatColor.DARK_RED + "[<ERROR-40: " + value.getLanguageKey() + ">]");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user