about summary refs log tree commit diff stats
path: root/WWW/Library/Implementation
diff options
context:
space:
mode:
Diffstat (limited to 'WWW/Library/Implementation')
-rw-r--r--WWW/Library/Implementation/HTAnchor.c8
-rw-r--r--WWW/Library/Implementation/HTFTP.c4
-rw-r--r--WWW/Library/Implementation/HTFile.c8
-rw-r--r--WWW/Library/Implementation/HTList.c9
-rw-r--r--WWW/Library/Implementation/HTMLDTD.c4
-rw-r--r--WWW/Library/Implementation/HTString.c10
-rw-r--r--WWW/Library/Implementation/HTTCP.c8
-rw-r--r--WWW/Library/Implementation/HTUtils.h14
-rw-r--r--WWW/Library/Implementation/SGML.c98
-rw-r--r--WWW/Library/Implementation/SGML.h42
-rw-r--r--WWW/Library/Implementation/dtd_util.c358
-rw-r--r--WWW/Library/Implementation/hdr_HTMLDTD.h566
-rw-r--r--WWW/Library/Implementation/src0_HTMLDTD.h1565
-rw-r--r--WWW/Library/Implementation/src1_HTMLDTD.h1565
14 files changed, 3491 insertions, 768 deletions
diff --git a/WWW/Library/Implementation/HTAnchor.c b/WWW/Library/Implementation/HTAnchor.c
index 6bb592c8..b0e6c771 100644
--- a/WWW/Library/Implementation/HTAnchor.c
+++ b/WWW/Library/Implementation/HTAnchor.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTAnchor.c,v 1.59 2007/07/02 23:42:54 tom Exp $
+ * $LynxId: HTAnchor.c,v 1.60 2008/09/18 21:35:24 tom Exp $
  *
  *	Hypertext "Anchor" Object				HTAnchor.c
  *	==========================
@@ -362,11 +362,11 @@ HTChildAnchor *HTAnchor_findChildAndLink(HTParentAnchor *parent,	/* May not be 0
 	    if (child->dest) {	/* DUPLICATE_ANCHOR_NAME_WORKAROUND  - kw */
 		CTRACE((tfp,
 			"*** Duplicate ChildAnchor %p named `%s'",
-			child, tag));
+			(void *) child, tag));
 		if ((HTAnchor *) dest != child->dest || ltype != child->type) {
 		    CTRACE((tfp,
 			    ", different dest %p or type, creating unnamed child\n",
-			    child->dest));
+			    (void *) child->dest));
 		    child = HTAnchor_addChild(parent);
 		}
 	    }
@@ -515,7 +515,7 @@ static BOOL HTAnchor_link(HTChildAnchor *child,
     if (!(child && destination))
 	return (NO);		/* Can't link to/from non-existing anchor */
 
-    CTRACE((tfp, "Linking child %p to anchor %p\n", child, destination));
+    CTRACE((tfp, "Linking child %p to anchor %p\n", (void *) child, (void *) destination));
     if (child->dest) {
 	CTRACE((tfp, "*** child anchor already has destination, exiting!\n"));
 	return (NO);
diff --git a/WWW/Library/Implementation/HTFTP.c b/WWW/Library/Implementation/HTFTP.c
index 003d61c0..1ca9f47a 100644
--- a/WWW/Library/Implementation/HTFTP.c
+++ b/WWW/Library/Implementation/HTFTP.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTFTP.c,v 1.80 2007/08/02 19:55:46 tom Exp $
+ * $LynxId: HTFTP.c,v 1.81 2008/09/18 21:34:25 tom Exp $
  *
  *			File Transfer Protocol (FTP) Client
  *			for a WorldWideWeb browser
@@ -882,7 +882,7 @@ static int get_connection(const char *arg,
     }
 
     CTRACE((tfp, "FTP connected, socket %d  control %p\n",
-	    con->socket, con));
+	    con->socket, (void *) con));
     control = con;		/* Current control connection */
 
     /* Initialise buffering for control connection */
diff --git a/WWW/Library/Implementation/HTFile.c b/WWW/Library/Implementation/HTFile.c
index aaefab80..bfd79410 100644
--- a/WWW/Library/Implementation/HTFile.c
+++ b/WWW/Library/Implementation/HTFile.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTFile.c,v 1.104 2007/08/02 19:46:01 tom Exp $
+ * $LynxId: HTFile.c,v 1.105 2008/09/18 21:34:25 tom Exp $
  *
  *			File Access				HTFile.c
  *			===========
@@ -2234,7 +2234,7 @@ static int decompressAndParse(HTParentAnchor *anchor,
 	FREE(ultrixname);
     }
 #endif /* VMS */
-    CTRACE((tfp, "HTLoadFile: Opening `%s' gives %p\n", localname, fp));
+    CTRACE((tfp, "HTLoadFile: Opening `%s' gives %p\n", localname, (void *) fp));
     if (fp) {			/* Good! */
 	if (HTEditable(localname)) {
 	    HTAtom *put = HTAtom_for("PUT");
@@ -2271,7 +2271,7 @@ static int decompressAndParse(HTParentAnchor *anchor,
 		fp = 0;
 
 		CTRACE((tfp, "HTLoadFile: zzopen of `%s' gives %p\n",
-			localname, zzfp));
+			localname, (void *) zzfp));
 		internal_decompress = cftDeflate;
 	    } else
 #endif /* USE_ZLIB */
@@ -2318,7 +2318,7 @@ static int decompressAndParse(HTParentAnchor *anchor,
 		    fp = 0;
 
 		    CTRACE((tfp, "HTLoadFile: zzopen of `%s' gives %p\n",
-			    localname, zzfp));
+			    localname, (void *) zzfp));
 		    internal_decompress = cftDeflate;
 		}
 #else /* USE_ZLIB */
diff --git a/WWW/Library/Implementation/HTList.c b/WWW/Library/Implementation/HTList.c
index ccb02b19..6b4cc421 100644
--- a/WWW/Library/Implementation/HTList.c
+++ b/WWW/Library/Implementation/HTList.c
@@ -1,4 +1,7 @@
-/*	A small List class					      HTList.c
+/*
+ * $LynxId: HTList.c,v 1.17 2008/09/18 21:36:59 tom Exp $
+ *
+ *	A small List class					      HTList.c
  *	==================
  *
  *	A list is represented as a sequence of linked nodes of type HTList.
@@ -70,7 +73,7 @@ HTList *HTList_appendList(HTList *start,
     if (!start) {
 	CTRACE((tfp,
 		"HTList: Trying to append list %p to a nonexisting list\n",
-		tail));
+		(void *) tail));
 	return NULL;
     }
     if (!(tail && tail->next))
@@ -107,7 +110,7 @@ void HTList_linkObject(HTList *me, void *newObject,
 	     */
 	    CTRACE((tfp, "*** HTList: Refuse linking already linked obj "));
 	    CTRACE((tfp, "%p, node %p, list %p\n",
-		    newObject, newNode, me));
+		    (void *) newObject, (void *) newNode, (void *) me));
 	}
 
     } else {
diff --git a/WWW/Library/Implementation/HTMLDTD.c b/WWW/Library/Implementation/HTMLDTD.c
index c2c30d6e..78b29c25 100644
--- a/WWW/Library/Implementation/HTMLDTD.c
+++ b/WWW/Library/Implementation/HTMLDTD.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTMLDTD.c,v 1.55 2008/07/07 00:04:46 tom Exp $
+ * $LynxId: HTMLDTD.c,v 1.56 2008/09/18 22:29:24 tom Exp $
  *
  *		Our Static DTD for HTML
  *		-----------------------
@@ -243,7 +243,7 @@ void HTSwitchDTD(int new_flag)
 
 HTTag HTTag_unrecognized =
 
-{NULL_HTTag, NULL, 0, SGML_EMPTY, T__UNREC_};
+{NULL_HTTag, NULL, 0, 0, SGML_EMPTY, T__UNREC_};
 
 /*
  *	Utility Routine:  Useful for people building HTML objects.
diff --git a/WWW/Library/Implementation/HTString.c b/WWW/Library/Implementation/HTString.c
index 7c119a37..298cc679 100644
--- a/WWW/Library/Implementation/HTString.c
+++ b/WWW/Library/Implementation/HTString.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTString.c,v 1.52 2008/02/18 00:04:16 tom Exp $
+ * $LynxId: HTString.c,v 1.54 2008/09/20 14:32:29 tom Exp $
  *
  *	Case-independent string comparison		HTString.c
  *
@@ -1165,7 +1165,9 @@ void HTSABCopy(bstring **dest, const char *src,
     bstring *t;
     unsigned need = len + 1;
 
-    CTRACE2(TRACE_BSTRING, (tfp, "HTSABCopy(%p, %p, %d)\n", dest, src, len));
+    CTRACE2(TRACE_BSTRING,
+	    (tfp, "HTSABCopy(%p, %p, %d)\n",
+	     (void *) dest, (const void *) src, len));
     HTSABFree(dest);
     if (src) {
 	if (TRACE_BSTRING) {
@@ -1206,7 +1208,9 @@ void HTSABCat(bstring **dest, const char *src,
 {
     bstring *t = *dest;
 
-    CTRACE2(TRACE_BSTRING, (tfp, "HTSABCat(%p, %p, %d)\n", dest, src, len));
+    CTRACE2(TRACE_BSTRING,
+	    (tfp, "HTSABCat(%p, %p, %d)\n",
+	     (void *) dest, (const void *) src, len));
     if (src) {
 	unsigned need = len + 1;
 
diff --git a/WWW/Library/Implementation/HTTCP.c b/WWW/Library/Implementation/HTTCP.c
index 05d41354..ee7c52b5 100644
--- a/WWW/Library/Implementation/HTTCP.c
+++ b/WWW/Library/Implementation/HTTCP.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTTCP.c,v 1.95 2008/07/06 12:55:40 tom Exp $
+ * $LynxId: HTTCP.c,v 1.97 2008/09/20 14:32:29 tom Exp $
  *
  *			Generic Communication Code		HTTCP.c
  *			==========================
@@ -380,7 +380,7 @@ static void dump_hostent(const char *msgprefix,
 	int i;
 	char **pcnt;
 
-	CTRACE((tfp, "%s: %p ", msgprefix, phost));
+	CTRACE((tfp, "%s: %p ", msgprefix, (const void *) phost));
 	if (phost) {
 	    CTRACE((tfp, "{ h_name = %p", phost->h_name));
 	    if (phost->h_name) {
@@ -388,7 +388,7 @@ static void dump_hostent(const char *msgprefix,
 	    } else {
 		CTRACE((tfp, ","));
 	    }
-	    CTRACE((tfp, "\n\t h_aliases = %p", phost->h_aliases));
+	    CTRACE((tfp, "\n\t h_aliases = %p", (void *) phost->h_aliases));
 	    if (phost->h_aliases) {
 		CTRACE((tfp, " {"));
 		for (pcnt = phost->h_aliases; *pcnt; pcnt++) {
@@ -403,7 +403,7 @@ static void dump_hostent(const char *msgprefix,
 	    }
 	    CTRACE((tfp, " h_addrtype = %d,", phost->h_addrtype));
 	    CTRACE((tfp, " h_length = %d,\n\t", phost->h_length));
-	    CTRACE((tfp, " h_addr_list = %p", phost->h_addr_list));
+	    CTRACE((tfp, " h_addr_list = %p", (void *) phost->h_addr_list));
 	    if (phost->h_addr_list) {
 		CTRACE((tfp, " {"));
 		for (pcnt = phost->h_addr_list; *pcnt; pcnt++) {
diff --git a/WWW/Library/Implementation/HTUtils.h b/WWW/Library/Implementation/HTUtils.h
index 6ea1f42c..cdc3442d 100644
--- a/WWW/Library/Implementation/HTUtils.h
+++ b/WWW/Library/Implementation/HTUtils.h
@@ -1,5 +1,5 @@
 /*
- * $LynxId: HTUtils.h,v 1.86 2008/09/17 00:52:06 tom Exp $
+ * $LynxId: HTUtils.h,v 1.87 2008/09/17 16:31:34 tom Exp $
  *
  * Utility macros for the W3 code library
  * MACROS FOR GENERAL USE
@@ -558,10 +558,16 @@ extern int WWW_TraceMask;
 #endif
 
 #ifndef PRI_off_t
+#if (SIZEOF_OFF_T == 8)
+#define PRI_off_t	"lld"
+#define SCN_off_t	"lld"
+#define CAST_off_t(n)	(long long)(n)
+#else
 #define PRI_off_t	"ld"
 #define SCN_off_t	"ld"
 #define CAST_off_t(n)	(long)(n)
 #endif
+#endif
 
 /*
  * Printing-format for "time_t", as well as cast needed to fit.
@@ -579,10 +585,16 @@ extern int WWW_TraceMask;
 #endif
 
 #ifndef PRI_time_t
+#if (SIZEOF_TIME_T == 8)
+#define PRI_time_t	"lld"
+#define SCN_time_t	"lld"
+#define CAST_time_t(n)	(long long)(n)
+#else
 #define PRI_time_t	"ld"
 #define SCN_time_t	"ld"
 #define CAST_time_t(n)	(long)(n)
 #endif
+#endif
 
 /*
  * Printing-format for "UCode_t".
diff --git a/WWW/Library/Implementation/SGML.c b/WWW/Library/Implementation/SGML.c
index accc23a2..fe8f9ecd 100644
--- a/WWW/Library/Implementation/SGML.c
+++ b/WWW/Library/Implementation/SGML.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: SGML.c,v 1.115 2008/09/17 00:45:07 tom Exp $
+ * $LynxId: SGML.c,v 1.117 2008/09/21 18:34:39 tom Exp $
  *
  *			General SGML Parser code		SGML.c
  *			========================
@@ -1140,7 +1140,7 @@ static void end_element(HTStream *context, HTTag * old_tag)
 	}
 
 	e = NORMAL_TAGNUM(TAGNUM_OF_TAGP(t));
-	CTRACE2(TRACE_SGML, (tfp, "tagnum(%p) = %d\n", t, (int) e));
+	CTRACE2(TRACE_SGML, (tfp, "tagnum(%p) = %d\n", (void *) t, (int) e));
 #ifdef USE_PRETTYSRC
 	if (!psrc_view)		/* Don't actually pass call on if viewing psrc - kw */
 #endif
@@ -1563,6 +1563,36 @@ static void discard_empty(HTStream *context)
     /* do not call end_element() if start_element() was not called */
 }
 
