Better ReplaceAll
This commit is contained in:
parent
3b5e1d4499
commit
7b67c58d2f
@ -7,6 +7,7 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
@ -33,14 +34,17 @@ public class Mson implements Serializable
|
|||||||
|
|
||||||
public static final Pattern PARSE_PREFIX = Pattern.compile("\u00A7");
|
public static final Pattern PARSE_PREFIX = Pattern.compile("\u00A7");
|
||||||
|
|
||||||
|
public static final LowercaseEnumAdapter<ChatColor> ADAPTER_LOWERCASE_CHAT_COLOR = LowercaseEnumAdapter.get(ChatColor.class);
|
||||||
|
public static final LowercaseEnumAdapter<MsonEventAction> ADAPTER_LOWERCASE_MSON_EVENT_ACTION = LowercaseEnumAdapter.get(MsonEventAction.class);
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// GSON
|
// GSON
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
public static final Gson GSON = new GsonBuilder()
|
public static final Gson GSON = new GsonBuilder()
|
||||||
.disableHtmlEscaping()
|
.disableHtmlEscaping()
|
||||||
.registerTypeAdapter(ChatColor.class, LowercaseEnumAdapter.get(ChatColor.class))
|
.registerTypeAdapter(ChatColor.class, ADAPTER_LOWERCASE_CHAT_COLOR)
|
||||||
.registerTypeAdapter(MsonEventAction.class, LowercaseEnumAdapter.get(MsonEventAction.class))
|
.registerTypeAdapter(MsonEventAction.class, ADAPTER_LOWERCASE_MSON_EVENT_ACTION)
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -63,7 +67,7 @@ public class Mson implements Serializable
|
|||||||
public ChatColor colorInherited() { return parentHas() ? parent().colorEffective() : null; }
|
public ChatColor colorInherited() { return parentHas() ? parent().colorEffective() : null; }
|
||||||
public Mson color(ChatColor color)
|
public Mson color(ChatColor color)
|
||||||
{
|
{
|
||||||
if (color != null && ! color.isColor()) throw new IllegalArgumentException("color must be a color");
|
if (color != null && ! color.isColor()) throw new IllegalArgumentException("Color must be a color.");
|
||||||
this.color = color;
|
this.color = color;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -92,7 +96,7 @@ public class Mson implements Serializable
|
|||||||
// FIELD: strikethrough
|
// FIELD: strikethrough
|
||||||
protected Boolean strikethrough = null;
|
protected Boolean strikethrough = null;
|
||||||
public Boolean strikethrough() { return this.strikethrough; }
|
public Boolean strikethrough() { return this.strikethrough; }
|
||||||
public Mson striketrhough(Boolean strikethrough) { this.strikethrough = strikethrough; return this; }
|
public Mson strikethrough(Boolean strikethrough) { this.strikethrough = strikethrough; return this; }
|
||||||
public boolean strikethroughEffective() { return strikethrough() != null ? strikethrough() : strikethroughInherited(); }
|
public boolean strikethroughEffective() { return strikethrough() != null ? strikethrough() : strikethroughInherited(); }
|
||||||
protected boolean strikethroughInherited() { return parentHas() && parent().strikethroughEffective(); }
|
protected boolean strikethroughInherited() { return parentHas() && parent().strikethroughEffective(); }
|
||||||
|
|
||||||
@ -110,7 +114,7 @@ public class Mson implements Serializable
|
|||||||
protected MsonEvent clickEventInherited() { return this.parentHas() ? this.parent().clickEventEffective() : null; }
|
protected MsonEvent clickEventInherited() { return this.parentHas() ? this.parent().clickEventEffective() : null; }
|
||||||
public Mson clickEvent(MsonEvent clickEvent)
|
public Mson clickEvent(MsonEvent clickEvent)
|
||||||
{
|
{
|
||||||
if (clickEvent != null && ! clickEvent.isClickEvent()) throw new IllegalArgumentException("clickEvent may not be hoverEvent");
|
if (clickEvent != null && ! clickEvent.isClickEvent()) throw new IllegalArgumentException("ClickEvent may not be a HoverEvent.");
|
||||||
this.clickEvent = clickEvent;
|
this.clickEvent = clickEvent;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -121,7 +125,7 @@ public class Mson implements Serializable
|
|||||||
protected MsonEvent hoverEventInherited() { return this.parentHas() ? this.parent().hoverEventEffective() : null; }
|
protected MsonEvent hoverEventInherited() { return this.parentHas() ? this.parent().hoverEventEffective() : null; }
|
||||||
public Mson hoverEvent(MsonEvent hoverEvent)
|
public Mson hoverEvent(MsonEvent hoverEvent)
|
||||||
{
|
{
|
||||||
if (hoverEvent != null && ! hoverEvent.isHoverEvent()) throw new IllegalArgumentException("hoverEvent may not be clickEvent");
|
if (hoverEvent != null && ! hoverEvent.isHoverEvent()) throw new IllegalArgumentException("HoverEvent may not be a ClickEvent.");
|
||||||
this.hoverEvent = hoverEvent;
|
this.hoverEvent = hoverEvent;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -208,7 +212,7 @@ public class Mson implements Serializable
|
|||||||
if (style == ChatColor.BOLD) return this.bold(true);
|
if (style == ChatColor.BOLD) return this.bold(true);
|
||||||
if (style == ChatColor.ITALIC) return this.italic(true);
|
if (style == ChatColor.ITALIC) return this.italic(true);
|
||||||
if (style == ChatColor.UNDERLINE) return this.underlined(true);
|
if (style == ChatColor.UNDERLINE) return this.underlined(true);
|
||||||
if (style == ChatColor.STRIKETHROUGH) return this.striketrhough(true);
|
if (style == ChatColor.STRIKETHROUGH) return this.strikethrough(true);
|
||||||
if (style == ChatColor.MAGIC) return this.obfuscated(true);
|
if (style == ChatColor.MAGIC) return this.obfuscated(true);
|
||||||
if (style.isColor()) return this.color(style);
|
if (style.isColor()) return this.color(style);
|
||||||
|
|
||||||
@ -351,6 +355,11 @@ public class Mson implements Serializable
|
|||||||
return new Mson();
|
return new Mson();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Mson mson(Object part)
|
||||||
|
{
|
||||||
|
return Mson.getMson(part);
|
||||||
|
}
|
||||||
|
|
||||||
public static Mson mson(Object... parts)
|
public static Mson mson(Object... parts)
|
||||||
{
|
{
|
||||||
return Mson.getMson(parts);
|
return Mson.getMson(parts);
|
||||||
@ -386,7 +395,7 @@ public class Mson implements Serializable
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("We only accept Strings, Msons, Collections and Arrays");
|
throw new IllegalArgumentException("We only accept Strings, Msons, Collections and Arrays.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,7 +404,7 @@ public class Mson implements Serializable
|
|||||||
return msons(Arrays.asList(parts));
|
return msons(Arrays.asList(parts));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Mson> msons(Collection<?> parts)
|
public static List<Mson> msons(Iterable<?> parts)
|
||||||
{
|
{
|
||||||
if (parts == null) throw new NullPointerException("parts");
|
if (parts == null) throw new NullPointerException("parts");
|
||||||
|
|
||||||
@ -464,7 +473,7 @@ public class Mson implements Serializable
|
|||||||
.bold(bold)
|
.bold(bold)
|
||||||
.italic(italic)
|
.italic(italic)
|
||||||
.underlined(underlined)
|
.underlined(underlined)
|
||||||
.striketrhough(strikethrough)
|
.strikethrough(strikethrough)
|
||||||
.obfuscated(obfuscated);
|
.obfuscated(obfuscated);
|
||||||
|
|
||||||
msons.add(mson);
|
msons.add(mson);
|
||||||
@ -488,7 +497,7 @@ public class Mson implements Serializable
|
|||||||
|
|
||||||
public static Mson format(String format, Object... args)
|
public static Mson format(String format, Object... args)
|
||||||
{
|
{
|
||||||
return Mson.mson(String.format(format, args));
|
return Mson.mson().text(String.format(format, args));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mson copy()
|
public Mson copy()
|
||||||
@ -499,7 +508,7 @@ public class Mson implements Serializable
|
|||||||
.bold(this.bold)
|
.bold(this.bold)
|
||||||
.italic(this.italic)
|
.italic(this.italic)
|
||||||
.underlined(this.underlined)
|
.underlined(this.underlined)
|
||||||
.striketrhough(this.strikethrough)
|
.strikethrough(this.strikethrough)
|
||||||
.obfuscated(this.obfuscated)
|
.obfuscated(this.obfuscated)
|
||||||
.insertionString(this.insertionString)
|
.insertionString(this.insertionString)
|
||||||
.clickEvent(this.clickEvent)
|
.clickEvent(this.clickEvent)
|
||||||
@ -528,7 +537,7 @@ public class Mson implements Serializable
|
|||||||
this.bold(ancestor.bold());
|
this.bold(ancestor.bold());
|
||||||
this.italic(ancestor.italic());
|
this.italic(ancestor.italic());
|
||||||
this.underlined(ancestor.underlined());
|
this.underlined(ancestor.underlined());
|
||||||
this.striketrhough(ancestor.strikethrough());
|
this.strikethrough(ancestor.strikethrough());
|
||||||
this.obfuscated(ancestor.obfuscated());
|
this.obfuscated(ancestor.obfuscated());
|
||||||
this.hoverEvent(ancestor.hoverEvent());
|
this.hoverEvent(ancestor.hoverEvent());
|
||||||
this.clickEvent(ancestor.clickEvent());
|
this.clickEvent(ancestor.clickEvent());
|
||||||
@ -646,11 +655,18 @@ public class Mson implements Serializable
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Special replace all
|
// Special replace all
|
||||||
public Mson replaceAll(String regex, Mson replacement)
|
|
||||||
|
// This is old and not the best solution.
|
||||||
|
// Awaiting further decision.
|
||||||
|
|
||||||
|
/* public Mson replaceAll(String regex, Mson replacement)
|
||||||
{
|
{
|
||||||
return replaceAll(Pattern.compile(regex), replacement);
|
if (regex == null) throw new NullPointerException("regex");
|
||||||
|
if (replacement == null) throw new NullPointerException("replacement");
|
||||||
|
return this.replaceAllOld(Pattern.compile(regex), replacement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Mson replaceAll(Pattern pattern, Mson replacement)
|
public Mson replaceAll(Pattern pattern, Mson replacement)
|
||||||
{
|
{
|
||||||
if (pattern == null) throw new NullPointerException("pattern");
|
if (pattern == null) throw new NullPointerException("pattern");
|
||||||
@ -730,6 +746,103 @@ public class Mson implements Serializable
|
|||||||
mson.simpleClean();
|
mson.simpleClean();
|
||||||
// ... and return recreated mson
|
// ... and return recreated mson
|
||||||
return mson;
|
return mson;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
public Mson replaceAll(String regex, Mson replacement)
|
||||||
|
{
|
||||||
|
if (regex == null) throw new NullPointerException("regex");
|
||||||
|
if (replacement == null) throw new NullPointerException("replacement");
|
||||||
|
return this.replaceAll(Pattern.compile(regex), replacement);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mson replaceAll(Pattern pattern, final Mson replacement)
|
||||||
|
{
|
||||||
|
if (pattern == null) throw new NullPointerException("pattern");
|
||||||
|
if (replacement == null) throw new NullPointerException("replacement");
|
||||||
|
MsonReplacement replacer = new MsonReplacement()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Object getReplacement(String match)
|
||||||
|
{
|
||||||
|
return replacement;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
return this.replaceAll(pattern, replacer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mson replaceAll(String regex, MsonReplacement replacer)
|
||||||
|
{
|
||||||
|
if (regex == null) throw new NullPointerException("regex");
|
||||||
|
if (replacer == null) throw new NullPointerException("replacer");
|
||||||
|
return this.replaceAll(Pattern.compile(regex), replacer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mson replaceAll(Pattern pattern, MsonReplacement replacer)
|
||||||
|
{
|
||||||
|
if (pattern == null) throw new NullPointerException("pattern");
|
||||||
|
if (replacer == null) throw new NullPointerException("replacer");
|
||||||
|
|
||||||
|
Mson ret = mson().copyFormatAndBehaviour(this);
|
||||||
|
|
||||||
|
List<Mson> msons = new ArrayList<Mson>();
|
||||||
|
StringBuffer currentString = new StringBuffer();
|
||||||
|
Matcher matcher = pattern.matcher(text());
|
||||||
|
while (matcher.find())
|
||||||
|
{
|
||||||
|
String match = matcher.group(0);
|
||||||
|
Object replacement = replacer.getReplacement(match);
|
||||||
|
|
||||||
|
// Add the match
|
||||||
|
if (replacement == null) matcher.appendReplacement(currentString, match);
|
||||||
|
|
||||||
|
// Add the string
|
||||||
|
else if (replacement instanceof String) matcher.appendReplacement(currentString, replacement.toString());
|
||||||
|
|
||||||
|
// Add the mson
|
||||||
|
else if (replacement instanceof Mson)
|
||||||
|
{
|
||||||
|
// Fixup current string
|
||||||
|
matcher.appendReplacement(currentString, "");
|
||||||
|
if (addStringBuffer(msons, currentString)) currentString = new StringBuffer();
|
||||||
|
|
||||||
|
// Add this replacement
|
||||||
|
msons.add((Mson) replacement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not allowed
|
||||||
|
else throw new IllegalArgumentException("We only support null, String and Mson.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the remaining string pieces
|
||||||
|
matcher.appendTail(currentString);
|
||||||
|
addStringBuffer(msons, currentString);
|
||||||
|
|
||||||
|
// Recurse on extras.
|
||||||
|
if (this.extraHas())
|
||||||
|
{
|
||||||
|
for (Mson extra : this.extra())
|
||||||
|
{
|
||||||
|
msons.add(extra.replaceAll(pattern, replacer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set extras
|
||||||
|
for (Mson mson : msons)
|
||||||
|
{
|
||||||
|
mson.parent(ret);
|
||||||
|
}
|
||||||
|
ret.extra(msons);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean addStringBuffer(List<Mson> msons, StringBuffer buffer)
|
||||||
|
{
|
||||||
|
if (buffer.length() == 0) return false;
|
||||||
|
Mson mson = mson().text(buffer.toString());
|
||||||
|
msons.add(mson);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mson replaceAll(Mson replace, Mson replacement)
|
public Mson replaceAll(Mson replace, Mson replacement)
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
package com.massivecraft.massivecore.mson;
|
||||||
|
|
||||||
|
public interface MsonReplacement
|
||||||
|
{
|
||||||
|
public Object getReplacement(String match);
|
||||||
|
}
|
@ -1,7 +1,10 @@
|
|||||||
package com.massivecraft.massivecore.mson;
|
package com.massivecraft.massivecore.mson;
|
||||||
|
|
||||||
import static org.bukkit.ChatColor.*;
|
|
||||||
import static com.massivecraft.massivecore.mson.Mson.mson;
|
import static com.massivecraft.massivecore.mson.Mson.mson;
|
||||||
|
import static org.bukkit.ChatColor.BLUE;
|
||||||
|
import static org.bukkit.ChatColor.GREEN;
|
||||||
|
import static org.bukkit.ChatColor.RED;
|
||||||
|
import static org.bukkit.ChatColor.YELLOW;
|
||||||
|
|
||||||
import com.massivecraft.massivecore.collections.MassiveList;
|
import com.massivecraft.massivecore.collections.MassiveList;
|
||||||
import com.massivecraft.massivecore.util.Txt;
|
import com.massivecraft.massivecore.util.Txt;
|
||||||
@ -91,9 +94,10 @@ public class Test
|
|||||||
mson = mson("1 2 3 4 5 6 1 7 tests").color(BLUE).addChild(" 1+1+1").addChild("herpiderp").root().replaceAll("1", mson("0"));
|
mson = mson("1 2 3 4 5 6 1 7 tests").color(BLUE).addChild(" 1+1+1").addChild("herpiderp").root().replaceAll("1", mson("0"));
|
||||||
test("replaceAll1", mson);
|
test("replaceAll1", mson);
|
||||||
|
|
||||||
mson = mson("hello").addChild("hello").addChild("hello").root().replaceAll("hello", mson("lol"));
|
mson = mson("hellohello").addChild("hello").addChild("hello").root().replaceAll("hello", mson("lol"));
|
||||||
test("overload", mson);
|
test("overload", mson);
|
||||||
|
|
||||||
|
|
||||||
Mson toReplace = mson("hallo");
|
Mson toReplace = mson("hallo");
|
||||||
|
|
||||||
// replace mson mson
|
// replace mson mson
|
||||||
|
Loading…
Reference in New Issue
Block a user