Fixed better color handling system

This commit is contained in:
Olof Larsson 2011-10-10 13:31:25 +02:00
parent e402797c54
commit aceeea8b0e
4 changed files with 116 additions and 80 deletions

View File

@ -68,7 +68,7 @@ public class FCmdRoot extends FCommand
this.disableOnLock = false; this.disableOnLock = false;
this.setHelpShort("The faction base command"); this.setHelpShort("The faction base command");
this.helpLong.add(p.txt.tags("<i>This command contains all faction stuff.")); this.helpLong.add(p.txt.parseTags("<i>This command contains all faction stuff."));
//this.subCommands.add(p.cmdHelp); //this.subCommands.add(p.cmdHelp);

View File

@ -223,7 +223,7 @@ public abstract class MCommand<T extends MPlugin>
public String getUseageTemplate(List<MCommand<?>> commandChain, boolean addShortHelp) public String getUseageTemplate(List<MCommand<?>> commandChain, boolean addShortHelp)
{ {
StringBuilder ret = new StringBuilder(); StringBuilder ret = new StringBuilder();
ret.append(p.txt.tags("<c>")); ret.append(p.txt.parseTags("<c>"));
ret.append('/'); ret.append('/');
for (MCommand<?> mc : commandChain) for (MCommand<?> mc : commandChain)
@ -257,13 +257,13 @@ public abstract class MCommand<T extends MPlugin>
if (args.size() > 0) if (args.size() > 0)
{ {
ret.append(p.txt.tags("<p> ")); ret.append(p.txt.parseTags("<p> "));
ret.append(TextUtil.implode(args, " ")); ret.append(TextUtil.implode(args, " "));
} }
if (addShortHelp) if (addShortHelp)
{ {
ret.append(p.txt.tags(" <i>")); ret.append(p.txt.parseTags(" <i>"));
ret.append(this.helpShort); ret.append(this.helpShort);
} }

View File

@ -3,6 +3,7 @@ package com.massivecraft.factions.zcore;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*; import java.util.*;
import java.util.Map.Entry;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -66,6 +67,7 @@ public abstract class MPlugin extends JavaPlugin
if ( ! lib.require("gson.jar", "http://search.maven.org/remotecontent?filepath=com/google/code/gson/gson/1.7.1/gson-1.7.1.jar")) return false; if ( ! lib.require("gson.jar", "http://search.maven.org/remotecontent?filepath=com/google/code/gson/gson/1.7.1/gson-1.7.1.jar")) return false;
this.gson = this.getGsonBuilder().create(); this.gson = this.getGsonBuilder().create();
this.txt = new TextUtil();
initTXT(); initTXT();
// Create and register listeners // Create and register listeners
@ -131,52 +133,37 @@ public abstract class MPlugin extends JavaPlugin
// These are not supposed to be used directly. // These are not supposed to be used directly.
// They are loaded and used through the TextUtil instance for the plugin. // They are loaded and used through the TextUtil instance for the plugin.
public Map<String, String> tags = new LinkedHashMap<String, String>(); public Map<String, String> rawTags = new LinkedHashMap<String, String>();
public void addTags() public void addRawTags()
{ {
this.tags.put("black", "§0"); this.rawTags.put("l", "<green>"); // logo
this.tags.put("navy", "§1"); this.rawTags.put("a", "<gold>"); // art
this.tags.put("green", "§2"); this.rawTags.put("n", "<silver>"); // notice
this.tags.put("teal", "§3"); this.rawTags.put("i", "<yellow>"); // info
this.tags.put("red", "§4"); this.rawTags.put("g", "<lime>"); // good
this.tags.put("purple", "§5"); this.rawTags.put("b", "<rose>"); // bad
this.tags.put("gold", "§6"); this.rawTags.put("h", "<pink>"); // highligh
this.tags.put("silver", "§7"); this.rawTags.put("c", "<aqua>"); // command
this.tags.put("gray", "§8"); this.rawTags.put("p", "<teal>"); // parameter
this.tags.put("blue", "§9");
this.tags.put("white", "§f");
this.tags.put("lime", "§a");
this.tags.put("aqua", "§b");
this.tags.put("rose", "§c");
this.tags.put("pink", "§d");
this.tags.put("yellow", "§e");
this.tags.put("l", "§2"); // logo
this.tags.put("a", "§6"); // art
this.tags.put("n", "§7"); // notice
this.tags.put("i", "§e"); // info
this.tags.put("g", "§a"); // good
this.tags.put("b", "§c"); // bad
this.tags.put("h", "§d"); // highligh
this.tags.put("c", "§b"); // command
this.tags.put("p", "§3"); // parameter
} }
public void initTXT() public void initTXT()
{ {
this.addTags(); this.addRawTags();
Type type = new TypeToken<Map<String, String>>(){}.getType(); Type type = new TypeToken<Map<String, String>>(){}.getType();
Map<String, String> tagsFromFile = this.persist.load(type, "tags"); Map<String, String> tagsFromFile = this.persist.load(type, "tags");
if (tagsFromFile != null) this.tags.putAll(tagsFromFile); if (tagsFromFile != null) this.rawTags.putAll(tagsFromFile);
this.persist.save(this.tags, "tags"); this.persist.save(this.rawTags, "tags");
this.txt = new TextUtil(this.tags); for (Entry<String, String> rawTag : this.rawTags.entrySet())
{
this.txt.tags.put(rawTag.getKey(), TextUtil.parseColor(rawTag.getValue()));
}
} }
// -------------------------------------------- // // -------------------------------------------- //
// COMMAND HANDLING // COMMAND HANDLING
// -------------------------------------------- // // -------------------------------------------- //

View File

@ -9,56 +9,36 @@ import org.bukkit.Material;
public class TextUtil public class TextUtil
{ {
private Map<String, String> tags = new HashMap<String, String>(); public Map<String, String> tags;
public TextUtil()
public TextUtil(Map<String, String> tags)
{ {
if (tags != null) this.tags = new HashMap<String, String>();
{
this.tags.putAll(tags);
}
} }
// Get is supposed to be the way we reach registered lang // -------------------------------------------- //
// TODO: Is the parse // Top-level parsing functions.
/*public String get(String name) // -------------------------------------------- //
{
String str = lang.get(name);
if (str == null) str = name;
return this.parse(str);
}
public String get(String name, Object... args)
{
String str = lang.get(name);
if (str == null) str = name;
return this.parse(str, args);
}*/
// Parse is used to handle non registered text
public String parse(String str, Object... args) public String parse(String str, Object... args)
{ {
return String.format(this.tags(str), args); return String.format(this.parse(str), args);
} }
public String parse(String str) public String parse(String str)
{ {
return this.tags(str); return this.parseTags(parseColor(str));
} }
public Map<String, String> getTags() // -------------------------------------------- //
{ // Tag parsing
return tags; // -------------------------------------------- //
}
public String tags(String str) public String parseTags(String str)
{ {
return replaceTags(str, this.tags); return replaceTags(str, this.tags);
} }
public static final transient Pattern patternTag = Pattern.compile("<([^<>]*)>"); public static final transient Pattern patternTag = Pattern.compile("<([a-zA-Z0-9_]*)>");
public static String replaceTags(String str, Map<String, String> tags) public static String replaceTags(String str, Map<String, String> tags)
{ {
StringBuffer ret = new StringBuffer(); StringBuffer ret = new StringBuffer();
@ -80,6 +60,69 @@ public class TextUtil
return ret.toString(); return ret.toString();
} }
// -------------------------------------------- //
// Color parsing
// -------------------------------------------- //
public static String parseColor(String string)
{
string = parseColorAmp(string);
string = parseColorAcc(string);
string = parseColorTags(string);
return string;
}
public static String parseColorAmp(String string)
{
string = string.replaceAll("(§([a-z0-9]))", "\u00A7$2");
string = string.replaceAll("(&([a-z0-9]))", "\u00A7$2");
string = string.replace("&&", "&");
return string;
}
public static String parseColorAcc(String string)
{
return string.replace("`e", "")
.replace("`r", ChatColor.RED.toString()) .replace("`R", ChatColor.DARK_RED.toString())
.replace("`y", ChatColor.YELLOW.toString()) .replace("`Y", ChatColor.GOLD.toString())
.replace("`g", ChatColor.GREEN.toString()) .replace("`G", ChatColor.DARK_GREEN.toString())
.replace("`a", ChatColor.AQUA.toString()) .replace("`A", ChatColor.DARK_AQUA.toString())
.replace("`b", ChatColor.BLUE.toString()) .replace("`B", ChatColor.DARK_BLUE.toString())
.replace("`p", ChatColor.LIGHT_PURPLE.toString()) .replace("`P", ChatColor.DARK_PURPLE.toString())
.replace("`k", ChatColor.BLACK.toString()) .replace("`s", ChatColor.GRAY.toString())
.replace("`S", ChatColor.DARK_GRAY.toString()) .replace("`w", ChatColor.WHITE.toString());
}
public static String parseColorTags(String string)
{
return string.replace("<empty>", "")
.replace("<black>", "\u00A70")
.replace("<navy>", "\u00A71")
.replace("<green>", "\u00A72")
.replace("<teal>", "\u00A73")
.replace("<red>", "\u00A74")
.replace("<purple>", "\u00A75")
.replace("<gold>", "\u00A76")
.replace("<silver>", "\u00A77")
.replace("<gray>", "\u00A78")
.replace("<blue>", "\u00A79")
.replace("<lime>", "\u00A7a")
.replace("<aqua>", "\u00A7b")
.replace("<rose>", "\u00A7c")
.replace("<pink>", "\u00A7d")
.replace("<yellow>", "\u00A7e")
.replace("<white>", "\u00A7f");
}
// -------------------------------------------- //
// Standard utils like UCFirst, implode and repeat.
// -------------------------------------------- //
public static String upperCaseFirst(String string)
{
return string.substring(0, 1).toUpperCase()+string.substring(1);
}
public static String implode(List<String> list, String glue) public static String implode(List<String> list, String glue)
{ {
StringBuilder ret = new StringBuilder(); StringBuilder ret = new StringBuilder();
@ -100,6 +143,10 @@ public class TextUtil
else return s + repeat(s, times-1); else return s + repeat(s, times-1);
} }
// -------------------------------------------- //
// Material name tools
// -------------------------------------------- //
public static String getMaterialName(Material material) public static String getMaterialName(Material material)
{ {
return material.toString().replace('_', ' ').toLowerCase(); return material.toString().replace('_', ' ').toLowerCase();
@ -110,26 +157,24 @@ public class TextUtil
return getMaterialName(Material.getMaterial(materialId)); return getMaterialName(Material.getMaterial(materialId));
} }
public static String upperCaseFirst(String string) // -------------------------------------------- //
{ // Paging and chrome-tools like titleize
return string.substring(0, 1).toUpperCase()+string.substring(1); // -------------------------------------------- //
}
// TODO: Make part of layout configuration.
private final static String titleizeLine = repeat("_", 52); private final static String titleizeLine = repeat("_", 52);
private final static int titleizeBalance = -1; private final static int titleizeBalance = -1;
public String titleize(String str) public String titleize(String str)
{ {
String center = ".[ "+ tags("<l>") + str + tags("<a>")+ " ]."; String center = ".[ "+ parseTags("<l>") + str + parseTags("<a>")+ " ].";
int centerlen = ChatColor.stripColor(center).length(); int centerlen = ChatColor.stripColor(center).length();
int pivot = titleizeLine.length() / 2; int pivot = titleizeLine.length() / 2;
int eatLeft = (centerlen / 2) - titleizeBalance; int eatLeft = (centerlen / 2) - titleizeBalance;
int eatRight = (centerlen - eatLeft) + titleizeBalance; int eatRight = (centerlen - eatLeft) + titleizeBalance;
if (eatLeft < pivot) if (eatLeft < pivot)
return tags("<a>")+titleizeLine.substring(0, pivot - eatLeft) + center + titleizeLine.substring(pivot + eatRight); return parseTags("<a>")+titleizeLine.substring(0, pivot - eatLeft) + center + titleizeLine.substring(pivot + eatRight);
else else
return tags("<a>")+center; return parseTags("<a>")+center;
} }
public ArrayList<String> getPage(List<String> lines, int pageHumanBased, String title) public ArrayList<String> getPage(List<String> lines, int pageHumanBased, String title)
@ -143,12 +188,12 @@ public class TextUtil
if (pagecount == 0) if (pagecount == 0)
{ {
ret.add(this.tags("<i>Sorry. No Pages available.")); ret.add(this.parseTags("<i>Sorry. No Pages available."));
return ret; return ret;
} }
else if (pageZeroBased < 0 || pageHumanBased > pagecount) else if (pageZeroBased < 0 || pageHumanBased > pagecount)
{ {
ret.add(this.tags("<i>Invalid page. Must be between 1 and "+pagecount)); ret.add(this.parseTags("<i>Invalid page. Must be between 1 and "+pagecount));
return ret; return ret;
} }
@ -164,6 +209,10 @@ public class TextUtil
return ret; return ret;
} }
// -------------------------------------------- //
// Describing Time
// -------------------------------------------- //
/** /**
* Using this function you transform a delta in milliseconds * Using this function you transform a delta in milliseconds
* to a String like "2 weeks from now" or "7 days ago". * to a String like "2 weeks from now" or "7 days ago".