Home | History | Annotate | Download | only in parser
      1 /**
      2  * Copyright (c) 2004, Google Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.mail.lib.html.parser;
     17 
     18 import com.google.common.collect.Maps;
     19 
     20 import java.util.Collections;
     21 import java.util.HashMap;
     22 import java.util.HashSet;
     23 import java.util.Map;
     24 import java.util.Set;
     25 
     26 /**
     27  * HTML4 contains HTML 4.0 definitions and specifications
     28  * See http://www.w3.org/TR/html401/
     29  * See http://www.w3.org/TR/html401/index/elements.html
     30  * See http://www.w3.org/TR/html401/index/attributes.html
     31  *
     32  * @author jlim (at) google.com (Jing Yee Lim)
     33  */
     34 public final class HTML4 {
     35 
     36   /** Map of all elements */
     37   private static final HashMap<String,HTML.Element> elements = Maps.newHashMap();
     38 
     39   /** Map of all attributes */
     40   private static final HashMap<String,HTML.Attribute> attributes = Maps.newHashMap();
     41 
     42   /** Default Whitelist */
     43   private static final HtmlWhitelist defaultWhitelist = new HtmlWhitelist() {
     44     /**
     45      * @see com.google.common.html.parser.HtmlWhitelist#lookupElement(String)
     46      */
     47     public HTML.Element lookupElement(String name) {
     48       return HTML4.lookupElement(name);
     49     }
     50 
     51     /**
     52      * @see com.google.common.html.parser.HtmlWhitelist#lookupAttribute(String)
     53      */
     54     public HTML.Attribute lookupAttribute(String name) {
     55       return HTML4.lookupAttribute(name);
     56     }
     57   };
     58 
     59   /** Gets the default Whitelist */
     60   public static HtmlWhitelist getWhitelist() {
     61     return HTML4.defaultWhitelist;
     62   }
     63 
     64   /** Looks for a HTML4 element */
     65   public static HTML.Element lookupElement(String name) {
     66     return elements.get(name.toLowerCase());
     67   }
     68 
     69   /** Looks for a HTML4 attribute */
     70   public static HTML.Attribute lookupAttribute(String name) {
     71     return attributes.get(name.toLowerCase());
     72   }
     73 
     74   /**
     75    * @return Unmodifiable Map of all valid HTML4 elements.  Key is lowercase
     76    * element name.
     77    */
     78   public static Map<String, HTML.Element> getAllElements() {
     79     return Collections.unmodifiableMap(elements);
     80   }
     81 
     82   /**
     83    * @return Unmodifiable Map of all valid HTML4 attributes.  Key is lowercase
     84    * attribute name.
     85    */
     86   public static Map<String, HTML.Attribute> getAllAttributes() {
     87     return Collections.unmodifiableMap(attributes);
     88   }
     89 
     90   /** Creates and adds a element to the map */
     91   private static HTML.Element addElement(String tag, String flags) {
     92     return addElement(tag, flags, HTML.Element.Flow.NONE);
     93   }
     94 
     95   /** Creates and adds a element to the map */
     96   private static HTML.Element addElement(String tag, String flags, HTML.Element.Flow flow) {
     97     return addElement(tag, flags, flow, HTML.Element.NO_TYPE);
     98   }
     99 
    100   /** Creates and adds a element to the map */
    101   private static HTML.Element addTableElement(String tag, String flags, HTML.Element.Flow flow) {
    102     return addElement(tag, flags, flow, HTML.Element.TABLE_TYPE);
    103   }
    104 
    105   /** Creates and adds a element to the map */
    106   private static HTML.Element addElement(String tag, String flags, HTML.Element.Flow flow,
    107       int type) {
    108     tag = tag.toLowerCase();
    109 
    110     boolean empty = false;
    111     boolean optionalEndTag = false;
    112     boolean breaksFlow = false;
    113     for (int i = 0; i < flags.length(); i++) {
    114       switch (flags.charAt(i)) {
    115         case 'E': empty = true; break;
    116         case 'O': optionalEndTag = true; break;
    117         case 'B': breaksFlow = true; break;
    118         default: throw new Error("Unknown element flag");
    119       }
    120     }
    121     HTML.Element element = new HTML.Element(tag, type, empty, optionalEndTag, breaksFlow, flow);
    122     elements.put(tag, element);
    123     return element;
    124   }
    125 
    126   /** Creates and add an attribute to the map */
    127   private static HTML.Attribute addAttribute(String attribute) {
    128     return addAttribute(attribute, HTML.Attribute.NO_TYPE);
    129   }
    130 
    131   private static HTML.Attribute addAttribute(String attribute, int type) {
    132     return addAttribute(attribute, type, null);
    133   }
    134 
    135   private static HTML.Attribute addAttribute(String attribute,
    136                                              int type,
    137                                              String[] values) {
    138     attribute = attribute.toLowerCase();
    139     Set<String> valueSet = null;
    140     if (values != null) {
    141       valueSet = new HashSet<String>();
    142       for (String x : values) {
    143         valueSet.add(x.toLowerCase());
    144       }
    145       valueSet = Collections.unmodifiableSet(valueSet);
    146     }
    147     HTML.Attribute attr = new HTML.Attribute(attribute, type, valueSet);
    148     attributes.put(attribute, attr);
    149     return attr;
    150   }
    151 
    152   /**
    153    * All HTML4 elements.
    154    *
    155    * Block vs inline flow:
    156    * http://www.w3.org/TR/REC-html40/sgml/dtd.html#block
    157    * http://www.w3.org/TR/REC-html40/sgml/dtd.html#inline
    158    * Some deprecated elements aren't listed there so we make an educated guess:
    159    * - CENTER is equivalent to DIV align=center, so we make it BLOCK.
    160    * - S, STRIKE and FONT are clearly inline like U, I, etc.
    161    * - MENU and DIR are like OL and UL, so we make them block.
    162    *
    163    * Optional end tag and empty:
    164    * http://www.w3.org/TR/REC-html40/index/elements.html
    165    */
    166   public static final HTML.Element
    167     A_ELEMENT          = addElement("A", "", HTML.Element.Flow.INLINE),
    168     ABBR_ELEMENT       = addElement("ABBR", "", HTML.Element.Flow.INLINE),
    169     ACRONYM_ELEMENT    = addElement("ACRONYM", "", HTML.Element.Flow.INLINE),
    170     ADDRESS_ELEMENT    = addElement("ADDRESS", "", HTML.Element.Flow.BLOCK),
    171     APPLET_ELEMENT     = addElement("APPLET", ""),
    172     AREA_ELEMENT       = addElement("AREA", "E"),
    173     B_ELEMENT          = addElement("B", "", HTML.Element.Flow.INLINE),
    174     BASE_ELEMENT       = addElement("BASE", "E"),
    175     BASEFONT_ELEMENT   = addElement("BASEFONT", "E"),
    176     BDO_ELEMENT        = addElement("BDO", "", HTML.Element.Flow.INLINE),
    177     BIG_ELEMENT        = addElement("BIG", "", HTML.Element.Flow.INLINE),
    178     BLOCKQUOTE_ELEMENT = addElement("BLOCKQUOTE", "B", HTML.Element.Flow.BLOCK),
    179     BODY_ELEMENT       = addElement("BODY", "O"),
    180     BR_ELEMENT         = addElement("BR", "EB", HTML.Element.Flow.INLINE),
    181     BUTTON_ELEMENT     = addElement("BUTTON", "", HTML.Element.Flow.INLINE),
    182     CAPTION_ELEMENT    = addTableElement("CAPTION", "", HTML.Element.Flow.NONE),
    183     CENTER_ELEMENT     = addElement("CENTER", "B", HTML.Element.Flow.BLOCK),
    184     CITE_ELEMENT       = addElement("CITE", "", HTML.Element.Flow.INLINE),
    185     CODE_ELEMENT       = addElement("CODE", "", HTML.Element.Flow.INLINE),
    186     COL_ELEMENT        = addTableElement("COL", "E", HTML.Element.Flow.NONE),
    187     COLGROUP_ELEMENT   = addTableElement("COLGROUP", "O", HTML.Element.Flow.NONE),
    188     DD_ELEMENT         = addElement("DD", "OB"),
    189     DEL_ELEMENT        = addElement("DEL", ""),
    190     DFN_ELEMENT        = addElement("DFN", "", HTML.Element.Flow.INLINE),
    191     DIR_ELEMENT        = addElement("DIR", "B", HTML.Element.Flow.BLOCK),
    192     DIV_ELEMENT        = addElement("DIV", "B", HTML.Element.Flow.BLOCK),
    193     DL_ELEMENT         = addElement("DL", "B", HTML.Element.Flow.BLOCK),
    194     DT_ELEMENT         = addElement("DT", "OB"),
    195     EM_ELEMENT         = addElement("EM", "", HTML.Element.Flow.INLINE),
    196     FIELDSET_ELEMENT   = addElement("FIELDSET", "", HTML.Element.Flow.BLOCK),
    197     FONT_ELEMENT       = addElement("FONT", "", HTML.Element.Flow.INLINE),
    198     FORM_ELEMENT       = addElement("FORM", "B", HTML.Element.Flow.BLOCK),
    199     FRAME_ELEMENT      = addElement("FRAME", "E"),
    200     FRAMESET_ELEMENT   = addElement("FRAMESET", ""),
    201     H1_ELEMENT         = addElement("H1", "B", HTML.Element.Flow.BLOCK),
    202     H2_ELEMENT         = addElement("H2", "B", HTML.Element.Flow.BLOCK),
    203     H3_ELEMENT         = addElement("H3", "B", HTML.Element.Flow.BLOCK),
    204     H4_ELEMENT         = addElement("H4", "B", HTML.Element.Flow.BLOCK),
    205     H5_ELEMENT         = addElement("H5", "B", HTML.Element.Flow.BLOCK),
    206     H6_ELEMENT         = addElement("H6", "B", HTML.Element.Flow.BLOCK),
    207     HEAD_ELEMENT       = addElement("HEAD", "OB"),
    208     HR_ELEMENT         = addElement("HR", "EB", HTML.Element.Flow.BLOCK),
    209     HTML_ELEMENT       = addElement("HTML", "OB"),
    210     I_ELEMENT          = addElement("I", "", HTML.Element.Flow.INLINE),
    211     IFRAME_ELEMENT     = addElement("IFRAME", ""),
    212     IMG_ELEMENT        = addElement("IMG", "E", HTML.Element.Flow.INLINE),
    213     INPUT_ELEMENT      = addElement("INPUT", "E", HTML.Element.Flow.INLINE),
    214     INS_ELEMENT        = addElement("INS", ""),
    215     ISINDEX_ELEMENT    = addElement("ISINDEX", "EB"),
    216     KBD_ELEMENT        = addElement("KBD", "", HTML.Element.Flow.INLINE),
    217     LABEL_ELEMENT      = addElement("LABEL", "", HTML.Element.Flow.INLINE),
    218     LEGEND_ELEMENT     = addElement("LEGEND", ""),
    219     LI_ELEMENT         = addElement("LI", "OB"),
    220     LINK_ELEMENT       = addElement("LINK", "E"),
    221     MAP_ELEMENT        = addElement("MAP", "", HTML.Element.Flow.INLINE),
    222     MENU_ELEMENT       = addElement("MENU", "B", HTML.Element.Flow.BLOCK),
    223     META_ELEMENT       = addElement("META", "E"),
    224     NOFRAMES_ELEMENT   = addElement("NOFRAMES", "B"),
    225     NOSCRIPT_ELEMENT   = addElement("NOSCRIPT", "", HTML.Element.Flow.BLOCK),
    226     OBJECT_ELEMENT     = addElement("OBJECT", "", HTML.Element.Flow.INLINE),
    227     OL_ELEMENT         = addElement("OL", "B", HTML.Element.Flow.BLOCK),
    228     OPTGROUP_ELEMENT   = addElement("OPTGROUP", ""),
    229     OPTION_ELEMENT     = addElement("OPTION", "O"),
    230     P_ELEMENT          = addElement("P", "OB", HTML.Element.Flow.BLOCK),
    231     PARAM_ELEMENT      = addElement("PARAM", "E"),
    232     PRE_ELEMENT        = addElement("PRE", "B", HTML.Element.Flow.BLOCK),
    233     Q_ELEMENT          = addElement("Q", "", HTML.Element.Flow.INLINE),
    234     S_ELEMENT          = addElement("S", "", HTML.Element.Flow.INLINE),
    235     SAMP_ELEMENT       = addElement("SAMP", "", HTML.Element.Flow.INLINE),
    236     SCRIPT_ELEMENT     = addElement("SCRIPT", "", HTML.Element.Flow.INLINE),
    237     SELECT_ELEMENT     = addElement("SELECT", "", HTML.Element.Flow.INLINE),
    238     SMALL_ELEMENT      = addElement("SMALL", "", HTML.Element.Flow.INLINE),
    239     SPAN_ELEMENT       = addElement("SPAN", "", HTML.Element.Flow.INLINE),
    240     STRIKE_ELEMENT     = addElement("STRIKE", "", HTML.Element.Flow.INLINE),
    241     STRONG_ELEMENT     = addElement("STRONG", "", HTML.Element.Flow.INLINE),
    242     STYLE_ELEMENT      = addElement("STYLE", ""),
    243     SUB_ELEMENT        = addElement("SUB", "", HTML.Element.Flow.INLINE),
    244     SUP_ELEMENT        = addElement("SUP", "", HTML.Element.Flow.INLINE),
    245     TABLE_ELEMENT      = addTableElement("TABLE", "B", HTML.Element.Flow.BLOCK),
    246     TBODY_ELEMENT      = addTableElement("TBODY", "O", HTML.Element.Flow.NONE),
    247     TD_ELEMENT         = addTableElement("TD", "OB", HTML.Element.Flow.NONE),
    248     TEXTAREA_ELEMENT   = addElement("TEXTAREA", "", HTML.Element.Flow.INLINE),
    249     TFOOT_ELEMENT      = addTableElement("TFOOT", "O", HTML.Element.Flow.NONE),
    250     TH_ELEMENT         = addTableElement("TH", "OB", HTML.Element.Flow.NONE),
    251     THEAD_ELEMENT      = addTableElement("THEAD", "O", HTML.Element.Flow.NONE),
    252     TITLE_ELEMENT      = addElement("TITLE", "B"),
    253     TR_ELEMENT         = addTableElement("TR", "OB", HTML.Element.Flow.NONE),
    254     TT_ELEMENT         = addElement("TT", "", HTML.Element.Flow.INLINE),
    255     U_ELEMENT          = addElement("U", "", HTML.Element.Flow.INLINE),
    256     UL_ELEMENT         = addElement("UL", "B", HTML.Element.Flow.BLOCK),
    257     VAR_ELEMENT        = addElement("VAR", "", HTML.Element.Flow.INLINE);
    258 
    259   /**
    260    * All the HTML4 attributes
    261    */
    262   public static final HTML.Attribute
    263     ABBR_ATTRIBUTE           = addAttribute("ABBR"),
    264     ACCEPT_ATTRIBUTE         = addAttribute("ACCEPT"),
    265     ACCEPT_CHARSET_ATTRIBUTE = addAttribute("ACCEPT-CHARSET"),
    266     ACCESSKEY_ATTRIBUTE      = addAttribute("ACCESSKEY"),
    267     ACTION_ATTRIBUTE         = addAttribute("ACTION", HTML.Attribute.URI_TYPE),
    268     ALIGN_ATTRIBUTE          = addAttribute("ALIGN",
    269         HTML.Attribute.ENUM_TYPE,
    270         new String[] {"left", "center", "right", "justify",
    271             "char", "top", "bottom", "middle"}),
    272     ALINK_ATTRIBUTE          = addAttribute("ALINK"),
    273     ALT_ATTRIBUTE            = addAttribute("ALT"),
    274     ARCHIVE_ATTRIBUTE        = addAttribute("ARCHIVE", HTML.Attribute.URI_TYPE),
    275     AXIS_ATTRIBUTE           = addAttribute("AXIS"),
    276     BACKGROUND_ATTRIBUTE     = addAttribute("BACKGROUND", HTML.Attribute.URI_TYPE),
    277     BGCOLOR_ATTRIBUTE        = addAttribute("BGCOLOR"),
    278     BORDER_ATTRIBUTE         = addAttribute("BORDER"),
    279     CELLPADDING_ATTRIBUTE    = addAttribute("CELLPADDING"),
    280     CELLSPACING_ATTRIBUTE    = addAttribute("CELLSPACING"),
    281     CHAR_ATTRIBUTE           = addAttribute("CHAR"),
    282     CHAROFF_ATTRIBUTE        = addAttribute("CHAROFF"),
    283     CHARSET_ATTRIBUTE        = addAttribute("CHARSET"),
    284     CHECKED_ATTRIBUTE        = addAttribute("CHECKED", HTML.Attribute.BOOLEAN_TYPE),
    285     CITE_ATTRIBUTE           = addAttribute("CITE", HTML.Attribute.URI_TYPE),
    286     CLASS_ATTRIBUTE          = addAttribute("CLASS"),
    287     CLASSID_ATTRIBUTE        = addAttribute("CLASSID", HTML.Attribute.URI_TYPE),
    288     CLEAR_ATTRIBUTE          = addAttribute("CLEAR",
    289         HTML.Attribute.ENUM_TYPE,
    290         new String[] {"left", "all", "right", "none"}),
    291     CODE_ATTRIBUTE           = addAttribute("CODE"),
    292     CODEBASE_ATTRIBUTE       = addAttribute("CODEBASE", HTML.Attribute.URI_TYPE),
    293     CODETYPE_ATTRIBUTE       = addAttribute("CODETYPE"),
    294     COLOR_ATTRIBUTE          = addAttribute("COLOR"),
    295     COLS_ATTRIBUTE           = addAttribute("COLS"),
    296     COLSPAN_ATTRIBUTE        = addAttribute("COLSPAN"),
    297     COMPACT_ATTRIBUTE        = addAttribute("COMPACT", HTML.Attribute.BOOLEAN_TYPE),
    298     CONTENT_ATTRIBUTE        = addAttribute("CONTENT"),
    299     COORDS_ATTRIBUTE         = addAttribute("COORDS"),
    300     DATA_ATTRIBUTE           = addAttribute("DATA", HTML.Attribute.URI_TYPE),
    301     DATETIME_ATTRIBUTE       = addAttribute("DATETIME"),
    302     DECLARE_ATTRIBUTE        = addAttribute("DECLARE", HTML.Attribute.BOOLEAN_TYPE),
    303     DEFER_ATTRIBUTE          = addAttribute("DEFER", HTML.Attribute.BOOLEAN_TYPE),
    304     DIR_ATTRIBUTE            = addAttribute("DIR",
    305         HTML.Attribute.ENUM_TYPE,
    306         new String[] {"ltr", "rtl"}),
    307     DISABLED_ATTRIBUTE       = addAttribute("DISABLED", HTML.Attribute.BOOLEAN_TYPE),
    308     ENCTYPE_ATTRIBUTE        = addAttribute("ENCTYPE"),
    309     FACE_ATTRIBUTE           = addAttribute("FACE"),
    310     FOR_ATTRIBUTE            = addAttribute("FOR"),
    311     FRAME_ATTRIBUTE          = addAttribute("FRAME"),
    312     FRAMEBORDER_ATTRIBUTE    = addAttribute("FRAMEBORDER",
    313         HTML.Attribute.ENUM_TYPE,
    314         new String[] {"1", "0"}),
    315     HEADERS_ATTRIBUTE        = addAttribute("HEADERS"),
    316     HEIGHT_ATTRIBUTE         = addAttribute("HEIGHT"),
    317     HREF_ATTRIBUTE           = addAttribute("HREF", HTML.Attribute.URI_TYPE),
    318     HREFLANG_ATTRIBUTE       = addAttribute("HREFLANG"),
    319     HSPACE_ATTRIBUTE         = addAttribute("HSPACE"),
    320     HTTP_EQUIV_ATTRIBUTE     = addAttribute("HTTP-EQUIV"),
    321     ID_ATTRIBUTE             = addAttribute("ID"),
    322     ISMAP_ATTRIBUTE          = addAttribute("ISMAP", HTML.Attribute.BOOLEAN_TYPE),
    323     LABEL_ATTRIBUTE          = addAttribute("LABEL"),
    324     LANG_ATTRIBUTE           = addAttribute("LANG"),
    325     LANGUAGE_ATTRIBUTE       = addAttribute("LANGUAGE"),
    326     LINK_ATTRIBUTE           = addAttribute("LINK"),
    327     LONGDESC_ATTRIBUTE       = addAttribute("LONGDESC", HTML.Attribute.URI_TYPE),
    328     MARGINHEIGHT_ATTRIBUTE   = addAttribute("MARGINHEIGHT"),
    329     MARGINWIDTH_ATTRIBUTE    = addAttribute("MARGINWIDTH"),
    330     MAXLENGTH_ATTRIBUTE      = addAttribute("MAXLENGTH"),
    331     MEDIA_ATTRIBUTE          = addAttribute("MEDIA"),
    332     METHOD_ATTRIBUTE         = addAttribute("METHOD",
    333         HTML.Attribute.ENUM_TYPE,
    334         new String[] {"get", "post"}),
    335     MULTIPLE_ATTRIBUTE       = addAttribute("MULTIPLE", HTML.Attribute.BOOLEAN_TYPE),
    336     NAME_ATTRIBUTE           = addAttribute("NAME"),
    337     NOHREF_ATTRIBUTE         = addAttribute("NOHREF", HTML.Attribute.BOOLEAN_TYPE),
    338     NORESIZE_ATTRIBUTE       = addAttribute("NORESIZE", HTML.Attribute.BOOLEAN_TYPE),
    339     NOSHADE_ATTRIBUTE        = addAttribute("NOSHADE", HTML.Attribute.BOOLEAN_TYPE),
    340     NOWRAP_ATTRIBUTE         = addAttribute("NOWRAP", HTML.Attribute.BOOLEAN_TYPE),
    341     OBJECT_ATTRIBUTE         = addAttribute("OBJECT"),
    342     ONBLUR_ATTRIBUTE         = addAttribute("ONBLUR", HTML.Attribute.SCRIPT_TYPE),
    343     ONCHANGE_ATTRIBUTE       = addAttribute("ONCHANGE", HTML.Attribute.SCRIPT_TYPE),
    344     ONCLICK_ATTRIBUTE        = addAttribute("ONCLICK", HTML.Attribute.SCRIPT_TYPE),
    345     ONDBLCLICK_ATTRIBUTE     = addAttribute("ONDBLCLICK", HTML.Attribute.SCRIPT_TYPE),
    346     ONFOCUS_ATTRIBUTE        = addAttribute("ONFOCUS", HTML.Attribute.SCRIPT_TYPE),
    347     ONKEYDOWN_ATTRIBUTE      = addAttribute("ONKEYDOWN", HTML.Attribute.SCRIPT_TYPE),
    348     ONKEYPRESS_ATTRIBUTE     = addAttribute("ONKEYPRESS", HTML.Attribute.SCRIPT_TYPE),
    349     ONKEYUP_ATTRIBUTE        = addAttribute("ONKEYUP", HTML.Attribute.SCRIPT_TYPE),
    350     ONLOAD_ATTRIBUTE         = addAttribute("ONLOAD", HTML.Attribute.SCRIPT_TYPE),
    351     ONMOUSEDOWN_ATTRIBUTE    = addAttribute("ONMOUSEDOWN", HTML.Attribute.SCRIPT_TYPE),
    352     ONMOUSEMOVE_ATTRIBUTE    = addAttribute("ONMOUSEMOVE", HTML.Attribute.SCRIPT_TYPE),
    353     ONMOUSEOUT_ATTRIBUTE     = addAttribute("ONMOUSEOUT", HTML.Attribute.SCRIPT_TYPE),
    354     ONMOUSEOVER_ATTRIBUTE    = addAttribute("ONMOUSEOVER", HTML.Attribute.SCRIPT_TYPE),
    355     ONMOUSEUP_ATTRIBUTE      = addAttribute("ONMOUSEUP", HTML.Attribute.SCRIPT_TYPE),
    356     ONRESET_ATTRIBUTE        = addAttribute("ONRESET", HTML.Attribute.SCRIPT_TYPE),
    357     ONSELECT_ATTRIBUTE       = addAttribute("ONSELECT", HTML.Attribute.SCRIPT_TYPE),
    358     ONSUBMIT_ATTRIBUTE       = addAttribute("ONSUBMIT", HTML.Attribute.SCRIPT_TYPE),
    359     ONUNLOAD_ATTRIBUTE       = addAttribute("ONUNLOAD", HTML.Attribute.SCRIPT_TYPE),
    360     PROFILE_ATTRIBUTE        = addAttribute("PROFILE", HTML.Attribute.URI_TYPE),
    361     PROMPT_ATTRIBUTE         = addAttribute("PROMPT"),
    362     READONLY_ATTRIBUTE       = addAttribute("READONLY", HTML.Attribute.BOOLEAN_TYPE),
    363     REL_ATTRIBUTE            = addAttribute("REL"),
    364     REV_ATTRIBUTE            = addAttribute("REV"),
    365     ROWS_ATTRIBUTE           = addAttribute("ROWS"),
    366     ROWSPAN_ATTRIBUTE        = addAttribute("ROWSPAN"),
    367     RULES_ATTRIBUTE          = addAttribute("RULES"),
    368     SCHEME_ATTRIBUTE         = addAttribute("SCHEME"),
    369     SCOPE_ATTRIBUTE          = addAttribute("SCOPE"),
    370     SCROLLING_ATTRIBUTE      = addAttribute("SCROLLING",
    371         HTML.Attribute.ENUM_TYPE,
    372         new String[] {"yes", "no", "auto"}),
    373     SELECTED_ATTRIBUTE       = addAttribute("SELECTED", HTML.Attribute.BOOLEAN_TYPE),
    374     SHAPE_ATTRIBUTE          = addAttribute("SHAPE"),
    375     SIZE_ATTRIBUTE           = addAttribute("SIZE"),
    376     SPAN_ATTRIBUTE           = addAttribute("SPAN"),
    377     SRC_ATTRIBUTE            = addAttribute("SRC", HTML.Attribute.URI_TYPE),
    378     STANDBY_ATTRIBUTE        = addAttribute("STANDBY"),
    379     START_ATTRIBUTE          = addAttribute("START"),
    380     STYLE_ATTRIBUTE          = addAttribute("STYLE"),
    381     SUMMARY_ATTRIBUTE        = addAttribute("SUMMARY"),
    382     TABINDEX_ATTRIBUTE       = addAttribute("TABINDEX"),
    383     TARGET_ATTRIBUTE         = addAttribute("TARGET"),
    384     TEXT_ATTRIBUTE           = addAttribute("TEXT"),
    385     TITLE_ATTRIBUTE          = addAttribute("TITLE"),
    386     TYPE_ATTRIBUTE           = addAttribute("TYPE"),
    387     USEMAP_ATTRIBUTE         = addAttribute("USEMAP", HTML.Attribute.URI_TYPE),
    388     VALIGN_ATTRIBUTE         = addAttribute("VALIGN",
    389         HTML.Attribute.ENUM_TYPE,
    390         new String[] {"top", "middle", "bottom", "baseline"}),
    391     VALUE_ATTRIBUTE          = addAttribute("VALUE"),
    392     VALUETYPE_ATTRIBUTE      = addAttribute("VALUETYPE",
    393         HTML.Attribute.ENUM_TYPE,
    394         new String[] {"data", "ref", "object"}),
    395     VERSION_ATTRIBUTE        = addAttribute("VERSION"),
    396     VLINK_ATTRIBUTE          = addAttribute("VLINK"),
    397     VSPACE_ATTRIBUTE         = addAttribute("VSPACE"),
    398     WIDTH_ATTRIBUTE          = addAttribute("WIDTH");
    399 }