File:  [Public] / Amaya / amaya / XHTMLbuilder.c
Revision 1.5: download - view: text, annotated - select for diffs
Fri May 19 13:43:48 2000 UTC (24 years, 1 month ago) by cvs
Branches: MAIN
CVS tags: HEAD
Improvement of the XML parser
Laurent

/*
 *
 *  (c) COPYRIGHT MIT and INRIA, 1996.
 *  Please first read the full copyright statement in file COPYRIGHT.
 *
 */

/*
 *
 * html2thot parses a HTML file and builds the corresponding abstract tree
 * for a Thot document of type HTML.
 *
 * Author: V. Quint
 *         L. Carcone 
 */

#define THOT_EXPORT extern
#include "amaya.h"
#include "css.h"
#include "parser.h"
#include "HTML.h"

#include "HTMLactions_f.h"
#include "HTMLedit_f.h"
#include "HTMLimage_f.h"
#include "HTMLtable_f.h"
#include "HTMLimage_f.h"
#include "UIcss_f.h"
#include "XHTMLbuilder_f.h"
#include "XmlNameSpaces_f.h"
#include "styleparser_f.h"
#include "css_f.h"

/* maximum length of a Thot structure schema name */
#define MAX_SS_NAME_LENGTH 32


typedef CHAR_T XhtmlEntityName[10];
typedef struct _XhtmlEntity
{
  XhtmlEntityName  charName;  /* entity name */
  int              charCode;  /* decimal code of ISO-Latin1 char */
}
XhtmlEntity;