+#ifdef USE_PRETTYSRC
+static BOOL end_if_prettysrc(HTStream *context, HTChunk *string, int end_ch)
+{
+    BOOL result = psrc_view;
+
+    if (psrc_view) {
+	if (attr_is_name) {
+	    HTStartAnchor(context->target, string->data, NULL);
+	    (*context->actions->end_element) (context->target,
+					      HTML_A,
+					      &context->include);
+	} else if (attr_is_href) {
+	    PSRCSTART(href);
+	    HTStartAnchor(context->target, NULL, string->data);
+	}
+	PUTS_TR(string->data);
+	if (attr_is_href) {
+	    (*context->actions->end_element) (context->target,
+					      HTML_A,
+					      &context->include);
+	    PSRCSTOP(href);
+	}
+	if (end_ch)
+	    PUTC(end_ch);
+	PSRCSTOP(attrval);
+    }
+    return result;
+}
+#endif
+
 static void SGML_character(HTStream *context, char c_in)
 {
     const SGML_dtd *dtd = context->dtd;
@@ -3711,25 +3741,7 @@ static void SGML_character(HTStream *context, char c_in)
 	if (WHITE(c) || (c == '>')) {	/* End of word */
 	    HTChunkTerminate(string);
 #ifdef USE_PRETTYSRC
-	    if (psrc_view) {
-		if (attr_is_name) {
-		    HTStartAnchor(context->target, string->data, NULL);
-		    (*context->actions->end_element) (context->target,
-						      HTML_A,
-						      &context->include);
-		} else if (attr_is_href) {
-		    PSRCSTART(href);
-		    HTStartAnchor(context->target, NULL, string->data);
-		}
-		PUTS_TR(string->data);
-		if (attr_is_href) {
-		    (*context->actions->end_element) (context->target,
-						      HTML_A,
-						      &context->include);
-		    PSRCSTOP(href);
-		}
-		PSRCSTOP(attrval);
-	    } else
+	    if (!end_if_prettysrc(context, string, 0))
 #endif
 	    {
 #ifdef CJK_EX			/* Quick hack. - JH7AYN */
@@ -3791,27 +3803,7 @@ static void SGML_character(HTStream *context, char c_in)
 	if (c == '\'') {	/* End of attribute value */
 	    HTChunkTerminate(string);
 #ifdef USE_PRETTYSRC
-	    if (psrc_view) {
-		/*PSRCSTART(attrval); */
-		if (attr_is_name) {
-		    HTStartAnchor(context->target, string->data, NULL);
-		    (*context->actions->end_element) (context->target,
-						      HTML_A,
-						      &context->include);
-		} else if (attr_is_href) {
-		    PSRCSTART(href);
-		    HTStartAnchor(context->target, NULL, string->data);
-		}
-		PUTS_TR(string->data);
-		if (attr_is_href) {
-		    (*context->actions->end_element) (context->target,
-						      HTML_A,
-						      &context->include);
-		    PSRCSTOP(href);
-		}
-		PUTC('\'');
-		PSRCSTOP(attrval);
-	    } else
+	    if (!end_if_prettysrc(context, string, '\''))
 #endif
 		handle_attribute_value(context, string->data);
 	    string->size = 0;
@@ -3853,28 +3845,8 @@ static void SGML_character(HTStream *context, char c_in)
 	     c == '>')) {	/*  as a co-terminator of dquoted and tag    */
 	    HTChunkTerminate(string);
 #ifdef USE_PRETTYSRC
-	    if (psrc_view) {
-		if (attr_is_name) {
-		    HTStartAnchor(context->target, string->data, NULL);
-		    (*context->actions->end_element) (context->target,
-						      HTML_A,
-						      &context->include);
-		} else if (attr_is_href) {
-		    PSRCSTART(href);
-		    HTStartAnchor(context->target, NULL, string->data);
-		}
-		PUTS_TR(string->data);
-		if (attr_is_href) {
-		    (*context->actions->end_element) (context->target,
-						      HTML_A,
-						      &context->include);
-		    PSRCSTOP(href);
-		}
-		PUTC(c);
-		PSRCSTOP(attrval);
-	    } else
+	    if (!end_if_prettysrc(context, string, c))
 #endif
-
 		handle_attribute_value(context, string->data);
 	    string->size = 0;
 	    context->state = S_tag_gap;
diff --git a/WWW/Library/Implementation/SGML.h b/WWW/Library/Implementation/SGML.h
index b7a5ecc4..04a2fc40 100644
--- a/WWW/Library/Implementation/SGML.h
+++ b/WWW/Library/Implementation/SGML.h
@@ -1,18 +1,20 @@
-/*						  SGML parse and stream definition for libwww
-			       SGML AND STRUCTURED STREAMS
-
-   The SGML parser is a state machine.	It is called for every character
-   of the input stream.	 The DTD data structure contains pointers
-   to functions which are called to implement the actual effect of the
-   text read. When these functions are called, the attribute structures pointed to by the
-   DTD are valid, and the function is passed a pointer to the current tag structure, and an
-   "element stack" which represents the state of nesting within SGML elements.
-
-   The following aspects are from Dan Connolly's suggestions:  Binary search,
-   Structured object scheme basically, SGML content enum type.
-
-   (c) Copyright CERN 1991 - See Copyright.html
-
+/*
+ * $LynxId: SGML.h,v 1.40 2008/09/18 23:36:15 tom Exp $
+ *			       SGML parse and stream definition for libwww
+ *                             SGML AND STRUCTURED STREAMS
+ *
+ * The SGML parser is a state machine.	It is called for every character
+ * of the input stream.	 The DTD data structure contains pointers
+ * to functions which are called to implement the actual effect of the
+ * text read. When these functions are called, the attribute structures pointed to by the
+ * DTD are valid, and the function is passed a pointer to the current tag structure, and an
+ * "element stack" which represents the state of nesting within SGML elements.
+ *
+ * The following aspects are from Dan Connolly's suggestions:  Binary search,
+ * Structured object scheme basically, SGML content enum type.
+ *
+ * (c) Copyright CERN 1991 - See Copyright.html
+ *
  */
 #ifndef SGML_H
 #define SGML_H
@@ -55,6 +57,13 @@ extern "C" {
 #endif
     } attr;
 
+    typedef const attr *AttrList;
+
+    typedef struct {
+	const char *name;
+	AttrList list;
+    } AttrType;
+
     typedef int TagClass;
 
     /* textflow */
@@ -135,8 +144,9 @@ extern "C" {
 #ifdef EXP_JUSTIFY_ELTS
 	BOOL can_justify;	/* justification allowed? */
 #endif
-	const attr *attributes;	/* The list of acceptable attributes */
+	AttrList attributes;	/* The list of acceptable attributes */
 	int number_of_attributes;	/* Number of possible attributes */
+	const AttrType *attr_types;
 	SGMLContent contents;	/* End only on end tag @@ */
 	TagClass tagclass;
 	TagClass contains;	/* which classes of elements this one can contain directly */
diff --git a/WWW/Library/Implementation/dtd_util.c b/WWW/Library/Implementation/dtd_util.c
index c50ac740..1870b2b2 100644
--- a/WWW/Library/Implementation/dtd_util.c
+++ b/WWW/Library/Implementation/dtd_util.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: dtd_util.c,v 1.31 2008/09/16 23:43:49 tom Exp $
+ * $LynxId: dtd_util.c,v 1.53 2008/09/20 13:45:30 tom Exp $
  *
  * Given a SGML_dtd structure, write a corresponding flat file, or "C" source.
  * Given the flat-file, write the "C" source.
@@ -28,6 +28,68 @@ FILE *TraceFP(void)
 #define GETOPT "chlo:ts"
 
 #define NOTE(message) fprintf(output, message "\n");
+/* *INDENT-OFF* */
+#ifdef USE_PRETTYSRC
+# define N HTMLA_NORMAL
+# define i HTMLA_ANAME
+# define h HTMLA_HREF
+# define c HTMLA_CLASS
+# define x HTMLA_AUXCLASS
+# define T(t) , t
+#else
+# define T(t)			/*nothing */
+#endif
+
+#define ATTR_TYPE(name) { #name, name##_attr_list }
+
+static const attr core_attr_list[] = {
+	{ "CLASS"         T(c) },
+	{ "ID"            T(i) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr i18n_attr_list[] = {
+	{ "DIR"           T(N) },
+	{ "LANG"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr events_attr_list[] = {
+	{ "ONCLICK"       T(N) },
+	{ "ONDBLCLICK"    T(N) },
+	{ "ONKEYDOWN"     T(N) },
+	{ "ONKEYPRESS"    T(N) },
+	{ "ONKEYUP"       T(N) },
+	{ "ONMOUSEDOWN"   T(N) },
+	{ "ONMOUSEMOVE"   T(N) },
+	{ "ONMOUSEOUT"    T(N) },
+	{ "ONMOUSEOVER"   T(N) },
+	{ "ONMOUSEUP"     T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr align_attr_list[] = {
+	{ "ALIGN"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr cellalign_attr_list[] = {
+	{ "ALIGN"         T(N) },
+	{ "CHAR"          T(N) },
+	{ "CHAROFF"       T(N) },
+	{ "VALIGN"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr bgcolor_attr_list[] = {
+	{ "BGCOLOR"       T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+#undef T
+/* *INDENT-ON* */
 
 static void failed(const char *s)
 {
@@ -170,17 +232,6 @@ static const char *NameOfAttrs(const SGML_dtd * dtd, int which)
     return result;
 }
 
-static const char *XXX_attr(const SGML_dtd * dtd, int which)
-{
-    static char result[80];
-    int i;
-
-    strcpy(result, NameOfAttrs(dtd, which));
-    for (i = 0; result[i]; ++i)
-	result[i] = tolower(result[i]);
-    return result;
-}
-
 static const char *DEF_name(const SGML_dtd * dtd, int which)
 {
     const char *result = dtd->tags[which].name;
@@ -205,7 +256,109 @@ static int compare_attr(const void *a, const void *b)
     return strcmp(p->name, q->name);
 }
 
-static AttrInfo *sorted_attrs(const SGML_dtd * dtd, unsigned *countp, int lower)
+static int len_AttrList(AttrList data)
+{
+    int result = 0;
+
+    for (result = 0; data[result].name != 0; ++result) {
+	;
+    }
+    return result;
+}
+
+static void sort_uniq_AttrList(attr *data)
+{
+    unsigned have = len_AttrList(data);
+    unsigned j, k;
+
+    qsort(data, have, sizeof(*data), compare_attr);
+    /*
+     * Eliminate duplicates
+     */
+    for (j = k = 0; j < have; ++j) {
+	for (k = j; data[k].name; ++k) {
+	    if (data[k + 1].name == 0)
+		break;
+	    if (strcmp(data[j].name, data[k + 1].name)) {
+		break;
+	    }
+	}
+	data[j] = data[k];
+    }
+    memset(data + j, 0, sizeof(data[0]));
+}
+
+static attr *copy_AttrList(AttrList data)
+{
+    unsigned need = len_AttrList(data);
+    unsigned n;
+
+    attr *result = (attr *) calloc(need + 1, sizeof(attr));
+
+    for (n = 0; n < need; ++n)
+	result[n] = data[n];
+    sort_uniq_AttrList(result);
+    return result;
+}
+
+static attr *merge_AttrLists(const AttrType * data)
+{
+    const AttrType *at;
+    attr *result = 0;
+    unsigned need = 1;
+    unsigned have = 0;
+    unsigned j;
+
+    for (at = data; at->name; ++at) {
+	need += len_AttrList(at->list);
+    }
+    result = (attr *) calloc(need + 1, sizeof(attr));
+    for (at = data; at->name; ++at) {
+	if (!strcmp(at->name, "events")) {
+	    ;			/* lynx does not use events */
+	} else {
+	    for (j = 0; at->list[j].name; ++j) {
+		result[have++] = at->list[j];
+	    }
+	}
+    }
+    sort_uniq_AttrList(result);
+    return result;
+}
+
+static int clean_AttrList(attr * target, AttrList source)
+{
+    int result = 0;
+    int j, k;
+
+    for (j = 0; target[j].name != 0; ++j) {
+	for (k = 0; source[k].name != 0; ++k) {
+	    if (!strcmp(target[j].name, source[k].name)) {
+		k = j--;
+		for (;;) {
+		    target[k] = target[k + 1];
+		    if (target[k++].name == 0)
+			break;
+		}
+		++result;
+		break;
+	    }
+	}
+    }
+    return result;
+}
+
+/*
+ * Actually COUNT the number of attributes, to make it possible to edit a
+ * attribute-table in src0_HTMLDTD.h and have all of the files updated by
+ * just doing a "make sources".
+ */
+static int AttrCount(HTTag * tag)
+{
+    return len_AttrList(tag->attributes);
+}
+
+static AttrInfo *sorted_attrs(const SGML_dtd * dtd, unsigned *countp)
 {
     int j;
 
@@ -215,12 +368,9 @@ static AttrInfo *sorted_attrs(const SGML_dtd * dtd, unsigned *countp, int lower)
     /* get the attribute-data */
     for (j = 0; j < dtd->number_of_tags; ++j) {
 	if (first_attrs(dtd, j)) {
-	    if (lower)
-		data[count].name = strdup(XXX_attr(dtd, j));
-	    else
-		data[count].name = NameOfAttrs(dtd, j);
+	    data[count].name = NameOfAttrs(dtd, j);
 	    data[count].attrs = dtd->tags[j].attributes;
-	    data[count].count = dtd->tags[j].number_of_attributes;
+	    data[count].count = AttrCount(&(dtd->tags[j]));
 	    data[count].which = j;
 	    ++count;
 	}
@@ -250,42 +400,84 @@ static void dump_src_HTTag_Defines(FILE *output, const SGML_dtd * dtd, int which
 	    tag->flags);
 }
 
+static void dump_AttrItem(FILE *output, const attr * data)
+{
+    char buffer[BUFSIZ];
+    char pretty = 'N';
+
+    sprintf(buffer, "\"%s\"", data->name);
+#ifdef USE_PRETTYSRC
+    switch (data->type) {
+    case HTMLA_NORMAL:
+	pretty = 'N';
+	break;
+    case HTMLA_ANAME:
+	pretty = 'i';
+	break;
+    case HTMLA_HREF:
+	pretty = 'h';
+	break;
+    case HTMLA_CLASS:
+	pretty = 'c';
+	break;
+    case HTMLA_AUXCLASS:
+	pretty = 'x';
+	break;
+    }
+#endif
+    fprintf(output, "\t{ %-15s T(%c) },\n", buffer, pretty);
+}
+
+static void dump_AttrItem0(FILE *output)
+{
+    fprintf(output, "\t{ 0               T(N) }\t/* Terminate list */\n");
+}
+
+static void dump_src_AttrType(FILE *output, const char *name, AttrList data, const char **from)
+{
+    int n;
+
+    fprintf(output, "static const attr %s_attr_list[] = {\n", name);
+    if (data != 0) {
+	for (n = 0; data[n].name != 0; ++n) {
+	    dump_AttrItem(output, data + n);
+	}
+    }
+    fprintf(output, "\t{ 0               T(N) }	/* Terminate list */\n");
+    fprintf(output, "};\n");
+    NOTE("");
+    fprintf(output, "static const AttrType %s_attr_type[] = {\n", name);
+    if (from != 0) {
+	while (*from != 0) {
+	    fprintf(output, "\t{ ATTR_TYPE(%s) },\n", *from);
+	    ++from;
+	}
+    } else {
+	fprintf(output, "\t{ ATTR_TYPE(%s) },\n", name);
+    }
+    fprintf(output, "\t{ 0, 0 },\n");
+    fprintf(output, "};\n");
+    NOTE("");
+}
+
 static void dump_src_HTTag_Attrs(FILE *output, const SGML_dtd * dtd, int which)
 {
     HTTag *tag = &(dtd->tags[which]);
+    attr *list = merge_AttrLists(tag->attr_types);
     char buffer[BUFSIZ];
-    char pretty = 'N';
     int n;
+    int limit = len_AttrList(list);
 
-    sprintf(buffer, "static const attr %s_attr[] = {", XXX_attr(dtd, which));
+    sprintf(buffer, "static const attr %s_attr[] = {", NameOfAttrs(dtd, which));
     fprintf(output,
 	    "%-40s/* %s attributes */\n", buffer, tag->name);
-    for (n = 0; n < tag->number_of_attributes; ++n) {
-	sprintf(buffer, "\"%s\"", tag->attributes[n].name);
-#ifdef USE_PRETTYSRC
-	switch (tag->attributes[n].type) {
-	case HTMLA_NORMAL:
-	    pretty = 'N';
-	    break;
-	case HTMLA_ANAME:
-	    pretty = 'i';
-	    break;
-	case HTMLA_HREF:
-	    pretty = 'h';
-	    break;
-	case HTMLA_CLASS:
-	    pretty = 'c';
-	    break;
-	case HTMLA_AUXCLASS:
-	    pretty = 'x';
-	    break;
-	}
-#endif
-	fprintf(output, "\t{ %-15s T(%c) },\n", buffer, pretty);
+    for (n = 0; n < limit; ++n) {
+	dump_AttrItem(output, list + n);
     }
-    fprintf(output, "\t{ 0               T(N) }\t/* Terminate list */\n");
+    dump_AttrItem0(output);
     fprintf(output, "};\n");
     NOTE("");
+    free(list);
 }
 
 static void dump_src_HTTag(FILE *output, const SGML_dtd * dtd, int which)
@@ -298,8 +490,7 @@ static void dump_src_HTTag(FILE *output, const SGML_dtd * dtd, int which)
 	P_macro = "P0";
 #endif
     PrintF(output, 19, " { %s(%s),", P_macro, tag->name);
-    PrintF(output, 16, "%s_attr,", XXX_attr(dtd, which));
-    PrintF(output, 28, "HTML_%s_ATTRIBUTES,", NameOfAttrs(dtd, which));
+    PrintF(output, 24, "ATTR_DATA(%s), ", NameOfAttrs(dtd, which));
     PrintF(output, 14, "%s,", SGMLContent2s(tag->contents));
     fprintf(output, "T_%s", DEF_name(dtd, which));
     fprintf(output, "},\n");
@@ -307,11 +498,23 @@ static void dump_src_HTTag(FILE *output, const SGML_dtd * dtd, int which)
 
 static void dump_source(FILE *output, const SGML_dtd * dtd, int dtd_version)
 {
+    static AttrType generic_types[] =
+    {
+	ATTR_TYPE(core),
+	ATTR_TYPE(i18n),
+	ATTR_TYPE(events),
+	ATTR_TYPE(align),
+	ATTR_TYPE(cellalign),
+	ATTR_TYPE(bgcolor),
+	{0, 0}
+    };
+    AttrType *gt;
+
     const char *marker = "src_HTMLDTD_H";
     int j;
 
     unsigned count = 0;
-    AttrInfo *data = sorted_attrs(dtd, &count, 1);
+    AttrInfo *data = sorted_attrs(dtd, &count);
 
     fprintf(output, "/* %cLynxId%c */\n", '$', '$');
     fprintf(output, "#ifndef %s%d\n", marker, dtd_version);
@@ -344,6 +547,58 @@ static void dump_source(FILE *output, const SGML_dtd * dtd, int dtd_version)
     NOTE("#endif");
     NOTE("/* *INDENT-OFF* */");
     NOTE("");
+    NOTE("#define ATTR_TYPE(name) #name, name##_attr_list");
+    NOTE("");
+    NOTE("/* generic attributes, used in different tags */");
+    for (gt = generic_types; gt->name != 0; ++gt) {
+	dump_src_AttrType(output, gt->name, gt->list, 0);
+    }
+    NOTE("");
+    NOTE("/* tables defining attributes per-tag in terms of generic attributes (editable) */");
+    for (j = 0; j < (int) count; ++j) {
+	int which = data[j].which;
+
+	if (first_attrs(dtd, which)) {
+	    HTTag *tag = &(dtd->tags[which]);
+	    const AttrType *types = tag->attr_types;
+	    const char *name = NameOfAttrs(dtd, which);
+	    attr *list = 0;
+	    const char *from_attr[10];
+	    int from_size = 0;
+
+	    while (types->name != 0) {
+		from_attr[from_size++] = types->name;
+		if (!strcmp(types->name, name)) {
+		    list = copy_AttrList(types->list);
+		    for (gt = generic_types; gt->name != 0; ++gt) {
+			if (clean_AttrList(list, gt->list)) {
+			    int k;
+			    int found = 0;
+
+			    for (k = 0; k < from_size; ++k) {
+				if (!strcmp(from_attr[k], gt->name)) {
+				    found = 1;
+				    break;
+				}
+			    }
+			    if (!found)
+				from_attr[from_size++] = gt->name;
+			    break;
+			}
+		    }
+		}
+		++types;
+	    }
+	    from_attr[from_size] = 0;
+
+	    if (list != 0) {
+		dump_src_AttrType(output, name, list, from_attr);
+		free(list);
+	    }
+	}
+    }
+    NOTE("");
+    NOTE("/* attribute lists for the runtime (generated by dtd_util) */");
     for (j = 0; j < (int) count; ++j) {
 	dump_src_HTTag_Attrs(output, dtd, data[j].which);
     }
@@ -384,6 +639,8 @@ static void dump_source(FILE *output, const SGML_dtd * dtd, int dtd_version)
     NOTE("#define NULL_HTTag NULL_HTTag_");
     NOTE("#endif");
     NOTE("");
+    NOTE("#define ATTR_DATA(name) name##_attr, HTML_##name##_ATTRIBUTES, name##_attr_type");
+    NOTE("");
     NOTE("#endif /* once_HTMLDTD */");
     NOTE("/* *INDENT-OFF* */");
 
@@ -430,7 +687,7 @@ static void dump_header(FILE *output, const SGML_dtd * dtd)
     int j;
 
     unsigned count = 0;
-    AttrInfo *data = sorted_attrs(dtd, &count, 0);
+    AttrInfo *data = sorted_attrs(dtd, &count);
 
     fprintf(output, "/* %cLynxId%c */\n", '$', '$');
     fprintf(output, "#ifndef %s\n", marker);
@@ -495,7 +752,10 @@ static void dump_header(FILE *output, const SGML_dtd * dtd)
     fprintf(output, "#endif\t\t\t\t/* %s */\n", marker);
 }
 
-static void dump_flat_attrs(FILE *output, const char *name, const attr * attributes, int number_of_attributes)
+static void dump_flat_attrs(FILE *output,
+			    const char *name,
+			    const attr * attributes,
+			    int number_of_attributes)
 {
     int n;
 
@@ -575,7 +835,7 @@ static void dump_flat_HTTag(FILE *output, unsigned n, HTTag * tag)
 #ifdef EXP_JUSTIFY_ELTS
     fprintf(output, "\t\t%s\n", tag->can_justify ? "justify" : "nojustify");
 #endif
-    dump_flat_attrs(output, "attributes", tag->attributes, tag->number_of_attributes);
+    dump_flat_attrs(output, "attributes", tag->attributes, AttrCount(tag));
     dump_flat_SGMLContent(output, "contents", tag->contents);
     dump_flat_TagClass(output, "tagclass", tag->tagclass);
     dump_flat_TagClass(output, "contains", tag->contains);
diff --git a/WWW/Library/Implementation/hdr_HTMLDTD.h b/WWW/Library/Implementation/hdr_HTMLDTD.h
index d0850283..2dee030e 100644
--- a/WWW/Library/Implementation/hdr_HTMLDTD.h
+++ b/WWW/Library/Implementation/hdr_HTMLDTD.h
@@ -1,4 +1,4 @@
-/* $LynxId: hdr_HTMLDTD.h,v 1.2 2008/07/06 18:16:18 tom Exp $ */
+/* $LynxId: hdr_HTMLDTD.h,v 1.19 2008/09/20 14:25:27 tom Exp $ */
 #ifndef hdr_HTMLDTD_H
 #define hdr_HTMLDTD_H 1
 
@@ -168,15 +168,15 @@ extern "C" {
 #define HTML_A_COORDS             4
 #define HTML_A_DIR                5
 #define HTML_A_HREF               6
-#define HTML_A_ID                 7
-#define HTML_A_ISMAP              8
-#define HTML_A_LANG               9
-#define HTML_A_MD                10
-#define HTML_A_NAME              11
-#define HTML_A_NOTAB             12
-#define HTML_A_ONCLICK           13
-#define HTML_A_ONMOUSEOUT        14
-#define HTML_A_ONMOUSEOVER       15
+#define HTML_A_HREFLANG           7
+#define HTML_A_ID                 8
+#define HTML_A_ISMAP              9
+#define HTML_A_LANG              10
+#define HTML_A_MD                11
+#define HTML_A_NAME              12
+#define HTML_A_NOTAB             13
+#define HTML_A_ONBLUR            14
+#define HTML_A_ONFOCUS           15
 #define HTML_A_REL               16
 #define HTML_A_REV               17
 #define HTML_A_SHAPE             18
@@ -217,19 +217,19 @@ extern "C" {
 #define HTML_APPLET_WIDTH        16
 #define HTML_APPLET_ATTRIBUTES   17
 
-#define HTML_AREA_ALT             0
-#define HTML_AREA_CLASS           1
-#define HTML_AREA_CLEAR           2
-#define HTML_AREA_COORDS          3
-#define HTML_AREA_DIR             4
-#define HTML_AREA_HREF            5
-#define HTML_AREA_ID              6
-#define HTML_AREA_LANG            7
-#define HTML_AREA_NOHREF          8
-#define HTML_AREA_NOTAB           9
-#define HTML_AREA_ONCLICK        10
-#define HTML_AREA_ONMOUSEOUT     11
-#define HTML_AREA_ONMOUSEOVER    12
+#define HTML_AREA_ACCESSKEY       0
+#define HTML_AREA_ALT             1
+#define HTML_AREA_CLASS           2
+#define HTML_AREA_CLEAR           3
+#define HTML_AREA_COORDS          4
+#define HTML_AREA_DIR             5
+#define HTML_AREA_HREF            6
+#define HTML_AREA_ID              7
+#define HTML_AREA_LANG            8
+#define HTML_AREA_NOHREF          9
+#define HTML_AREA_NOTAB          10
+#define HTML_AREA_ONBLUR         11
+#define HTML_AREA_ONFOCUS        12
 #define HTML_AREA_SHAPE          13
 #define HTML_AREA_STYLE          14
 #define HTML_AREA_TABINDEX       15
@@ -237,10 +237,13 @@ extern "C" {
 #define HTML_AREA_TITLE          17
 #define HTML_AREA_ATTRIBUTES     18
 
-#define HTML_BASE_HREF            0
-#define HTML_BASE_TARGET          1
-#define HTML_BASE_TITLE           2
-#define HTML_BASE_ATTRIBUTES      3
+#define HTML_BASE_CLASS           0
+#define HTML_BASE_HREF            1
+#define HTML_BASE_ID              2
+#define HTML_BASE_STYLE           3
+#define HTML_BASE_TARGET          4
+#define HTML_BASE_TITLE           5
+#define HTML_BASE_ATTRIBUTES      6
 
 #define HTML_BGSOUND_CLASS        0
 #define HTML_BGSOUND_CLEAR        1
@@ -297,21 +300,22 @@ extern "C" {
 #define HTML_BQ_TITLE             8
 #define HTML_BQ_ATTRIBUTES        9
 
-#define HTML_BUTTON_CLASS         0
-#define HTML_BUTTON_CLEAR         1
-#define HTML_BUTTON_DIR           2
-#define HTML_BUTTON_DISABLED      3
-#define HTML_BUTTON_ID            4
-#define HTML_BUTTON_LANG          5
-#define HTML_BUTTON_NAME          6
-#define HTML_BUTTON_ONBLUR        7
-#define HTML_BUTTON_ONFOCUS       8
-#define HTML_BUTTON_STYLE         9
-#define HTML_BUTTON_TABINDEX     10
-#define HTML_BUTTON_TITLE        11
-#define HTML_BUTTON_TYPE         12
-#define HTML_BUTTON_VALUE        13
-#define HTML_BUTTON_ATTRIBUTES   14
+#define HTML_BUTTON_ACCESSKEY     0
+#define HTML_BUTTON_CLASS         1
+#define HTML_BUTTON_CLEAR         2
+#define HTML_BUTTON_DIR           3
+#define HTML_BUTTON_DISABLED      4
+#define HTML_BUTTON_ID            5
+#define HTML_BUTTON_LANG          6
+#define HTML_BUTTON_NAME          7
+#define HTML_BUTTON_ONBLUR        8
+#define HTML_BUTTON_ONFOCUS       9
+#define HTML_BUTTON_STYLE        10
+#define HTML_BUTTON_TABINDEX     11
+#define HTML_BUTTON_TITLE        12
+#define HTML_BUTTON_TYPE         13
+#define HTML_BUTTON_VALUE        14
+#define HTML_BUTTON_ATTRIBUTES   15
 
 #define HTML_CAPTION_ACCESSKEY    0
 #define HTML_CAPTION_ALIGN        1
@@ -348,6 +352,16 @@ extern "C" {
 #define HTML_CREDIT_TITLE         6
 #define HTML_CREDIT_ATTRIBUTES    7
 
+#define HTML_DEL_CITE             0
+#define HTML_DEL_CLASS            1
+#define HTML_DEL_DATETIME         2
+#define HTML_DEL_DIR              3
+#define HTML_DEL_ID               4
+#define HTML_DEL_LANG             5
+#define HTML_DEL_STYLE            6
+#define HTML_DEL_TITLE            7
+#define HTML_DEL_ATTRIBUTES       8
+
 #define HTML_DIV_ALIGN            0
 #define HTML_DIV_CLASS            1
 #define HTML_DIV_CLEAR            2
@@ -437,38 +451,48 @@ extern "C" {
 #define HTML_FONT_ID              6
 #define HTML_FONT_LANG            7
 #define HTML_FONT_SIZE            8
-#define HTML_FONT_ATTRIBUTES      9
-
-#define HTML_FORM_ACCEPT_CHARSET  0
-#define HTML_FORM_ACTION          1
-#define HTML_FORM_CLASS           2
-#define HTML_FORM_CLEAR           3
-#define HTML_FORM_DIR             4
-#define HTML_FORM_ENCTYPE         5
-#define HTML_FORM_ID              6
-#define HTML_FORM_LANG            7
-#define HTML_FORM_METHOD          8
-#define HTML_FORM_ONSUBMIT        9
-#define HTML_FORM_SCRIPT         10
-#define HTML_FORM_STYLE          11
-#define HTML_FORM_SUBJECT        12
-#define HTML_FORM_TARGET         13
-#define HTML_FORM_TITLE          14
-#define HTML_FORM_ATTRIBUTES     15
-
-#define HTML_FRAME_ID             0
-#define HTML_FRAME_LONGDESC       1
-#define HTML_FRAME_MARGINHEIGHT   2
-#define HTML_FRAME_MARGINWIDTH    3
-#define HTML_FRAME_NAME           4
-#define HTML_FRAME_NORESIZE       5
-#define HTML_FRAME_SCROLLING      6
-#define HTML_FRAME_SRC            7
-#define HTML_FRAME_ATTRIBUTES     8
+#define HTML_FONT_STYLE           9
+#define HTML_FONT_TITLE          10
+#define HTML_FONT_ATTRIBUTES     11
+
+#define HTML_FORM_ACCEPT          0
+#define HTML_FORM_ACCEPT_CHARSET  1
+#define HTML_FORM_ACTION          2
+#define HTML_FORM_CLASS           3
+#define HTML_FORM_CLEAR           4
+#define HTML_FORM_DIR             5
+#define HTML_FORM_ENCTYPE         6
+#define HTML_FORM_ID              7
+#define HTML_FORM_LANG            8
+#define HTML_FORM_METHOD          9
+#define HTML_FORM_ONRESET        10
+#define HTML_FORM_ONSUBMIT       11
+#define HTML_FORM_SCRIPT         12
+#define HTML_FORM_STYLE          13
+#define HTML_FORM_SUBJECT        14
+#define HTML_FORM_TARGET         15
+#define HTML_FORM_TITLE          16
+#define HTML_FORM_ATTRIBUTES     17
+
+#define HTML_FRAME_CLASS          0
+#define HTML_FRAME_FRAMEBORDER    1
+#define HTML_FRAME_ID             2
+#define HTML_FRAME_LONGDESC       3
+#define HTML_FRAME_MARGINHEIGHT   4
+#define HTML_FRAME_MARGINWIDTH    5
+#define HTML_FRAME_NAME           6
+#define HTML_FRAME_NORESIZE       7
+#define HTML_FRAME_SCROLLING      8
+#define HTML_FRAME_SRC            9
+#define HTML_FRAME_STYLE         10
+#define HTML_FRAME_TITLE         11
+#define HTML_FRAME_ATTRIBUTES    12
 
 #define HTML_FRAMESET_COLS        0
-#define HTML_FRAMESET_ROWS        1
-#define HTML_FRAMESET_ATTRIBUTES  2
+#define HTML_FRAMESET_ONLOAD      1
+#define HTML_FRAMESET_ONUNLOAD    2
+#define HTML_FRAMESET_ROWS        3
+#define HTML_FRAMESET_ATTRIBUTES  4
 
 #define HTML_GEN_CLASS            0
 #define HTML_GEN_CLEAR            1
@@ -500,28 +524,31 @@ extern "C" {
 #define HTML_HR_CLEAR             2
 #define HTML_HR_DIR               3
 #define HTML_HR_ID                4
-#define HTML_HR_MD                5
-#define HTML_HR_NOSHADE           6
-#define HTML_HR_SIZE              7
-#define HTML_HR_SRC               8
-#define HTML_HR_STYLE             9
-#define HTML_HR_TITLE            10
-#define HTML_HR_WIDTH            11
-#define HTML_HR_ATTRIBUTES       12
+#define HTML_HR_LANG              5
+#define HTML_HR_MD                6
+#define HTML_HR_NOSHADE           7
+#define HTML_HR_SIZE              8
+#define HTML_HR_SRC               9
+#define HTML_HR_STYLE            10
+#define HTML_HR_TITLE            11
+#define HTML_HR_WIDTH            12
+#define HTML_HR_ATTRIBUTES       13
 
 #define HTML_IFRAME_ALIGN         0
-#define HTML_IFRAME_FRAMEBORDER   1
-#define HTML_IFRAME_HEIGHT        2
-#define HTML_IFRAME_ID            3
-#define HTML_IFRAME_LONGDESC      4
-#define HTML_IFRAME_MARGINHEIGHT  5
-#define HTML_IFRAME_MARGINWIDTH   6
-#define HTML_IFRAME_NAME          7
-#define HTML_IFRAME_SCROLLING     8
-#define HTML_IFRAME_SRC           9
-#define HTML_IFRAME_STYLE        10
-#define HTML_IFRAME_WIDTH        11
-#define HTML_IFRAME_ATTRIBUTES   12
+#define HTML_IFRAME_CLASS         1
+#define HTML_IFRAME_FRAMEBORDER   2
+#define HTML_IFRAME_HEIGHT        3
+#define HTML_IFRAME_ID            4
+#define HTML_IFRAME_LONGDESC      5
+#define HTML_IFRAME_MARGINHEIGHT  6
+#define HTML_IFRAME_MARGINWIDTH   7
+#define HTML_IFRAME_NAME          8
+#define HTML_IFRAME_SCROLLING     9
+#define HTML_IFRAME_SRC          10
+#define HTML_IFRAME_STYLE        11
+#define HTML_IFRAME_TITLE        12
+#define HTML_IFRAME_WIDTH        13
+#define HTML_IFRAME_ATTRIBUTES   14
 
 #define HTML_IMG_ALIGN            0
 #define HTML_IMG_ALT              1
@@ -530,62 +557,70 @@ extern "C" {
 #define HTML_IMG_CLEAR            4
 #define HTML_IMG_DIR              5
 #define HTML_IMG_HEIGHT           6
-#define HTML_IMG_ID               7
-#define HTML_IMG_ISMAP            8
-#define HTML_IMG_ISOBJECT         9
-#define HTML_IMG_LANG            10
-#define HTML_IMG_LONGDESC        11
-#define HTML_IMG_MD              12
-#define HTML_IMG_SRC             13
-#define HTML_IMG_STYLE           14
-#define HTML_IMG_TITLE           15
-#define HTML_IMG_UNITS           16
-#define HTML_IMG_USEMAP          17
-#define HTML_IMG_WIDTH           18
-#define HTML_IMG_ATTRIBUTES      19
+#define HTML_IMG_HSPACE           7
+#define HTML_IMG_ID               8
+#define HTML_IMG_ISMAP            9
+#define HTML_IMG_ISOBJECT        10
+#define HTML_IMG_LANG            11
+#define HTML_IMG_LONGDESC        12
+#define HTML_IMG_MD              13
+#define HTML_IMG_NAME            14
+#define HTML_IMG_SRC             15
+#define HTML_IMG_STYLE           16
+#define HTML_IMG_TITLE           17
+#define HTML_IMG_UNITS           18
+#define HTML_IMG_USEMAP          19
+#define HTML_IMG_VSPACE          20
+#define HTML_IMG_WIDTH           21
+#define HTML_IMG_ATTRIBUTES      22
 
 #define HTML_INPUT_ACCEPT         0
 #define HTML_INPUT_ACCEPT_CHARSET 1
-#define HTML_INPUT_ALIGN          2
-#define HTML_INPUT_ALT            3
-#define HTML_INPUT_CHECKED        4
-#define HTML_INPUT_CLASS          5
-#define HTML_INPUT_CLEAR          6
-#define HTML_INPUT_DIR            7
-#define HTML_INPUT_DISABLED       8
-#define HTML_INPUT_ERROR          9
-#define HTML_INPUT_HEIGHT        10
-#define HTML_INPUT_ID            11
-#define HTML_INPUT_LANG          12
-#define HTML_INPUT_MAX           13
-#define HTML_INPUT_MAXLENGTH     14
-#define HTML_INPUT_MD            15
-#define HTML_INPUT_MIN           16
-#define HTML_INPUT_NAME          17
-#define HTML_INPUT_NOTAB         18
-#define HTML_INPUT_ONBLUR        19
-#define HTML_INPUT_ONCHANGE      20
-#define HTML_INPUT_ONCLICK       21
-#define HTML_INPUT_ONFOCUS       22
-#define HTML_INPUT_ONSELECT      23
-#define HTML_INPUT_SIZE          24
-#define HTML_INPUT_SRC           25
-#define HTML_INPUT_STYLE         26
-#define HTML_INPUT_TABINDEX      27
-#define HTML_INPUT_TITLE         28
-#define HTML_INPUT_TYPE          29
-#define HTML_INPUT_VALUE         30
-#define HTML_INPUT_WIDTH         31
-#define HTML_INPUT_ATTRIBUTES    32
+#define HTML_INPUT_ACCESSKEY      2
+#define HTML_INPUT_ALIGN          3
+#define HTML_INPUT_ALT            4
+#define HTML_INPUT_CHECKED        5
+#define HTML_INPUT_CLASS          6
+#define HTML_INPUT_CLEAR          7
+#define HTML_INPUT_DIR            8
+#define HTML_INPUT_DISABLED       9
+#define HTML_INPUT_ERROR         10
+#define HTML_INPUT_HEIGHT        11
+#define HTML_INPUT_ID            12
+#define HTML_INPUT_ISMAP         13
+#define HTML_INPUT_LANG          14
+#define HTML_INPUT_MAX           15
+#define HTML_INPUT_MAXLENGTH     16
+#define HTML_INPUT_MD            17
+#define HTML_INPUT_MIN           18
+#define HTML_INPUT_NAME          19
+#define HTML_INPUT_NOTAB         20
+#define HTML_INPUT_ONBLUR        21
+#define HTML_INPUT_ONCHANGE      22
+#define HTML_INPUT_ONFOCUS       23
+#define HTML_INPUT_ONSELECT      24
+#define HTML_INPUT_READONLY      25
+#define HTML_INPUT_SIZE          26
+#define HTML_INPUT_SRC           27
+#define HTML_INPUT_STYLE         28
+#define HTML_INPUT_TABINDEX      29
+#define HTML_INPUT_TITLE         30
+#define HTML_INPUT_TYPE          31
+#define HTML_INPUT_USEMAP        32
+#define HTML_INPUT_VALUE         33
+#define HTML_INPUT_WIDTH         34
+#define HTML_INPUT_ATTRIBUTES    35
 
 #define HTML_ISINDEX_ACTION       0
-#define HTML_ISINDEX_DIR          1
-#define HTML_ISINDEX_HREF         2
-#define HTML_ISINDEX_ID           3
-#define HTML_ISINDEX_LANG         4
-#define HTML_ISINDEX_PROMPT       5
-#define HTML_ISINDEX_TITLE        6
-#define HTML_ISINDEX_ATTRIBUTES   7
+#define HTML_ISINDEX_CLASS        1
+#define HTML_ISINDEX_DIR          2
+#define HTML_ISINDEX_HREF         3
+#define HTML_ISINDEX_ID           4
+#define HTML_ISINDEX_LANG         5
+#define HTML_ISINDEX_PROMPT       6
+#define HTML_ISINDEX_STYLE        7
+#define HTML_ISINDEX_TITLE        8
+#define HTML_ISINDEX_ATTRIBUTES   9
 
 #define HTML_KEYGEN_CHALLENGE     0
 #define HTML_KEYGEN_CLASS         1
@@ -604,10 +639,11 @@ extern "C" {
 #define HTML_LABEL_FOR            4
 #define HTML_LABEL_ID             5
 #define HTML_LABEL_LANG           6
-#define HTML_LABEL_ONCLICK        7
-#define HTML_LABEL_STYLE          8
-#define HTML_LABEL_TITLE          9
-#define HTML_LABEL_ATTRIBUTES    10
+#define HTML_LABEL_ONBLUR         7
+#define HTML_LABEL_ONFOCUS        8
+#define HTML_LABEL_STYLE          9
+#define HTML_LABEL_TITLE         10
+#define HTML_LABEL_ATTRIBUTES    11
 
 #define HTML_LEGEND_ACCESSKEY     0
 #define HTML_LEGEND_ALIGN         1
@@ -637,16 +673,19 @@ extern "C" {
 
 #define HTML_LINK_CHARSET         0
 #define HTML_LINK_CLASS           1
-#define HTML_LINK_HREF            2
-#define HTML_LINK_ID              3
-#define HTML_LINK_MEDIA           4
-#define HTML_LINK_REL             5
-#define HTML_LINK_REV             6
-#define HTML_LINK_STYLE           7
-#define HTML_LINK_TARGET          8
-#define HTML_LINK_TITLE           9
-#define HTML_LINK_TYPE           10
-#define HTML_LINK_ATTRIBUTES     11
+#define HTML_LINK_DIR             2
+#define HTML_LINK_HREF            3
+#define HTML_LINK_HREFLANG        4
+#define HTML_LINK_ID              5
+#define HTML_LINK_LANG            6
+#define HTML_LINK_MEDIA           7
+#define HTML_LINK_REL             8
+#define HTML_LINK_REV             9
+#define HTML_LINK_STYLE          10
+#define HTML_LINK_TARGET         11
+#define HTML_LINK_TITLE          12
+#define HTML_LINK_TYPE           13
+#define HTML_LINK_ATTRIBUTES     14
 
 #define HTML_MAP_CLASS            0
 #define HTML_MAP_CLEAR            1
@@ -671,7 +710,8 @@ extern "C" {
 #define HTML_META_CONTENT         0
 #define HTML_META_HTTP_EQUIV      1
 #define HTML_META_NAME            2
-#define HTML_META_ATTRIBUTES      3
+#define HTML_META_SCHEME          3
+#define HTML_META_ATTRIBUTES      4
 
 #define HTML_NEXTID_N             0
 #define HTML_NEXTID_ATTRIBUTES    1
@@ -689,31 +729,32 @@ extern "C" {
 #define HTML_NOTE_ATTRIBUTES     10
 
 #define HTML_OBJECT_ALIGN         0
-#define HTML_OBJECT_BORDER        1
-#define HTML_OBJECT_CLASS         2
-#define HTML_OBJECT_CLASSID       3
-#define HTML_OBJECT_CODEBASE      4
-#define HTML_OBJECT_CODETYPE      5
-#define HTML_OBJECT_DATA          6
-#define HTML_OBJECT_DECLARE       7
-#define HTML_OBJECT_DIR           8
-#define HTML_OBJECT_HEIGHT        9
-#define HTML_OBJECT_HSPACE       10
-#define HTML_OBJECT_ID           11
-#define HTML_OBJECT_ISMAP        12
-#define HTML_OBJECT_LANG         13
-#define HTML_OBJECT_NAME         14
-#define HTML_OBJECT_NOTAB        15
-#define HTML_OBJECT_SHAPES       16
-#define HTML_OBJECT_STANDBY      17
-#define HTML_OBJECT_STYLE        18
-#define HTML_OBJECT_TABINDEX     19
-#define HTML_OBJECT_TITLE        20
-#define HTML_OBJECT_TYPE         21
-#define HTML_OBJECT_USEMAP       22
-#define HTML_OBJECT_VSPACE       23
-#define HTML_OBJECT_WIDTH        24
-#define HTML_OBJECT_ATTRIBUTES   25
+#define HTML_OBJECT_ARCHIVE       1
+#define HTML_OBJECT_BORDER        2
+#define HTML_OBJECT_CLASS         3
+#define HTML_OBJECT_CLASSID       4
+#define HTML_OBJECT_CODEBASE      5
+#define HTML_OBJECT_CODETYPE      6
+#define HTML_OBJECT_DATA          7
+#define HTML_OBJECT_DECLARE       8
+#define HTML_OBJECT_DIR           9
+#define HTML_OBJECT_HEIGHT       10
+#define HTML_OBJECT_HSPACE       11
+#define HTML_OBJECT_ID           12
+#define HTML_OBJECT_ISMAP        13
+#define HTML_OBJECT_LANG         14
+#define HTML_OBJECT_NAME         15
+#define HTML_OBJECT_NOTAB        16
+#define HTML_OBJECT_SHAPES       17
+#define HTML_OBJECT_STANDBY      18
+#define HTML_OBJECT_STYLE        19
+#define HTML_OBJECT_TABINDEX     20
+#define HTML_OBJECT_TITLE        21
+#define HTML_OBJECT_TYPE         22
+#define HTML_OBJECT_USEMAP       23
+#define HTML_OBJECT_VSPACE       24
+#define HTML_OBJECT_WIDTH        25
+#define HTML_OBJECT_ATTRIBUTES   26
 
 #define HTML_OL_CLASS             0
 #define HTML_OL_CLEAR             1
@@ -735,13 +776,14 @@ extern "C" {
 #define HTML_OPTION_DISABLED      3
 #define HTML_OPTION_ERROR         4
 #define HTML_OPTION_ID            5
-#define HTML_OPTION_LANG          6
-#define HTML_OPTION_SELECTED      7
-#define HTML_OPTION_SHAPE         8
-#define HTML_OPTION_STYLE         9
-#define HTML_OPTION_TITLE        10
-#define HTML_OPTION_VALUE        11
-#define HTML_OPTION_ATTRIBUTES   12
+#define HTML_OPTION_LABEL         6
+#define HTML_OPTION_LANG          7
+#define HTML_OPTION_SELECTED      8
+#define HTML_OPTION_SHAPE         9
+#define HTML_OPTION_STYLE        10
+#define HTML_OPTION_TITLE        11
+#define HTML_OPTION_VALUE        12
+#define HTML_OPTION_ATTRIBUTES   13
 
 #define HTML_OVERLAY_CLASS        0
 #define HTML_OVERLAY_HEIGHT       1
@@ -788,21 +830,33 @@ extern "C" {
 #define HTML_PARAM_VALUETYPE     17
 #define HTML_PARAM_ATTRIBUTES    18
 
-#define HTML_SCRIPT_CLASS         0
-#define HTML_SCRIPT_CLEAR         1
-#define HTML_SCRIPT_DIR           2
-#define HTML_SCRIPT_EVENT         3
-#define HTML_SCRIPT_FOR           4
-#define HTML_SCRIPT_ID            5
-#define HTML_SCRIPT_LANG          6
-#define HTML_SCRIPT_LANGUAGE      7
-#define HTML_SCRIPT_NAME          8
-#define HTML_SCRIPT_SCRIPTENGINE  9
-#define HTML_SCRIPT_SRC          10
-#define HTML_SCRIPT_STYLE        11
-#define HTML_SCRIPT_TITLE        12
-#define HTML_SCRIPT_TYPE         13
-#define HTML_SCRIPT_ATTRIBUTES   14
+#define HTML_Q_CITE               0
+#define HTML_Q_CLASS              1
+#define HTML_Q_CLEAR              2
+#define HTML_Q_DIR                3
+#define HTML_Q_ID                 4
+#define HTML_Q_LANG               5
+#define HTML_Q_STYLE              6
+#define HTML_Q_TITLE              7
+#define HTML_Q_ATTRIBUTES         8
+
+#define HTML_SCRIPT_CHARSET       0
+#define HTML_SCRIPT_CLASS         1
+#define HTML_SCRIPT_CLEAR         2
+#define HTML_SCRIPT_DEFER         3
+#define HTML_SCRIPT_DIR           4
+#define HTML_SCRIPT_EVENT         5
+#define HTML_SCRIPT_FOR           6
+#define HTML_SCRIPT_ID            7
+#define HTML_SCRIPT_LANG          8
+#define HTML_SCRIPT_LANGUAGE      9
+#define HTML_SCRIPT_NAME         10
+#define HTML_SCRIPT_SCRIPTENGINE 11
+#define HTML_SCRIPT_SRC          12
+#define HTML_SCRIPT_STYLE        13
+#define HTML_SCRIPT_TITLE        14
+#define HTML_SCRIPT_TYPE         15
+#define HTML_SCRIPT_ATTRIBUTES   16
 
 #define HTML_SELECT_ALIGN         0
 #define HTML_SELECT_CLASS         1
@@ -828,11 +882,16 @@ extern "C" {
 #define HTML_SELECT_WIDTH        21
 #define HTML_SELECT_ATTRIBUTES   22
 
-#define HTML_STYLE_DIR            0
-#define HTML_STYLE_LANG           1
-#define HTML_STYLE_NOTATION       2
-#define HTML_STYLE_TITLE          3
-#define HTML_STYLE_ATTRIBUTES     4
+#define HTML_STYLE_CLASS          0
+#define HTML_STYLE_DIR            1
+#define HTML_STYLE_ID             2
+#define HTML_STYLE_LANG           3
+#define HTML_STYLE_MEDIA          4
+#define HTML_STYLE_NOTATION       5
+#define HTML_STYLE_STYLE          6
+#define HTML_STYLE_TITLE          7
+#define HTML_STYLE_TYPE           8
+#define HTML_STYLE_ATTRIBUTES     9
 
 #define HTML_TAB_ALIGN            0
 #define HTML_TAB_CLASS            1
@@ -871,49 +930,54 @@ extern "C" {
 #define HTML_TABLE_WIDTH         21
 #define HTML_TABLE_ATTRIBUTES    22
 
-#define HTML_TD_ALIGN             0
-#define HTML_TD_AXES              1
-#define HTML_TD_AXIS              2
-#define HTML_TD_BACKGROUND        3
-#define HTML_TD_CHAR              4
-#define HTML_TD_CHAROFF           5
-#define HTML_TD_CLASS             6
-#define HTML_TD_CLEAR             7
-#define HTML_TD_COLSPAN           8
-#define HTML_TD_DIR               9
-#define HTML_TD_DP               10
-#define HTML_TD_HEIGHT           11
-#define HTML_TD_ID               12
-#define HTML_TD_LANG             13
-#define HTML_TD_NOWRAP           14
-#define HTML_TD_ROWSPAN          15
-#define HTML_TD_STYLE            16
-#define HTML_TD_TITLE            17
-#define HTML_TD_VALIGN           18
-#define HTML_TD_WIDTH            19
-#define HTML_TD_ATTRIBUTES       20
+#define HTML_TD_ABBR              0
+#define HTML_TD_ALIGN             1
+#define HTML_TD_AXES              2
+#define HTML_TD_AXIS              3
+#define HTML_TD_BACKGROUND        4
+#define HTML_TD_CHAR              5
+#define HTML_TD_CHAROFF           6
+#define HTML_TD_CLASS             7
+#define HTML_TD_CLEAR             8
+#define HTML_TD_COLSPAN           9
+#define HTML_TD_DIR              10
+#define HTML_TD_DP               11
+#define HTML_TD_HEADERS          12
+#define HTML_TD_HEIGHT           13
+#define HTML_TD_ID               14
+#define HTML_TD_LANG             15
+#define HTML_TD_NOWRAP           16
+#define HTML_TD_ROWSPAN          17
+#define HTML_TD_SCOPE            18
+#define HTML_TD_STYLE            19
+#define HTML_TD_TITLE            20
+#define HTML_TD_VALIGN           21
+#define HTML_TD_WIDTH            22
+#define HTML_TD_ATTRIBUTES       23
 
 #define HTML_TEXTAREA_ACCEPT_CHARSET 0
-#define HTML_TEXTAREA_ALIGN       1
-#define HTML_TEXTAREA_CLASS       2
-#define HTML_TEXTAREA_CLEAR       3
-#define HTML_TEXTAREA_COLS        4
-#define HTML_TEXTAREA_DIR         5
-#define HTML_TEXTAREA_DISABLED    6
-#define HTML_TEXTAREA_ERROR       7
-#define HTML_TEXTAREA_ID          8
-#define HTML_TEXTAREA_LANG        9
-#define HTML_TEXTAREA_NAME       10
-#define HTML_TEXTAREA_NOTAB      11
-#define HTML_TEXTAREA_ONBLUR     12
-#define HTML_TEXTAREA_ONCHANGE   13
-#define HTML_TEXTAREA_ONFOCUS    14
-#define HTML_TEXTAREA_ONSELECT   15
-#define HTML_TEXTAREA_ROWS       16
-#define HTML_TEXTAREA_STYLE      17
-#define HTML_TEXTAREA_TABINDEX   18
-#define HTML_TEXTAREA_TITLE      19
-#define HTML_TEXTAREA_ATTRIBUTES 20
+#define HTML_TEXTAREA_ACCESSKEY   1
+#define HTML_TEXTAREA_ALIGN       2
+#define HTML_TEXTAREA_CLASS       3
+#define HTML_TEXTAREA_CLEAR       4
+#define HTML_TEXTAREA_COLS        5
+#define HTML_TEXTAREA_DIR         6
+#define HTML_TEXTAREA_DISABLED    7
+#define HTML_TEXTAREA_ERROR       8
+#define HTML_TEXTAREA_ID          9
+#define HTML_TEXTAREA_LANG       10
+#define HTML_TEXTAREA_NAME       11
+#define HTML_TEXTAREA_NOTAB      12
+#define HTML_TEXTAREA_ONBLUR     13
+#define HTML_TEXTAREA_ONCHANGE   14
+#define HTML_TEXTAREA_ONFOCUS    15
+#define HTML_TEXTAREA_ONSELECT   16
+#define HTML_TEXTAREA_READONLY   17
+#define HTML_TEXTAREA_ROWS       18
+#define HTML_TEXTAREA_STYLE      19
+#define HTML_TEXTAREA_TABINDEX   20
+#define HTML_TEXTAREA_TITLE      21
+#define HTML_TEXTAREA_ATTRIBUTES 22
 
 #define HTML_TR_ALIGN             0
 #define HTML_TR_CHAR              1
diff --git a/WWW/Library/Implementation/src0_HTMLDTD.h b/WWW/Library/Implementation/src0_HTMLDTD.h
index 19431ef7..86e0da38 100644
--- a/WWW/Library/Implementation/src0_HTMLDTD.h
+++ b/WWW/Library/Implementation/src0_HTMLDTD.h
@@ -1,4 +1,4 @@
-/* $LynxId: src0_HTMLDTD.h,v 1.9 2008/09/16 23:47:45 tom Exp $ */
+/* $LynxId: src0_HTMLDTD.h,v 1.39 2008/09/20 14:25:27 tom Exp $ */
 #ifndef src_HTMLDTD_H0
 #define src_HTMLDTD_H0 1
 
@@ -137,7 +137,1136 @@
 #endif
 /* *INDENT-OFF* */
 
-static const attr a_attr[] = {          /* A attributes */
+#define ATTR_TYPE(name) #name, name##_attr_list
+
+/* generic attributes, used in different tags */
+static const attr core_attr_list[] = {
+	{ "CLASS"         T(c) },
+	{ "ID"            T(i) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType core_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ 0, 0 },
+};
+
+static const attr i18n_attr_list[] = {
+	{ "DIR"           T(N) },
+	{ "LANG"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType i18n_attr_type[] = {
+	{ ATTR_TYPE(i18n) },
+	{ 0, 0 },
+};
+
+static const attr events_attr_list[] = {
+	{ "ONCLICK"       T(N) },
+	{ "ONDBLCLICK"    T(N) },
+	{ "ONKEYDOWN"     T(N) },
+	{ "ONKEYPRESS"    T(N) },
+	{ "ONKEYUP"       T(N) },
+	{ "ONMOUSEDOWN"   T(N) },
+	{ "ONMOUSEMOVE"   T(N) },
+	{ "ONMOUSEOUT"    T(N) },
+	{ "ONMOUSEOVER"   T(N) },
+	{ "ONMOUSEUP"     T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType events_attr_type[] = {
+	{ ATTR_TYPE(events) },
+	{ 0, 0 },
+};
+
+static const attr align_attr_list[] = {
+	{ "ALIGN"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType align_attr_type[] = {
+	{ ATTR_TYPE(align) },
+	{ 0, 0 },
+};
+
+static const attr cellalign_attr_list[] = {
+	{ "ALIGN"         T(N) },
+	{ "CHAR"          T(N) },
+	{ "CHAROFF"       T(N) },
+	{ "VALIGN"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType cellalign_attr_type[] = {
+	{ ATTR_TYPE(cellalign) },
+	{ 0, 0 },
+};
+
+static const attr bgcolor_attr_list[] = {
+	{ "BGCOLOR"       T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType bgcolor_attr_type[] = {
+	{ ATTR_TYPE(bgcolor) },
+	{ 0, 0 },
+};
+
+
+/* tables defining attributes per-tag in terms of generic attributes (editable) */
+static const attr A_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CHARSET"       T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COORDS"        T(N) },
+	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
+	{ "ISMAP"         T(N) },
+	{ "MD"            T(N) },
+	{ "NAME"          T(i) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "REL"           T(N) },
+	{ "REV"           T(N) },
+	{ "SHAPE"         T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TARGET"        T(N) },
+	{ "TYPE"          T(N) },
+	{ "URN"           T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType A_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(A) },
+	{ 0, 0 },
+};
+
+static const attr ADDRESS_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType ADDRESS_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(ADDRESS) },
+	{ 0, 0 },
+};
+
+static const attr APPLET_attr_list[] = {
+	{ "ALT"           T(N) },
+	{ "CLEAR"         T(N) },
+	{ "CODE"          T(N) },
+	{ "CODEBASE"      T(h) },
+	{ "DOWNLOAD"      T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
+	{ "NAME"          T(i) },
+	{ "VSPACE"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType APPLET_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(APPLET) },
+	{ 0, 0 },
+};
+
+static const attr AREA_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "ALT"           T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COORDS"        T(N) },
+	{ "HREF"          T(h) },
+	{ "NOHREF"        T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "SHAPE"         T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TARGET"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType AREA_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(AREA) },
+	{ 0, 0 },
+};
+
+static const attr BASE_attr_list[] = {
+	{ "HREF"          T(h) },
+	{ "TARGET"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BASE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(BASE) },
+	{ 0, 0 },
+};
+
+static const attr BGSOUND_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "LOOP"          T(N) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BGSOUND_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BGSOUND) },
+	{ 0, 0 },
+};
+
+static const attr BODY_attr_list[] = {
+	{ "ALINK"         T(N) },
+	{ "BACKGROUND"    T(h) },
+	{ "CLEAR"         T(N) },
+	{ "LINK"          T(N) },
+	{ "ONLOAD"        T(N) },
+	{ "ONUNLOAD"      T(N) },
+	{ "TEXT"          T(N) },
+	{ "VLINK"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BODY_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BODY) },
+	{ ATTR_TYPE(bgcolor) },
+	{ 0, 0 },
+};
+
+static const attr BODYTEXT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DATA"          T(N) },
+	{ "NAME"          T(N) },
+	{ "OBJECT"        T(N) },
+	{ "REF"           T(N) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ "VALUETYPE"     T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BODYTEXT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BODYTEXT) },
+	{ 0, 0 },
+};
+
+static const attr BQ_attr_list[] = {
+	{ "CITE"          T(h) },
+	{ "CLEAR"         T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BQ_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BQ) },
+	{ 0, 0 },
+};
+
+static const attr BUTTON_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "NAME"          T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BUTTON_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(BUTTON) },
+	{ 0, 0 },
+};
+
+static const attr CAPTION_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType CAPTION_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(CAPTION) },
+	{ 0, 0 },
+};
+
+static const attr COL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "SPAN"          T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType COL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(COL) },
+	{ ATTR_TYPE(cellalign) },
+	{ 0, 0 },
+};
+
+static const attr CREDIT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType CREDIT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(CREDIT) },
+	{ 0, 0 },
+};
+
+static const attr DEL_attr_list[] = {
+	{ "CITE"          T(N) },
+	{ "DATETIME"      T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType DEL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(DEL) },
+	{ 0, 0 },
+};
+
+static const attr DIV_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType DIV_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(DIV) },
+	{ 0, 0 },
+};
+
+static const attr DL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COMPACT"       T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType DL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(DL) },
+	{ 0, 0 },
+};
+
+static const attr EMBED_attr_list[] = {
+	{ "ALT"           T(N) },
+	{ "BORDER"        T(N) },
+	{ "CLEAR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "IMAGEMAP"      T(N) },
+	{ "ISMAP"         T(N) },
+	{ "MD"            T(N) },
+	{ "NAME"          T(i) },
+	{ "NOFLOW"        T(N) },
+	{ "PARAMS"        T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "USEMAP"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType EMBED_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(EMBED) },
+	{ 0, 0 },
+};
+
+static const attr FIELDSET_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FIELDSET_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FIELDSET) },
+	{ 0, 0 },
+};
+
+static const attr FIG_attr_list[] = {
+	{ "BORDER"        T(N) },
+	{ "CLEAR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "IMAGEMAP"      T(N) },
+	{ "ISOBJECT"      T(N) },
+	{ "MD"            T(N) },
+	{ "NOFLOW"        T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FIG_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(FIG) },
+	{ 0, 0 },
+};
+
+static const attr FN_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FN_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FN) },
+	{ 0, 0 },
+};
+
+static const attr FONT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COLOR"         T(N) },
+	{ "END"           T(N) },
+	{ "FACE"          T(N) },
+	{ "SIZE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FONT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FONT) },
+	{ 0, 0 },
+};
+
+static const attr FORM_attr_list[] = {
+	{ "ACCEPT"        T(N) },
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACTION"        T(h) },
+	{ "CLEAR"         T(N) },
+	{ "ENCTYPE"       T(N) },
+	{ "METHOD"        T(N) },
+	{ "ONRESET"       T(N) },
+	{ "ONSUBMIT"      T(N) },
+	{ "SCRIPT"        T(N) },
+	{ "SUBJECT"       T(N) },
+	{ "TARGET"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FORM_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FORM) },
+	{ 0, 0 },
+};
+
+static const attr FRAME_attr_list[] = {
+	{ "FRAMEBORDER"   T(N) },
+	{ "LONGDESC"      T(h) },
+	{ "MARGINHEIGHT"  T(N) },
+	{ "MARGINWIDTH"   T(N) },
+	{ "NAME"          T(N) },
+	{ "NORESIZE"      T(N) },
+	{ "SCROLLING"     T(N) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FRAME_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(FRAME) },
+	{ 0, 0 },
+};
+
+static const attr FRAMESET_attr_list[] = {
+	{ "COLS"          T(N) },
+	{ "ONLOAD"        T(N) },
+	{ "ONUNLOAD"      T(N) },
+	{ "ROWS"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FRAMESET_attr_type[] = {
+	{ ATTR_TYPE(FRAMESET) },
+	{ 0, 0 },
+};
+
+static const attr GEN_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType GEN_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(GEN) },
+	{ 0, 0 },
+};
+
+static const attr H_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DINGBAT"       T(N) },
+	{ "MD"            T(N) },
+	{ "NOWRAP"        T(N) },
+	{ "SEQNUM"        T(N) },
+	{ "SKIP"          T(N) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType H_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(H) },
+	{ 0, 0 },
+};
+
+static const attr HR_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "MD"            T(N) },
+	{ "NOSHADE"       T(N) },
+	{ "SIZE"          T(N) },
+	{ "SRC"           T(h) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType HR_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(HR) },
+	{ 0, 0 },
+};
+
+static const attr IFRAME_attr_list[] = {
+	{ "FRAMEBORDER"   T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "LONGDESC"      T(h) },
+	{ "MARGINHEIGHT"  T(N) },
+	{ "MARGINWIDTH"   T(N) },
+	{ "NAME"          T(N) },
+	{ "SCROLLING"     T(N) },
+	{ "SRC"           T(h) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType IFRAME_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(IFRAME) },
+	{ 0, 0 },
+};
+
+static const attr IMG_attr_list[] = {
+	{ "ALT"           T(N) },
+	{ "BORDER"        T(N) },
+	{ "CLEAR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
+	{ "ISMAP"         T(N) },
+	{ "ISOBJECT"      T(N) },
+	{ "LONGDESC"      T(h) },
+	{ "MD"            T(N) },
+	{ "NAME"          T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "USEMAP"        T(h) },
+	{ "VSPACE"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType IMG_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(IMG) },
+	{ 0, 0 },
+};
+
+static const attr INPUT_attr_list[] = {
+	{ "ACCEPT"        T(N) },
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
+	{ "ALT"           T(N) },
+	{ "CHECKED"       T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "ISMAP"         T(N) },
+	{ "MAX"           T(N) },
+	{ "MAXLENGTH"     T(N) },
+	{ "MD"            T(N) },
+	{ "MIN"           T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONCHANGE"      T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
+	{ "SIZE"          T(N) },
+	{ "SRC"           T(h) },
+	{ "TABINDEX"      T(N) },
+	{ "TYPE"          T(N) },
+	{ "USEMAP"        T(N) },
+	{ "VALUE"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType INPUT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(INPUT) },
+	{ 0, 0 },
+};
+
+static const attr ISINDEX_attr_list[] = {
+	{ "ACTION"        T(h) },
+	{ "HREF"          T(h) },
+	{ "PROMPT"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType ISINDEX_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(ISINDEX) },
+	{ 0, 0 },
+};
+
+static const attr KEYGEN_attr_list[] = {
+	{ "CHALLENGE"     T(N) },
+	{ "NAME"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType KEYGEN_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(KEYGEN) },
+	{ 0, 0 },
+};
+
+static const attr LABEL_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ "FOR"           T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LABEL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(LABEL) },
+	{ 0, 0 },
+};
+
+static const attr LEGEND_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LEGEND_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(LEGEND) },
+	{ 0, 0 },
+};
+
+static const attr LI_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DINGBAT"       T(N) },
+	{ "MD"            T(N) },
+	{ "SKIP"          T(N) },
+	{ "SRC"           T(h) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LI_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(LI) },
+	{ 0, 0 },
+};
+
+static const attr LINK_attr_list[] = {
+	{ "CHARSET"       T(N) },
+	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
+	{ "MEDIA"         T(N) },
+	{ "REL"           T(N) },
+	{ "REV"           T(N) },
+	{ "TARGET"        T(N) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LINK_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(LINK) },
+	{ 0, 0 },
+};
+
+static const attr MAP_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "NAME"          T(i) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType MAP_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(MAP) },
+	{ 0, 0 },
+};
+
+static const attr MATH_attr_list[] = {
+	{ "BOX"           T(N) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType MATH_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(MATH) },
+	{ 0, 0 },
+};
+
+static const attr META_attr_list[] = {
+	{ "CONTENT"       T(N) },
+	{ "HTTP-EQUIV"    T(N) },
+	{ "NAME"          T(N) },
+	{ "SCHEME"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType META_attr_type[] = {
+	{ ATTR_TYPE(META) },
+	{ 0, 0 },
+};
+
+static const attr NEXTID_attr_list[] = {
+	{ "N"             T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType NEXTID_attr_type[] = {
+	{ ATTR_TYPE(NEXTID) },
+	{ 0, 0 },
+};
+
+static const attr NOTE_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "MD"            T(N) },
+	{ "ROLE"          T(x) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType NOTE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(NOTE) },
+	{ 0, 0 },
+};
+
+static const attr OBJECT_attr_list[] = {
+	{ "ARCHIVE"       T(N) },
+	{ "BORDER"        T(N) },
+	{ "CLASSID"       T(h) },
+	{ "CODEBASE"      T(h) },
+	{ "CODETYPE"      T(N) },
+	{ "DATA"          T(h) },
+	{ "DECLARE"       T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
+	{ "ISMAP"         T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "SHAPES"        T(N) },
+	{ "STANDBY"       T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TYPE"          T(N) },
+	{ "USEMAP"        T(h) },
+	{ "VSPACE"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OBJECT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(OBJECT) },
+	{ 0, 0 },
+};
+
+static const attr OL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COMPACT"       T(N) },
+	{ "CONTINUE"      T(N) },
+	{ "SEQNUM"        T(N) },
+	{ "START"         T(N) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(OL) },
+	{ 0, 0 },
+};
+
+static const attr OPTION_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "LABEL"         T(N) },
+	{ "SELECTED"      T(N) },
+	{ "SHAPE"         T(N) },
+	{ "VALUE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OPTION_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(OPTION) },
+	{ 0, 0 },
+};
+
+static const attr OVERLAY_attr_list[] = {
+	{ "HEIGHT"        T(N) },
+	{ "IMAGEMAP"      T(N) },
+	{ "MD"            T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ "X"             T(N) },
+	{ "Y"             T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OVERLAY_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(OVERLAY) },
+	{ 0, 0 },
+};
+
+static const attr P_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType P_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(P) },
+	{ 0, 0 },
+};
+
+static const attr PARAM_attr_list[] = {
+	{ "ACCEPT"        T(N) },
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCEPT-ENCODING" T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DATA"          T(N) },
+	{ "NAME"          T(N) },
+	{ "OBJECT"        T(N) },
+	{ "REF"           T(N) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ "VALUEREF"      T(N) },
+	{ "VALUETYPE"     T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType PARAM_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(PARAM) },
+	{ 0, 0 },
+};
+
+static const attr Q_attr_list[] = {
+	{ "CITE"          T(h) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType Q_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(Q) },
+	{ 0, 0 },
+};
+
+static const attr SCRIPT_attr_list[] = {
+	{ "CHARSET"       T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DEFER"         T(N) },
+	{ "EVENT"         T(N) },
+	{ "FOR"           T(N) },
+	{ "LANGUAGE"      T(N) },
+	{ "NAME"          T(N) },
+	{ "SCRIPTENGINE"  T(N) },
+	{ "SRC"           T(h) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType SCRIPT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(SCRIPT) },
+	{ 0, 0 },
+};
+
+static const attr SELECT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "MD"            T(N) },
+	{ "MULTIPLE"      T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONCHANGE"      T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "SIZE"          T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType SELECT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(SELECT) },
+	{ 0, 0 },
+};
+
+static const attr STYLE_attr_list[] = {
+	{ "MEDIA"         T(N) },
+	{ "NOTATION"      T(N) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType STYLE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(STYLE) },
+	{ 0, 0 },
+};
+
+static const attr TAB_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DP"            T(N) },
+	{ "INDENT"        T(N) },
+	{ "TO"            T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TAB_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(TAB) },
+	{ 0, 0 },
+};
+
+static const attr TABLE_attr_list[] = {
+	{ "BACKGROUND"    T(h) },
+	{ "BORDER"        T(N) },
+	{ "CELLPADDING"   T(N) },
+	{ "CELLSPACING"   T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COLS"          T(N) },
+	{ "COLSPEC"       T(N) },
+	{ "DP"            T(N) },
+	{ "FRAME"         T(N) },
+	{ "NOFLOW"        T(N) },
+	{ "NOWRAP"        T(N) },
+	{ "RULES"         T(N) },
+	{ "SUMMARY"       T(N) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TABLE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(TABLE) },
+	{ 0, 0 },
+};
+
+static const attr TD_attr_list[] = {
+	{ "ABBR"          T(N) },
+	{ "AXES"          T(N) },
+	{ "AXIS"          T(N) },
+	{ "BACKGROUND"    T(h) },
+	{ "CLEAR"         T(N) },
+	{ "COLSPAN"       T(N) },
+	{ "DP"            T(N) },
+	{ "HEADERS"       T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "NOWRAP"        T(N) },
+	{ "ROWSPAN"       T(N) },
+	{ "SCOPE"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TD_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(TD) },
+	{ ATTR_TYPE(cellalign) },
+	{ 0, 0 },
+};
+
+static const attr TEXTAREA_attr_list[] = {
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COLS"          T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONCHANGE"      T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
+	{ "ROWS"          T(N) },
+	{ "TABINDEX"      T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TEXTAREA_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(TEXTAREA) },
+	{ 0, 0 },
+};
+
+static const attr TR_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DP"            T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TR_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(cellalign) },
+	{ ATTR_TYPE(TR) },
+	{ 0, 0 },
+};
+
+static const attr UL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COMPACT"       T(N) },
+	{ "DINGBAT"       T(N) },
+	{ "MD"            T(N) },
+	{ "PLAIN"         T(N) },
+	{ "SRC"           T(h) },
+	{ "TYPE"          T(N) },
+	{ "WRAP"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType UL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(UL) },
+	{ 0, 0 },
+};
+
+
+/* attribute lists for the runtime (generated by dtd_util) */
+static const attr A_attr[] = {          /* A attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "CHARSET"       T(N) },
 	{ "CLASS"         T(c) },
@@ -145,15 +1274,15 @@ static const attr a_attr[] = {          /* A attributes */
 	{ "COORDS"        T(N) },
 	{ "DIR"           T(N) },
 	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
 	{ "ID"            T(i) },
 	{ "ISMAP"         T(N) },
 	{ "LANG"          T(N) },
 	{ "MD"            T(N) },
 	{ "NAME"          T(i) },
 	{ "NOTAB"         T(N) },
-	{ "ONCLICK"       T(N) },
-	{ "ONMOUSEOUT"    T(N) },
-	{ "ONMOUSEOVER"   T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
 	{ "REL"           T(N) },
 	{ "REV"           T(N) },
 	{ "SHAPE"         T(N) },
@@ -166,7 +1295,7 @@ static const attr a_attr[] = {          /* A attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr address_attr[] = {    /* ADDRESS attributes */
+static const attr ADDRESS_attr[] = {    /* ADDRESS attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -178,7 +1307,7 @@ static const attr address_attr[] = {    /* ADDRESS attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr applet_attr[] = {     /* APPLET attributes */
+static const attr APPLET_attr[] = {     /* APPLET attributes */
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "CLASS"         T(c) },
@@ -199,7 +1328,8 @@ static const attr applet_attr[] = {     /* APPLET attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr area_attr[] = {       /* AREA attributes */
+static const attr AREA_attr[] = {       /* AREA attributes */
+	{ "ACCESSKEY"     T(N) },
 	{ "ALT"           T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -210,9 +1340,8 @@ static const attr area_attr[] = {       /* AREA attributes */
 	{ "LANG"          T(N) },
 	{ "NOHREF"        T(N) },
 	{ "NOTAB"         T(N) },
-	{ "ONCLICK"       T(N) },
-	{ "ONMOUSEOUT"    T(N) },
-	{ "ONMOUSEOVER"   T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
 	{ "SHAPE"         T(N) },
 	{ "STYLE"         T(N) },
 	{ "TABINDEX"      T(N) },
@@ -221,14 +1350,17 @@ static const attr area_attr[] = {       /* AREA attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr base_attr[] = {       /* BASE attributes */
+static const attr BASE_attr[] = {       /* BASE attributes */
+	{ "CLASS"         T(c) },
 	{ "HREF"          T(h) },
+	{ "ID"            T(i) },
+	{ "STYLE"         T(N) },
 	{ "TARGET"        T(N) },
 	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr bgsound_attr[] = {    /* BGSOUND attributes */
+static const attr BGSOUND_attr[] = {    /* BGSOUND attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -241,7 +1373,7 @@ static const attr bgsound_attr[] = {    /* BGSOUND attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr body_attr[] = {       /* BODY attributes */
+static const attr BODY_attr[] = {       /* BODY attributes */
 	{ "ALINK"         T(N) },
 	{ "BACKGROUND"    T(h) },
 	{ "BGCOLOR"       T(N) },
@@ -260,7 +1392,7 @@ static const attr body_attr[] = {       /* BODY attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr bodytext_attr[] = {   /* BODYTEXT attributes */
+static const attr BODYTEXT_attr[] = {   /* BODYTEXT attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DATA"          T(N) },
@@ -278,7 +1410,7 @@ static const attr bodytext_attr[] = {   /* BODYTEXT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr bq_attr[] = {         /* BLOCKQUOTE attributes */
+static const attr BQ_attr[] = {         /* BLOCKQUOTE attributes */
 	{ "CITE"          T(h) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -291,7 +1423,8 @@ static const attr bq_attr[] = {         /* BLOCKQUOTE attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr button_attr[] = {     /* BUTTON attributes */
+static const attr BUTTON_attr[] = {     /* BUTTON attributes */
+	{ "ACCESSKEY"     T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -309,7 +1442,7 @@ static const attr button_attr[] = {     /* BUTTON attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr caption_attr[] = {    /* CAPTION attributes */
+static const attr CAPTION_attr[] = {    /* CAPTION attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
@@ -322,7 +1455,7 @@ static const attr caption_attr[] = {    /* CAPTION attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr col_attr[] = {        /* COL attributes */
+static const attr COL_attr[] = {        /* COL attributes */
 	{ "ALIGN"         T(N) },
 	{ "CHAR"          T(N) },
 	{ "CHAROFF"       T(N) },
@@ -339,7 +1472,7 @@ static const attr col_attr[] = {        /* COL attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr credit_attr[] = {     /* CREDIT attributes */
+static const attr CREDIT_attr[] = {     /* CREDIT attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -350,7 +1483,19 @@ static const attr credit_attr[] = {     /* CREDIT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr div_attr[] = {        /* CENTER attributes */
+static const attr DEL_attr[] = {        /* DEL attributes */
+	{ "CITE"          T(N) },
+	{ "CLASS"         T(c) },
+	{ "DATETIME"      T(N) },
+	{ "DIR"           T(N) },
+	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr DIV_attr[] = {        /* CENTER attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -362,7 +1507,7 @@ static const attr div_attr[] = {        /* CENTER attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr dl_attr[] = {         /* DL attributes */
+static const attr DL_attr[] = {         /* DL attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COMPACT"       T(N) },
@@ -374,7 +1519,7 @@ static const attr dl_attr[] = {         /* DL attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr embed_attr[] = {      /* EMBED attributes */
+static const attr EMBED_attr[] = {      /* EMBED attributes */
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "BORDER"        T(N) },
@@ -399,7 +1544,7 @@ static const attr embed_attr[] = {      /* EMBED attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr fieldset_attr[] = {   /* FIELDSET attributes */
+static const attr FIELDSET_attr[] = {   /* FIELDSET attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -410,7 +1555,7 @@ static const attr fieldset_attr[] = {   /* FIELDSET attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr fig_attr[] = {        /* FIG attributes */
+static const attr FIG_attr[] = {        /* FIG attributes */
 	{ "ALIGN"         T(N) },
 	{ "BORDER"        T(N) },
 	{ "CLASS"         T(c) },
@@ -431,7 +1576,7 @@ static const attr fig_attr[] = {        /* FIG attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr fn_attr[] = {         /* FN attributes */
+static const attr FN_attr[] = {         /* FN attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -442,7 +1587,7 @@ static const attr fn_attr[] = {         /* FN attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr font_attr[] = {       /* BASEFONT attributes */
+static const attr FONT_attr[] = {       /* BASEFONT attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COLOR"         T(N) },
@@ -452,10 +1597,13 @@ static const attr font_attr[] = {       /* BASEFONT attributes */
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "SIZE"          T(N) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr form_attr[] = {       /* FORM attributes */
+static const attr FORM_attr[] = {       /* FORM attributes */
+	{ "ACCEPT"        T(N) },
 	{ "ACCEPT-CHARSET" T(N) },
 	{ "ACTION"        T(h) },
 	{ "CLASS"         T(c) },
@@ -465,6 +1613,7 @@ static const attr form_attr[] = {       /* FORM attributes */
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "METHOD"        T(N) },
+	{ "ONRESET"       T(N) },
 	{ "ONSUBMIT"      T(N) },
 	{ "SCRIPT"        T(N) },
 	{ "STYLE"         T(N) },
@@ -474,7 +1623,9 @@ static const attr form_attr[] = {       /* FORM attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr frame_attr[] = {      /* FRAME attributes */
+static const attr FRAME_attr[] = {      /* FRAME attributes */
+	{ "CLASS"         T(c) },
+	{ "FRAMEBORDER"   T(N) },
 	{ "ID"            T(i) },
 	{ "LONGDESC"      T(h) },
 	{ "MARGINHEIGHT"  T(N) },
@@ -483,16 +1634,20 @@ static const attr frame_attr[] = {      /* FRAME attributes */
 	{ "NORESIZE"      T(N) },
 	{ "SCROLLING"     T(N) },
 	{ "SRC"           T(h) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr frameset_attr[] = {   /* FRAMESET attributes */
+static const attr FRAMESET_attr[] = {   /* FRAMESET attributes */
 	{ "COLS"          T(N) },
+	{ "ONLOAD"        T(N) },
+	{ "ONUNLOAD"      T(N) },
 	{ "ROWS"          T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr gen_attr[] = {        /* ABBR attributes */
+static const attr GEN_attr[] = {        /* ABBR attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -503,7 +1658,7 @@ static const attr gen_attr[] = {        /* ABBR attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr h_attr[] = {          /* H1 attributes */
+static const attr H_attr[] = {          /* H1 attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -521,12 +1676,13 @@ static const attr h_attr[] = {          /* H1 attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr hr_attr[] = {         /* HR attributes */
+static const attr HR_attr[] = {         /* HR attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
 	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
 	{ "MD"            T(N) },
 	{ "NOSHADE"       T(N) },
 	{ "SIZE"          T(N) },
@@ -537,8 +1693,9 @@ static const attr hr_attr[] = {         /* HR attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr iframe_attr[] = {     /* IFRAME attributes */
+static const attr IFRAME_attr[] = {     /* IFRAME attributes */
 	{ "ALIGN"         T(N) },
+	{ "CLASS"         T(c) },
 	{ "FRAMEBORDER"   T(N) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
@@ -549,11 +1706,12 @@ static const attr iframe_attr[] = {     /* IFRAME attributes */
 	{ "SCROLLING"     T(N) },
 	{ "SRC"           T(h) },
 	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
 	{ "WIDTH"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr img_attr[] = {        /* IMG attributes */
+static const attr IMG_attr[] = {        /* IMG attributes */
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "BORDER"        T(N) },
@@ -561,24 +1719,28 @@ static const attr img_attr[] = {        /* IMG attributes */
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
 	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
 	{ "ID"            T(i) },
 	{ "ISMAP"         T(N) },
 	{ "ISOBJECT"      T(N) },
 	{ "LANG"          T(N) },
 	{ "LONGDESC"      T(h) },
 	{ "MD"            T(N) },
+	{ "NAME"          T(N) },
 	{ "SRC"           T(h) },
 	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ "UNITS"         T(N) },
 	{ "USEMAP"        T(h) },
+	{ "VSPACE"        T(N) },
 	{ "WIDTH"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr input_attr[] = {      /* INPUT attributes */
+static const attr INPUT_attr[] = {      /* INPUT attributes */
 	{ "ACCEPT"        T(N) },
 	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "CHECKED"       T(N) },
@@ -589,6 +1751,7 @@ static const attr input_attr[] = {      /* INPUT attributes */
 	{ "ERROR"         T(N) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
+	{ "ISMAP"         T(N) },
 	{ "LANG"          T(N) },
 	{ "MAX"           T(N) },
 	{ "MAXLENGTH"     T(N) },
@@ -598,32 +1761,35 @@ static const attr input_attr[] = {      /* INPUT attributes */
 	{ "NOTAB"         T(N) },
 	{ "ONBLUR"        T(N) },
 	{ "ONCHANGE"      T(N) },
-	{ "ONCLICK"       T(N) },
 	{ "ONFOCUS"       T(N) },
 	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
 	{ "SIZE"          T(N) },
 	{ "SRC"           T(h) },
 	{ "STYLE"         T(N) },
 	{ "TABINDEX"      T(N) },
 	{ "TITLE"         T(N) },
 	{ "TYPE"          T(N) },
+	{ "USEMAP"        T(N) },
 	{ "VALUE"         T(N) },
 	{ "WIDTH"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr isindex_attr[] = {    /* ISINDEX attributes */
+static const attr ISINDEX_attr[] = {    /* ISINDEX attributes */
 	{ "ACTION"        T(h) },
+	{ "CLASS"         T(c) },
 	{ "DIR"           T(N) },
 	{ "HREF"          T(h) },
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "PROMPT"        T(N) },
+	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr keygen_attr[] = {     /* KEYGEN attributes */
+static const attr KEYGEN_attr[] = {     /* KEYGEN attributes */
 	{ "CHALLENGE"     T(N) },
 	{ "CLASS"         T(c) },
 	{ "DIR"           T(N) },
@@ -635,7 +1801,7 @@ static const attr keygen_attr[] = {     /* KEYGEN attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr label_attr[] = {      /* LABEL attributes */
+static const attr LABEL_attr[] = {      /* LABEL attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -643,13 +1809,14 @@ static const attr label_attr[] = {      /* LABEL attributes */
 	{ "FOR"           T(N) },
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
-	{ "ONCLICK"       T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
 	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr legend_attr[] = {     /* LEGEND attributes */
+static const attr LEGEND_attr[] = {     /* LEGEND attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
@@ -662,7 +1829,7 @@ static const attr legend_attr[] = {     /* LEGEND attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr li_attr[] = {         /* LI attributes */
+static const attr LI_attr[] = {         /* LI attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DINGBAT"       T(N) },
@@ -679,11 +1846,14 @@ static const attr li_attr[] = {         /* LI attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr link_attr[] = {       /* LINK attributes */
+static const attr LINK_attr[] = {       /* LINK attributes */
 	{ "CHARSET"       T(N) },
 	{ "CLASS"         T(c) },
+	{ "DIR"           T(N) },
 	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
 	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
 	{ "MEDIA"         T(N) },
 	{ "REL"           T(N) },
 	{ "REV"           T(N) },
@@ -694,7 +1864,7 @@ static const attr link_attr[] = {       /* LINK attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr map_attr[] = {        /* MAP attributes */
+static const attr MAP_attr[] = {        /* MAP attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -706,7 +1876,7 @@ static const attr map_attr[] = {        /* MAP attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr math_attr[] = {       /* MATH attributes */
+static const attr MATH_attr[] = {       /* MATH attributes */
 	{ "BOX"           T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -718,19 +1888,20 @@ static const attr math_attr[] = {       /* MATH attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr meta_attr[] = {       /* META attributes */
+static const attr META_attr[] = {       /* META attributes */
 	{ "CONTENT"       T(N) },
 	{ "HTTP-EQUIV"    T(N) },
 	{ "NAME"          T(N) },
+	{ "SCHEME"        T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr nextid_attr[] = {     /* NEXTID attributes */
+static const attr NEXTID_attr[] = {     /* NEXTID attributes */
 	{ "N"             T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr note_attr[] = {       /* NOTE attributes */
+static const attr NOTE_attr[] = {       /* NOTE attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -744,8 +1915,9 @@ static const attr note_attr[] = {       /* NOTE attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr object_attr[] = {     /* OBJECT attributes */
+static const attr OBJECT_attr[] = {     /* OBJECT attributes */
 	{ "ALIGN"         T(N) },
+	{ "ARCHIVE"       T(N) },
 	{ "BORDER"        T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLASSID"       T(h) },
@@ -773,7 +1945,7 @@ static const attr object_attr[] = {     /* OBJECT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr ol_attr[] = {         /* OL attributes */
+static const attr OL_attr[] = {         /* OL attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COMPACT"       T(N) },
@@ -789,13 +1961,14 @@ static const attr ol_attr[] = {         /* OL attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr option_attr[] = {     /* OPTION attributes */
+static const attr OPTION_attr[] = {     /* OPTION attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
 	{ "DISABLED"      T(N) },
 	{ "ERROR"         T(N) },
 	{ "ID"            T(i) },
+	{ "LABEL"         T(N) },
 	{ "LANG"          T(N) },
 	{ "SELECTED"      T(N) },
 	{ "SHAPE"         T(N) },
@@ -805,7 +1978,7 @@ static const attr option_attr[] = {     /* OPTION attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr overlay_attr[] = {    /* OVERLAY attributes */
+static const attr OVERLAY_attr[] = {    /* OVERLAY attributes */
 	{ "CLASS"         T(c) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
@@ -821,7 +1994,7 @@ static const attr overlay_attr[] = {    /* OVERLAY attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr p_attr[] = {          /* P attributes */
+static const attr P_attr[] = {          /* P attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -834,7 +2007,7 @@ static const attr p_attr[] = {          /* P attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr param_attr[] = {      /* PARAM attributes */
+static const attr PARAM_attr[] = {      /* PARAM attributes */
 	{ "ACCEPT"        T(N) },
 	{ "ACCEPT-CHARSET" T(N) },
 	{ "ACCEPT-ENCODING" T(N) },
@@ -856,9 +2029,23 @@ static const attr param_attr[] = {      /* PARAM attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr script_attr[] = {     /* SCRIPT attributes */
+static const attr Q_attr[] = {          /* Q attributes */
+	{ "CITE"          T(h) },
+	{ "CLASS"         T(c) },
+	{ "CLEAR"         T(N) },
+	{ "DIR"           T(N) },
+	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr SCRIPT_attr[] = {     /* SCRIPT attributes */
+	{ "CHARSET"       T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
+	{ "DEFER"         T(N) },
 	{ "DIR"           T(N) },
 	{ "EVENT"         T(N) },
 	{ "FOR"           T(N) },
@@ -874,7 +2061,7 @@ static const attr script_attr[] = {     /* SCRIPT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr select_attr[] = {     /* SELECT attributes */
+static const attr SELECT_attr[] = {     /* SELECT attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -900,15 +2087,20 @@ static const attr select_attr[] = {     /* SELECT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr style_attr[] = {      /* STYLE attributes */
+static const attr STYLE_attr[] = {      /* STYLE attributes */
+	{ "CLASS"         T(c) },
 	{ "DIR"           T(N) },
+	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
+	{ "MEDIA"         T(N) },
 	{ "NOTATION"      T(N) },
+	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
+	{ "TYPE"          T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr tab_attr[] = {        /* TAB attributes */
+static const attr TAB_attr[] = {        /* TAB attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -923,7 +2115,7 @@ static const attr tab_attr[] = {        /* TAB attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr table_attr[] = {      /* TABLE attributes */
+static const attr TABLE_attr[] = {      /* TABLE attributes */
 	{ "ALIGN"         T(N) },
 	{ "BACKGROUND"    T(h) },
 	{ "BORDER"        T(N) },
@@ -949,7 +2141,8 @@ static const attr table_attr[] = {      /* TABLE attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr td_attr[] = {         /* TD attributes */
+static const attr TD_attr[] = {         /* TD attributes */
+	{ "ABBR"          T(N) },
 	{ "ALIGN"         T(N) },
 	{ "AXES"          T(N) },
 	{ "AXIS"          T(N) },
@@ -961,11 +2154,13 @@ static const attr td_attr[] = {         /* TD attributes */
 	{ "COLSPAN"       T(N) },
 	{ "DIR"           T(N) },
 	{ "DP"            T(N) },
+	{ "HEADERS"       T(N) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "NOWRAP"        T(N) },
 	{ "ROWSPAN"       T(N) },
+	{ "SCOPE"         T(N) },
 	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ "VALIGN"        T(N) },
@@ -973,8 +2168,9 @@ static const attr td_attr[] = {         /* TD attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr textarea_attr[] = {   /* TEXTAREA attributes */
+static const attr TEXTAREA_attr[] = {   /* TEXTAREA attributes */
 	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -990,6 +2186,7 @@ static const attr textarea_attr[] = {   /* TEXTAREA attributes */
 	{ "ONCHANGE"      T(N) },
 	{ "ONFOCUS"       T(N) },
 	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
 	{ "ROWS"          T(N) },
 	{ "STYLE"         T(N) },
 	{ "TABINDEX"      T(N) },
@@ -997,7 +2194,7 @@ static const attr textarea_attr[] = {   /* TEXTAREA attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr tr_attr[] = {         /* TBODY attributes */
+static const attr TR_attr[] = {         /* TBODY attributes */
 	{ "ALIGN"         T(N) },
 	{ "CHAR"          T(N) },
 	{ "CHAROFF"       T(N) },
@@ -1014,7 +2211,7 @@ static const attr tr_attr[] = {         /* TBODY attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr ul_attr[] = {         /* DIR attributes */
+static const attr UL_attr[] = {         /* DIR attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COMPACT"       T(N) },
@@ -1185,131 +2382,133 @@ static const attr ul_attr[] = {         /* DIR attributes */
 #define NULL_HTTag NULL_HTTag_
 #endif
 
+#define ATTR_DATA(name) name##_attr, HTML_##name##_ATTRIBUTES, name##_attr_type
+
 #endif /* once_HTMLDTD */
 /* *INDENT-OFF* */
 static const HTTag tags_table0[HTML_ALL_ELEMENTS] = {
- { P(A),           a_attr,         HTML_A_ATTRIBUTES,          SGML_EMPTY,   T_A},
- { P(ABBR),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_ABBR},
- { P(ACRONYM),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_ACRONYM},
- { P(ADDRESS),     address_attr,   HTML_ADDRESS_ATTRIBUTES,    SGML_MIXED,   T_ADDRESS},
- { P(APPLET),      applet_attr,    HTML_APPLET_ATTRIBUTES,     SGML_MIXED,   T_APPLET},
- { P(AREA),        area_attr,      HTML_AREA_ATTRIBUTES,       SGML_EMPTY,   T_AREA},
- { P(AU),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_AU},
- { P(AUTHOR),      gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_AUTHOR},
- { P(B),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_B},
- { P0(BANNER),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_BANNER},
- { P(BASE),        base_attr,      HTML_BASE_ATTRIBUTES,       SGML_EMPTY,   T_BASE},
- { P(BASEFONT),    font_attr,      HTML_FONT_ATTRIBUTES,       SGML_EMPTY,   T_BASEFONT},
- { P(BDO),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_BDO},
- { P(BGSOUND),     bgsound_attr,   HTML_BGSOUND_ATTRIBUTES,    SGML_EMPTY,   T_BGSOUND},
- { P(BIG),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_BIG},
- { P(BLINK),       gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_BLINK},
- { P(BLOCKQUOTE),  bq_attr,        HTML_BQ_ATTRIBUTES,         SGML_MIXED,   T_BLOCKQUOTE},
- { P(BODY),        body_attr,      HTML_BODY_ATTRIBUTES,       SGML_MIXED,   T_BODY},
- { P(BODYTEXT),    bodytext_attr,  HTML_BODYTEXT_ATTRIBUTES,   SGML_MIXED,   T_BODYTEXT},
- { P(BQ),          bq_attr,        HTML_BQ_ATTRIBUTES,         SGML_MIXED,   T_BQ},
- { P(BR),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_BR},
- { P(BUTTON),      button_attr,    HTML_BUTTON_ATTRIBUTES,     SGML_MIXED,   T_BUTTON},
- { P(CAPTION),     caption_attr,   HTML_CAPTION_ATTRIBUTES,    SGML_MIXED,   T_CAPTION},
- { P(CENTER),      div_attr,       HTML_DIV_ATTRIBUTES,        SGML_MIXED,   T_CENTER},
- { P(CITE),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_CITE},
- { P(CODE),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_CODE},
- { P(COL),         col_attr,       HTML_COL_ATTRIBUTES,        SGML_EMPTY,   T_COL},
- { P(COLGROUP),    col_attr,       HTML_COL_ATTRIBUTES,        SGML_EMPTY,   T_COLGROUP},
- { P(COMMENT),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_COMMENT},
- { P(CREDIT),      credit_attr,    HTML_CREDIT_ATTRIBUTES,     SGML_MIXED,   T_CREDIT},
- { P(DD),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_DD},
- { P(DEL),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_DEL},
- { P(DFN),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_DFN},
- { P(DIR),         ul_attr,        HTML_UL_ATTRIBUTES,         SGML_MIXED,   T_DIR},
- { P(DIV),         div_attr,       HTML_DIV_ATTRIBUTES,        SGML_MIXED,   T_DIV},
- { P(DL),          dl_attr,        HTML_DL_ATTRIBUTES,         SGML_MIXED,   T_DL},
- { P(DLC),         dl_attr,        HTML_DL_ATTRIBUTES,         SGML_MIXED,   T_DLC},
- { P(DT),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_DT},
- { P(EM),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_EM},
- { P(EMBED),       embed_attr,     HTML_EMBED_ATTRIBUTES,      SGML_EMPTY,   T_EMBED},
- { P(FIELDSET),    fieldset_attr,  HTML_FIELDSET_ATTRIBUTES,   SGML_MIXED,   T_FIELDSET},
- { P(FIG),         fig_attr,       HTML_FIG_ATTRIBUTES,        SGML_MIXED,   T_FIG},
- { P(FN),          fn_attr,        HTML_FN_ATTRIBUTES,         SGML_MIXED,   T_FN},
- { P(FONT),        font_attr,      HTML_FONT_ATTRIBUTES,       SGML_EMPTY,   T_FONT},
- { P(FORM),        form_attr,      HTML_FORM_ATTRIBUTES,       SGML_EMPTY,   T_FORM},
- { P(FRAME),       frame_attr,     HTML_FRAME_ATTRIBUTES,      SGML_EMPTY,   T_FRAME},
- { P(FRAMESET),    frameset_attr,  HTML_FRAMESET_ATTRIBUTES,   SGML_MIXED,   T_FRAMESET},
- { P0(H1),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H1},
- { P0(H2),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H2},
- { P0(H3),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H3},
- { P0(H4),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H4},
- { P0(H5),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H5},
- { P0(H6),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H6},
- { P(HEAD),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_HEAD},
- { P(HR),          hr_attr,        HTML_HR_ATTRIBUTES,         SGML_EMPTY,   T_HR},
- { P(HTML),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_HTML},
- { P(HY),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_HY},
- { P(I),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_I},
- { P(IFRAME),      iframe_attr,    HTML_IFRAME_ATTRIBUTES,     SGML_MIXED,   T_IFRAME},
- { P(IMG),         img_attr,       HTML_IMG_ATTRIBUTES,        SGML_EMPTY,   T_IMG},
- { P(INPUT),       input_attr,     HTML_INPUT_ATTRIBUTES,      SGML_EMPTY,   T_INPUT},
- { P(INS),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_INS},
- { P(ISINDEX),     isindex_attr,   HTML_ISINDEX_ATTRIBUTES,    SGML_EMPTY,   T_ISINDEX},
- { P(KBD),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_KBD},
- { P(KEYGEN),      keygen_attr,    HTML_KEYGEN_ATTRIBUTES,     SGML_EMPTY,   T_KEYGEN},
- { P(LABEL),       label_attr,     HTML_LABEL_ATTRIBUTES,      SGML_MIXED,   T_LABEL},
- { P(LEGEND),      legend_attr,    HTML_LEGEND_ATTRIBUTES,     SGML_MIXED,   T_LEGEND},
- { P(LH),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_LH},
- { P(LI),          li_attr,        HTML_LI_ATTRIBUTES,         SGML_EMPTY,   T_LI},
- { P(LINK),        link_attr,      HTML_LINK_ATTRIBUTES,       SGML_EMPTY,   T_LINK},
- { P(LISTING),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_LITTERAL,T_LISTING},
- { P(MAP),         map_attr,       HTML_MAP_ATTRIBUTES,        SGML_MIXED,   T_MAP},
- { P(MARQUEE),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_MARQUEE},
- { P(MATH),        math_attr,      HTML_MATH_ATTRIBUTES,       SGML_LITTERAL,T_MATH},
- { P(MENU),        ul_attr,        HTML_UL_ATTRIBUTES,         SGML_MIXED,   T_MENU},
- { P(META),        meta_attr,      HTML_META_ATTRIBUTES,       SGML_EMPTY,   T_META},
- { P(NEXTID),      nextid_attr,    HTML_NEXTID_ATTRIBUTES,     SGML_EMPTY,   T_NEXTID},
- { P(NOFRAMES),    gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_NOFRAMES},
- { P(NOTE),        note_attr,      HTML_NOTE_ATTRIBUTES,       SGML_MIXED,   T_NOTE},
- { P(OBJECT),      object_attr,    HTML_OBJECT_ATTRIBUTES,     SGML_LITTERAL,T_OBJECT},
- { P(OL),          ol_attr,        HTML_OL_ATTRIBUTES,         SGML_MIXED,   T_OL},
- { P(OPTION),      option_attr,    HTML_OPTION_ATTRIBUTES,     SGML_EMPTY,   T_OPTION},
- { P(OVERLAY),     overlay_attr,   HTML_OVERLAY_ATTRIBUTES,    SGML_EMPTY,   T_OVERLAY},
- { P(P),           p_attr,         HTML_P_ATTRIBUTES,          SGML_EMPTY,   T_P},
- { P(PARAM),       param_attr,     HTML_PARAM_ATTRIBUTES,      SGML_EMPTY,   T_PARAM},
- { P(PLAINTEXT),   gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_LITTERAL,T_PLAINTEXT},
- { P0(PRE),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_PRE},
- { P(Q),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_Q},
- { P(S),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_S},
- { P(SAMP),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SAMP},
- { P(SCRIPT),      script_attr,    HTML_SCRIPT_ATTRIBUTES,     SGML_LITTERAL,T_SCRIPT},
- { P(SELECT),      select_attr,    HTML_SELECT_ATTRIBUTES,     SGML_MIXED,   T_SELECT},
- { P(SHY),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_SHY},
- { P(SMALL),       gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SMALL},
- { P(SPAN),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SPAN},
- { P(SPOT),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_SPOT},
- { P(STRIKE),      gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_STRIKE},
- { P(STRONG),      gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_STRONG},
- { P(STYLE),       style_attr,     HTML_STYLE_ATTRIBUTES,      SGML_LITTERAL,T_STYLE},
- { P(SUB),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SUB},
- { P(SUP),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SUP},
- { P(TAB),         tab_attr,       HTML_TAB_ATTRIBUTES,        SGML_EMPTY,   T_TAB},
- { P(TABLE),       table_attr,     HTML_TABLE_ATTRIBUTES,      SGML_MIXED,   T_TABLE},
- { P(TBODY),       tr_attr,        HTML_TR_ATTRIBUTES,         SGML_EMPTY,   T_TBODY},
- { P(TD),          td_attr,        HTML_TD_ATTRIBUTES,         SGML_EMPTY,   T_TD},
- { P(TEXTAREA),    textarea_attr,  HTML_TEXTAREA_ATTRIBUTES,   SGML_LITTERAL,T_TEXTAREA},
- { P(TEXTFLOW),    bodytext_attr,  HTML_BODYTEXT_ATTRIBUTES,   SGML_MIXED,   T_TEXTFLOW},
- { P(TFOOT),       tr_attr,        HTML_TR_ATTRIBUTES,         SGML_EMPTY,   T_TFOOT},
- { P(TH),          td_attr,        HTML_TD_ATTRIBUTES,         SGML_EMPTY,   T_TH},
- { P(THEAD),       tr_attr,        HTML_TR_ATTRIBUTES,         SGML_EMPTY,   T_THEAD},
- { P(TITLE),       gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_RCDATA,  T_TITLE},
- { P(TR),          tr_attr,        HTML_TR_ATTRIBUTES,         SGML_EMPTY,   T_TR},
- { P(TT),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_TT},
- { P(U),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_U},
- { P(UL),          ul_attr,        HTML_UL_ATTRIBUTES,         SGML_MIXED,   T_UL},
- { P(VAR),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_VAR},
- { P(WBR),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_WBR},
- { P0(XMP),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_LITTERAL,T_XMP},
+ { P(A),           ATTR_DATA(A),           SGML_EMPTY,   T_A},
+ { P(ABBR),        ATTR_DATA(GEN),         SGML_MIXED,   T_ABBR},
+ { P(ACRONYM),     ATTR_DATA(GEN),         SGML_MIXED,   T_ACRONYM},
+ { P(ADDRESS),     ATTR_DATA(ADDRESS),     SGML_MIXED,   T_ADDRESS},
+ { P(APPLET),      ATTR_DATA(APPLET),      SGML_MIXED,   T_APPLET},
+ { P(AREA),        ATTR_DATA(AREA),        SGML_EMPTY,   T_AREA},
+ { P(AU),          ATTR_DATA(GEN),         SGML_MIXED,   T_AU},
+ { P(AUTHOR),      ATTR_DATA(GEN),         SGML_MIXED,   T_AUTHOR},
+ { P(B),           ATTR_DATA(GEN),         SGML_EMPTY,   T_B},
+ { P0(BANNER),     ATTR_DATA(GEN),         SGML_MIXED,   T_BANNER},
+ { P(BASE),        ATTR_DATA(BASE),        SGML_EMPTY,   T_BASE},
+ { P(BASEFONT),    ATTR_DATA(FONT),        SGML_EMPTY,   T_BASEFONT},
+ { P(BDO),         ATTR_DATA(GEN),         SGML_MIXED,   T_BDO},
+ { P(BGSOUND),     ATTR_DATA(BGSOUND),     SGML_EMPTY,   T_BGSOUND},
+ { P(BIG),         ATTR_DATA(GEN),         SGML_MIXED,   T_BIG},
+ { P(BLINK),       ATTR_DATA(GEN),         SGML_EMPTY,   T_BLINK},
+ { P(BLOCKQUOTE),  ATTR_DATA(BQ),          SGML_MIXED,   T_BLOCKQUOTE},
+ { P(BODY),        ATTR_DATA(BODY),        SGML_MIXED,   T_BODY},
+ { P(BODYTEXT),    ATTR_DATA(BODYTEXT),    SGML_MIXED,   T_BODYTEXT},
+ { P(BQ),          ATTR_DATA(BQ),          SGML_MIXED,   T_BQ},
+ { P(BR),          ATTR_DATA(GEN),         SGML_EMPTY,   T_BR},
+ { P(BUTTON),      ATTR_DATA(BUTTON),      SGML_MIXED,   T_BUTTON},
+ { P(CAPTION),     ATTR_DATA(CAPTION),     SGML_MIXED,   T_CAPTION},
+ { P(CENTER),      ATTR_DATA(DIV),         SGML_MIXED,   T_CENTER},
+ { P(CITE),        ATTR_DATA(GEN),         SGML_EMPTY,   T_CITE},
+ { P(CODE),        ATTR_DATA(GEN),         SGML_MIXED,   T_CODE},
+ { P(COL),         ATTR_DATA(COL),         SGML_EMPTY,   T_COL},
+ { P(COLGROUP),    ATTR_DATA(COL),         SGML_EMPTY,   T_COLGROUP},
+ { P(COMMENT),     ATTR_DATA(GEN),         SGML_MIXED,   T_COMMENT},
+ { P(CREDIT),      ATTR_DATA(CREDIT),      SGML_MIXED,   T_CREDIT},
+ { P(DD),          ATTR_DATA(GEN),         SGML_EMPTY,   T_DD},
+ { P(DEL),         ATTR_DATA(DEL),         SGML_MIXED,   T_DEL},
+ { P(DFN),         ATTR_DATA(GEN),         SGML_MIXED,   T_DFN},
+ { P(DIR),         ATTR_DATA(UL),          SGML_MIXED,   T_DIR},
+ { P(DIV),         ATTR_DATA(DIV),         SGML_MIXED,   T_DIV},
+ { P(DL),          ATTR_DATA(DL),          SGML_MIXED,   T_DL},
+ { P(DLC),         ATTR_DATA(DL),          SGML_MIXED,   T_DLC},
+ { P(DT),          ATTR_DATA(GEN),         SGML_EMPTY,   T_DT},
+ { P(EM),          ATTR_DATA(GEN),         SGML_EMPTY,   T_EM},
+ { P(EMBED),       ATTR_DATA(EMBED),       SGML_EMPTY,   T_EMBED},
+ { P(FIELDSET),    ATTR_DATA(FIELDSET),    SGML_MIXED,   T_FIELDSET},
+ { P(FIG),         ATTR_DATA(FIG),         SGML_MIXED,   T_FIG},
+ { P(FN),          ATTR_DATA(FN),          SGML_MIXED,   T_FN},
+ { P(FONT),        ATTR_DATA(FONT),        SGML_EMPTY,   T_FONT},
+ { P(FORM),        ATTR_DATA(FORM),        SGML_EMPTY,   T_FORM},
+ { P(FRAME),       ATTR_DATA(FRAME),       SGML_EMPTY,   T_FRAME},
+ { P(FRAMESET),    ATTR_DATA(FRAMESET),    SGML_MIXED,   T_FRAMESET},
+ { P0(H1),         ATTR_DATA(H),           SGML_MIXED,   T_H1},
+ { P0(H2),         ATTR_DATA(H),           SGML_MIXED,   T_H2},
+ { P0(H3),         ATTR_DATA(H),           SGML_MIXED,   T_H3},
+ { P0(H4),         ATTR_DATA(H),           SGML_MIXED,   T_H4},
+ { P0(H5),         ATTR_DATA(H),           SGML_MIXED,   T_H5},
+ { P0(H6),         ATTR_DATA(H),           SGML_MIXED,   T_H6},
+ { P(HEAD),        ATTR_DATA(GEN),         SGML_MIXED,   T_HEAD},
+ { P(HR),          ATTR_DATA(HR),          SGML_EMPTY,   T_HR},
+ { P(HTML),        ATTR_DATA(GEN),         SGML_MIXED,   T_HTML},
+ { P(HY),          ATTR_DATA(GEN),         SGML_EMPTY,   T_HY},
+ { P(I),           ATTR_DATA(GEN),         SGML_EMPTY,   T_I},
+ { P(IFRAME),      ATTR_DATA(IFRAME),      SGML_MIXED,   T_IFRAME},
+ { P(IMG),         ATTR_DATA(IMG),         SGML_EMPTY,   T_IMG},
+ { P(INPUT),       ATTR_DATA(INPUT),       SGML_EMPTY,   T_INPUT},
+ { P(INS),         ATTR_DATA(DEL),         SGML_MIXED,   T_INS},
+ { P(ISINDEX),     ATTR_DATA(ISINDEX),     SGML_EMPTY,   T_ISINDEX},
+ { P(KBD),         ATTR_DATA(GEN),         SGML_MIXED,   T_KBD},
+ { P(KEYGEN),      ATTR_DATA(KEYGEN),      SGML_EMPTY,   T_KEYGEN},
+ { P(LABEL),       ATTR_DATA(LABEL),       SGML_MIXED,   T_LABEL},
+ { P(LEGEND),      ATTR_DATA(LEGEND),      SGML_MIXED,   T_LEGEND},
+ { P(LH),          ATTR_DATA(GEN),         SGML_EMPTY,   T_LH},
+ { P(LI),          ATTR_DATA(LI),          SGML_EMPTY,   T_LI},
+ { P(LINK),        ATTR_DATA(LINK),        SGML_EMPTY,   T_LINK},
+ { P(LISTING),     ATTR_DATA(GEN),         SGML_LITTERAL,T_LISTING},
+ { P(MAP),         ATTR_DATA(MAP),         SGML_MIXED,   T_MAP},
+ { P(MARQUEE),     ATTR_DATA(GEN),         SGML_MIXED,   T_MARQUEE},
+ { P(MATH),        ATTR_DATA(MATH),        SGML_LITTERAL,T_MATH},
+ { P(MENU),        ATTR_DATA(UL),          SGML_MIXED,   T_MENU},
+ { P(META),        ATTR_DATA(META),        SGML_EMPTY,   T_META},
+ { P(NEXTID),      ATTR_DATA(NEXTID),      SGML_EMPTY,   T_NEXTID},
+ { P(NOFRAMES),    ATTR_DATA(GEN),         SGML_MIXED,   T_NOFRAMES},
+ { P(NOTE),        ATTR_DATA(NOTE),        SGML_MIXED,   T_NOTE},
+ { P(OBJECT),      ATTR_DATA(OBJECT),      SGML_LITTERAL,T_OBJECT},
+ { P(OL),          ATTR_DATA(OL),          SGML_MIXED,   T_OL},
+ { P(OPTION),      ATTR_DATA(OPTION),      SGML_EMPTY,   T_OPTION},
+ { P(OVERLAY),     ATTR_DATA(OVERLAY),     SGML_EMPTY,   T_OVERLAY},
+ { P(P),           ATTR_DATA(P),           SGML_EMPTY,   T_P},
+ { P(PARAM),       ATTR_DATA(PARAM),       SGML_EMPTY,   T_PARAM},
+ { P(PLAINTEXT),   ATTR_DATA(GEN),         SGML_LITTERAL,T_PLAINTEXT},
+ { P0(PRE),        ATTR_DATA(GEN),         SGML_MIXED,   T_PRE},
+ { P(Q),           ATTR_DATA(Q),           SGML_MIXED,   T_Q},
+ { P(S),           ATTR_DATA(GEN),         SGML_MIXED,   T_S},
+ { P(SAMP),        ATTR_DATA(GEN),         SGML_MIXED,   T_SAMP},
+ { P(SCRIPT),      ATTR_DATA(SCRIPT),      SGML_LITTERAL,T_SCRIPT},
+ { P(SELECT),      ATTR_DATA(SELECT),      SGML_MIXED,   T_SELECT},
+ { P(SHY),         ATTR_DATA(GEN),         SGML_EMPTY,   T_SHY},
+ { P(SMALL),       ATTR_DATA(GEN),         SGML_MIXED,   T_SMALL},
+ { P(SPAN),        ATTR_DATA(GEN),         SGML_MIXED,   T_SPAN},
+ { P(SPOT),        ATTR_DATA(GEN),         SGML_EMPTY,   T_SPOT},
+ { P(STRIKE),      ATTR_DATA(GEN),         SGML_MIXED,   T_STRIKE},
+ { P(STRONG),      ATTR_DATA(GEN),         SGML_EMPTY,   T_STRONG},
+ { P(STYLE),       ATTR_DATA(STYLE),       SGML_LITTERAL,T_STYLE},
+ { P(SUB),         ATTR_DATA(GEN),         SGML_MIXED,   T_SUB},
+ { P(SUP),         ATTR_DATA(GEN),         SGML_MIXED,   T_SUP},
+ { P(TAB),         ATTR_DATA(TAB),         SGML_EMPTY,   T_TAB},
+ { P(TABLE),       ATTR_DATA(TABLE),       SGML_MIXED,   T_TABLE},
+ { P(TBODY),       ATTR_DATA(TR),          SGML_EMPTY,   T_TBODY},
+ { P(TD),          ATTR_DATA(TD),          SGML_EMPTY,   T_TD},
+ { P(TEXTAREA),    ATTR_DATA(TEXTAREA),    SGML_LITTERAL,T_TEXTAREA},
+ { P(TEXTFLOW),    ATTR_DATA(BODYTEXT),    SGML_MIXED,   T_TEXTFLOW},
+ { P(TFOOT),       ATTR_DATA(TR),          SGML_EMPTY,   T_TFOOT},
+ { P(TH),          ATTR_DATA(TD),          SGML_EMPTY,   T_TH},
+ { P(THEAD),       ATTR_DATA(TR),          SGML_EMPTY,   T_THEAD},
+ { P(TITLE),       ATTR_DATA(GEN),         SGML_RCDATA,  T_TITLE},
+ { P(TR),          ATTR_DATA(TR),          SGML_EMPTY,   T_TR},
+ { P(TT),          ATTR_DATA(GEN),         SGML_EMPTY,   T_TT},
+ { P(U),           ATTR_DATA(GEN),         SGML_EMPTY,   T_U},
+ { P(UL),          ATTR_DATA(UL),          SGML_MIXED,   T_UL},
+ { P(VAR),         ATTR_DATA(GEN),         SGML_MIXED,   T_VAR},
+ { P(WBR),         ATTR_DATA(GEN),         SGML_EMPTY,   T_WBR},
+ { P0(XMP),        ATTR_DATA(GEN),         SGML_LITTERAL,T_XMP},
 /* additional (alternative variants), not counted in HTML_ELEMENTS: */
 /* This one will be used as a temporary substitute within the parser when
    it has been signalled to parse OBJECT content as MIXED. - kw */
- { P(OBJECT),      object_attr,    HTML_OBJECT_ATTRIBUTES,     SGML_MIXED,   T_OBJECT_PCDATA},
+ { P(OBJECT),      ATTR_DATA(OBJECT),      SGML_MIXED,   T_OBJECT_PCDATA},
 };
 /* *INDENT-ON* */
 
diff --git a/WWW/Library/Implementation/src1_HTMLDTD.h b/WWW/Library/Implementation/src1_HTMLDTD.h
index 6d65a670..96ab8824 100644
--- a/WWW/Library/Implementation/src1_HTMLDTD.h
+++ b/WWW/Library/Implementation/src1_HTMLDTD.h
@@ -1,4 +1,4 @@
-/* $LynxId: src1_HTMLDTD.h,v 1.9 2008/09/16 23:47:45 tom Exp $ */
+/* $LynxId: src1_HTMLDTD.h,v 1.39 2008/09/20 14:25:27 tom Exp $ */
 #ifndef src_HTMLDTD_H1
 #define src_HTMLDTD_H1 1
 
@@ -137,7 +137,1136 @@
 #endif
 /* *INDENT-OFF* */
 
-static const attr a_attr[] = {          /* A attributes */
+#define ATTR_TYPE(name) #name, name##_attr_list
+
+/* generic attributes, used in different tags */
+static const attr core_attr_list[] = {
+	{ "CLASS"         T(c) },
+	{ "ID"            T(i) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType core_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ 0, 0 },
+};
+
+static const attr i18n_attr_list[] = {
+	{ "DIR"           T(N) },
+	{ "LANG"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType i18n_attr_type[] = {
+	{ ATTR_TYPE(i18n) },
+	{ 0, 0 },
+};
+
+static const attr events_attr_list[] = {
+	{ "ONCLICK"       T(N) },
+	{ "ONDBLCLICK"    T(N) },
+	{ "ONKEYDOWN"     T(N) },
+	{ "ONKEYPRESS"    T(N) },
+	{ "ONKEYUP"       T(N) },
+	{ "ONMOUSEDOWN"   T(N) },
+	{ "ONMOUSEMOVE"   T(N) },
+	{ "ONMOUSEOUT"    T(N) },
+	{ "ONMOUSEOVER"   T(N) },
+	{ "ONMOUSEUP"     T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType events_attr_type[] = {
+	{ ATTR_TYPE(events) },
+	{ 0, 0 },
+};
+
+static const attr align_attr_list[] = {
+	{ "ALIGN"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType align_attr_type[] = {
+	{ ATTR_TYPE(align) },
+	{ 0, 0 },
+};
+
+static const attr cellalign_attr_list[] = {
+	{ "ALIGN"         T(N) },
+	{ "CHAR"          T(N) },
+	{ "CHAROFF"       T(N) },
+	{ "VALIGN"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType cellalign_attr_type[] = {
+	{ ATTR_TYPE(cellalign) },
+	{ 0, 0 },
+};
+
+static const attr bgcolor_attr_list[] = {
+	{ "BGCOLOR"       T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType bgcolor_attr_type[] = {
+	{ ATTR_TYPE(bgcolor) },
+	{ 0, 0 },
+};
+
+
+/* tables defining attributes per-tag in terms of generic attributes (editable) */
+static const attr A_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CHARSET"       T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COORDS"        T(N) },
+	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
+	{ "ISMAP"         T(N) },
+	{ "MD"            T(N) },
+	{ "NAME"          T(i) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "REL"           T(N) },
+	{ "REV"           T(N) },
+	{ "SHAPE"         T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TARGET"        T(N) },
+	{ "TYPE"          T(N) },
+	{ "URN"           T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType A_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(A) },
+	{ 0, 0 },
+};
+
+static const attr ADDRESS_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType ADDRESS_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(ADDRESS) },
+	{ 0, 0 },
+};
+
+static const attr APPLET_attr_list[] = {
+	{ "ALT"           T(N) },
+	{ "CLEAR"         T(N) },
+	{ "CODE"          T(N) },
+	{ "CODEBASE"      T(h) },
+	{ "DOWNLOAD"      T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
+	{ "NAME"          T(i) },
+	{ "VSPACE"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType APPLET_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(APPLET) },
+	{ 0, 0 },
+};
+
+static const attr AREA_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "ALT"           T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COORDS"        T(N) },
+	{ "HREF"          T(h) },
+	{ "NOHREF"        T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "SHAPE"         T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TARGET"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType AREA_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(AREA) },
+	{ 0, 0 },
+};
+
+static const attr BASE_attr_list[] = {
+	{ "HREF"          T(h) },
+	{ "TARGET"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BASE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(BASE) },
+	{ 0, 0 },
+};
+
+static const attr BGSOUND_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "LOOP"          T(N) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BGSOUND_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BGSOUND) },
+	{ 0, 0 },
+};
+
+static const attr BODY_attr_list[] = {
+	{ "ALINK"         T(N) },
+	{ "BACKGROUND"    T(h) },
+	{ "CLEAR"         T(N) },
+	{ "LINK"          T(N) },
+	{ "ONLOAD"        T(N) },
+	{ "ONUNLOAD"      T(N) },
+	{ "TEXT"          T(N) },
+	{ "VLINK"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BODY_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BODY) },
+	{ ATTR_TYPE(bgcolor) },
+	{ 0, 0 },
+};
+
+static const attr BODYTEXT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DATA"          T(N) },
+	{ "NAME"          T(N) },
+	{ "OBJECT"        T(N) },
+	{ "REF"           T(N) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ "VALUETYPE"     T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BODYTEXT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BODYTEXT) },
+	{ 0, 0 },
+};
+
+static const attr BQ_attr_list[] = {
+	{ "CITE"          T(h) },
+	{ "CLEAR"         T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BQ_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(BQ) },
+	{ 0, 0 },
+};
+
+static const attr BUTTON_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "NAME"          T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType BUTTON_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(BUTTON) },
+	{ 0, 0 },
+};
+
+static const attr CAPTION_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType CAPTION_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(CAPTION) },
+	{ 0, 0 },
+};
+
+static const attr COL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "SPAN"          T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType COL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(COL) },
+	{ ATTR_TYPE(cellalign) },
+	{ 0, 0 },
+};
+
+static const attr CREDIT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType CREDIT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(CREDIT) },
+	{ 0, 0 },
+};
+
+static const attr DEL_attr_list[] = {
+	{ "CITE"          T(N) },
+	{ "DATETIME"      T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType DEL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(DEL) },
+	{ 0, 0 },
+};
+
+static const attr DIV_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType DIV_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(DIV) },
+	{ 0, 0 },
+};
+
+static const attr DL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COMPACT"       T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType DL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(DL) },
+	{ 0, 0 },
+};
+
+static const attr EMBED_attr_list[] = {
+	{ "ALT"           T(N) },
+	{ "BORDER"        T(N) },
+	{ "CLEAR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "IMAGEMAP"      T(N) },
+	{ "ISMAP"         T(N) },
+	{ "MD"            T(N) },
+	{ "NAME"          T(i) },
+	{ "NOFLOW"        T(N) },
+	{ "PARAMS"        T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "USEMAP"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType EMBED_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(EMBED) },
+	{ 0, 0 },
+};
+
+static const attr FIELDSET_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FIELDSET_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FIELDSET) },
+	{ 0, 0 },
+};
+
+static const attr FIG_attr_list[] = {
+	{ "BORDER"        T(N) },
+	{ "CLEAR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "IMAGEMAP"      T(N) },
+	{ "ISOBJECT"      T(N) },
+	{ "MD"            T(N) },
+	{ "NOFLOW"        T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FIG_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(FIG) },
+	{ 0, 0 },
+};
+
+static const attr FN_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FN_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FN) },
+	{ 0, 0 },
+};
+
+static const attr FONT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COLOR"         T(N) },
+	{ "END"           T(N) },
+	{ "FACE"          T(N) },
+	{ "SIZE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FONT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FONT) },
+	{ 0, 0 },
+};
+
+static const attr FORM_attr_list[] = {
+	{ "ACCEPT"        T(N) },
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACTION"        T(h) },
+	{ "CLEAR"         T(N) },
+	{ "ENCTYPE"       T(N) },
+	{ "METHOD"        T(N) },
+	{ "ONRESET"       T(N) },
+	{ "ONSUBMIT"      T(N) },
+	{ "SCRIPT"        T(N) },
+	{ "SUBJECT"       T(N) },
+	{ "TARGET"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FORM_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(FORM) },
+	{ 0, 0 },
+};
+
+static const attr FRAME_attr_list[] = {
+	{ "FRAMEBORDER"   T(N) },
+	{ "LONGDESC"      T(h) },
+	{ "MARGINHEIGHT"  T(N) },
+	{ "MARGINWIDTH"   T(N) },
+	{ "NAME"          T(N) },
+	{ "NORESIZE"      T(N) },
+	{ "SCROLLING"     T(N) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FRAME_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(FRAME) },
+	{ 0, 0 },
+};
+
+static const attr FRAMESET_attr_list[] = {
+	{ "COLS"          T(N) },
+	{ "ONLOAD"        T(N) },
+	{ "ONUNLOAD"      T(N) },
+	{ "ROWS"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType FRAMESET_attr_type[] = {
+	{ ATTR_TYPE(FRAMESET) },
+	{ 0, 0 },
+};
+
+static const attr GEN_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType GEN_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(GEN) },
+	{ 0, 0 },
+};
+
+static const attr H_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DINGBAT"       T(N) },
+	{ "MD"            T(N) },
+	{ "NOWRAP"        T(N) },
+	{ "SEQNUM"        T(N) },
+	{ "SKIP"          T(N) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType H_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(H) },
+	{ 0, 0 },
+};
+
+static const attr HR_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "MD"            T(N) },
+	{ "NOSHADE"       T(N) },
+	{ "SIZE"          T(N) },
+	{ "SRC"           T(h) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType HR_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(HR) },
+	{ 0, 0 },
+};
+
+static const attr IFRAME_attr_list[] = {
+	{ "FRAMEBORDER"   T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "LONGDESC"      T(h) },
+	{ "MARGINHEIGHT"  T(N) },
+	{ "MARGINWIDTH"   T(N) },
+	{ "NAME"          T(N) },
+	{ "SCROLLING"     T(N) },
+	{ "SRC"           T(h) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType IFRAME_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(IFRAME) },
+	{ 0, 0 },
+};
+
+static const attr IMG_attr_list[] = {
+	{ "ALT"           T(N) },
+	{ "BORDER"        T(N) },
+	{ "CLEAR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
+	{ "ISMAP"         T(N) },
+	{ "ISOBJECT"      T(N) },
+	{ "LONGDESC"      T(h) },
+	{ "MD"            T(N) },
+	{ "NAME"          T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "USEMAP"        T(h) },
+	{ "VSPACE"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType IMG_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(IMG) },
+	{ 0, 0 },
+};
+
+static const attr INPUT_attr_list[] = {
+	{ "ACCEPT"        T(N) },
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
+	{ "ALT"           T(N) },
+	{ "CHECKED"       T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "ISMAP"         T(N) },
+	{ "MAX"           T(N) },
+	{ "MAXLENGTH"     T(N) },
+	{ "MD"            T(N) },
+	{ "MIN"           T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONCHANGE"      T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
+	{ "SIZE"          T(N) },
+	{ "SRC"           T(h) },
+	{ "TABINDEX"      T(N) },
+	{ "TYPE"          T(N) },
+	{ "USEMAP"        T(N) },
+	{ "VALUE"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType INPUT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(INPUT) },
+	{ 0, 0 },
+};
+
+static const attr ISINDEX_attr_list[] = {
+	{ "ACTION"        T(h) },
+	{ "HREF"          T(h) },
+	{ "PROMPT"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType ISINDEX_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(ISINDEX) },
+	{ 0, 0 },
+};
+
+static const attr KEYGEN_attr_list[] = {
+	{ "CHALLENGE"     T(N) },
+	{ "NAME"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType KEYGEN_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(KEYGEN) },
+	{ 0, 0 },
+};
+
+static const attr LABEL_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ "FOR"           T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LABEL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(LABEL) },
+	{ 0, 0 },
+};
+
+static const attr LEGEND_attr_list[] = {
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LEGEND_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(LEGEND) },
+	{ 0, 0 },
+};
+
+static const attr LI_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DINGBAT"       T(N) },
+	{ "MD"            T(N) },
+	{ "SKIP"          T(N) },
+	{ "SRC"           T(h) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LI_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(LI) },
+	{ 0, 0 },
+};
+
+static const attr LINK_attr_list[] = {
+	{ "CHARSET"       T(N) },
+	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
+	{ "MEDIA"         T(N) },
+	{ "REL"           T(N) },
+	{ "REV"           T(N) },
+	{ "TARGET"        T(N) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType LINK_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(LINK) },
+	{ 0, 0 },
+};
+
+static const attr MAP_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "NAME"          T(i) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType MAP_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(MAP) },
+	{ 0, 0 },
+};
+
+static const attr MATH_attr_list[] = {
+	{ "BOX"           T(N) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType MATH_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(MATH) },
+	{ 0, 0 },
+};
+
+static const attr META_attr_list[] = {
+	{ "CONTENT"       T(N) },
+	{ "HTTP-EQUIV"    T(N) },
+	{ "NAME"          T(N) },
+	{ "SCHEME"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType META_attr_type[] = {
+	{ ATTR_TYPE(META) },
+	{ 0, 0 },
+};
+
+static const attr NEXTID_attr_list[] = {
+	{ "N"             T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType NEXTID_attr_type[] = {
+	{ ATTR_TYPE(NEXTID) },
+	{ 0, 0 },
+};
+
+static const attr NOTE_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "MD"            T(N) },
+	{ "ROLE"          T(x) },
+	{ "SRC"           T(h) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType NOTE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(NOTE) },
+	{ 0, 0 },
+};
+
+static const attr OBJECT_attr_list[] = {
+	{ "ARCHIVE"       T(N) },
+	{ "BORDER"        T(N) },
+	{ "CLASSID"       T(h) },
+	{ "CODEBASE"      T(h) },
+	{ "CODETYPE"      T(N) },
+	{ "DATA"          T(h) },
+	{ "DECLARE"       T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
+	{ "ISMAP"         T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "SHAPES"        T(N) },
+	{ "STANDBY"       T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "TYPE"          T(N) },
+	{ "USEMAP"        T(h) },
+	{ "VSPACE"        T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OBJECT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(OBJECT) },
+	{ 0, 0 },
+};
+
+static const attr OL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COMPACT"       T(N) },
+	{ "CONTINUE"      T(N) },
+	{ "SEQNUM"        T(N) },
+	{ "START"         T(N) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(OL) },
+	{ 0, 0 },
+};
+
+static const attr OPTION_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "LABEL"         T(N) },
+	{ "SELECTED"      T(N) },
+	{ "SHAPE"         T(N) },
+	{ "VALUE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OPTION_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(OPTION) },
+	{ 0, 0 },
+};
+
+static const attr OVERLAY_attr_list[] = {
+	{ "HEIGHT"        T(N) },
+	{ "IMAGEMAP"      T(N) },
+	{ "MD"            T(N) },
+	{ "SRC"           T(h) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ "X"             T(N) },
+	{ "Y"             T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType OVERLAY_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(OVERLAY) },
+	{ 0, 0 },
+};
+
+static const attr P_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType P_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(P) },
+	{ 0, 0 },
+};
+
+static const attr PARAM_attr_list[] = {
+	{ "ACCEPT"        T(N) },
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCEPT-ENCODING" T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DATA"          T(N) },
+	{ "NAME"          T(N) },
+	{ "OBJECT"        T(N) },
+	{ "REF"           T(N) },
+	{ "TYPE"          T(N) },
+	{ "VALUE"         T(N) },
+	{ "VALUEREF"      T(N) },
+	{ "VALUETYPE"     T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType PARAM_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(PARAM) },
+	{ 0, 0 },
+};
+
+static const attr Q_attr_list[] = {
+	{ "CITE"          T(h) },
+	{ "CLEAR"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType Q_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(Q) },
+	{ 0, 0 },
+};
+
+static const attr SCRIPT_attr_list[] = {
+	{ "CHARSET"       T(N) },
+	{ "CLEAR"         T(N) },
+	{ "DEFER"         T(N) },
+	{ "EVENT"         T(N) },
+	{ "FOR"           T(N) },
+	{ "LANGUAGE"      T(N) },
+	{ "NAME"          T(N) },
+	{ "SCRIPTENGINE"  T(N) },
+	{ "SRC"           T(h) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType SCRIPT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(SCRIPT) },
+	{ 0, 0 },
+};
+
+static const attr SELECT_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "MD"            T(N) },
+	{ "MULTIPLE"      T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONCHANGE"      T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "SIZE"          T(N) },
+	{ "TABINDEX"      T(N) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType SELECT_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(SELECT) },
+	{ 0, 0 },
+};
+
+static const attr STYLE_attr_list[] = {
+	{ "MEDIA"         T(N) },
+	{ "NOTATION"      T(N) },
+	{ "TYPE"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType STYLE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(STYLE) },
+	{ 0, 0 },
+};
+
+static const attr TAB_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DP"            T(N) },
+	{ "INDENT"        T(N) },
+	{ "TO"            T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TAB_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(TAB) },
+	{ 0, 0 },
+};
+
+static const attr TABLE_attr_list[] = {
+	{ "BACKGROUND"    T(h) },
+	{ "BORDER"        T(N) },
+	{ "CELLPADDING"   T(N) },
+	{ "CELLSPACING"   T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COLS"          T(N) },
+	{ "COLSPEC"       T(N) },
+	{ "DP"            T(N) },
+	{ "FRAME"         T(N) },
+	{ "NOFLOW"        T(N) },
+	{ "NOWRAP"        T(N) },
+	{ "RULES"         T(N) },
+	{ "SUMMARY"       T(N) },
+	{ "UNITS"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TABLE_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(TABLE) },
+	{ 0, 0 },
+};
+
+static const attr TD_attr_list[] = {
+	{ "ABBR"          T(N) },
+	{ "AXES"          T(N) },
+	{ "AXIS"          T(N) },
+	{ "BACKGROUND"    T(h) },
+	{ "CLEAR"         T(N) },
+	{ "COLSPAN"       T(N) },
+	{ "DP"            T(N) },
+	{ "HEADERS"       T(N) },
+	{ "HEIGHT"        T(N) },
+	{ "NOWRAP"        T(N) },
+	{ "ROWSPAN"       T(N) },
+	{ "SCOPE"         T(N) },
+	{ "WIDTH"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TD_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(TD) },
+	{ ATTR_TYPE(cellalign) },
+	{ 0, 0 },
+};
+
+static const attr TEXTAREA_attr_list[] = {
+	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
+	{ "CLEAR"         T(N) },
+	{ "COLS"          T(N) },
+	{ "DISABLED"      T(N) },
+	{ "ERROR"         T(N) },
+	{ "NAME"          T(N) },
+	{ "NOTAB"         T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONCHANGE"      T(N) },
+	{ "ONFOCUS"       T(N) },
+	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
+	{ "ROWS"          T(N) },
+	{ "TABINDEX"      T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TEXTAREA_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(align) },
+	{ ATTR_TYPE(TEXTAREA) },
+	{ 0, 0 },
+};
+
+static const attr TR_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "DP"            T(N) },
+	{ "NOWRAP"        T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType TR_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(events) },
+	{ ATTR_TYPE(cellalign) },
+	{ ATTR_TYPE(TR) },
+	{ 0, 0 },
+};
+
+static const attr UL_attr_list[] = {
+	{ "CLEAR"         T(N) },
+	{ "COMPACT"       T(N) },
+	{ "DINGBAT"       T(N) },
+	{ "MD"            T(N) },
+	{ "PLAIN"         T(N) },
+	{ "SRC"           T(h) },
+	{ "TYPE"          T(N) },
+	{ "WRAP"          T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const AttrType UL_attr_type[] = {
+	{ ATTR_TYPE(core) },
+	{ ATTR_TYPE(i18n) },
+	{ ATTR_TYPE(UL) },
+	{ 0, 0 },
+};
+
+
+/* attribute lists for the runtime (generated by dtd_util) */
+static const attr A_attr[] = {          /* A attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "CHARSET"       T(N) },
 	{ "CLASS"         T(c) },
@@ -145,15 +1274,15 @@ static const attr a_attr[] = {          /* A attributes */
 	{ "COORDS"        T(N) },
 	{ "DIR"           T(N) },
 	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
 	{ "ID"            T(i) },
 	{ "ISMAP"         T(N) },
 	{ "LANG"          T(N) },
 	{ "MD"            T(N) },
 	{ "NAME"          T(i) },
 	{ "NOTAB"         T(N) },
-	{ "ONCLICK"       T(N) },
-	{ "ONMOUSEOUT"    T(N) },
-	{ "ONMOUSEOVER"   T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
 	{ "REL"           T(N) },
 	{ "REV"           T(N) },
 	{ "SHAPE"         T(N) },
@@ -166,7 +1295,7 @@ static const attr a_attr[] = {          /* A attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr address_attr[] = {    /* ADDRESS attributes */
+static const attr ADDRESS_attr[] = {    /* ADDRESS attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -178,7 +1307,7 @@ static const attr address_attr[] = {    /* ADDRESS attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr applet_attr[] = {     /* APPLET attributes */
+static const attr APPLET_attr[] = {     /* APPLET attributes */
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "CLASS"         T(c) },
@@ -199,7 +1328,8 @@ static const attr applet_attr[] = {     /* APPLET attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr area_attr[] = {       /* AREA attributes */
+static const attr AREA_attr[] = {       /* AREA attributes */
+	{ "ACCESSKEY"     T(N) },
 	{ "ALT"           T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -210,9 +1340,8 @@ static const attr area_attr[] = {       /* AREA attributes */
 	{ "LANG"          T(N) },
 	{ "NOHREF"        T(N) },
 	{ "NOTAB"         T(N) },
-	{ "ONCLICK"       T(N) },
-	{ "ONMOUSEOUT"    T(N) },
-	{ "ONMOUSEOVER"   T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
 	{ "SHAPE"         T(N) },
 	{ "STYLE"         T(N) },
 	{ "TABINDEX"      T(N) },
@@ -221,14 +1350,17 @@ static const attr area_attr[] = {       /* AREA attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr base_attr[] = {       /* BASE attributes */
+static const attr BASE_attr[] = {       /* BASE attributes */
+	{ "CLASS"         T(c) },
 	{ "HREF"          T(h) },
+	{ "ID"            T(i) },
+	{ "STYLE"         T(N) },
 	{ "TARGET"        T(N) },
 	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr bgsound_attr[] = {    /* BGSOUND attributes */
+static const attr BGSOUND_attr[] = {    /* BGSOUND attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -241,7 +1373,7 @@ static const attr bgsound_attr[] = {    /* BGSOUND attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr body_attr[] = {       /* BODY attributes */
+static const attr BODY_attr[] = {       /* BODY attributes */
 	{ "ALINK"         T(N) },
 	{ "BACKGROUND"    T(h) },
 	{ "BGCOLOR"       T(N) },
@@ -260,7 +1392,7 @@ static const attr body_attr[] = {       /* BODY attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr bodytext_attr[] = {   /* BODYTEXT attributes */
+static const attr BODYTEXT_attr[] = {   /* BODYTEXT attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DATA"          T(N) },
@@ -278,7 +1410,7 @@ static const attr bodytext_attr[] = {   /* BODYTEXT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr bq_attr[] = {         /* BLOCKQUOTE attributes */
+static const attr BQ_attr[] = {         /* BLOCKQUOTE attributes */
 	{ "CITE"          T(h) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -291,7 +1423,8 @@ static const attr bq_attr[] = {         /* BLOCKQUOTE attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr button_attr[] = {     /* BUTTON attributes */
+static const attr BUTTON_attr[] = {     /* BUTTON attributes */
+	{ "ACCESSKEY"     T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -309,7 +1442,7 @@ static const attr button_attr[] = {     /* BUTTON attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr caption_attr[] = {    /* CAPTION attributes */
+static const attr CAPTION_attr[] = {    /* CAPTION attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
@@ -322,7 +1455,7 @@ static const attr caption_attr[] = {    /* CAPTION attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr col_attr[] = {        /* COL attributes */
+static const attr COL_attr[] = {        /* COL attributes */
 	{ "ALIGN"         T(N) },
 	{ "CHAR"          T(N) },
 	{ "CHAROFF"       T(N) },
@@ -339,7 +1472,7 @@ static const attr col_attr[] = {        /* COL attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr credit_attr[] = {     /* CREDIT attributes */
+static const attr CREDIT_attr[] = {     /* CREDIT attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -350,7 +1483,19 @@ static const attr credit_attr[] = {     /* CREDIT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr div_attr[] = {        /* CENTER attributes */
+static const attr DEL_attr[] = {        /* DEL attributes */
+	{ "CITE"          T(N) },
+	{ "CLASS"         T(c) },
+	{ "DATETIME"      T(N) },
+	{ "DIR"           T(N) },
+	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr DIV_attr[] = {        /* CENTER attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -362,7 +1507,7 @@ static const attr div_attr[] = {        /* CENTER attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr dl_attr[] = {         /* DL attributes */
+static const attr DL_attr[] = {         /* DL attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COMPACT"       T(N) },
@@ -374,7 +1519,7 @@ static const attr dl_attr[] = {         /* DL attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr embed_attr[] = {      /* EMBED attributes */
+static const attr EMBED_attr[] = {      /* EMBED attributes */
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "BORDER"        T(N) },
@@ -399,7 +1544,7 @@ static const attr embed_attr[] = {      /* EMBED attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr fieldset_attr[] = {   /* FIELDSET attributes */
+static const attr FIELDSET_attr[] = {   /* FIELDSET attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -410,7 +1555,7 @@ static const attr fieldset_attr[] = {   /* FIELDSET attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr fig_attr[] = {        /* FIG attributes */
+static const attr FIG_attr[] = {        /* FIG attributes */
 	{ "ALIGN"         T(N) },
 	{ "BORDER"        T(N) },
 	{ "CLASS"         T(c) },
@@ -431,7 +1576,7 @@ static const attr fig_attr[] = {        /* FIG attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr fn_attr[] = {         /* FN attributes */
+static const attr FN_attr[] = {         /* FN attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -442,7 +1587,7 @@ static const attr fn_attr[] = {         /* FN attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr font_attr[] = {       /* BASEFONT attributes */
+static const attr FONT_attr[] = {       /* BASEFONT attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COLOR"         T(N) },
@@ -452,10 +1597,13 @@ static const attr font_attr[] = {       /* BASEFONT attributes */
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "SIZE"          T(N) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr form_attr[] = {       /* FORM attributes */
+static const attr FORM_attr[] = {       /* FORM attributes */
+	{ "ACCEPT"        T(N) },
 	{ "ACCEPT-CHARSET" T(N) },
 	{ "ACTION"        T(h) },
 	{ "CLASS"         T(c) },
@@ -465,6 +1613,7 @@ static const attr form_attr[] = {       /* FORM attributes */
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "METHOD"        T(N) },
+	{ "ONRESET"       T(N) },
 	{ "ONSUBMIT"      T(N) },
 	{ "SCRIPT"        T(N) },
 	{ "STYLE"         T(N) },
@@ -474,7 +1623,9 @@ static const attr form_attr[] = {       /* FORM attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr frame_attr[] = {      /* FRAME attributes */
+static const attr FRAME_attr[] = {      /* FRAME attributes */
+	{ "CLASS"         T(c) },
+	{ "FRAMEBORDER"   T(N) },
 	{ "ID"            T(i) },
 	{ "LONGDESC"      T(h) },
 	{ "MARGINHEIGHT"  T(N) },
@@ -483,16 +1634,20 @@ static const attr frame_attr[] = {      /* FRAME attributes */
 	{ "NORESIZE"      T(N) },
 	{ "SCROLLING"     T(N) },
 	{ "SRC"           T(h) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr frameset_attr[] = {   /* FRAMESET attributes */
+static const attr FRAMESET_attr[] = {   /* FRAMESET attributes */
 	{ "COLS"          T(N) },
+	{ "ONLOAD"        T(N) },
+	{ "ONUNLOAD"      T(N) },
 	{ "ROWS"          T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr gen_attr[] = {        /* ABBR attributes */
+static const attr GEN_attr[] = {        /* ABBR attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -503,7 +1658,7 @@ static const attr gen_attr[] = {        /* ABBR attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr h_attr[] = {          /* H1 attributes */
+static const attr H_attr[] = {          /* H1 attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -521,12 +1676,13 @@ static const attr h_attr[] = {          /* H1 attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr hr_attr[] = {         /* HR attributes */
+static const attr HR_attr[] = {         /* HR attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
 	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
 	{ "MD"            T(N) },
 	{ "NOSHADE"       T(N) },
 	{ "SIZE"          T(N) },
@@ -537,8 +1693,9 @@ static const attr hr_attr[] = {         /* HR attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr iframe_attr[] = {     /* IFRAME attributes */
+static const attr IFRAME_attr[] = {     /* IFRAME attributes */
 	{ "ALIGN"         T(N) },
+	{ "CLASS"         T(c) },
 	{ "FRAMEBORDER"   T(N) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
@@ -549,11 +1706,12 @@ static const attr iframe_attr[] = {     /* IFRAME attributes */
 	{ "SCROLLING"     T(N) },
 	{ "SRC"           T(h) },
 	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
 	{ "WIDTH"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr img_attr[] = {        /* IMG attributes */
+static const attr IMG_attr[] = {        /* IMG attributes */
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "BORDER"        T(N) },
@@ -561,24 +1719,28 @@ static const attr img_attr[] = {        /* IMG attributes */
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
 	{ "HEIGHT"        T(N) },
+	{ "HSPACE"        T(N) },
 	{ "ID"            T(i) },
 	{ "ISMAP"         T(N) },
 	{ "ISOBJECT"      T(N) },
 	{ "LANG"          T(N) },
 	{ "LONGDESC"      T(h) },
 	{ "MD"            T(N) },
+	{ "NAME"          T(N) },
 	{ "SRC"           T(h) },
 	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ "UNITS"         T(N) },
 	{ "USEMAP"        T(h) },
+	{ "VSPACE"        T(N) },
 	{ "WIDTH"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr input_attr[] = {      /* INPUT attributes */
+static const attr INPUT_attr[] = {      /* INPUT attributes */
 	{ "ACCEPT"        T(N) },
 	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "ALT"           T(N) },
 	{ "CHECKED"       T(N) },
@@ -589,6 +1751,7 @@ static const attr input_attr[] = {      /* INPUT attributes */
 	{ "ERROR"         T(N) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
+	{ "ISMAP"         T(N) },
 	{ "LANG"          T(N) },
 	{ "MAX"           T(N) },
 	{ "MAXLENGTH"     T(N) },
@@ -598,32 +1761,35 @@ static const attr input_attr[] = {      /* INPUT attributes */
 	{ "NOTAB"         T(N) },
 	{ "ONBLUR"        T(N) },
 	{ "ONCHANGE"      T(N) },
-	{ "ONCLICK"       T(N) },
 	{ "ONFOCUS"       T(N) },
 	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
 	{ "SIZE"          T(N) },
 	{ "SRC"           T(h) },
 	{ "STYLE"         T(N) },
 	{ "TABINDEX"      T(N) },
 	{ "TITLE"         T(N) },
 	{ "TYPE"          T(N) },
+	{ "USEMAP"        T(N) },
 	{ "VALUE"         T(N) },
 	{ "WIDTH"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr isindex_attr[] = {    /* ISINDEX attributes */
+static const attr ISINDEX_attr[] = {    /* ISINDEX attributes */
 	{ "ACTION"        T(h) },
+	{ "CLASS"         T(c) },
 	{ "DIR"           T(N) },
 	{ "HREF"          T(h) },
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "PROMPT"        T(N) },
+	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr keygen_attr[] = {     /* KEYGEN attributes */
+static const attr KEYGEN_attr[] = {     /* KEYGEN attributes */
 	{ "CHALLENGE"     T(N) },
 	{ "CLASS"         T(c) },
 	{ "DIR"           T(N) },
@@ -635,7 +1801,7 @@ static const attr keygen_attr[] = {     /* KEYGEN attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr label_attr[] = {      /* LABEL attributes */
+static const attr LABEL_attr[] = {      /* LABEL attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -643,13 +1809,14 @@ static const attr label_attr[] = {      /* LABEL attributes */
 	{ "FOR"           T(N) },
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
-	{ "ONCLICK"       T(N) },
+	{ "ONBLUR"        T(N) },
+	{ "ONFOCUS"       T(N) },
 	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr legend_attr[] = {     /* LEGEND attributes */
+static const attr LEGEND_attr[] = {     /* LEGEND attributes */
 	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
@@ -662,7 +1829,7 @@ static const attr legend_attr[] = {     /* LEGEND attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr li_attr[] = {         /* LI attributes */
+static const attr LI_attr[] = {         /* LI attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DINGBAT"       T(N) },
@@ -679,11 +1846,14 @@ static const attr li_attr[] = {         /* LI attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr link_attr[] = {       /* LINK attributes */
+static const attr LINK_attr[] = {       /* LINK attributes */
 	{ "CHARSET"       T(N) },
 	{ "CLASS"         T(c) },
+	{ "DIR"           T(N) },
 	{ "HREF"          T(h) },
+	{ "HREFLANG"      T(N) },
 	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
 	{ "MEDIA"         T(N) },
 	{ "REL"           T(N) },
 	{ "REV"           T(N) },
@@ -694,7 +1864,7 @@ static const attr link_attr[] = {       /* LINK attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr map_attr[] = {        /* MAP attributes */
+static const attr MAP_attr[] = {        /* MAP attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -706,7 +1876,7 @@ static const attr map_attr[] = {        /* MAP attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr math_attr[] = {       /* MATH attributes */
+static const attr MATH_attr[] = {       /* MATH attributes */
 	{ "BOX"           T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -718,19 +1888,20 @@ static const attr math_attr[] = {       /* MATH attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr meta_attr[] = {       /* META attributes */
+static const attr META_attr[] = {       /* META attributes */
 	{ "CONTENT"       T(N) },
 	{ "HTTP-EQUIV"    T(N) },
 	{ "NAME"          T(N) },
+	{ "SCHEME"        T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr nextid_attr[] = {     /* NEXTID attributes */
+static const attr NEXTID_attr[] = {     /* NEXTID attributes */
 	{ "N"             T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr note_attr[] = {       /* NOTE attributes */
+static const attr NOTE_attr[] = {       /* NOTE attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
@@ -744,8 +1915,9 @@ static const attr note_attr[] = {       /* NOTE attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr object_attr[] = {     /* OBJECT attributes */
+static const attr OBJECT_attr[] = {     /* OBJECT attributes */
 	{ "ALIGN"         T(N) },
+	{ "ARCHIVE"       T(N) },
 	{ "BORDER"        T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLASSID"       T(h) },
@@ -773,7 +1945,7 @@ static const attr object_attr[] = {     /* OBJECT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr ol_attr[] = {         /* OL attributes */
+static const attr OL_attr[] = {         /* OL attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COMPACT"       T(N) },
@@ -789,13 +1961,14 @@ static const attr ol_attr[] = {         /* OL attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr option_attr[] = {     /* OPTION attributes */
+static const attr OPTION_attr[] = {     /* OPTION attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "DIR"           T(N) },
 	{ "DISABLED"      T(N) },
 	{ "ERROR"         T(N) },
 	{ "ID"            T(i) },
+	{ "LABEL"         T(N) },
 	{ "LANG"          T(N) },
 	{ "SELECTED"      T(N) },
 	{ "SHAPE"         T(N) },
@@ -805,7 +1978,7 @@ static const attr option_attr[] = {     /* OPTION attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr overlay_attr[] = {    /* OVERLAY attributes */
+static const attr OVERLAY_attr[] = {    /* OVERLAY attributes */
 	{ "CLASS"         T(c) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
@@ -821,7 +1994,7 @@ static const attr overlay_attr[] = {    /* OVERLAY attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr p_attr[] = {          /* P attributes */
+static const attr P_attr[] = {          /* P attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -834,7 +2007,7 @@ static const attr p_attr[] = {          /* P attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr param_attr[] = {      /* PARAM attributes */
+static const attr PARAM_attr[] = {      /* PARAM attributes */
 	{ "ACCEPT"        T(N) },
 	{ "ACCEPT-CHARSET" T(N) },
 	{ "ACCEPT-ENCODING" T(N) },
@@ -856,9 +2029,23 @@ static const attr param_attr[] = {      /* PARAM attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr script_attr[] = {     /* SCRIPT attributes */
+static const attr Q_attr[] = {          /* Q attributes */
+	{ "CITE"          T(h) },
+	{ "CLASS"         T(c) },
+	{ "CLEAR"         T(N) },
+	{ "DIR"           T(N) },
+	{ "ID"            T(i) },
+	{ "LANG"          T(N) },
+	{ "STYLE"         T(N) },
+	{ "TITLE"         T(N) },
+	{ 0               T(N) }	/* Terminate list */
+};
+
+static const attr SCRIPT_attr[] = {     /* SCRIPT attributes */
+	{ "CHARSET"       T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
+	{ "DEFER"         T(N) },
 	{ "DIR"           T(N) },
 	{ "EVENT"         T(N) },
 	{ "FOR"           T(N) },
@@ -874,7 +2061,7 @@ static const attr script_attr[] = {     /* SCRIPT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr select_attr[] = {     /* SELECT attributes */
+static const attr SELECT_attr[] = {     /* SELECT attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -900,15 +2087,20 @@ static const attr select_attr[] = {     /* SELECT attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr style_attr[] = {      /* STYLE attributes */
+static const attr STYLE_attr[] = {      /* STYLE attributes */
+	{ "CLASS"         T(c) },
 	{ "DIR"           T(N) },
+	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
+	{ "MEDIA"         T(N) },
 	{ "NOTATION"      T(N) },
+	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
+	{ "TYPE"          T(N) },
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr tab_attr[] = {        /* TAB attributes */
+static const attr TAB_attr[] = {        /* TAB attributes */
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -923,7 +2115,7 @@ static const attr tab_attr[] = {        /* TAB attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr table_attr[] = {      /* TABLE attributes */
+static const attr TABLE_attr[] = {      /* TABLE attributes */
 	{ "ALIGN"         T(N) },
 	{ "BACKGROUND"    T(h) },
 	{ "BORDER"        T(N) },
@@ -949,7 +2141,8 @@ static const attr table_attr[] = {      /* TABLE attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr td_attr[] = {         /* TD attributes */
+static const attr TD_attr[] = {         /* TD attributes */
+	{ "ABBR"          T(N) },
 	{ "ALIGN"         T(N) },
 	{ "AXES"          T(N) },
 	{ "AXIS"          T(N) },
@@ -961,11 +2154,13 @@ static const attr td_attr[] = {         /* TD attributes */
 	{ "COLSPAN"       T(N) },
 	{ "DIR"           T(N) },
 	{ "DP"            T(N) },
+	{ "HEADERS"       T(N) },
 	{ "HEIGHT"        T(N) },
 	{ "ID"            T(i) },
 	{ "LANG"          T(N) },
 	{ "NOWRAP"        T(N) },
 	{ "ROWSPAN"       T(N) },
+	{ "SCOPE"         T(N) },
 	{ "STYLE"         T(N) },
 	{ "TITLE"         T(N) },
 	{ "VALIGN"        T(N) },
@@ -973,8 +2168,9 @@ static const attr td_attr[] = {         /* TD attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr textarea_attr[] = {   /* TEXTAREA attributes */
+static const attr TEXTAREA_attr[] = {   /* TEXTAREA attributes */
 	{ "ACCEPT-CHARSET" T(N) },
+	{ "ACCESSKEY"     T(N) },
 	{ "ALIGN"         T(N) },
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
@@ -990,6 +2186,7 @@ static const attr textarea_attr[] = {   /* TEXTAREA attributes */
 	{ "ONCHANGE"      T(N) },
 	{ "ONFOCUS"       T(N) },
 	{ "ONSELECT"      T(N) },
+	{ "READONLY"      T(N) },
 	{ "ROWS"          T(N) },
 	{ "STYLE"         T(N) },
 	{ "TABINDEX"      T(N) },
@@ -997,7 +2194,7 @@ static const attr textarea_attr[] = {   /* TEXTAREA attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr tr_attr[] = {         /* TBODY attributes */
+static const attr TR_attr[] = {         /* TBODY attributes */
 	{ "ALIGN"         T(N) },
 	{ "CHAR"          T(N) },
 	{ "CHAROFF"       T(N) },
@@ -1014,7 +2211,7 @@ static const attr tr_attr[] = {         /* TBODY attributes */
 	{ 0               T(N) }	/* Terminate list */
 };
 
-static const attr ul_attr[] = {         /* DIR attributes */
+static const attr UL_attr[] = {         /* DIR attributes */
 	{ "CLASS"         T(c) },
 	{ "CLEAR"         T(N) },
 	{ "COMPACT"       T(N) },
@@ -1185,131 +2382,133 @@ static const attr ul_attr[] = {         /* DIR attributes */
 #define NULL_HTTag NULL_HTTag_
 #endif
 
+#define ATTR_DATA(name) name##_attr, HTML_##name##_ATTRIBUTES, name##_attr_type
+
 #endif /* once_HTMLDTD */
 /* *INDENT-OFF* */
 static const HTTag tags_table1[HTML_ALL_ELEMENTS] = {
- { P(A),           a_attr,         HTML_A_ATTRIBUTES,          SGML_MIXED,   T_A},
- { P(ABBR),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_ABBR},
- { P(ACRONYM),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_ACRONYM},
- { P(ADDRESS),     address_attr,   HTML_ADDRESS_ATTRIBUTES,    SGML_MIXED,   T_ADDRESS},
- { P(APPLET),      applet_attr,    HTML_APPLET_ATTRIBUTES,     SGML_MIXED,   T_APPLET},
- { P(AREA),        area_attr,      HTML_AREA_ATTRIBUTES,       SGML_EMPTY,   T_AREA},
- { P(AU),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_AU},
- { P(AUTHOR),      gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_AUTHOR},
- { P(B),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_B},
- { P0(BANNER),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_BANNER},
- { P(BASE),        base_attr,      HTML_BASE_ATTRIBUTES,       SGML_EMPTY,   T_BASE},
- { P(BASEFONT),    font_attr,      HTML_FONT_ATTRIBUTES,       SGML_EMPTY,   T_BASEFONT},
- { P(BDO),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_BDO},
- { P(BGSOUND),     bgsound_attr,   HTML_BGSOUND_ATTRIBUTES,    SGML_EMPTY,   T_BGSOUND},
- { P(BIG),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_BIG},
- { P(BLINK),       gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_BLINK},
- { P(BLOCKQUOTE),  bq_attr,        HTML_BQ_ATTRIBUTES,         SGML_MIXED,   T_BLOCKQUOTE},
- { P(BODY),        body_attr,      HTML_BODY_ATTRIBUTES,       SGML_MIXED,   T_BODY},
- { P(BODYTEXT),    bodytext_attr,  HTML_BODYTEXT_ATTRIBUTES,   SGML_MIXED,   T_BODYTEXT},
- { P(BQ),          bq_attr,        HTML_BQ_ATTRIBUTES,         SGML_MIXED,   T_BQ},
- { P(BR),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_BR},
- { P(BUTTON),      button_attr,    HTML_BUTTON_ATTRIBUTES,     SGML_MIXED,   T_BUTTON},
- { P(CAPTION),     caption_attr,   HTML_CAPTION_ATTRIBUTES,    SGML_MIXED,   T_CAPTION},
- { P(CENTER),      div_attr,       HTML_DIV_ATTRIBUTES,        SGML_MIXED,   T_CENTER},
- { P(CITE),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_CITE},
- { P(CODE),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_CODE},
- { P(COL),         col_attr,       HTML_COL_ATTRIBUTES,        SGML_EMPTY,   T_COL},
- { P(COLGROUP),    col_attr,       HTML_COL_ATTRIBUTES,        SGML_ELEMENT, T_COLGROUP},
- { P(COMMENT),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_PCDATA,  T_COMMENT},
- { P(CREDIT),      credit_attr,    HTML_CREDIT_ATTRIBUTES,     SGML_MIXED,   T_CREDIT},
- { P(DD),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_DD},
- { P(DEL),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_DEL},
- { P(DFN),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_DFN},
- { P(DIR),         ul_attr,        HTML_UL_ATTRIBUTES,         SGML_MIXED,   T_DIR},
- { P(DIV),         div_attr,       HTML_DIV_ATTRIBUTES,        SGML_MIXED,   T_DIV},
- { P(DL),          dl_attr,        HTML_DL_ATTRIBUTES,         SGML_MIXED,   T_DL},
- { P(DLC),         dl_attr,        HTML_DL_ATTRIBUTES,         SGML_MIXED,   T_DLC},
- { P(DT),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_DT},
- { P(EM),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_EM},
- { P(EMBED),       embed_attr,     HTML_EMBED_ATTRIBUTES,      SGML_EMPTY,   T_EMBED},
- { P(FIELDSET),    fieldset_attr,  HTML_FIELDSET_ATTRIBUTES,   SGML_MIXED,   T_FIELDSET},
- { P(FIG),         fig_attr,       HTML_FIG_ATTRIBUTES,        SGML_MIXED,   T_FIG},
- { P(FN),          fn_attr,        HTML_FN_ATTRIBUTES,         SGML_MIXED,   T_FN},
- { P(FONT),        font_attr,      HTML_FONT_ATTRIBUTES,       SGML_MIXED,   T_FONT},
- { P(FORM),        form_attr,      HTML_FORM_ATTRIBUTES,       SGML_MIXED,   T_FORM},
- { P(FRAME),       frame_attr,     HTML_FRAME_ATTRIBUTES,      SGML_EMPTY,   T_FRAME},
- { P(FRAMESET),    frameset_attr,  HTML_FRAMESET_ATTRIBUTES,   SGML_ELEMENT, T_FRAMESET},
- { P0(H1),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H1},
- { P0(H2),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H2},
- { P0(H3),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H3},
- { P0(H4),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H4},
- { P0(H5),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H5},
- { P0(H6),         h_attr,         HTML_H_ATTRIBUTES,          SGML_MIXED,   T_H6},
- { P(HEAD),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_ELEMENT, T_HEAD},
- { P(HR),          hr_attr,        HTML_HR_ATTRIBUTES,         SGML_EMPTY,   T_HR},
- { P(HTML),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_HTML},
- { P(HY),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_HY},
- { P(I),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_I},
- { P(IFRAME),      iframe_attr,    HTML_IFRAME_ATTRIBUTES,     SGML_MIXED,   T_IFRAME},
- { P(IMG),         img_attr,       HTML_IMG_ATTRIBUTES,        SGML_EMPTY,   T_IMG},
- { P(INPUT),       input_attr,     HTML_INPUT_ATTRIBUTES,      SGML_EMPTY,   T_INPUT},
- { P(INS),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_INS},
- { P(ISINDEX),     isindex_attr,   HTML_ISINDEX_ATTRIBUTES,    SGML_EMPTY,   T_ISINDEX},
- { P(KBD),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_KBD},
- { P(KEYGEN),      keygen_attr,    HTML_KEYGEN_ATTRIBUTES,     SGML_EMPTY,   T_KEYGEN},
- { P(LABEL),       label_attr,     HTML_LABEL_ATTRIBUTES,      SGML_MIXED,   T_LABEL},
- { P(LEGEND),      legend_attr,    HTML_LEGEND_ATTRIBUTES,     SGML_MIXED,   T_LEGEND},
- { P(LH),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_LH},
- { P(LI),          li_attr,        HTML_LI_ATTRIBUTES,         SGML_MIXED,   T_LI},
- { P(LINK),        link_attr,      HTML_LINK_ATTRIBUTES,       SGML_EMPTY,   T_LINK},
- { P(LISTING),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_LITTERAL,T_LISTING},
- { P(MAP),         map_attr,       HTML_MAP_ATTRIBUTES,        SGML_ELEMENT, T_MAP},
- { P(MARQUEE),     gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_MARQUEE},
- { P(MATH),        math_attr,      HTML_MATH_ATTRIBUTES,       SGML_PCDATA,  T_MATH},
- { P(MENU),        ul_attr,        HTML_UL_ATTRIBUTES,         SGML_MIXED,   T_MENU},
- { P(META),        meta_attr,      HTML_META_ATTRIBUTES,       SGML_EMPTY,   T_META},
- { P(NEXTID),      nextid_attr,    HTML_NEXTID_ATTRIBUTES,     SGML_EMPTY,   T_NEXTID},
- { P(NOFRAMES),    gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_NOFRAMES},
- { P(NOTE),        note_attr,      HTML_NOTE_ATTRIBUTES,       SGML_MIXED,   T_NOTE},
- { P(OBJECT),      object_attr,    HTML_OBJECT_ATTRIBUTES,     SGML_LITTERAL,T_OBJECT},
- { P(OL),          ol_attr,        HTML_OL_ATTRIBUTES,         SGML_MIXED,   T_OL},
- { P(OPTION),      option_attr,    HTML_OPTION_ATTRIBUTES,     SGML_PCDATA,  T_OPTION},
- { P(OVERLAY),     overlay_attr,   HTML_OVERLAY_ATTRIBUTES,    SGML_PCDATA,  T_OVERLAY},
- { P(P),           p_attr,         HTML_P_ATTRIBUTES,          SGML_MIXED,   T_P},
- { P(PARAM),       param_attr,     HTML_PARAM_ATTRIBUTES,      SGML_EMPTY,   T_PARAM},
- { P(PLAINTEXT),   gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_LITTERAL,T_PLAINTEXT},
- { P0(PRE),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_PRE},
- { P(Q),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_Q},
- { P(S),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_S},
- { P(SAMP),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SAMP},
- { P(SCRIPT),      script_attr,    HTML_SCRIPT_ATTRIBUTES,     SGML_SCRIPT,  T_SCRIPT},
- { P(SELECT),      select_attr,    HTML_SELECT_ATTRIBUTES,     SGML_ELEMENT, T_SELECT},
- { P(SHY),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_SHY},
- { P(SMALL),       gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SMALL},
- { P(SPAN),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SPAN},
- { P(SPOT),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_SPOT},
- { P(STRIKE),      gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_STRIKE},
- { P(STRONG),      gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_STRONG},
- { P(STYLE),       style_attr,     HTML_STYLE_ATTRIBUTES,      SGML_CDATA,   T_STYLE},
- { P(SUB),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SUB},
- { P(SUP),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_SUP},
- { P(TAB),         tab_attr,       HTML_TAB_ATTRIBUTES,        SGML_EMPTY,   T_TAB},
- { P(TABLE),       table_attr,     HTML_TABLE_ATTRIBUTES,      SGML_ELEMENT, T_TABLE},
- { P(TBODY),       tr_attr,        HTML_TR_ATTRIBUTES,         SGML_ELEMENT, T_TBODY},
- { P(TD),          td_attr,        HTML_TD_ATTRIBUTES,         SGML_MIXED,   T_TD},
- { P(TEXTAREA),    textarea_attr,  HTML_TEXTAREA_ATTRIBUTES,   SGML_PCDATA,  T_TEXTAREA},
- { P(TEXTFLOW),    bodytext_attr,  HTML_BODYTEXT_ATTRIBUTES,   SGML_MIXED,   T_TEXTFLOW},
- { P(TFOOT),       tr_attr,        HTML_TR_ATTRIBUTES,         SGML_ELEMENT, T_TFOOT},
- { P(TH),          td_attr,        HTML_TD_ATTRIBUTES,         SGML_MIXED,   T_TH},
- { P(THEAD),       tr_attr,        HTML_TR_ATTRIBUTES,         SGML_ELEMENT, T_THEAD},
- { P(TITLE),       gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_PCDATA,  T_TITLE},
- { P(TR),          tr_attr,        HTML_TR_ATTRIBUTES,         SGML_MIXED,   T_TR},
- { P(TT),          gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_TT},
- { P(U),           gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_U},
- { P(UL),          ul_attr,        HTML_UL_ATTRIBUTES,         SGML_MIXED,   T_UL},
- { P(VAR),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_MIXED,   T_VAR},
- { P(WBR),         gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_EMPTY,   T_WBR},
- { P0(XMP),        gen_attr,       HTML_GEN_ATTRIBUTES,        SGML_LITTERAL,T_XMP},
+ { P(A),           ATTR_DATA(A),           SGML_MIXED,   T_A},
+ { P(ABBR),        ATTR_DATA(GEN),         SGML_MIXED,   T_ABBR},
+ { P(ACRONYM),     ATTR_DATA(GEN),         SGML_MIXED,   T_ACRONYM},
+ { P(ADDRESS),     ATTR_DATA(ADDRESS),     SGML_MIXED,   T_ADDRESS},
+ { P(APPLET),      ATTR_DATA(APPLET),      SGML_MIXED,   T_APPLET},
+ { P(AREA),        ATTR_DATA(AREA),        SGML_EMPTY,   T_AREA},
+ { P(AU),          ATTR_DATA(GEN),         SGML_MIXED,   T_AU},
+ { P(AUTHOR),      ATTR_DATA(GEN),         SGML_MIXED,   T_AUTHOR},
+ { P(B),           ATTR_DATA(GEN),         SGML_MIXED,   T_B},
+ { P0(BANNER),     ATTR_DATA(GEN),         SGML_MIXED,   T_BANNER},
+ { P(BASE),        ATTR_DATA(BASE),        SGML_EMPTY,   T_BASE},
+ { P(BASEFONT),    ATTR_DATA(FONT),        SGML_EMPTY,   T_BASEFONT},
+ { P(BDO),         ATTR_DATA(GEN),         SGML_MIXED,   T_BDO},
+ { P(BGSOUND),     ATTR_DATA(BGSOUND),     SGML_EMPTY,   T_BGSOUND},
+ { P(BIG),         ATTR_DATA(GEN),         SGML_MIXED,   T_BIG},
+ { P(BLINK),       ATTR_DATA(GEN),         SGML_MIXED,   T_BLINK},
+ { P(BLOCKQUOTE),  ATTR_DATA(BQ),          SGML_MIXED,   T_BLOCKQUOTE},
+ { P(BODY),        ATTR_DATA(BODY),        SGML_MIXED,   T_BODY},
+ { P(BODYTEXT),    ATTR_DATA(BODYTEXT),    SGML_MIXED,   T_BODYTEXT},
+ { P(BQ),          ATTR_DATA(BQ),          SGML_MIXED,   T_BQ},
+ { P(BR),          ATTR_DATA(GEN),         SGML_EMPTY,   T_BR},
+ { P(BUTTON),      ATTR_DATA(BUTTON),      SGML_MIXED,   T_BUTTON},
+ { P(CAPTION),     ATTR_DATA(CAPTION),     SGML_MIXED,   T_CAPTION},
+ { P(CENTER),      ATTR_DATA(DIV),         SGML_MIXED,   T_CENTER},
+ { P(CITE),        ATTR_DATA(GEN),         SGML_MIXED,   T_CITE},
+ { P(CODE),        ATTR_DATA(GEN),         SGML_MIXED,   T_CODE},
+ { P(COL),         ATTR_DATA(COL),         SGML_EMPTY,   T_COL},
+ { P(COLGROUP),    ATTR_DATA(COL),         SGML_ELEMENT, T_COLGROUP},
+ { P(COMMENT),     ATTR_DATA(GEN),         SGML_PCDATA,  T_COMMENT},
+ { P(CREDIT),      ATTR_DATA(CREDIT),      SGML_MIXED,   T_CREDIT},
+ { P(DD),          ATTR_DATA(GEN),         SGML_MIXED,   T_DD},
+ { P(DEL),         ATTR_DATA(DEL),         SGML_MIXED,   T_DEL},
+ { P(DFN),         ATTR_DATA(GEN),         SGML_MIXED,   T_DFN},
+ { P(DIR),         ATTR_DATA(UL),          SGML_MIXED,   T_DIR},
+ { P(DIV),         ATTR_DATA(DIV),         SGML_MIXED,   T_DIV},
+ { P(DL),          ATTR_DATA(DL),          SGML_MIXED,   T_DL},
+ { P(DLC),         ATTR_DATA(DL),          SGML_MIXED,   T_DLC},
+ { P(DT),          ATTR_DATA(GEN),         SGML_MIXED,   T_DT},
+ { P(EM),          ATTR_DATA(GEN),         SGML_MIXED,   T_EM},
+ { P(EMBED),       ATTR_DATA(EMBED),       SGML_EMPTY,   T_EMBED},
+ { P(FIELDSET),    ATTR_DATA(FIELDSET),    SGML_MIXED,   T_FIELDSET},
+ { P(FIG),         ATTR_DATA(FIG),         SGML_MIXED,   T_FIG},
+ { P(FN),          ATTR_DATA(FN),          SGML_MIXED,   T_FN},
+ { P(FONT),        ATTR_DATA(FONT),        SGML_MIXED,   T_FONT},
+ { P(FORM),        ATTR_DATA(FORM),        SGML_MIXED,   T_FORM},
+ { P(FRAME),       ATTR_DATA(FRAME),       SGML_EMPTY,   T_FRAME},
+ { P(FRAMESET),    ATTR_DATA(FRAMESET),    SGML_ELEMENT, T_FRAMESET},
+ { P0(H1),         ATTR_DATA(H),           SGML_MIXED,   T_H1},
+ { P0(H2),         ATTR_DATA(H),           SGML_MIXED,   T_H2},
+ { P0(H3),         ATTR_DATA(H),           SGML_MIXED,   T_H3},
+ { P0(H4),         ATTR_DATA(H),           SGML_MIXED,   T_H4},
+ { P0(H5),         ATTR_DATA(H),           SGML_MIXED,   T_H5},
+ { P0(H6),         ATTR_DATA(H),           SGML_MIXED,   T_H6},
+ { P(HEAD),        ATTR_DATA(GEN),         SGML_ELEMENT, T_HEAD},
+ { P(HR),          ATTR_DATA(HR),          SGML_EMPTY,   T_HR},
+ { P(HTML),        ATTR_DATA(GEN),         SGML_MIXED,   T_HTML},
+ { P(HY),          ATTR_DATA(GEN),         SGML_EMPTY,   T_HY},
+ { P(I),           ATTR_DATA(GEN),         SGML_MIXED,   T_I},
+ { P(IFRAME),      ATTR_DATA(IFRAME),      SGML_MIXED,   T_IFRAME},
+ { P(IMG),         ATTR_DATA(IMG),         SGML_EMPTY,   T_IMG},
+ { P(INPUT),       ATTR_DATA(INPUT),       SGML_EMPTY,   T_INPUT},
+ { P(INS),         ATTR_DATA(DEL),         SGML_MIXED,   T_INS},
+ { P(ISINDEX),     ATTR_DATA(ISINDEX),     SGML_EMPTY,   T_ISINDEX},
+ { P(KBD),         ATTR_DATA(GEN),         SGML_MIXED,   T_KBD},
+ { P(KEYGEN),      ATTR_DATA(KEYGEN),      SGML_EMPTY,   T_KEYGEN},
+ { P(LABEL),       ATTR_DATA(LABEL),       SGML_MIXED,   T_LABEL},
+ { P(LEGEND),      ATTR_DATA(LEGEND),      SGML_MIXED,   T_LEGEND},
+ { P(LH),          ATTR_DATA(GEN),         SGML_MIXED,   T_LH},
+ { P(LI),          ATTR_DATA(LI),          SGML_MIXED,   T_LI},
+ { P(LINK),        ATTR_DATA(LINK),        SGML_EMPTY,   T_LINK},
+ { P(LISTING),     ATTR_DATA(GEN),         SGML_LITTERAL,T_LISTING},
+ { P(MAP),         ATTR_DATA(MAP),         SGML_ELEMENT, T_MAP},
+ { P(MARQUEE),     ATTR_DATA(GEN),         SGML_MIXED,   T_MARQUEE},
+ { P(MATH),        ATTR_DATA(MATH),        SGML_PCDATA,  T_MATH},
+ { P(MENU),        ATTR_DATA(UL),          SGML_MIXED,   T_MENU},
+ { P(META),        ATTR_DATA(META),        SGML_EMPTY,   T_META},
+ { P(NEXTID),      ATTR_DATA(NEXTID),      SGML_EMPTY,   T_NEXTID},
+ { P(NOFRAMES),    ATTR_DATA(GEN),         SGML_MIXED,   T_NOFRAMES},
+ { P(NOTE),        ATTR_DATA(NOTE),        SGML_MIXED,   T_NOTE},
+ { P(OBJECT),      ATTR_DATA(OBJECT),      SGML_LITTERAL,T_OBJECT},
+ { P(OL),          ATTR_DATA(OL),          SGML_MIXED,   T_OL},
+ { P(OPTION),      ATTR_DATA(OPTION),      SGML_PCDATA,  T_OPTION},
+ { P(OVERLAY),     ATTR_DATA(OVERLAY),     SGML_PCDATA,  T_OVERLAY},
+ { P(P),           ATTR_DATA(P),           SGML_MIXED,   T_P},
+ { P(PARAM),       ATTR_DATA(PARAM),       SGML_EMPTY,   T_PARAM},
+ { P(PLAINTEXT),   ATTR_DATA(GEN),         SGML_LITTERAL,T_PLAINTEXT},
+ { P0(PRE),        ATTR_DATA(GEN),         SGML_MIXED,   T_PRE},
+ { P(Q),           ATTR_DATA(Q),           SGML_MIXED,   T_Q},
+ { P(S),           ATTR_DATA(GEN),         SGML_MIXED,   T_S},
+ { P(SAMP),        ATTR_DATA(GEN),         SGML_MIXED,   T_SAMP},
+ { P(SCRIPT),      ATTR_DATA(SCRIPT),      SGML_SCRIPT,  T_SCRIPT},
+ { P(SELECT),      ATTR_DATA(SELECT),      SGML_ELEMENT, T_SELECT},
+ { P(SHY),         ATTR_DATA(GEN),         SGML_EMPTY,   T_SHY},
+ { P(SMALL),       ATTR_DATA(GEN),         SGML_MIXED,   T_SMALL},
+ { P(SPAN),        ATTR_DATA(GEN),         SGML_MIXED,   T_SPAN},
+ { P(SPOT),        ATTR_DATA(GEN),         SGML_EMPTY,   T_SPOT},
+ { P(STRIKE),      ATTR_DATA(GEN),         SGML_MIXED,   T_STRIKE},
+ { P(STRONG),      ATTR_DATA(GEN),         SGML_MIXED,   T_STRONG},
+ { P(STYLE),       ATTR_DATA(STYLE),       SGML_CDATA,   T_STYLE},
+ { P(SUB),         ATTR_DATA(GEN),         SGML_MIXED,   T_SUB},
+ { P(SUP),         ATTR_DATA(GEN),         SGML_MIXED,   T_SUP},
+ { P(TAB),         ATTR_DATA(TAB),         SGML_EMPTY,   T_TAB},
+ { P(TABLE),       ATTR_DATA(TABLE),       SGML_ELEMENT, T_TABLE},
+ { P(TBODY),       ATTR_DATA(TR),          SGML_ELEMENT, T_TBODY},
+ { P(TD),          ATTR_DATA(TD),          SGML_MIXED,   T_TD},
+ { P(TEXTAREA),    ATTR_DATA(TEXTAREA),    SGML_PCDATA,  T_TEXTAREA},
+ { P(TEXTFLOW),    ATTR_DATA(BODYTEXT),    SGML_MIXED,   T_TEXTFLOW},
+ { P(TFOOT),       ATTR_DATA(TR),          SGML_ELEMENT, T_TFOOT},
+ { P(TH),          ATTR_DATA(TD),          SGML_MIXED,   T_TH},
+ { P(THEAD),       ATTR_DATA(TR),          SGML_ELEMENT, T_THEAD},
+ { P(TITLE),       ATTR_DATA(GEN),         SGML_PCDATA,  T_TITLE},
+ { P(TR),          ATTR_DATA(TR),          SGML_MIXED,   T_TR},
+ { P(TT),          ATTR_DATA(GEN),         SGML_MIXED,   T_TT},
+ { P(U),           ATTR_DATA(GEN),         SGML_MIXED,   T_U},
+ { P(UL),          ATTR_DATA(UL),          SGML_MIXED,   T_UL},
+ { P(VAR),         ATTR_DATA(GEN),         SGML_MIXED,   T_VAR},
+ { P(WBR),         ATTR_DATA(GEN),         SGML_EMPTY,   T_WBR},
+ { P0(XMP),        ATTR_DATA(GEN),         SGML_LITTERAL,T_XMP},
 /* additional (alternative variants), not counted in HTML_ELEMENTS: */
 /* This one will be used as a temporary substitute within the parser when
    it has been signalled to parse OBJECT content as MIXED. - kw */
- { P(OBJECT),      object_attr,    HTML_OBJECT_ATTRIBUTES,     SGML_MIXED,   T_OBJECT_PCDATA},
+ { P(OBJECT),      ATTR_DATA(OBJECT),      SGML_MIXED,   T_OBJECT_PCDATA},
 };
 /* *INDENT-ON* */