package gutenberg.util;
import com.google.common.collect.Maps;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author <a href="http://twitter.com/aloyer">@aloyer</a>
*/
public class Attributes {
private static Pattern KEY_VALUE = Pattern.compile("([a-zA-Z_\\-]+)" + "\\s*[=:]\\s*" + "(\"[^\"]+\"|[^\",]+)");
private final Map<String, Object> map;
public Attributes() {
this.map = Maps.newHashMap();
}
public Attributes declare(String key, Object value) {
map.put(key.toLowerCase(), value);
return this;
}
public Attributes appendCommaSeparatedKeyValuePairs(String text) {
Matcher matcher = KEY_VALUE.matcher(text);
while (matcher.find()) {
String key = matcher.group(1);
String value = unquote(matcher.group(2));
map.put(key, value);
}
return this;
}
private String unquote(String group) {
if (group.startsWith("\""))
return group.substring(1, group.length() - 1);
else
return group;
}
public String getString(String key) {
return (String) map.get(key);
}
public boolean isOn(String key) {
String val = getString(key);
if (val == null)
return false;
else
return val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes") || val.equalsIgnoreCase("true");
}
public boolean isOff(String key) {
String val = getString(key);
if (val == null)
return false;
else
return val.equalsIgnoreCase("off") || val.equalsIgnoreCase("no") || val.equalsIgnoreCase("false");
}
public Dimension getDimension(String key) throws DimensionFormatException {
Object val = map.get(key);
if (val == null)
return null;
else if (val instanceof String)
return new DimensionParser().parse((String) val);
else
return (Dimension) val;
}
@Override
public String toString() {
return "Attributes{" + map + '}';
}
public Align getAlign(String key) throws AlignFormatException {
Object val = map.get(key);
if (val == null)
return null;
else if (val instanceof String)
return new AlignParser().parse((String) val);
else
return (Align) val;
}
public RGB getRGB(String key) throws RGBFormatException {
Object val = map.get(key);
if (val == null)
return null;
else if (val instanceof String)
return new RGBParser().parse((String) val);
else
return (RGB) val;
}
}