XhtmlEntity        XhtmlEntityTable[] =
{
/* This table MUST be in alphabetical order */
{TEXT("AElig"), 198},	/* latin capital letter AE = */ 
                        /* latin capital ligature AE, U+00C6 ISOlat1 */
{TEXT("Aacute"), 193},	/* latin capital letter A with acute, U+00C1 ISOlat1 */
{TEXT("Acirc"), 194},	/* latin capital letter A with circumflex, U+00C2 ISOlat1 */
{TEXT("Agrave"), 192},	/* latin capital letter A with grave = */
                        /* latin capital letter A grave, U+00C0 ISOlat1 */
{TEXT("Alpha"), 913},	/* greek capital letter alpha, U+0391 */
{TEXT("Aring"), 197},	/* latin capital letter A with ring above = */ 
                        /* latin capital letter A ring, U+00C5 ISOlat1 */
{TEXT("Atilde"), 195},	/* latin capital letter A with tilde, U+00C3 ISOlat1 */
{TEXT("Auml"), 196},	/* latin capital letter A with diaeresis, U+00C4 ISOlat1 */
{TEXT("Beta"), 914},	/* greek capital letter beta, U+0392 */
{TEXT("Ccedil"), 199},	/* latin capital letter C with cedilla, U+00C7 ISOlat1 */
{TEXT("Chi"), 935},	/* greek capital letter chi, U+03A7 */
{TEXT("Dagger"), 8225},	/* double dagger, U+2021 ISOpub */
{TEXT("Delta"), 916},	/* greek capital letter delta, U+0394 ISOgrk3 */
{TEXT("ETH"), 208},	/* latin capital letter ETH, U+00D0 ISOlat1 */
{TEXT("Eacute"), 201},	/* latin capital letter E with acute, U+00C9 ISOlat1 */
{TEXT("Ecirc"), 202},	/* latin capital letter E with circumflex, U+00CA ISOlat1 */
{TEXT("Egrave"), 200},	/* latin capital letter E with grave, U+00C8 ISOlat1 */
{TEXT("Epsilon"), 917},	/* greek capital letter epsilon, U+0395 */
{TEXT("Eta"), 919},	/* greek capital letter eta, U+0397 */
{TEXT("Euml"), 203},	/* latin capital letter E with diaeresis, U+00CB ISOlat1 */
{TEXT("Gamma"), 915},	/* greek capital letter gamma, U+0393 ISOgrk3 */
{TEXT("Iacute"), 205},	/* latin capital letter I with acute, U+00CD ISOlat1 */
{TEXT("Icirc"), 206},	/* latin capital letter I with circumflex, U+00CE ISOlat1 */
{TEXT("Igrave"), 204},	/* latin capital letter I with grave, U+00CC ISOlat1 */
{TEXT("Iota"), 921},	/* greek capital letter iota, U+0399 */
{TEXT("Iuml"), 207},	/* latin capital letter I with diaeresis, U+00CF ISOlat1 */
{TEXT("Kappa"), 922},	/* greek capital letter kappa, U+039A */
{TEXT("Lambda"), 923},	/* greek capital letter lambda, U+039B ISOgrk3 */
{TEXT("Mu"), 924},	/* greek capital letter mu, U+039C */
{TEXT("Ntilde"), 209},	/* latin capital letter N with tilde, U+00D1 ISOlat1 */
{TEXT("Nu"), 925},	/* greek capital letter nu, U+039D */
{TEXT("OElig"), 338},	/* latin capital ligature OE, U+0152 ISOlat2 */
{TEXT("Oacute"), 211},	/* latin capital letter O with acute, U+00D3 ISOlat1 */
{TEXT("Ocirc"), 212},  	/* latin capital letter O with circumflex, U+00D4 ISOlat1 */
{TEXT("Ograve"), 210},	/* latin capital letter O with grave, U+00D2 ISOlat1 */
{TEXT("Omega"), 937},  	/* greek capital letter omega, U+03A9 ISOgrk3 */
{TEXT("Omicron"), 927},	/* greek capital letter omicron, U+039F */
{TEXT("Oslash"), 216},	/* latin capital letter O with stroke = */ 
                        /* latin capital letter O slash, U+00D8 ISOlat1 */
{TEXT("Otilde"), 213},	/* latin capital letter O with tilde, U+00D5 ISOlat1 */
{TEXT("Ouml"), 214},   	/* latin capital letter O with diaeresis, U+00D6 ISOlat1 */
{TEXT("Phi"), 934},    	/* greek capital letter phi, U+03A6 ISOgrk3 */
{TEXT("Pi"), 928},     	/* greek capital letter pi, U+03A0 ISOgrk3 */
{TEXT("Prime"), 8243},	/* double prime = seconds = inches, U+2033 ISOtech */
{TEXT("Psi"), 936},    	/* greek capital letter psi, U+03A8 ISOgrk3 */
{TEXT("Rho"), 929},    	/* greek capital letter rho, U+03A1 */
{TEXT("Scaron"), 352},	/* latin capital letter S with caron, U+0160 ISOlat2 */
{TEXT("Sigma"), 931},  	/* greek capital letter sigma, U+03A3 ISOgrk3 */
{TEXT("THORN"), 222},  	/* latin capital letter THORN, U+00DE ISOlat1 */
{TEXT("Tau"), 932},    	/* greek capital letter tau, U+03A4 */
{TEXT("Theta"), 920},  	/* greek capital letter theta, U+0398 ISOgrk3 */
{TEXT("Uacute"), 218},	/* latin capital letter U with acute, U+00DA ISOlat1 */
{TEXT("Ucirc"), 219},  	/* latin capital letter U with circumflex, U+00DB ISOlat1 */
{TEXT("Ugrave"), 217},	/* latin capital letter U with grave, U+00D9 ISOlat1 */
{TEXT("Upsilon"), 933},	/* greek capital letter upsilon, U+03A5 ISOgrk3 */
{TEXT("Uuml"), 220},   	/* latin capital letter U with diaeresis, U+00DC ISOlat1 */
{TEXT("Xi"), 926},     	/* greek capital letter xi, U+039E ISOgrk3 */
{TEXT("Yacute"), 221},	/* latin capital letter Y with acute, U+00DD ISOlat1 */
{TEXT("Yuml"), 376},   	/* latin capital letter Y with diaeresis, U+0178 ISOlat2 */
{TEXT("Zeta"), 918},   	/* greek capital letter zeta, U+0396 */
{TEXT("aacute"), 225},	/* latin small letter a with acute, U+00E1 ISOlat1 */
{TEXT("acirc"), 226},  	/* latin small letter a with circumflex, U+00E2 ISOlat1 */
{TEXT("acute"), 180},  	/* acute accent = spacing acute, U+00B4 ISOdia */
{TEXT("aelig"), 230},  	/* latin small letter ae = */
                        /* latin small ligature ae, U+00E6 ISOlat1 */
{TEXT("agrave"), 224},	/* latin small letter a with grave = */
                        /* latin small letter a grave, U+00E0 ISOlat1 */
{TEXT("alefsym"), 8501},/* alef symbol = first transfinite cardinal, U+2135 NEW */
{TEXT("alpha"), 945},  	/* greek small letter alpha, U+03B1 ISOgrk3 */
{TEXT("amp"), 38},     	/* ampersand, U+0026 ISOnum */
{TEXT("and"), 8743},   	/* logical and = wedge, U+2227 ISOtech */
{TEXT("ang"), 8736},   	/* angle, U+2220 ISOamso */
{TEXT("aring"), 229},  	/* latin small letter a with ring above = */
                        /* latin small letter a ring, U+00E5 ISOlat1 */
{TEXT("asymp"), 8776},	/* almost equal to = asymptotic to, U+2248 ISOamsr */
{TEXT("atilde"), 227},	/* latin small letter a with tilde, U+00E3 ISOlat1 */
{TEXT("auml"), 228},   	/* latin small letter a with diaeresis, U+00E4 ISOlat1 */
{TEXT("bdquo"), 8222},	/* double low-9 quotation mark, U+201E NEW */
{TEXT("beta"), 946},   	/* greek small letter beta, U+03B2 ISOgrk3 */
{TEXT("brvbar"), 166},	/* broken bar = broken vertical bar, U+00A6 ISOnum */
{TEXT("bull"), 8226},  	/* bullet = black small circle, U+2022 ISOpub */
{TEXT("cap"), 8745},   	/* intersection = cap, U+2229 ISOtech */
{TEXT("ccedil"), 231},	/* latin small letter c with cedilla, U+00E7 ISOlat1 */
{TEXT("cedil"), 184},  	/* cedilla = spacing cedilla, U+00B8 ISOdia */
{TEXT("cent"), 162},   	/* cent sign, U+00A2 ISOnum */
{TEXT("chi"), 967},    	/* greek small letter chi, U+03C7 ISOgrk3 */
{TEXT("circ"), 710},   	/* modifier letter circumflex accent, U+02C6 ISOpub */
{TEXT("clubs"), 9827},	/* black club suit = shamrock, U+2663 ISOpub */
{TEXT("cong"), 8773},  	/* approximately equal to, U+2245 ISOtech */
{TEXT("copy"), 169},   	/* copyright sign, U+00A9 ISOnum */
{TEXT("crarr"), 8629},	/* downwards arrow with corner leftwards = */
                        /* carriage return, U+21B5 NEW */
{TEXT("cup"), 8746},   	/* union = cup, U+222A ISOtech */
{TEXT("curren"), 164},	/* currency sign, U+00A4 ISOnum */
{TEXT("dArr"), 8659},  	/* downwards double arrow, U+21D3 ISOamsa */
{TEXT("dagger"), 8224},	/* dagger, U+2020 ISOpub */
{TEXT("darr"), 8595},  	/* downwards arrow, U+2193 ISOnum */
{TEXT("deg"), 176},    	/* degree sign, U+00B0 ISOnum */
{TEXT("delta"), 948},  	/* greek small letter delta, U+03B4 ISOgrk3 */
{TEXT("diams"), 9830},	/* black diamond suit, U+2666 ISOpub */
{TEXT("divide"), 247},	/* division sign, U+00F7 ISOnum */
{TEXT("eacute"), 233},	/* latin small letter e with acute, U+00E9 ISOlat1 */
{TEXT("ecirc"), 234},  	/* latin small letter e with circumflex, U+00EA ISOlat1 */
{TEXT("egrave"), 232},	/* latin small letter e with grave, U+00E8 ISOlat1 */
{TEXT("empty"), 8709},	/* empty set = null set = diameter, U+2205 ISOamso */
{TEXT("emsp"), 8195},  	/* em space, U+2003 ISOpub */
{TEXT("ensp"), 8194},  	/* en space, U+2002 ISOpub */
{TEXT("epsilon"), 949},	/* greek small letter epsilon, U+03B5 ISOgrk3 */
{TEXT("equiv"), 8801},	/* identical to, U+2261 ISOtech */
{TEXT("eta"), 951},    	/* greek small letter eta, U+03B7 ISOgrk3 */
{TEXT("eth"), 240},    	/* latin small letter eth, U+00F0 ISOlat1 */
{TEXT("euml"), 235},   	/* latin small letter e with diaeresis, U+00EB ISOlat1 */
{TEXT("euro"), 8364},  	/* euro sign, U+20AC NEW */
{TEXT("exist"), 8707},  /* there exists, U+2203 ISOtech */
{TEXT("fnof"), 402},   	/* latin small f with hook = function = */
                        /* florin, U+0192 ISOtech */
{TEXT("forall"), 8704},	/* for all, U+2200 ISOtech */
{TEXT("frac12"), 189},	/* vulgar fraction one half = */
                        /*fraction one half, U+00BD ISOnum */
{TEXT("frac14"), 188},	/* vulgar fraction one quarter = */
                        /* fraction one quarter, U+00BC ISOnum */
{TEXT("frac34"), 190},	/* vulgar fraction three quarters = */
                        /* fraction three quarters, U+00BE ISOnum */
{TEXT("frasl"), 8260},	/* fraction slash, U+2044 NEW */
{TEXT("gamma"), 947},  	/* greek small letter gamma, U+03B3 ISOgrk3 */
{TEXT("ge"), 8805},    	/* greater-than or equal to, U+2265 ISOtech */
{TEXT("gt"), 62},      	/* greater-than sign, U+003E ISOnum */
{TEXT("hArr"), 8660},  	/* left right double arrow, U+21D4 ISOamsa */
{TEXT("harr"), 8596},  	/* left right arrow, U+2194 ISOamsa */
{TEXT("hearts"), 9829},	/* black heart suit = valentine, U+2665 ISOpub */
{TEXT("hellip"), 8230},	/* horizontal ellipsis = three dot leader, U+2026 ISOpub */
{TEXT("hyphen"), 173},	/* hyphen = discretionary hyphen, U+00AD ISOnum */
{TEXT("iacute"), 237},	/* latin small letter i with acute, U+00ED ISOlat1 */
{TEXT("icirc"), 238},  	/* latin small letter i with circumflex, U+00EE ISOlat1 */
{TEXT("iexcl"), 161},  	/* inverted exclamation mark, U+00A1 ISOnum */
{TEXT("igrave"), 236},	/* latin small letter i with grave, U+00EC ISOlat1 */
{TEXT("image"), 8465},	/* blackletter capital I = imaginary part, U+2111 ISOamso */
{TEXT("infin"), 8734},	/* infinity, U+221E ISOtech */
{TEXT("int"), 8747},   	/* integral, U+222B ISOtech */
{TEXT("iota"), 953},   	/* greek small letter iota, U+03B9 ISOgrk3 */
{TEXT("iquest"), 191},	/* inverted question mark = */
                        /* turned question mark, U+00BF ISOnum */
{TEXT("isin"), 8712},  	/* element of, U+2208 ISOtech */
{TEXT("iuml"), 239},   	/* latin small letter i with diaeresis, U+00EF ISOlat1 */
{TEXT("kappa"), 954},  	/* greek small letter kappa, U+03BA ISOgrk3 */
{TEXT("lArr"), 8656},  	/* leftwards double arrow, U+21D0 ISOtech */
{TEXT("lambda"), 955},	/* greek small letter lambda, U+03BB ISOgrk3 */
{TEXT("lang"), 9001},  	/* left-pointing angle bracket = bra, U+2329 ISOtech */
{TEXT("laquo"), 171},  	/* left-pointing double angle quotation mark = */
                        /* left pointing guillemet, U+00AB ISOnum */
{TEXT("larr"), 8592},  	/* leftwards arrow, U+2190 ISOnum */
{TEXT("lceil"), 8968},	/* left ceiling = apl upstile, U+2308 ISOamsc */
{TEXT("ldquo"), 8220},	/* left double quotation mark, U+201C ISOnum */
{TEXT("le"), 8804},    	/* less-than or equal to, U+2264 ISOtech */
{TEXT("lfloor"), 8970},	/* left floor = apl downstile, U+230A ISOamsc */
{TEXT("lowast"), 8727},	/* asterisk operator, U+2217 ISOtech */
{TEXT("loz"), 9674},   	/* lozenge, U+25CA ISOpub */
{TEXT("lrm"), 8206},   	/* left-to-right mark, U+200E NEW RFC 2070 */
{TEXT("lsaquo"), 8249},	/* single left-pointing angle quotation mark, */
                        /* U+2039 ISO proposed */
{TEXT("lsquo"), 8216},	/* left single quotation mark, U+2018 ISOnum */
{TEXT("lt"), 60},      	/* less-than sign, U+003C ISOnum */
{TEXT("macr"), 175},   	/* macron = spacing macron = overline = APL overbar, */
                        /* U+00AF ISOdia */
{TEXT("mdash"), 8212},	/* em dash, U+2014 ISOpub */
{TEXT("micro"), 181},  	/* micro sign, U+00B5 ISOnum */
{TEXT("middot"), 183},	/* middle dot = Georgian comma = */
                        /* Greek middle dot, U+00B7 ISOnum */
{TEXT("minus"), 8722},	/* minus sign, U+2212 ISOtech */
{TEXT("mu"), 956},     	/* greek small letter mu, U+03BC ISOgrk3 */
{TEXT("nabla"), 8711},	/* nabla = backward difference, U+2207 ISOtech */
{TEXT("nbsp"), 160},   	/* no-break space = non-breaking space, U+00A0 ISOnum */
{TEXT("ndash"), 8211},	/* en dash, U+2013 ISOpub */
{TEXT("ne"), 8800},    	/* not equal to, U+2260 ISOtech */
{TEXT("ni"), 8715},    	/* contains as member, U+220B ISOtech */
{TEXT("not"), 172},    	/* not sign, U+00AC ISOnum */
{TEXT("notin"), 8713},	/* not an element of, U+2209 ISOtech */
{TEXT("nsub"), 8836},  	/* not a subset of, U+2284 ISOamsn */
{TEXT("ntilde"), 241},	/* latin small letter n with tilde, U+00F1 ISOlat1 */
{TEXT("nu"), 957},     	/* greek small letter nu, U+03BD ISOgrk3 */
{TEXT("oacute"), 243},	/* latin small letter o with acute, U+00F3 ISOlat1 */
{TEXT("ocirc"), 244},  	/* latin small letter o with circumflex, U+00F4 ISOlat1 */
{TEXT("oelig"), 339},  	/* latin small ligature oe, U+0153 ISOlat2 */
{TEXT("ograve"), 242},	/* latin small letter o with grave, U+00F2 ISOlat1 */
{TEXT("oline"), 8254},	/* overline = spacing overscore, U+203E NEW */
{TEXT("omega"), 969},  	/* greek small letter omega, U+03C9 ISOgrk3 */
{TEXT("omicron"), 959},	/* greek small letter omicron, U+03BF NEW */
{TEXT("oplus"), 8853},	/* circled plus = direct sum, U+2295 ISOamsb */
{TEXT("or"), 8744},    	/* logical or = vee, U+2228 ISOtech */
{TEXT("ordf"), 170},   	/* feminine ordinal indicator, U+00AA ISOnum */
{TEXT("ordm"), 186},   	/* masculine ordinal indicator, U+00BA ISOnum */
{TEXT("oslash"), 248},	/* latin small letter o with stroke, = */
                        /* latin small letter o slash, U+00F8 ISOlat1 */
{TEXT("otilde"), 245},	/* latin small letter o with tilde, U+00F5 ISOlat1 */
{TEXT("otimes"), 8855},	/* circled times = vector product, U+2297 ISOamsb */
{TEXT("ouml"), 246},   	/* latin small letter o with diaeresis, U+00F6 ISOlat1 */
{TEXT("para"), 182},   	/* pilcrow sign = paragraph sign, U+00B6 ISOnum */
{TEXT("part"), 8706},  	/* partial differential, U+2202 ISOtech */
{TEXT("permil"), 8240},	/* per mille sign, U+2030 ISOtech */
{TEXT("perp"), 8869},  	/* up tack = orthogonal to = perpendicular, U+22A5 ISOtech */
{TEXT("phi"), 966},    	/* greek small letter phi, U+03C6 ISOgrk3 */
{TEXT("pi"), 960},     	/* greek small letter pi, U+03C0 ISOgrk3 */
{TEXT("piv"), 982},    	/* greek pi symbol, U+03D6 ISOgrk3 */
{TEXT("plusmn"), 177},	/* plus-minus sign = plus-or-minus sign, U+00B1 ISOnum */
{TEXT("pound"), 163},  	/* pound sign, U+00A3 ISOnum */
{TEXT("prime"), 8242},	/* prime = minutes = feet, U+2032 ISOtech */
{TEXT("prod"), 8719},  	/* n-ary product = product sign, U+220F ISOamsb */
{TEXT("prop"), 8733},  	/* proportional to, U+221D ISOtech */
{TEXT("psi"), 968},    	/* greek small letter psi, U+03C8 ISOgrk3 */
{TEXT("quot"), 34},    	/* quotation mark = APL quote, U+0022 ISOnum */
{TEXT("rArr"), 8658},  	/* rightwards double arrow, U+21D2 ISOtech */
{TEXT("radic"), 8730},	/* square root = radical sign, U+221A ISOtech */
{TEXT("rang"), 9002},  	/* right-pointing angle bracket = ket, U+232A ISOtech */
{TEXT("raquo"), 187},  	/* right-pointing double angle quotation mark = */
                        /* right pointing guillemet, U+00BB ISOnum */
{TEXT("rarr"), 8594},  	/* rightwards arrow, U+2192 ISOnum */
{TEXT("rceil"), 8969},	/* right ceiling, U+2309 ISOamsc */
{TEXT("rdquo"), 8221},	/* right double quotation mark, U+201D ISOnum */
{TEXT("real"), 8476},  	/* blackletter capital R = real part symbol, U+211C ISOamso */
{TEXT("reg"), 174},    	/* registered sign = registered trade mark sign, */
                        /* U+00AE ISOnum */
{TEXT("rfloor"), 8971},	/* right floor, U+230B ISOamsc */
{TEXT("rho"), 961},     /* greek small letter rho, U+03C1 ISOgrk3 */
{TEXT("rlm"), 8207},   	/* right-to-left mark, U+200F NEW RFC 2070 */
{TEXT("rsaquo"), 8250},	/* single right-pointing angle quotation mark, */
                        /* U+203A ISO proposed */
{TEXT("rsquo"), 8217},	/* right single quotation mark, U+2019 ISOnum */
{TEXT("sbquo"), 8218},	/* single low-9 quotation mark, U+201A NEW */
{TEXT("scaron"), 353},	/* latin small letter s with caron, U+0161 ISOlat2 */
{TEXT("sdot"), 8901},  	/* dot operator, U+22C5 ISOamsb */
{TEXT("sect"), 167},   	/* section sign, U+00A7 ISOnum */
{TEXT("shy"), 173},    	/* soft hyphen = discretionary hyphen, U+00AD ISOnum */
{TEXT("sigma"), 963},  	/* greek small letter sigma, U+03C3 ISOgrk3 */
{TEXT("sigmaf"), 962},	/* greek small letter final sigma, U+03C2 ISOgrk3 */
{TEXT("sim"), 8764},   	/* tilde operator = varies with = similar to, U+223C ISOtech */
{TEXT("spades"), 9824},	/* black spade suit, U+2660 ISOpub */
{TEXT("sub"), 8834},   	/* subset of, U+2282 ISOtech */
{TEXT("sube"), 8838},  	/* subset of or equal to, U+2286 ISOtech */
{TEXT("sum"), 8721},   	/* n-ary sumation, U+2211 ISOamsb */
{TEXT("sup"), 8835},   	/* superset of, U+2283 ISOtech */
{TEXT("sup1"), 185},   	/* superscript one = superscript digit one, U+00B9 ISOnum */
{TEXT("sup2"), 178},   	/* superscript two = superscript digit two = squared, */
                        /* U+00B2 ISOnum */
{TEXT("sup3"), 179},   	/* superscript three = superscript digit three = cubed, */
                        /* U+00B3 ISOnum */
{TEXT("supe"), 8839},  	/* superset of or equal to, U+2287 ISOtech */
{TEXT("szlig"), 223},  	/* latin small letter sharp s = ess-zed, U+00DF ISOlat1 */
{TEXT("tau"), 964},    	/* greek small letter tau, U+03C4 ISOgrk3 */
{TEXT("there4"), 8756},	/* therefore, U+2234 ISOtech */
{TEXT("theta"), 952},  	/* greek small letter theta, U+03B8 ISOgrk3 */
{TEXT("thetasym"), 977},/* greek small letter theta symbol, U+03D1 NEW */
{TEXT("thinsp"), 8201},	/* thin space, U+2009 ISOpub */
{TEXT("thorn"), 254},  	/* latin small letter thorn with, U+00FE ISOlat1 */
{TEXT("tilde"), 732},  	/* small tilde, U+02DC ISOdia */
{TEXT("times"), 215},  	/* multiplication sign, U+00D7 ISOnum */
{TEXT("trade"), 8482},	/* trade mark sign, U+2122 ISOnum */
{TEXT("uArr"), 8657},  	/* upwards double arrow, U+21D1 ISOamsa */
{TEXT("uacute"), 250},	/* latin small letter u with acute, U+00FA ISOlat1 */
{TEXT("uarr"), 8593},  	/* upwards arrow, U+2191 ISOnum*/
{TEXT("ucirc"), 251},  	/* latin small letter u with circumflex, U+00FB ISOlat1 */
{TEXT("ugrave"), 249},	/* latin small letter u with grave, U+00F9 ISOlat1 */
{TEXT("uml"), 168},    	/* diaeresis = spacing diaeresis, U+00A8 ISOdia */
{TEXT("upsih"), 978},  	/* greek upsilon with hook symbol, U+03D2 NEW */
{TEXT("upsilon"), 965},	/* greek small letter upsilon, U+03C5 ISOgrk3 */
{TEXT("uuml"), 252},   	/* latin small letter u with diaeresis, U+00FC ISOlat1 */
{TEXT("weierp"), 8472}, /* script capital P = power set = Weierstrass p, */
                        /* U+2118 ISOamso */
{TEXT("xi"), 958},     	/* greek small letter xi, U+03BE ISOgrk3 */
{TEXT("yacute"), 253},	/* latin small letter y with acute, U+00FD ISOlat1 */
{TEXT("yen"), 165},    	/* yen sign = yuan sign, U+00A5 ISOnum */
{TEXT("yuml"), 255},   	/* latin small letter y with diaeresis, U+00FF ISOlat1 */
{TEXT("zeta"), 950},   	/* greek small letter zeta, U+03B6 ISOgrk3 */
{TEXT("zwj"), 8205},   	/* zero width joiner, U+200D NEW RFC 2070 */
{TEXT("zwnj"), 8204},  	/* zero width non-joiner, U+200C NEW RFC 2070 */
{TEXT("zzzz"), 0}			/* this last entry is required */
};

