/* * Copyright 2010 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * @(#)AttributeTable.java 1.11 2000/08/16 * */ package org.w3c.tidy; import java.util.Hashtable; /** * HTML attribute hash table (c) 1998-2000 (W3C) MIT, INRIA, Keio University See * Tidy.java for the copyright notice. Derived from <a * href="http://www.w3.org/People/Raggett/tidy"> HTML Tidy Release 4 Aug * 2000</a> * * @author Dave Raggett <dsr@w3.org> * @author Andy Quick <ac.quick@sympatico.ca> (translation to Java) * @version 1.11, 2000/08/16 Tidy Release 4 Aug 2000 */ public class AttributeTable { public AttributeTable() { } public Attribute lookup(String name) { return (Attribute) attributeHashtable.get(name); } public Attribute install(Attribute attr) { return (Attribute) attributeHashtable.put(attr.name, attr); } /* public method for finding attribute definition by name */ public Attribute findAttribute(AttVal attval) { Attribute np; if (attval.attribute != null) { np = lookup(attval.attribute); return np; } return null; } public boolean isUrl(String attrname) { Attribute np; np = lookup(attrname); return np != null && np.attrchk == AttrCheckImpl.getCheckUrl(); } public boolean isScript(String attrname) { Attribute np; np = lookup(attrname); return np != null && np.attrchk == AttrCheckImpl.getCheckScript(); } public boolean isLiteralAttribute(String attrname) { Attribute np; np = lookup(attrname); return np != null && np.literal; } /* * Henry Zrepa reports that some folk are using embed with script attributes * where newlines are signficant. These need to be declared and handled * specially! */ public void declareLiteralAttrib(String name) { Attribute attrib = lookup(name); if (attrib == null) { attrib = install(new Attribute(name, Dict.VERS_PROPRIETARY, null)); } attrib.literal = true; } private Hashtable attributeHashtable = new Hashtable(); private static AttributeTable defaultAttributeTable = null; private static Attribute[] attrs = { new Attribute("abbr", Dict.VERS_HTML40, null), new Attribute("accept-charset", Dict.VERS_HTML40, null), new Attribute("accept", Dict.VERS_ALL, null), new Attribute("accesskey", Dict.VERS_HTML40, null), new Attribute("action", Dict.VERS_ALL, AttrCheckImpl.getCheckUrl()), new Attribute("add_date", Dict.VERS_NETSCAPE, null), /* A */ new Attribute("align", Dict.VERS_ALL, AttrCheckImpl.getCheckAlign()), /* * set * varies * with * element */ new Attribute("alink", Dict.VERS_LOOSE, null), new Attribute("alt", Dict.VERS_ALL, null), new Attribute("archive", Dict.VERS_HTML40, null), /* * space or comma * separated list */ new Attribute("axis", Dict.VERS_HTML40, null), new Attribute("background", Dict.VERS_LOOSE, AttrCheckImpl.getCheckUrl()), new Attribute("bgcolor", Dict.VERS_LOOSE, null), new Attribute("bgproperties", Dict.VERS_PROPRIETARY, null), /* * BODY * "fixed" * fixes * background */ new Attribute("border", Dict.VERS_ALL, AttrCheckImpl.getCheckBool()), /* * like * LENGTH * + * "border" */ new Attribute("bordercolor", Dict.VERS_MICROSOFT, null), /* * used on * TABLE */ new Attribute("bottommargin", Dict.VERS_MICROSOFT, null), /* * used on * BODY */ new Attribute("cellpadding", Dict.VERS_FROM32, null), /* * % or pixel * values */ new Attribute("cellspacing", Dict.VERS_FROM32, null), new Attribute("char", Dict.VERS_HTML40, null), new Attribute("charoff", Dict.VERS_HTML40, null), new Attribute("charset", Dict.VERS_HTML40, null), new Attribute("checked", Dict.VERS_ALL, AttrCheckImpl.getCheckBool()), /* * i * . * e * . * "checked" * or * absent */ new Attribute("cite", Dict.VERS_HTML40, AttrCheckImpl.getCheckUrl()), new Attribute("class", Dict.VERS_HTML40, null), new Attribute("classid", Dict.VERS_HTML40, AttrCheckImpl.getCheckUrl()), new Attribute("clear", Dict.VERS_LOOSE, null), /* * BR: left, right, * all */ new Attribute("code", Dict.VERS_LOOSE, null), /* APPLET */ new Attribute("codebase", Dict.VERS_HTML40, AttrCheckImpl.getCheckUrl()), /* OBJECT */ new Attribute("codetype", Dict.VERS_HTML40, null), /* OBJECT */ new Attribute("color", Dict.VERS_LOOSE, null), /* BASEFONT, FONT */ new Attribute("cols", Dict.VERS_IFRAMES, null), /* TABLE & FRAMESET */ new Attribute("colspan", Dict.VERS_FROM32, null), new Attribute("compact", Dict.VERS_ALL, AttrCheckImpl.getCheckBool()), /* lists */ new Attribute("content", Dict.VERS_ALL, null), /* META */ new Attribute("coords", Dict.VERS_FROM32, null), /* AREA, A */ new Attribute("data", Dict.VERS_HTML40, AttrCheckImpl.getCheckUrl()), /* OBJECT */ new Attribute("datafld", Dict.VERS_MICROSOFT, null), /* * used on DIV, * IMG */ new Attribute("dataformatas", Dict.VERS_MICROSOFT, null), /* * used on * DIV, * IMG */ new Attribute("datapagesize", Dict.VERS_MICROSOFT, null), /* * used on * DIV, * IMG */ new Attribute("datasrc", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckUrl()), /* * used * on * TABLE */ new Attribute("datetime", Dict.VERS_HTML40, null), /* INS, DEL */ new Attribute("declare", Dict.VERS_HTML40, AttrCheckImpl.getCheckBool()), /* OBJECT */ new Attribute("defer", Dict.VERS_HTML40, AttrCheckImpl.getCheckBool()), /* SCRIPT */ new Attribute("dir", Dict.VERS_HTML40, null), /* ltr or rtl */ new Attribute("disabled", Dict.VERS_HTML40, AttrCheckImpl.getCheckBool()), /* * form * fields */ new Attribute("enctype", Dict.VERS_ALL, null), /* FORM */ new Attribute("face", Dict.VERS_LOOSE, null), /* BASEFONT, FONT */ new Attribute("for", Dict.VERS_HTML40, null), /* LABEL */ new Attribute("frame", Dict.VERS_HTML40, null), /* TABLE */ new Attribute("frameborder", Dict.VERS_FRAMES, null), /* 0 or 1 */ new Attribute("framespacing", Dict.VERS_PROPRIETARY, null), /* * pixel * value */ new Attribute("gridx", Dict.VERS_PROPRIETARY, null), /* * TABLE Adobe * golive */ new Attribute("gridy", Dict.VERS_PROPRIETARY, null), /* * TABLE Adobe * golive */ new Attribute("headers", Dict.VERS_HTML40, null), /* table cells */ new Attribute("height", Dict.VERS_ALL, null), /* * pixels only for * TH/TD */ new Attribute("href", Dict.VERS_ALL, AttrCheckImpl.getCheckUrl()), /* * A, * AREA * , * LINK * and * BASE */ new Attribute("hreflang", Dict.VERS_HTML40, null), /* A, LINK */ new Attribute("hspace", Dict.VERS_ALL, null), /* APPLET, IMG, OBJECT */ new Attribute("http-equiv", Dict.VERS_ALL, null), /* META */ new Attribute("id", Dict.VERS_HTML40, AttrCheckImpl.getCheckId()), new Attribute("ismap", Dict.VERS_ALL, AttrCheckImpl.getCheckBool()), /* IMG */ new Attribute("label", Dict.VERS_HTML40, null), /* OPT, OPTGROUP */ new Attribute("lang", Dict.VERS_HTML40, null), new Attribute("language", Dict.VERS_LOOSE, null), /* SCRIPT */ new Attribute("last_modified", Dict.VERS_NETSCAPE, null), /* A */ new Attribute("last_visit", Dict.VERS_NETSCAPE, null), /* A */ new Attribute("leftmargin", Dict.VERS_MICROSOFT, null), /* * used on * BODY */ new Attribute("link", Dict.VERS_LOOSE, null), /* BODY */ new Attribute("longdesc", Dict.VERS_HTML40, AttrCheckImpl.getCheckUrl()), /* IMG */ new Attribute("lowsrc", Dict.VERS_PROPRIETARY, AttrCheckImpl.getCheckUrl()), /* IMG */ new Attribute("marginheight", Dict.VERS_IFRAMES, null), /* * FRAME, * IFRAME, * BODY */ new Attribute("marginwidth", Dict.VERS_IFRAMES, null), /* ditto */ new Attribute("maxlength", Dict.VERS_ALL, null), /* INPUT */ new Attribute("media", Dict.VERS_HTML40, null), /* STYLE, LINK */ new Attribute("method", Dict.VERS_ALL, null), /* FORM: get or post */ new Attribute("multiple", Dict.VERS_ALL, AttrCheckImpl.getCheckBool()), /* SELECT */ new Attribute("name", Dict.VERS_ALL, AttrCheckImpl.getCheckName()), new Attribute("nohref", Dict.VERS_FROM32, AttrCheckImpl.getCheckBool()), /* AREA */ new Attribute("noresize", Dict.VERS_FRAMES, AttrCheckImpl.getCheckBool()), /* FRAME */ new Attribute("noshade", Dict.VERS_LOOSE, AttrCheckImpl.getCheckBool()), /* HR */ new Attribute("nowrap", Dict.VERS_LOOSE, AttrCheckImpl.getCheckBool()), /* * table * cells */ new Attribute("object", Dict.VERS_HTML40_LOOSE, null), /* APPLET */ new Attribute("onblur", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onchange", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onclick", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("ondblclick", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onkeydown", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onkeypress", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onkeyup", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onload", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onmousedown", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onmousemove", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onmouseout", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onmouseover", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onmouseup", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onsubmit", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onreset", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onselect", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onunload", Dict.VERS_HTML40, AttrCheckImpl.getCheckScript()), /* event */ new Attribute("onafterupdate", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * form * fields */ new Attribute("onbeforeupdate", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * form * fields */ new Attribute("onerrorupdate", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * form * fields */ new Attribute("onrowenter", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * form * fields */ new Attribute("onrowexit", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * form * fields */ new Attribute("onbeforeunload", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * form * fields */ new Attribute("ondatasetchanged", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * object * , * applet */ new Attribute("ondataavailable", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * object * , * applet */ new Attribute("ondatasetcomplete", Dict.VERS_MICROSOFT, AttrCheckImpl.getCheckScript()), /* * object * , * applet */ new Attribute("profile", Dict.VERS_HTML40, AttrCheckImpl.getCheckUrl()), /* HEAD */ new Attribute("prompt", Dict.VERS_LOOSE, null), /* ISINDEX */ new Attribute("readonly", Dict.VERS_HTML40, AttrCheckImpl.getCheckBool()), /* * form * fields */ new Attribute("rel", Dict.VERS_ALL, null), /* A, LINK */ new Attribute("rev", Dict.VERS_ALL, null), /* A, LINK */ new Attribute("rightmargin", Dict.VERS_MICROSOFT, null), /* * used on * BODY */ new Attribute("rows", Dict.VERS_ALL, null), /* TEXTAREA */ new Attribute("rowspan", Dict.VERS_ALL, null), /* table cells */ new Attribute("rules", Dict.VERS_HTML40, null), /* TABLE */ new Attribute("scheme", Dict.VERS_HTML40, null), /* META */ new Attribute("scope", Dict.VERS_HTML40, null), /* table cells */ new Attribute("scrolling", Dict.VERS_IFRAMES, null), /* * yes, no or * auto */ new Attribute("selected", Dict.VERS_ALL, AttrCheckImpl.getCheckBool()), /* OPTION */ new Attribute("shape", Dict.VERS_FROM32, null), /* AREA, A */ new Attribute("showgrid", Dict.VERS_PROPRIETARY, AttrCheckImpl.getCheckBool()), /* * TABLE * Adobe * golive */ new Attribute("showgridx", Dict.VERS_PROPRIETARY, AttrCheckImpl.getCheckBool()), /* * TABLE * Adobe * golive */ new Attribute("showgridy", Dict.VERS_PROPRIETARY, AttrCheckImpl.getCheckBool()), /* * TABLE * Adobe * golive */ new Attribute("size", Dict.VERS_LOOSE, null), /* * HR, FONT, BASEFONT, * SELECT */ new Attribute("span", Dict.VERS_HTML40, null), /* COL, COLGROUP */ new Attribute("src", (short) (Dict.VERS_ALL | Dict.VERS_FRAMES), AttrCheckImpl.getCheckUrl()), /* * IMG * , * FRAME * , * IFRAME */ new Attribute("standby", Dict.VERS_HTML40, null), /* OBJECT */ new Attribute("start", Dict.VERS_ALL, null), /* OL */ new Attribute("style", Dict.VERS_HTML40, null), new Attribute("summary", Dict.VERS_HTML40, null), /* TABLE */ new Attribute("tabindex", Dict.VERS_HTML40, null), /* * fields, OBJECT * and A */ new Attribute("target", Dict.VERS_HTML40, null), /* * names a * frame/window */ new Attribute("text", Dict.VERS_LOOSE, null), /* BODY */ new Attribute("title", Dict.VERS_HTML40, null), /* text tool tip */ new Attribute("topmargin", Dict.VERS_MICROSOFT, null), /* * used on * BODY */ new Attribute("type", Dict.VERS_FROM32, null), /* * also used by * SPACER */ new Attribute("usemap", Dict.VERS_ALL, AttrCheckImpl.getCheckBool()), /* * things * with * images */ new Attribute("valign", Dict.VERS_FROM32, AttrCheckImpl.getCheckValign()), new Attribute("value", Dict.VERS_ALL, null), /* OPTION, PARAM */ new Attribute("valuetype", Dict.VERS_HTML40, null), /* * PARAM: data, * ref, object */ new Attribute("version", Dict.VERS_ALL, null), /* HTML */ new Attribute("vlink", Dict.VERS_LOOSE, null), /* BODY */ new Attribute("vspace", Dict.VERS_LOOSE, null), /* * IMG, OBJECT, * APPLET */ new Attribute("width", Dict.VERS_ALL, null), /* * pixels only for * TD/TH */ new Attribute("wrap", Dict.VERS_NETSCAPE, null), /* textarea */ new Attribute("xml:lang", Dict.VERS_XML, null), /* XML language */ new Attribute("xmlns", Dict.VERS_ALL, null), /* name space */ }; public static Attribute attrHref = null; public static Attribute attrSrc = null; public static Attribute attrId = null; public static Attribute attrName = null; public static Attribute attrSummary = null; public static Attribute attrAlt = null; public static Attribute attrLongdesc = null; public static Attribute attrUsemap = null; public static Attribute attrIsmap = null; public static Attribute attrLanguage = null; public static Attribute attrType = null; public static Attribute attrTitle = null; public static Attribute attrXmlns = null; public static Attribute attrValue = null; public static Attribute attrContent = null; public static Attribute attrDatafld = null; public static Attribute attrWidth = null; public static Attribute attrHeight = null; public static AttributeTable getDefaultAttributeTable() { if (defaultAttributeTable == null) { defaultAttributeTable = new AttributeTable(); for (Attribute attr : attrs) { defaultAttributeTable.install(attr); } attrHref = defaultAttributeTable.lookup("href"); attrSrc = defaultAttributeTable.lookup("src"); attrId = defaultAttributeTable.lookup("id"); attrName = defaultAttributeTable.lookup("name"); attrSummary = defaultAttributeTable.lookup("summary"); attrAlt = defaultAttributeTable.lookup("alt"); attrLongdesc = defaultAttributeTable.lookup("longdesc"); attrUsemap = defaultAttributeTable.lookup("usemap"); attrIsmap = defaultAttributeTable.lookup("ismap"); attrLanguage = defaultAttributeTable.lookup("language"); attrType = defaultAttributeTable.lookup("type"); attrTitle = defaultAttributeTable.lookup("title"); attrXmlns = defaultAttributeTable.lookup("xmlns"); attrValue = defaultAttributeTable.lookup("value"); attrContent = defaultAttributeTable.lookup("content"); attrDatafld = defaultAttributeTable.lookup("datafld"); ; attrWidth = defaultAttributeTable.lookup("width"); ; attrHeight = defaultAttributeTable.lookup("height"); ; attrAlt.nowrap = true; attrValue.nowrap = true; attrContent.nowrap = true; } return defaultAttributeTable; } }