# frozen_string_literal: true

module Nokogiri
  module HTML4
    class ElementDescription
      # Methods are defined protected by method_defined? because at
      # this point the C-library or Java library is already loaded,
      # and we don't want to clobber any methods that have been
      # defined there.

      Desc = Struct.new("HTMLElementDescription", :name,
        :startTag, :endTag, :saveEndTag,
        :empty, :depr, :dtd, :isinline,
        :desc,
        :subelts, :defaultsubelt,
        :attrs_opt, :attrs_depr, :attrs_req)

      # This is filled in down below.
      DefaultDescriptions = {} # rubocop:disable Naming/ConstantName

      def default_desc
        DefaultDescriptions[name.downcase]
      end
      private :default_desc

      unless method_defined?(:implied_start_tag?)
        def implied_start_tag?
          d = default_desc
          d ? d.startTag : nil
        end
      end

      unless method_defined?(:implied_end_tag?)
        def implied_end_tag?
          d = default_desc
          d ? d.endTag : nil
        end
      end

      unless method_defined?(:save_end_tag?)
        def save_end_tag?
          d = default_desc
          d ? d.saveEndTag : nil
        end
      end

      unless method_defined?(:deprecated?)
        def deprecated?
          d = default_desc
          d ? d.depr : nil
        end
      end

      unless method_defined?(:description)
        def description
          d = default_desc
          d ? d.desc : nil
        end
      end

      unless method_defined?(:default_sub_element)
        def default_sub_element
          d = default_desc
          d ? d.defaultsubelt : nil
        end
      end

      unless method_defined?(:optional_attributes)
        def optional_attributes
          d = default_desc
          d ? d.attrs_opt : []
        end
      end

      unless method_defined?(:deprecated_attributes)
        def deprecated_attributes
          d = default_desc
          d ? d.attrs_depr : []
        end
      end

      unless method_defined?(:required_attributes)
        def required_attributes
          d = default_desc
          d ? d.attrs_req : []
        end
      end

      ###
      # Default Element Descriptions (HTML 4.0) copied from
      # libxml2/HTMLparser.c and libxml2/include/libxml/HTMLparser.h
      #
      # The copyright notice for those files and the following list of
      # element and attribute descriptions is reproduced here:
      #
      # Except where otherwise noted in the source code (e.g. the
      # files hash.c, list.c and the trio files, which are covered by
      # a similar licence but with different Copyright notices) all
      # the files are:
      #
      #  Copyright (C) 1998-2003 Daniel Veillard.  All Rights Reserved.
      #
      # Permission is hereby granted, free of charge, to any person
      # obtaining a copy of this software and associated documentation
      # files (the "Software"), to deal in the Software without
      # restriction, including without limitation the rights to use,
      # copy, modify, merge, publish, distribute, sublicense, and/or
      # sell copies of the Software, and to permit persons to whom the
      # Software is fur- nished to do so, subject to the following
      # conditions:

      # The above copyright notice and this permission notice shall be
      # included in all copies or substantial portions of the
      # Software.

      # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
      # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
      # WARRANTIES OF MERCHANTABILITY, FIT- NESS FOR A PARTICULAR
      # PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE DANIEL
      # VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
      # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      # FROM, OUT OF OR IN CON- NECTION WITH THE SOFTWARE OR THE USE
      # OR OTHER DEALINGS IN THE SOFTWARE.

      # Except as contained in this notice, the name of Daniel
      # Veillard shall not be used in advertising or otherwise to
      # promote the sale, use or other deal- ings in this Software
      # without prior written authorization from him.

      # Attributes defined and categorized
      FONTSTYLE = ["tt", "i", "b", "u", "s", "strike", "big", "small"]
      PHRASE = ["em", "strong", "dfn", "code", "samp",
                "kbd", "var", "cite", "abbr", "acronym",]
      SPECIAL = ["a", "img", "applet", "embed", "object", "font", "basefont",
                 "br", "script", "map", "q", "sub", "sup", "span", "bdo",
                 "iframe",]
      PCDATA = []
      HEADING = ["h1", "h2", "h3", "h4", "h5", "h6"]
      LIST = ["ul", "ol", "dir", "menu"]
      FORMCTRL = ["input", "select", "textarea", "label", "button"]
      BLOCK = [HEADING, LIST, "pre", "p", "dl", "div", "center", "noscript",
               "noframes", "blockquote", "form", "isindex", "hr", "table",
               "fieldset", "address",]
      INLINE = [PCDATA, FONTSTYLE, PHRASE, SPECIAL, FORMCTRL]
      FLOW = [BLOCK, INLINE]
      MODIFIER = []
      EMPTY = []

      HTML_FLOW = FLOW
      HTML_INLINE = INLINE
      HTML_PCDATA = PCDATA
      HTML_CDATA = HTML_PCDATA

      COREATTRS = ["id", "class", "style", "title"]
      I18N = ["lang", "dir"]
      EVENTS = ["onclick", "ondblclick", "onmousedown", "onmouseup",
                "onmouseover", "onmouseout", "onkeypress", "onkeydown",
                "onkeyup",]
      ATTRS = [COREATTRS, I18N, EVENTS]
      CELLHALIGN = ["align", "char", "charoff"]
      CELLVALIGN = ["valign"]

      HTML_ATTRS = ATTRS
      CORE_I18N_ATTRS = [COREATTRS, I18N]
      CORE_ATTRS = COREATTRS
      I18N_ATTRS = I18N

      A_ATTRS = [ATTRS, "charset", "type", "name",
                 "href", "hreflang", "rel", "rev", "accesskey", "shape",
                 "coords", "tabindex", "onfocus", "onblur",]
      TARGET_ATTR = ["target"]
      ROWS_COLS_ATTR = ["rows", "cols"]
      ALT_ATTR = ["alt"]
      SRC_ALT_ATTRS = ["src", "alt"]
      HREF_ATTRS = ["href"]
      CLEAR_ATTRS = ["clear"]
      INLINE_P = [INLINE, "p"]

      FLOW_PARAM = [FLOW, "param"]
      APPLET_ATTRS = [COREATTRS, "codebase",
                      "archive", "alt", "name", "height", "width", "align",
                      "hspace", "vspace",]
      AREA_ATTRS = ["shape", "coords", "href", "nohref",
                    "tabindex", "accesskey", "onfocus", "onblur",]
      BASEFONT_ATTRS = ["id", "size", "color", "face"]
      QUOTE_ATTRS = [ATTRS, "cite"]
      BODY_CONTENTS = [FLOW, "ins", "del"]
      BODY_ATTRS = [ATTRS, "onload", "onunload"]
      BODY_DEPR = ["background", "bgcolor", "text",
                   "link", "vlink", "alink",]
      BUTTON_ATTRS = [ATTRS, "name", "value", "type",
                      "disabled", "tabindex", "accesskey", "onfocus", "onblur",]

      COL_ATTRS = [ATTRS, "span", "width", CELLHALIGN, CELLVALIGN]
      COL_ELT = ["col"]
      EDIT_ATTRS = [ATTRS, "datetime", "cite"]
      COMPACT_ATTRS = [ATTRS, "compact"]
      DL_CONTENTS = ["dt", "dd"]
      COMPACT_ATTR = ["compact"]
      LABEL_ATTR = ["label"]
      FIELDSET_CONTENTS = [FLOW, "legend"]
      FONT_ATTRS = [COREATTRS, I18N, "size", "color", "face"]
      FORM_CONTENTS = [HEADING, LIST, INLINE, "pre", "p", "div", "center",
                       "noscript", "noframes", "blockquote", "isindex", "hr",
                       "table", "fieldset", "address",]
      FORM_ATTRS = [ATTRS, "method", "enctype", "accept", "name", "onsubmit",
                    "onreset", "accept-charset",]
      FRAME_ATTRS = [COREATTRS, "longdesc", "name", "src", "frameborder",
                     "marginwidth", "marginheight", "noresize", "scrolling",]
      FRAMESET_ATTRS = [COREATTRS, "rows", "cols", "onload", "onunload"]
      FRAMESET_CONTENTS = ["frameset", "frame", "noframes"]
      HEAD_ATTRS = [I18N, "profile"]
      HEAD_CONTENTS = ["title", "isindex", "base", "script", "style", "meta",
                       "link", "object",]
      HR_DEPR = ["align", "noshade", "size", "width"]
      VERSION_ATTR = ["version"]
      HTML_CONTENT = ["head", "body", "frameset"]
      IFRAME_ATTRS = [COREATTRS, "longdesc", "name", "src", "frameborder",
                      "marginwidth", "marginheight", "scrolling", "align",
                      "height", "width",]
      IMG_ATTRS = [ATTRS, "longdesc", "name", "height", "width", "usemap",
                   "ismap",]
      EMBED_ATTRS = [COREATTRS, "align", "alt", "border", "code", "codebase",
                     "frameborder", "height", "hidden", "hspace", "name",
                     "palette", "pluginspace", "pluginurl", "src", "type",
                     "units", "vspace", "width",]
      INPUT_ATTRS = [ATTRS, "type", "name", "value", "checked", "disabled",
                     "readonly", "size", "maxlength", "src", "alt", "usemap",
                     "ismap", "tabindex", "accesskey", "onfocus", "onblur",
                     "onselect", "onchange", "accept",]
      PROMPT_ATTRS = [COREATTRS, I18N, "prompt"]
      LABEL_ATTRS = [ATTRS, "for", "accesskey", "onfocus", "onblur"]
      LEGEND_ATTRS = [ATTRS, "accesskey"]
      ALIGN_ATTR = ["align"]
      LINK_ATTRS = [ATTRS, "charset", "href", "hreflang", "type", "rel", "rev",
                    "media",]
      MAP_CONTENTS = [BLOCK, "area"]
      NAME_ATTR = ["name"]
      ACTION_ATTR = ["action"]
      BLOCKLI_ELT = [BLOCK, "li"]
      META_ATTRS = [I18N, "http-equiv", "name", "scheme"]
      CONTENT_ATTR = ["content"]
      TYPE_ATTR = ["type"]
      NOFRAMES_CONTENT = ["body", FLOW, MODIFIER]
      OBJECT_CONTENTS = [FLOW, "param"]
      OBJECT_ATTRS = [ATTRS, "declare", "classid", "codebase", "data", "type",
                      "codetype", "archive", "standby", "height", "width",
                      "usemap", "name", "tabindex",]
      OBJECT_DEPR = ["align", "border", "hspace", "vspace"]
      OL_ATTRS = ["type", "compact", "start"]
      OPTION_ELT = ["option"]
      OPTGROUP_ATTRS = [ATTRS, "disabled"]
      OPTION_ATTRS = [ATTRS, "disabled", "label", "selected", "value"]
      PARAM_ATTRS = ["id", "value", "valuetype", "type"]
      WIDTH_ATTR = ["width"]
      PRE_CONTENT = [PHRASE, "tt", "i", "b", "u", "s", "strike", "a", "br",
                     "script", "map", "q", "span", "bdo", "iframe",]
      SCRIPT_ATTRS = ["charset", "src", "defer", "event", "for"]
      LANGUAGE_ATTR = ["language"]
      SELECT_CONTENT = ["optgroup", "option"]
      SELECT_ATTRS = [ATTRS, "name", "size", "multiple", "disabled", "tabindex",
                      "onfocus", "onblur", "onchange",]
      STYLE_ATTRS = [I18N, "media", "title"]
      TABLE_ATTRS = [ATTRS, "summary", "width", "border", "frame", "rules",
                     "cellspacing", "cellpadding", "datapagesize",]
      TABLE_DEPR = ["align", "bgcolor"]
      TABLE_CONTENTS = ["caption", "col", "colgroup", "thead", "tfoot", "tbody",
                        "tr",]
      TR_ELT = ["tr"]
      TALIGN_ATTRS = [ATTRS, CELLHALIGN, CELLVALIGN]
      TH_TD_DEPR = ["nowrap", "bgcolor", "width", "height"]
      TH_TD_ATTR = [ATTRS, "abbr", "axis", "headers", "scope", "rowspan",
                    "colspan", CELLHALIGN, CELLVALIGN,]
      TEXTAREA_ATTRS = [ATTRS, "name", "disabled", "readonly", "tabindex",
                        "accesskey", "onfocus", "onblur", "onselect",
                        "onchange",]
      TR_CONTENTS = ["th", "td"]
      BGCOLOR_ATTR = ["bgcolor"]
      LI_ELT = ["li"]
      UL_DEPR = ["type", "compact"]
      DIR_ATTR = ["dir"]

      [
        ["a", false, false, false, false, false, :any, true,
         "anchor ",
         HTML_INLINE, nil, A_ATTRS, TARGET_ATTR, [],],
        ["abbr", false, false, false, false, false, :any, true,
         "abbreviated form",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["acronym", false, false, false, false, false, :any, true, "",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["address", false, false, false, false, false, :any, false,
         "information on author",
         INLINE_P, nil, HTML_ATTRS, [], [],],
        ["applet", false, false, false, false, true, :loose, true,
         "java applet ",
         FLOW_PARAM, nil, [], APPLET_ATTRS, [],],
        ["area", false, true, true, true, false, :any, false,
         "client-side image map area ",
         EMPTY, nil, AREA_ATTRS, TARGET_ATTR, ALT_ATTR,],
        ["b", false, true, false, false, false, :any, true,
         "bold text style",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["base", false, true, true, true, false, :any, false,
         "document base uri ",
         EMPTY, nil, [], TARGET_ATTR, HREF_ATTRS,],
        ["basefont", false, true, true, true, true, :loose, true,
         "base font size ",
         EMPTY, nil, [], BASEFONT_ATTRS, [],],
        ["bdo", false, false, false, false, false, :any, true,
         "i18n bidi over-ride ",
         HTML_INLINE, nil, CORE_I18N_ATTRS, [], DIR_ATTR,],
        ["big", false, true, false, false, false, :any, true,
         "large text style",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["blockquote", false, false, false, false, false, :any, false,
         "long quotation ",
         HTML_FLOW, nil, QUOTE_ATTRS, [], [],],
        ["body", true, true, false, false, false, :any, false,
         "document body ",
         BODY_CONTENTS, "div", BODY_ATTRS, BODY_DEPR, [],],
        ["br", false, true, true, true, false, :any, true,
         "forced line break ",
         EMPTY, nil, CORE_ATTRS, CLEAR_ATTRS, [],],
        ["button", false, false, false, false, false, :any, true,
         "push button ",
         [HTML_FLOW, MODIFIER], nil, BUTTON_ATTRS, [], [],],
        ["caption", false, false, false, false, false, :any, false,
         "table caption ",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["center", false, true, false, false, true, :loose, false,
         "shorthand for div align=center ",
         HTML_FLOW, nil, [], HTML_ATTRS, [],],
        ["cite", false, false, false, false, false, :any, true, "citation",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["code", false, false, false, false, false, :any, true,
         "computer code fragment",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["col", false, true, true, true, false, :any, false, "table column ",
         EMPTY, nil, COL_ATTRS, [], [],],
        ["colgroup", false, true, false, false, false, :any, false,
         "table column group ",
         COL_ELT, "col", COL_ATTRS, [], [],],
        ["dd", false, true, false, false, false, :any, false,
         "definition description ",
         HTML_FLOW, nil, HTML_ATTRS, [], [],],
        ["del", false, false, false, false, false, :any, true,
         "deleted text ",
         HTML_FLOW, nil, EDIT_ATTRS, [], [],],
        ["dfn", false, false, false, false, false, :any, true,
         "instance definition",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["dir", false, false, false, false, true, :loose, false,
         "directory list",
         BLOCKLI_ELT, "li", [], COMPACT_ATTRS, [],],
        ["div", false, false, false, false, false, :any, false,
         "generic language/style container",
         HTML_FLOW, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["dl", false, false, false, false, false, :any, false,
         "definition list ",
         DL_CONTENTS, "dd", HTML_ATTRS, COMPACT_ATTR, [],],
        ["dt", false, true, false, false, false, :any, false,
         "definition term ",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["em", false, true, false, false, false, :any, true,
         "emphasis",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["embed", false, true, false, false, true, :loose, true,
         "generic embedded object ",
         EMPTY, nil, EMBED_ATTRS, [], [],],
        ["fieldset", false, false, false, false, false, :any, false,
         "form control group ",
         FIELDSET_CONTENTS, nil, HTML_ATTRS, [], [],],
        ["font", false, true, false, false, true, :loose, true,
         "local change to font ",
         HTML_INLINE, nil, [], FONT_ATTRS, [],],
        ["form", false, false, false, false, false, :any, false,
         "interactive form ",
         FORM_CONTENTS, "fieldset", FORM_ATTRS, TARGET_ATTR, ACTION_ATTR,],
        ["frame", false, true, true, true, false, :frameset, false,
         "subwindow ",
         EMPTY, nil, [], FRAME_ATTRS, [],],
        ["frameset", false, false, false, false, false, :frameset, false,
         "window subdivision",
         FRAMESET_CONTENTS, "noframes", [], FRAMESET_ATTRS, [],],
        ["htrue", false, false, false, false, false, :any, false,
         "heading ",
         HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["htrue", false, false, false, false, false, :any, false,
         "heading ",
         HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["htrue", false, false, false, false, false, :any, false,
         "heading ",
         HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["h4", false, false, false, false, false, :any, false,
         "heading ",
         HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["h5", false, false, false, false, false, :any, false,
         "heading ",
         HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["h6", false, false, false, false, false, :any, false,
         "heading ",
         HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["head", true, true, false, false, false, :any, false,
         "document head ",
         HEAD_CONTENTS, nil, HEAD_ATTRS, [], [],],
        ["hr", false, true, true, true, false, :any, false,
         "horizontal rule ",
         EMPTY, nil, HTML_ATTRS, HR_DEPR, [],],
        ["html", true, true, false, false, false, :any, false,
         "document root element ",
         HTML_CONTENT, nil, I18N_ATTRS, VERSION_ATTR, [],],
        ["i", false, true, false, false, false, :any, true,
         "italic text style",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["iframe", false, false, false, false, false, :any, true,
         "inline subwindow ",
         HTML_FLOW, nil, [], IFRAME_ATTRS, [],],
        ["img", false, true, true, true, false, :any, true,
         "embedded image ",
         EMPTY, nil, IMG_ATTRS, ALIGN_ATTR, SRC_ALT_ATTRS,],
        ["input", false, true, true, true, false, :any, true,
         "form control ",
         EMPTY, nil, INPUT_ATTRS, ALIGN_ATTR, [],],
        ["ins", false, false, false, false, false, :any, true,
         "inserted text",
         HTML_FLOW, nil, EDIT_ATTRS, [], [],],
        ["isindex", false, true, true, true, true, :loose, false,
         "single line prompt ",
         EMPTY, nil, [], PROMPT_ATTRS, [],],
        ["kbd", false, false, false, false, false, :any, true,
         "text to be entered by the user",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["label", false, false, false, false, false, :any, true,
         "form field label text ",
         [HTML_INLINE, MODIFIER], nil, LABEL_ATTRS, [], [],],
        ["legend", false, false, false, false, false, :any, false,
         "fieldset legend ",
         HTML_INLINE, nil, LEGEND_ATTRS, ALIGN_ATTR, [],],
        ["li", false, true, true, false, false, :any, false,
         "list item ",
         HTML_FLOW, nil, HTML_ATTRS, [], [],],
        ["link", false, true, true, true, false, :any, false,
         "a media-independent link ",
         EMPTY, nil, LINK_ATTRS, TARGET_ATTR, [],],
        ["map", false, false, false, false, false, :any, true,
         "client-side image map ",
         MAP_CONTENTS, nil, HTML_ATTRS, [], NAME_ATTR,],
        ["menu", false, false, false, false, true, :loose, false,
         "menu list ",
         BLOCKLI_ELT, nil, [], COMPACT_ATTRS, [],],
        ["meta", false, true, true, true, false, :any, false,
         "generic metainformation ",
         EMPTY, nil, META_ATTRS, [], CONTENT_ATTR,],
        ["noframes", false, false, false, false, false, :frameset, false,
         "alternate content container for non frame-based rendering ",
         NOFRAMES_CONTENT, "body", HTML_ATTRS, [], [],],
        ["noscript", false, false, false, false, false, :any, false,
         "alternate content container for non script-based rendering ",
         HTML_FLOW, "div", HTML_ATTRS, [], [],],
        ["object", false, false, false, false, false, :any, true,
         "generic embedded object ",
         OBJECT_CONTENTS, "div", OBJECT_ATTRS, OBJECT_DEPR, [],],
        ["ol", false, false, false, false, false, :any, false,
         "ordered list ",
         LI_ELT, "li", HTML_ATTRS, OL_ATTRS, [],],
        ["optgroup", false, false, false, false, false, :any, false,
         "option group ",
         OPTION_ELT, "option", OPTGROUP_ATTRS, [], LABEL_ATTR,],
        ["option", false, true, false, false, false, :any, false,
         "selectable choice ",
         HTML_PCDATA, nil, OPTION_ATTRS, [], [],],
        ["p", false, true, false, false, false, :any, false,
         "paragraph ",
         HTML_INLINE, nil, HTML_ATTRS, ALIGN_ATTR, [],],
        ["param", false, true, true, true, false, :any, false,
         "named property value ",
         EMPTY, nil, PARAM_ATTRS, [], NAME_ATTR,],
        ["pre", false, false, false, false, false, :any, false,
         "preformatted text ",
         PRE_CONTENT, nil, HTML_ATTRS, WIDTH_ATTR, [],],
        ["q", false, false, false, false, false, :any, true,
         "short inline quotation ",
         HTML_INLINE, nil, QUOTE_ATTRS, [], [],],
        ["s", false, true, false, false, true, :loose, true,
         "strike-through text style",
         HTML_INLINE, nil, [], HTML_ATTRS, [],],
        ["samp", false, false, false, false, false, :any, true,
         "sample program output, scripts, etc.",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["script", false, false, false, false, false, :any, true,
         "script statements ",
         HTML_CDATA, nil, SCRIPT_ATTRS, LANGUAGE_ATTR, TYPE_ATTR,],
        ["select", false, false, false, false, false, :any, true,
         "option selector ",
         SELECT_CONTENT, nil, SELECT_ATTRS, [], [],],
        ["small", false, true, false, false, false, :any, true,
         "small text style",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["span", false, false, false, false, false, :any, true,
         "generic language/style container ",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["strike", false, true, false, false, true, :loose, true,
         "strike-through text",
         HTML_INLINE, nil, [], HTML_ATTRS, [],],
        ["strong", false, true, false, false, false, :any, true,
         "strong emphasis",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["style", false, false, false, false, false, :any, false,
         "style info ",
         HTML_CDATA, nil, STYLE_ATTRS, [], TYPE_ATTR,],
        ["sub", false, true, false, false, false, :any, true,
         "subscript",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["sup", false, true, false, false, false, :any, true,
         "superscript ",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["table", false, false, false, false, false, :any, false,
         "",
         TABLE_CONTENTS, "tr", TABLE_ATTRS, TABLE_DEPR, [],],
        ["tbody", true, false, false, false, false, :any, false,
         "table body ",
         TR_ELT, "tr", TALIGN_ATTRS, [], [],],
        ["td", false, false, false, false, false, :any, false,
         "table data cell",
         HTML_FLOW, nil, TH_TD_ATTR, TH_TD_DEPR, [],],
        ["textarea", false, false, false, false, false, :any, true,
         "multi-line text field ",
         HTML_PCDATA, nil, TEXTAREA_ATTRS, [], ROWS_COLS_ATTR,],
        ["tfoot", false, true, false, false, false, :any, false,
         "table footer ",
         TR_ELT, "tr", TALIGN_ATTRS, [], [],],
        ["th", false, true, false, false, false, :any, false,
         "table header cell",
         HTML_FLOW, nil, TH_TD_ATTR, TH_TD_DEPR, [],],
        ["thead", false, true, false, false, false, :any, false,
         "table header ",
         TR_ELT, "tr", TALIGN_ATTRS, [], [],],
        ["title", false, false, false, false, false, :any, false,
         "document title ",
         HTML_PCDATA, nil, I18N_ATTRS, [], [],],
        ["tr", false, false, false, false, false, :any, false,
         "table row ",
         TR_CONTENTS, "td", TALIGN_ATTRS, BGCOLOR_ATTR, [],],
        ["tt", false, true, false, false, false, :any, true,
         "teletype or monospaced text style",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
        ["u", false, true, false, false, true, :loose, true,
         "underlined text style",
         HTML_INLINE, nil, [], HTML_ATTRS, [],],
        ["ul", false, false, false, false, false, :any, false,
         "unordered list ",
         LI_ELT, "li", HTML_ATTRS, UL_DEPR, [],],
        ["var", false, false, false, false, false, :any, true,
         "instance of a variable or program argument",
         HTML_INLINE, nil, HTML_ATTRS, [], [],],
      ].each do |descriptor|
        name = descriptor[0]

        begin
          d = Desc.new(*descriptor)

          # flatten all the attribute lists (Ruby1.9, *[a,b,c] can be
          # used to flatten a literal list, but not in Ruby1.8).
          d[:subelts] = d[:subelts].flatten
          d[:attrs_opt] = d[:attrs_opt].flatten
          d[:attrs_depr] = d[:attrs_depr].flatten
          d[:attrs_req] = d[:attrs_req].flatten
        rescue => e
          p(name)
          raise e
        end

        DefaultDescriptions[name] = d
      end
    end
  end
end