#define DummyAttribute 500
static AttributeMapping XhtmlAttributeMappingTable[] =
{
   /* The first entry MUST be unknown_attr */
   {TEXT("unknown_attr"), TEXT(""), 'A', HTML_ATTR_Invalid_attribute},

   {TEXT("abbr"), TEXT(""), 'A', HTML_ATTR_abbr},
   {TEXT("accept"), TEXT(""), 'A', HTML_ATTR_accept},
   {TEXT("accept-charset"), TEXT("form"), 'A', HTML_ATTR_accept_charset},
   {TEXT("accesskey"), TEXT(""), 'A', HTML_ATTR_accesskey},
   {TEXT("action"), TEXT(""), 'A', HTML_ATTR_Script_URL},
   {TEXT("align"), TEXT("applet"), 'A', HTML_ATTR_Alignment},
   {TEXT("align"), TEXT("caption"), 'A', HTML_ATTR_Position},
   {TEXT("align"), TEXT("col"), 'A', HTML_ATTR_Cell_align},
   {TEXT("align"), TEXT("colgroup"), 'A', HTML_ATTR_Cell_align},
   {TEXT("align"), TEXT("div"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("h1"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("h2"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("h3"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("h4"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("h5"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("h6"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("hr"), 'A', HTML_ATTR_Align},
   {TEXT("align"), TEXT("iframe"), 'A', HTML_ATTR_Alignment},
   {TEXT("align"), TEXT("image"), 'A', HTML_ATTR_Alignment},
   {TEXT("align"), TEXT("img"), 'A', HTML_ATTR_Alignment},
   {TEXT("align"), TEXT("input"), 'A', HTML_ATTR_Alignment},
   {TEXT("align"), TEXT("legend"), 'A', HTML_ATTR_LAlign},
   {TEXT("align"), TEXT("object"), 'A', HTML_ATTR_Alignment},
   {TEXT("align"), TEXT("p"), 'A', HTML_ATTR_TextAlign},
   {TEXT("align"), TEXT("table"), 'A', HTML_ATTR_Align},
   {TEXT("align"), TEXT("tbody"), 'A', HTML_ATTR_Cell_align},
   {TEXT("align"), TEXT("td"), 'A', HTML_ATTR_Cell_align},
   {TEXT("align"), TEXT("tfoot"), 'A', HTML_ATTR_Cell_align},
   {TEXT("align"), TEXT("th"), 'A', HTML_ATTR_Cell_align},
   {TEXT("align"), TEXT("thead"), 'A', HTML_ATTR_Cell_align},
   {TEXT("align"), TEXT("tr"), 'A', HTML_ATTR_Cell_align},
   {TEXT("alink"), TEXT("body"), 'A', HTML_ATTR_ActiveLinkColor},
   {TEXT("alt"), TEXT(""), 'A', HTML_ATTR_ALT},
   {TEXT("archive"), TEXT(""), 'A', HTML_ATTR_archive},
   {TEXT("axis"), TEXT(""), 'A', HTML_ATTR_axis},

   {TEXT("background"), TEXT(""), 'A', HTML_ATTR_background_},
   {TEXT("bgcolor"), TEXT(""), 'A', HTML_ATTR_BackgroundColor},
   {TEXT("border"), TEXT("image"), 'A', HTML_ATTR_Img_border},
   {TEXT("border"), TEXT("img"), 'A', HTML_ATTR_Img_border},
   {TEXT("border"), TEXT("object"), 'A', HTML_ATTR_Img_border},
   {TEXT("border"), TEXT("table"), 'A', HTML_ATTR_Border},

   {TEXT("cellspacing"), TEXT(""), 'A', HTML_ATTR_cellspacing},
   {TEXT("cellpadding"), TEXT(""), 'A', HTML_ATTR_cellpadding},
   {TEXT("char"), TEXT(""), 'A', HTML_ATTR_char},
   {TEXT("charoff"), TEXT(""), 'A', HTML_ATTR_charoff},
   {TEXT("charset"), TEXT(""), 'A', HTML_ATTR_charset},
   {TEXT("checked"), TEXT(""), 'A', HTML_ATTR_Checked},
   {TEXT("cite"), TEXT(""), 'A', HTML_ATTR_cite},
   {TEXT("class"), TEXT(""), 'A', HTML_ATTR_Class},
   {TEXT("classid"), TEXT(""), 'A', HTML_ATTR_classid},
   {TEXT("clear"), TEXT("br"), 'A', HTML_ATTR_Clear},
   {TEXT("code"), TEXT(""), 'A', HTML_ATTR_code},
   {TEXT("codebase"), TEXT(""), 'A', HTML_ATTR_codebase},
   {TEXT("codetype"), TEXT(""), 'A', HTML_ATTR_codetype},
   {TEXT("color"), TEXT("basefont"), 'A', HTML_ATTR_BaseFontColor},
   {TEXT("color"), TEXT(""), 'A', HTML_ATTR_color},
   {TEXT("cols"), TEXT("frameset"), 'A', HTML_ATTR_ColWidth},
   {TEXT("cols"), TEXT("textarea"), 'A', HTML_ATTR_Columns},
   {TEXT("colspan"), TEXT(""), 'A', HTML_ATTR_colspan_},
   {TEXT("compact"), TEXT(""), 'A', HTML_ATTR_COMPACT},
   {TEXT("content"), TEXT(""), 'A', HTML_ATTR_meta_content},
   {TEXT("coords"), TEXT(""), 'A', HTML_ATTR_coords},

   {TEXT("data"), TEXT(""), 'A', HTML_ATTR_data},
   {TEXT("datapagesize"), TEXT("table"), 'A', HTML_ATTR_datapagesize},
   {TEXT("datetime"), TEXT(""), 'A', HTML_ATTR_datetime},
   {TEXT("declare"), TEXT("object"), 'A', HTML_ATTR_declare},
   {TEXT("defer"), TEXT("script"), 'A', HTML_ATTR_defer},
   {TEXT("dir"), TEXT(""), 'A', HTML_ATTR_dir},
   {TEXT("disabled"), TEXT(""), 'A', HTML_ATTR_disabled},

   {TEXT("enctype"), TEXT(""), 'A', HTML_ATTR_ENCTYPE},
   {TEXT("event"), TEXT("script"), 'A', HTML_ATTR_event},

   {TEXT("face"), TEXT("basefont"), 'A', HTML_ATTR_BaseFontFace},
   {TEXT("face"), TEXT("font"), 'A', HTML_ATTR_face},
   {TEXT("for"), TEXT("label"), 'A', HTML_ATTR_Associated_control},
   {TEXT("for"), TEXT("script"), 'A', HTML_ATTR_for_},
   {TEXT("frame"), TEXT("table"), 'A', HTML_ATTR_frame},
   {TEXT("frameborder"), TEXT(""), 'A', HTML_ATTR_frameborder},

   {TEXT("headers"), TEXT(""), 'A', HTML_ATTR_headers},
   {TEXT("height"), TEXT(""), 'A', HTML_ATTR_Height_},
   {TEXT("href"), TEXT(""), 'A', HTML_ATTR_HREF_},
   {TEXT("hreflang"), TEXT(""), 'A', HTML_ATTR_hreflang},
   {TEXT("hspace"), TEXT(""), 'A', HTML_ATTR_hspace},
   {TEXT("http-equiv"), TEXT(""), 'A', HTML_ATTR_http_equiv},

   {TEXT("id"), TEXT(""), 'A', HTML_ATTR_ID},
   {TEXT("ismap"), TEXT(""), 'A', HTML_ATTR_ISMAP},

   {TEXT("label"), TEXT(""), 'A', HTML_ATTR_label},
   {TEXT("lang"), TEXT(""), 'A', HTML_ATTR_Langue},
   {TEXT("language"), TEXT("script"), 'A', HTML_ATTR_script_language},
   {TEXT("link"), TEXT("body"), 'A', HTML_ATTR_LinkColor},
   {TEXT("longdesc"), TEXT(""), 'A', HTML_ATTR_longdesc},

   {TEXT("marginheight"), TEXT(""), 'A', HTML_ATTR_marginheight},
   {TEXT("marginwidth"), TEXT(""), 'A', HTML_ATTR_marginwidth},
   {TEXT("maxlength"), TEXT(""), 'A', HTML_ATTR_MaxLength},
   {TEXT("media"), TEXT(""), 'A', HTML_ATTR_media},
   {TEXT("method"), TEXT(""), 'A', HTML_ATTR_METHOD},
   {TEXT("mode"), TEXT(""), 'A', HTML_ATTR_mode},
   {TEXT("multiple"), TEXT(""), 'A', HTML_ATTR_Multiple},

   {TEXT("N"), TEXT(""), 'C', 0},
   {TEXT("name"), TEXT("applet"), 'A', HTML_ATTR_applet_name},
   {TEXT("name"), TEXT("frame"), 'A', HTML_ATTR_FrameName},
   {TEXT("name"), TEXT("iframe"), 'A', HTML_ATTR_FrameName},
   {TEXT("name"), TEXT("meta"), 'A', HTML_ATTR_meta_name},
   {TEXT("name"), TEXT("param"), 'A', HTML_ATTR_Param_name},
   {TEXT("name"), TEXT(""), 'A', HTML_ATTR_NAME},
   {TEXT("nohref"), TEXT(""), 'A', HTML_ATTR_nohref},
   {TEXT("noresize"), TEXT(""), 'A', HTML_ATTR_no_resize},
   {TEXT("noshade"), TEXT(""), 'A', HTML_ATTR_NoShade},
   {TEXT("nowrap"), TEXT(""), 'A', HTML_ATTR_No_wrap},

   {TEXT("object"), TEXT("applet"), 'A', HTML_ATTR_object},
   {TEXT("onblur"), TEXT(""), 'A', HTML_ATTR_onblur},
   {TEXT("onchange"), TEXT(""), 'A', HTML_ATTR_onchange},
   {TEXT("onclick"), TEXT(""), 'A', HTML_ATTR_onclick},
   {TEXT("ondblclick"), TEXT(""), 'A', HTML_ATTR_ondblclick},
   {TEXT("onfocus"), TEXT(""), 'A', HTML_ATTR_onfocus},
   {TEXT("onkeydown"), TEXT(""), 'A', HTML_ATTR_onkeydown},
   {TEXT("onkeypress"), TEXT(""), 'A', HTML_ATTR_onkeypress},
   {TEXT("onkeyup"), TEXT(""), 'A', HTML_ATTR_onkeyup},
   {TEXT("onload"), TEXT(""), 'A', HTML_ATTR_onload},
   {TEXT("onmousedown"), TEXT(""), 'A', HTML_ATTR_onmousedown},
   {TEXT("onmousemove"), TEXT(""), 'A', HTML_ATTR_onmousemove},
   {TEXT("onmouseout"), TEXT(""), 'A', HTML_ATTR_onmouseout},
   {TEXT("onmouseover"), TEXT(""), 'A', HTML_ATTR_onmouseover},
   {TEXT("onmouseup"), TEXT(""), 'A', HTML_ATTR_onmouseup},
   {TEXT("onreset"), TEXT("form"), 'A', HTML_ATTR_onreset},
   {TEXT("onselect"), TEXT(""), 'A', HTML_ATTR_onselect},
   {TEXT("onsubmit"), TEXT("form"), 'A', HTML_ATTR_onsubmit},
   {TEXT("onunload"), TEXT(""), 'A', HTML_ATTR_onunload},

   {TEXT("profile"), TEXT("head"), 'A', HTML_ATTR_profile},
   {TEXT("prompt"), TEXT(""), 'A', HTML_ATTR_Prompt},

   {TEXT("readonly"), TEXT(""), 'A', HTML_ATTR_readonly},
   {TEXT("rel"), TEXT(""), 'A', HTML_ATTR_REL},
   {TEXT("rev"), TEXT(""), 'A', HTML_ATTR_REV},
   {TEXT("rows"), TEXT("frameset"), 'A', HTML_ATTR_RowHeight},
   {TEXT("rows"), TEXT("textarea"), 'A', HTML_ATTR_Rows},
   {TEXT("rowspan"), TEXT(""), 'A', HTML_ATTR_rowspan_},
   {TEXT("rules"), TEXT("table"), 'A', HTML_ATTR_rules_},

   {TEXT("scheme"), TEXT("meta"), 'A', HTML_ATTR_scheme},
   {TEXT("scope"), TEXT(""), 'A', HTML_ATTR_scope},
   {TEXT("scrolling"), TEXT(""), 'A', HTML_ATTR_scrolling},
   {TEXT("selected"), TEXT(""), 'A', HTML_ATTR_Selected},
   {TEXT("shape"), TEXT(""), 'A', HTML_ATTR_shape},
   {TEXT("size"), TEXT("basefont"), 'A', HTML_ATTR_BaseFontSize},
   {TEXT("size"), TEXT("font"), 'A', HTML_ATTR_Font_size},
   {TEXT("size"), TEXT("hr"), 'A', HTML_ATTR_Size_},
   {TEXT("size"), TEXT("input"), 'A', HTML_ATTR_Area_Size},
   {TEXT("size"), TEXT("select"), 'A', HTML_ATTR_MenuSize},
   {TEXT("span"), TEXT("col"), 'A', HTML_ATTR_span_},
   {TEXT("span"), TEXT("colgroup"), 'A', HTML_ATTR_span_},
   {TEXT("src"), TEXT("frame"), 'A', HTML_ATTR_FrameSrc},
   {TEXT("src"), TEXT("iframe"), 'A', HTML_ATTR_FrameSrc},
   {TEXT("src"), TEXT("script"), 'A', HTML_ATTR_script_src},
   {TEXT("src"), TEXT(""), 'A', HTML_ATTR_SRC},
   {TEXT("standby"), TEXT(""), 'A', HTML_ATTR_standby},
   {TEXT("start"), TEXT(""), 'A', HTML_ATTR_Start},
   {TEXT("style"), TEXT(""), 'A', HTML_ATTR_Style_},
   {TEXT("summary"), TEXT("table"), 'A', HTML_ATTR_summary},

   {TEXT("tabindex"), TEXT(""), 'A', HTML_ATTR_tabindex},
   {TEXT("target"), TEXT(""), 'A', HTML_ATTR_target_},
   {TEXT("text"), TEXT(""), 'A', HTML_ATTR_TextColor},
   {TEXT("title"), TEXT(""), 'A', HTML_ATTR_Title},
   {TEXT("type"), TEXT("button"), 'A', HTML_ATTR_Button_type},
   {TEXT("type"), TEXT("li"), 'A', HTML_ATTR_ItemStyle},
   {TEXT("type"), TEXT("link"), 'A', HTML_ATTR_Link_type},
   {TEXT("type"), TEXT("a"), 'A', HTML_ATTR_Link_type},
   {TEXT("type"), TEXT("object"), 'A', HTML_ATTR_Object_type},
   {TEXT("type"), TEXT("ol"), 'A', HTML_ATTR_NumberStyle},
   {TEXT("type"), TEXT("param"), 'A', HTML_ATTR_Param_type},
   {TEXT("type"), TEXT("script"), 'A', HTML_ATTR_content_type},
   {TEXT("type"), TEXT("style"), 'A', HTML_ATTR_Notation},
   {TEXT("type"), TEXT("ul"), 'A', HTML_ATTR_BulletStyle},
   {TEXT("type"), TEXT(""), SPACE, DummyAttribute},

   {TEXT("usemap"), TEXT(""), 'A', HTML_ATTR_USEMAP},

   {TEXT("valign"), TEXT("tbody"), 'A', HTML_ATTR_Row_valign},
   {TEXT("valign"), TEXT("td"), 'A', HTML_ATTR_Cell_valign},
   {TEXT("valign"), TEXT("tfoot"), 'A', HTML_ATTR_Row_valign},
   {TEXT("valign"), TEXT("th"), 'A', HTML_ATTR_Cell_valign},
   {TEXT("valign"), TEXT("thead"), 'A', HTML_ATTR_Row_valign},
   {TEXT("valign"), TEXT("tr"), 'A', HTML_ATTR_Row_valign},
   {TEXT("value"), TEXT("li"), 'A', HTML_ATTR_ItemValue},
   {TEXT("value"), TEXT("param"), 'A', HTML_ATTR_Param_value},
   {TEXT("value"), TEXT(""), 'A', HTML_ATTR_Value_},
   {TEXT("valuetype"), TEXT("param"), 'A', HTML_ATTR_valuetype},
   {TEXT("version"), TEXT(""), 'A', 0},
   {TEXT("vlink"), TEXT("body"), 'A', HTML_ATTR_VisitedLinkColor},
   {TEXT("vspace"), TEXT(""), 'A', HTML_ATTR_vspace},

   {TEXT("width"), TEXT("applet"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("col"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("colgroup"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("hr"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("iframe"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("image"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("img"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("object"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("pre"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("table"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("td"), 'A', HTML_ATTR_Width__},
   {TEXT("width"), TEXT("th"), 'A', HTML_ATTR_Width__},

   {TEXT("zzghost"), TEXT(""), 'A', HTML_ATTR_Ghost_restruct},
   {TEXT(""), TEXT(""), EOS, 0}		/* Last entry. Mandatory */
};


/* Mapping table of HTML attribute values */
static AttrValueMapping XhtmlAttrValueMappingTable[] =
{
   {HTML_ATTR_dir, TEXT("ltr"), HTML_ATTR_dir_VAL_ltr},
   {HTML_ATTR_dir, TEXT("rtl"), HTML_ATTR_dir_VAL_rtl},

   {HTML_ATTR_TextAlign, TEXT("left"), HTML_ATTR_TextAlign_VAL_left_},
   {HTML_ATTR_TextAlign, TEXT("center"), HTML_ATTR_TextAlign_VAL_center_},
   {HTML_ATTR_TextAlign, TEXT("right"), HTML_ATTR_TextAlign_VAL_right_},
   {HTML_ATTR_TextAlign, TEXT("justify"), HTML_ATTR_TextAlign_VAL_justify_},

   {HTML_ATTR_Align, TEXT("left"), HTML_ATTR_Align_VAL_left_},
   {HTML_ATTR_Align, TEXT("center"), HTML_ATTR_Align_VAL_center_},
   {HTML_ATTR_Align, TEXT("right"), HTML_ATTR_Align_VAL_right_},

   {HTML_ATTR_LAlign, TEXT("top"), HTML_ATTR_LAlign_VAL_Top_},
   {HTML_ATTR_LAlign, TEXT("bottom"), HTML_ATTR_LAlign_VAL_Bottom_},
   {HTML_ATTR_LAlign, TEXT("left"), HTML_ATTR_LAlign_VAL_Left_},
   {HTML_ATTR_LAlign, TEXT("right"), HTML_ATTR_LAlign_VAL_Right_},

   {HTML_ATTR_Clear, TEXT("left"), HTML_ATTR_Clear_VAL_Left_},
   {HTML_ATTR_Clear, TEXT("right"), HTML_ATTR_Clear_VAL_Right_},
   {HTML_ATTR_Clear, TEXT("all"), HTML_ATTR_Clear_VAL_All_},
   {HTML_ATTR_Clear, TEXT("none"), HTML_ATTR_Clear_VAL_None_},

   {HTML_ATTR_NumberStyle, TEXT("1"), HTML_ATTR_NumberStyle_VAL_Arabic_},
   {HTML_ATTR_NumberStyle, TEXT("a"), HTML_ATTR_NumberStyle_VAL_LowerAlpha},
   {HTML_ATTR_NumberStyle, TEXT("A"), HTML_ATTR_NumberStyle_VAL_UpperAlpha},
   {HTML_ATTR_NumberStyle, TEXT("i"), HTML_ATTR_NumberStyle_VAL_LowerRoman},
   {HTML_ATTR_NumberStyle, TEXT("I"), HTML_ATTR_NumberStyle_VAL_UpperRoman},

   {HTML_ATTR_BulletStyle, TEXT("disc"), HTML_ATTR_BulletStyle_VAL_disc},
   {HTML_ATTR_BulletStyle, TEXT("square"), HTML_ATTR_BulletStyle_VAL_square},
   {HTML_ATTR_BulletStyle, TEXT("circle"), HTML_ATTR_BulletStyle_VAL_circle},

   {HTML_ATTR_ItemStyle, TEXT("1"), HTML_ATTR_ItemStyle_VAL_Arabic_},
   {HTML_ATTR_ItemStyle, TEXT("a"), HTML_ATTR_ItemStyle_VAL_LowerAlpha},
   {HTML_ATTR_ItemStyle, TEXT("A"), HTML_ATTR_ItemStyle_VAL_UpperAlpha},
   {HTML_ATTR_ItemStyle, TEXT("i"), HTML_ATTR_ItemStyle_VAL_LowerRoman},
   {HTML_ATTR_ItemStyle, TEXT("I"), HTML_ATTR_ItemStyle_VAL_UpperRoman},
   {HTML_ATTR_ItemStyle, TEXT("disc"), HTML_ATTR_ItemStyle_VAL_disc},
   {HTML_ATTR_ItemStyle, TEXT("square"), HTML_ATTR_ItemStyle_VAL_square},
   {HTML_ATTR_ItemStyle, TEXT("circle"), HTML_ATTR_ItemStyle_VAL_circle},

   {HTML_ATTR_Button_type, TEXT("button"), HTML_ATTR_Button_type_VAL_button},
   {HTML_ATTR_Button_type, TEXT("submit"), HTML_ATTR_Button_type_VAL_submit},
   {HTML_ATTR_Button_type, TEXT("reset"), HTML_ATTR_Button_type_VAL_reset},

   {HTML_ATTR_mode, TEXT("display"), HTML_ATTR_mode_VAL_display},
   {HTML_ATTR_mode, TEXT("inline"), HTML_ATTR_mode_VAL_inline_math},

   {HTML_ATTR_frame, TEXT("void"), HTML_ATTR_frame_VAL_void},
   {HTML_ATTR_frame, TEXT("above"), HTML_ATTR_frame_VAL_above},
   {HTML_ATTR_frame, TEXT("below"), HTML_ATTR_frame_VAL_below},
   {HTML_ATTR_frame, TEXT("hsides"), HTML_ATTR_frame_VAL_hsides},
   {HTML_ATTR_frame, TEXT("lhs"), HTML_ATTR_frame_VAL_lhs},
   {HTML_ATTR_frame, TEXT("rhs"), HTML_ATTR_frame_VAL_rhs},
   {HTML_ATTR_frame, TEXT("vsides"), HTML_ATTR_frame_VAL_vsides},
   {HTML_ATTR_frame, TEXT("box"), HTML_ATTR_frame_VAL_box},
   {HTML_ATTR_frame, TEXT("border"), HTML_ATTR_frame_VAL_border},

   {HTML_ATTR_frameborder, TEXT("0"), HTML_ATTR_frameborder_VAL_Border0},
   {HTML_ATTR_frameborder, TEXT("1"), HTML_ATTR_frameborder_VAL_Border1},

   {HTML_ATTR_scrolling, TEXT("yes"), HTML_ATTR_scrolling_VAL_Yes_},
   {HTML_ATTR_scrolling, TEXT("no"), HTML_ATTR_scrolling_VAL_No_},
   {HTML_ATTR_scrolling, TEXT("auto"), HTML_ATTR_scrolling_VAL_auto_},

   {HTML_ATTR_rules_, TEXT("none"), HTML_ATTR_rules__VAL_none_},
   {HTML_ATTR_rules_, TEXT("groups"), HTML_ATTR_rules__VAL_groups},
   {HTML_ATTR_rules_, TEXT("rows"), HTML_ATTR_rules__VAL_rows},
   {HTML_ATTR_rules_, TEXT("cols"), HTML_ATTR_rules__VAL_cols},
   {HTML_ATTR_rules_, TEXT("all"), HTML_ATTR_rules__VAL_all},

   {HTML_ATTR_Cell_align, TEXT("left"), HTML_ATTR_Cell_align_VAL_Cell_left},
   {HTML_ATTR_Cell_align, TEXT("center"), HTML_ATTR_Cell_align_VAL_Cell_center},
   {HTML_ATTR_Cell_align, TEXT("right"), HTML_ATTR_Cell_align_VAL_Cell_right},
   {HTML_ATTR_Cell_align, TEXT("justify"), HTML_ATTR_Cell_align_VAL_Cell_justify},
   {HTML_ATTR_Cell_align, TEXT("char"), HTML_ATTR_Cell_align_VAL_Cell_char},

   {HTML_ATTR_Alignment, TEXT("top"), HTML_ATTR_Alignment_VAL_Top_},
   {HTML_ATTR_Alignment, TEXT("middle"), HTML_ATTR_Alignment_VAL_Middle_},
   {HTML_ATTR_Alignment, TEXT("bottom"), HTML_ATTR_Alignment_VAL_Bottom_},
   {HTML_ATTR_Alignment, TEXT("left"), HTML_ATTR_Alignment_VAL_Left_},
   {HTML_ATTR_Alignment, TEXT("right"), HTML_ATTR_Alignment_VAL_Right_},

   {HTML_ATTR_METHOD, TEXT("get"), HTML_ATTR_METHOD_VAL_Get_},
   {HTML_ATTR_METHOD, TEXT("post"), HTML_ATTR_METHOD_VAL_Post_},

   {HTML_ATTR_Position, TEXT("top"), HTML_ATTR_Position_VAL_Position_top},
   {HTML_ATTR_Position, TEXT("bottom"), HTML_ATTR_Position_VAL_Position_bottom},
   {HTML_ATTR_Position, TEXT("left"), HTML_ATTR_Position_VAL_Position_left},
   {HTML_ATTR_Position, TEXT("right"), HTML_ATTR_Position_VAL_Position_right},

   {HTML_ATTR_Row_valign, TEXT("top"), HTML_ATTR_Row_valign_VAL_Row_top},
   {HTML_ATTR_Row_valign, TEXT("middle"), HTML_ATTR_Row_valign_VAL_Row_middle},
   {HTML_ATTR_Row_valign, TEXT("bottom"), HTML_ATTR_Row_valign_VAL_Row_bottom},
   {HTML_ATTR_Row_valign, TEXT("baseline"), HTML_ATTR_Row_valign_VAL_Row_baseline},

   {HTML_ATTR_Cell_valign, TEXT("top"), HTML_ATTR_Cell_valign_VAL_Cell_top},
   {HTML_ATTR_Cell_valign, TEXT("middle"), HTML_ATTR_Cell_valign_VAL_Cell_middle},
   {HTML_ATTR_Cell_valign, TEXT("bottom"), HTML_ATTR_Cell_valign_VAL_Cell_bottom},
   {HTML_ATTR_Cell_valign, TEXT("baseline"), HTML_ATTR_Cell_valign_VAL_Cell_baseline},

   {HTML_ATTR_shape, TEXT("rect"), HTML_ATTR_shape_VAL_rectangle},
   {HTML_ATTR_shape, TEXT("circle"), HTML_ATTR_shape_VAL_circle},
   {HTML_ATTR_shape, TEXT("poly"), HTML_ATTR_shape_VAL_polygon},

   {HTML_ATTR_valuetype, TEXT("data"), HTML_ATTR_valuetype_VAL_data_},
   {HTML_ATTR_valuetype, TEXT("ref"), HTML_ATTR_valuetype_VAL_ref},
   {HTML_ATTR_valuetype, TEXT("object"), HTML_ATTR_valuetype_VAL_object_},

/* HTML attribute TYPE generates a Thot element */
   {DummyAttribute, TEXT("button"), HTML_EL_Button_Input},
   {DummyAttribute, TEXT("checkbox"), HTML_EL_Checkbox_Input},
   {DummyAttribute, TEXT("file"), HTML_EL_File_Input},
   {DummyAttribute, TEXT("hidden"), HTML_EL_Hidden_Input},
   {DummyAttribute, TEXT("image"), HTML_EL_PICTURE_UNIT},
   {DummyAttribute, TEXT("password"), HTML_EL_Password_Input},
   {DummyAttribute, TEXT("radio"), HTML_EL_Radio_Input},
   {DummyAttribute, TEXT("reset"), HTML_EL_Reset_Input},
   {DummyAttribute, TEXT("submit"), HTML_EL_Submit_Input},
   {DummyAttribute, TEXT("text"), HTML_EL_Text_Input},

/* The following declarations allow the parser to accept boolean attributes */
/* written "checked=CHECKED"), for instance */
   {HTML_ATTR_ISMAP, TEXT("ismap"), HTML_ATTR_ISMAP_VAL_Yes_},
   {HTML_ATTR_nohref, TEXT("nohref"), HTML_ATTR_nohref_VAL_Yes_},
   {HTML_ATTR_COMPACT, TEXT("compact"), HTML_ATTR_COMPACT_VAL_Yes_},
   {HTML_ATTR_Multiple, TEXT("multiple"), HTML_ATTR_Multiple_VAL_Yes_},
   {HTML_ATTR_Selected, TEXT("selected"), HTML_ATTR_Selected_VAL_Yes_},
   {HTML_ATTR_Checked, TEXT("checked"), HTML_ATTR_Checked_VAL_Yes_},
   {HTML_ATTR_No_wrap, TEXT("nowrap"), HTML_ATTR_No_wrap_VAL_no_wrap},
   {HTML_ATTR_NoShade, TEXT("noshade"), HTML_ATTR_NoShade_VAL_NoShade_},
   {HTML_ATTR_declare, TEXT("declare"), HTML_ATTR_declare_VAL_Yes_},
   {HTML_ATTR_defer, TEXT("defer"), HTML_ATTR_defer_VAL_Yes_},
   {HTML_ATTR_disabled, TEXT("disabled"), HTML_ATTR_disabled_VAL_Yes_},
   {HTML_ATTR_readonly, TEXT("readonly"), HTML_ATTR_readonly_VAL_Yes_},
   {HTML_ATTR_no_resize, TEXT("noresize"), HTML_ATTR_no_resize_VAL_Yes_},
   {0, TEXT(""), 0}			/* Last entry. Mandatory */
};


/*----------------------------------------------------------------------
   XhtmlGetDTDName
   Return in DTDname the name of the DTD to be used for parsing the
   content of element named elementName.
   This element type appear with an 'X' in the ElemMappingTable.
  ----------------------------------------------------------------------*/
#ifdef __STDC__
void      XhtmlGetDTDName (STRING DTDname,
			   STRING elementName)
#else
void      XhtmlGetDTDName (DTDname,
			   elementName)
STRING     DTDname;
STRING     elementName;
 
#endif
{
   if (ustrcmp (elementName, TEXT("math")) == 0)
       ustrcpy (DTDname, TEXT("MathML"));
   else
       if (ustrcmp (elementName, TEXT("label")) == 0 ||
	   ustrcmp (elementName, TEXT("text")) == 0)
	   ustrcpy (DTDname, TEXT("HTML"));
       else
	 ustrcpy (DTDname, TEXT(""));
}

/*----------------------------------------------------------------------
   XhtmlMapAttribute
   Search in the Attribute Mapping Table the entry for the attribute
   of name Attr and returns the corresponding Thot attribute type.
  ----------------------------------------------------------------------*/
#ifdef __STDC__
AttributeMapping*     XhtmlMapAttribute (CHAR_T* attrName,
					 AttributeType* attrType,
					 CHAR_T* elementName,
					 Document doc)
#else
AttributeMapping*     XhtmlMapAttribute (attrName,
					 attrType,
					 elementName,
					 doc)
CHAR_T*         attrName;
AttributeType*  attrType;
CHAR_T*         elementName;
Document        doc;
#endif
{
   int                 i;

   attrType->AttrTypeNum = 0;
   attrType->AttrSSchema = NULL;
   i = 0;

   do
     if (ustrcasecmp (XhtmlAttributeMappingTable[i].XMLattribute, attrName))
	 i++;
     else
	 if (XhtmlAttributeMappingTable[i].XMLelement[0] == EOS)
	   {
	     attrType->AttrTypeNum = XhtmlAttributeMappingTable[i].ThotAttribute;
	     attrType->AttrSSchema = GetXHTML_DTD (doc);
	   }
	 else
	   if (!ustrcasecmp (XhtmlAttributeMappingTable[i].XMLelement, elementName))
	     {
	       attrType->AttrTypeNum = XhtmlAttributeMappingTable[i].ThotAttribute;
	       attrType->AttrSSchema = GetXHTML_DTD (doc);
	     }
	   else
	     i++;
   while (attrType->AttrTypeNum <= 0 &&
	  XhtmlAttributeMappingTable[i].AttrOrContent != EOS);

   if (XhtmlAttributeMappingTable[i].AttrOrContent == EOS)
       return (NULL);
   else
       return (&XhtmlAttributeMappingTable[i]);
}

/*----------------------------------------------------------------------
   XhtmlMapAttributeValue
   Search in the Attribute Value Mapping Table the entry for the attribute
   ThotAtt and its value AttrVal. Returns the corresponding Thot value.
  ----------------------------------------------------------------------*/
#ifdef __STDC__
void        XhtmlMapAttributeValue (CHAR_T* AttrVal,
				    AttributeType attrType,
				    int* value)
#else
void        XhtmlMapAttributeValue (AttrVal,
				    attrType,
				    value)
CHAR_T*             AttrVal;
AttributeType       attrType;
int*                value;
#endif
{
   int       i;

   *value = 0;
   i = 0;

   while (XhtmlAttrValueMappingTable[i].ThotAttr != attrType.AttrTypeNum &&
	  XhtmlAttrValueMappingTable[i].ThotAttr != 0)
       i++;

   if (XhtmlAttrValueMappingTable[i].ThotAttr == attrType.AttrTypeNum)
     {
       do
           if (!ustrcasecmp (XhtmlAttrValueMappingTable[i].XMLattrValue, AttrVal))
	       *value = XhtmlAttrValueMappingTable[i].ThotAttrValue;
	   else 
	       i++;
       while (*value <= 0 &&
	      XhtmlAttrValueMappingTable[i].ThotAttr != 0);
     }
}

/*---------------------------------------------------------------------------
   XhtmlMapEntity
   Search that entity in the entity table and return the corresponding value.
  ---------------------------------------------------------------------------*/
#ifdef __STDC__
void	XhtmlMapEntity (STRING entityName,
			int *entityValue,
			int valueLength,
			STRING alphabet)
#else
void	XhtmlMapEntity (entityName,
			entityValue,
			valueLength,
			alphabet)
STRING    entityName;
int      *entityValue;
int       valueLength;
STRING    alphabet;

#endif

{
   int            i;

   for (i = 0; XhtmlEntityTable[i].charCode >= 0 &&
	       ustrcmp (XhtmlEntityTable[i].charName, entityName);
	       i++);

   if (!ustrcmp (XhtmlEntityTable[i].charName, entityName))
     {
       /* entity found */
       *entityValue = XhtmlEntityTable[i].charCode;
       *alphabet = 'L';
     }
   else
     {
       *alphabet = EOS;
     }
}

/*--------------------  Entities  (end)  ---------------------*/


Webmaster