package com.supaham.commons.bukkit.text.xml;
import com.supaham.commons.bukkit.text.FancyMessage;
import com.supaham.commons.bukkit.text.xml.tags.A;
import com.supaham.commons.bukkit.text.xml.tags.B;
import com.supaham.commons.bukkit.text.xml.tags.Color;
import com.supaham.commons.bukkit.text.xml.tags.I;
import com.supaham.commons.bukkit.text.xml.tags.Obfuscated;
import com.supaham.commons.bukkit.text.xml.tags.S;
import com.supaham.commons.bukkit.text.xml.tags.Span;
import com.supaham.commons.bukkit.text.xml.tags.U;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlSeeAlso;
/**
* Element serialized through {@link XmlParser}.
*
* @since 0.2.4
*/
@XmlSeeAlso({A.class,
B.class,
Color.class,
I.class,
Obfuscated.class,
S.class,
Span.class,
U.class})
public class Element {
@XmlAttribute
private String onClick = null;
@XmlAttribute
private String onHover = null;
@XmlElementRef(type = Element.class)
@XmlMixed
public List<Object> mixedContent = new ArrayList<Object>();
/**
* This regex pattern validates the syntax for onClick/onHover chat events. <p/>
* Click <a href="http://www.regexr.com/38pjh">here</a> for fun.
*/
private static final Pattern FUNCTION_PATTERN = Pattern.compile("^([^(]+)\\('(.*)'\\)$");
protected void modifyStyle(FancyMessage fancyMessage, Object... params) {
if (onClick != null) {
Matcher matcher = FUNCTION_PATTERN.matcher(onClick);
if (!matcher.matches()) {
throw new IllegalArgumentException("onClick syntax is invalid ('" + onClick + "')");
}
String event = matcher.group(1);
String data = String.format(matcher.group(2), params);
fancyMessage.onClick(event, data);
}
if (onHover != null) {
Matcher matcher = FUNCTION_PATTERN.matcher(onHover);
if (!matcher.matches()) {
throw new IllegalArgumentException("onHover syntax is invalid ('" + onHover + "')");
}
String event = matcher.group(1);
String data = String.format(matcher.group(2), params);
fancyMessage.onHover(event, data);
}
}
public FancyMessage getFancyMessage() {
FancyMessage fancyMessage = new FancyMessage();
modifyStyle(fancyMessage);
loop(fancyMessage);
return fancyMessage;
}
protected void loop(FancyMessage fancyMessage) {
for (Object o : mixedContent) {
if (fancyMessage.hasText()) {
fancyMessage.then();
}
if (o instanceof String) {
fancyMessage.text(o.toString());
} else if (o instanceof Element) {
Element element = (Element) o;
element.modifyStyle(fancyMessage);
element.loop(fancyMessage);
}
}
}
}