package org.nutz.lang.util; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.nutz.lang.meta.Pair; public class HtmlToken { private static final Pattern BLOCK = Pattern.compile( "^(head|div|p|ul|ol|blockquote|pre|title|h[1-9]|li|hr|table|tr|td)$", Pattern.CASE_INSENSITIVE); private static final Pattern INLINE = Pattern.compile( "^(span|b|i|u|em|strong|sub|sup|code|font)$", Pattern.CASE_INSENSITIVE); private static final Pattern NOCHILD = Pattern.compile( "^(br|img|link|hr|meta)$", Pattern.CASE_INSENSITIVE); HtmlToken() { attributes = new ArrayList<Pair<String>>(); } private String name; private String value; private List<Pair<String>> attributes; public String getName() { return name; } public HtmlToken setName(String name) { this.name = name; return this; } public String getValue() { return value; } public HtmlToken setValue(String value) { this.value = value; return this; } public boolean isElement() { return null != name; } public boolean isText() { return null == name && value != null; } public boolean isBlock() { if (null == name) return false; return BLOCK.matcher(name).find(); } public boolean isInline() { if (null == name) return false; return INLINE.matcher(name).find(); } public boolean isNoChild() { if (null == name) return true; return NOCHILD.matcher(name).find(); } public boolean isHtml() { if (null == name) return false; return name.equalsIgnoreCase("html"); } public boolean isBody() { if (null == name) return false; return name.equalsIgnoreCase("body"); } public HtmlToken attr(String name, String value) { Pair<String> attr = getAttr(name); if (null == attr) { attr = new Pair<String>(name, value); attributes.add(attr); } else { attr.setValue(value); } return this; } public HtmlToken attr(String name, int value) { return attr(name, String.valueOf(value)); } public Pair<String> getAttr(String name) { for (Pair<String> attr : attributes) if (attr.getName().equals(name)) return attr; return null; } public String getAttrVal(String name) { Pair<String> p = getAttr(name); return p == null ? null : p.getValueString(); } public List<Pair<String>> getAttributes() { return attributes; } }