Annotation of libwww/Library/src/HTMLPDTD.c, revision 2.29

2.12      frystyk     1: /*                                                                  HTMLPDTD.c
2.26      frystyk     2: **     STATIC DTD FOR HTML (with frame support)
2.12      frystyk     3: **
2.16      frystyk     4: **     (c) COPYRIGHT MIT 1995.
2.12      frystyk     5: **     Please first read the full copyright statement in the file COPYRIGH.
2.29    ! frystyk     6: **     @(#) $Id: HTMLPDTD.c,v 2.28 1999/01/22 14:52:01 frystyk Exp $
2.1       timbl       7: **
                      8: **      6 Nov 93       MD      Increased size of img_attr array to make space
                      9: **                             for terminator.
                     10: */
                     11: 
2.14      frystyk    12: /* Library include files */
2.25      frystyk    13: #include "wwwsys.h"
2.14      frystyk    14: #include "HTUtils.h"
2.29    ! frystyk    15: 
2.1       timbl      16: #include "HTMLPDTD.h"
                     17: 
2.27      frystyk    18: struct _HTStructured {
                     19:     HTStructuredClass * isa;
                     20:        /* ... */
                     21: };
                     22: 
                     23: /*
                     24: **     ENTITY NAMES
2.1       timbl      25: **     This table must be matched exactly with ALL the translation tables
                     26: */
2.19      frystyk    27: PRIVATE const char* entities[HTML_ENTITIES] = {
2.1       timbl      28:   "AElig",     /* capital AE diphthong (ligature) */ 
                     29:   "Aacute",    /* capital A, acute accent */ 
                     30:   "Acirc",     /* capital A, circumflex accent */ 
                     31:   "Agrave",    /* capital A, grave accent */ 
                     32:   "Aring",     /* capital A, ring */ 
                     33:   "Atilde",    /* capital A, tilde */ 
                     34:   "Auml",      /* capital A, dieresis or umlaut mark */ 
                     35:   "Ccedil",    /* capital C, cedilla */ 
                     36:   "ETH",       /* capital Eth, Icelandic */ 
                     37:   "Eacute",    /* capital E, acute accent */ 
                     38:   "Ecirc",     /* capital E, circumflex accent */ 
                     39:   "Egrave",    /* capital E, grave accent */ 
                     40:   "Euml",      /* capital E, dieresis or umlaut mark */ 
                     41:   "Iacute",    /* capital I, acute accent */ 
                     42:   "Icirc",     /* capital I, circumflex accent */ 
                     43:   "Igrave",    /* capital I, grave accent */ 
                     44:   "Iuml",      /* capital I, dieresis or umlaut mark */ 
                     45:   "Ntilde",    /* capital N, tilde */ 
                     46:   "Oacute",    /* capital O, acute accent */ 
                     47:   "Ocirc",     /* capital O, circumflex accent */ 
                     48:   "Ograve",    /* capital O, grave accent */ 
                     49:   "Oslash",    /* capital O, slash */ 
                     50:   "Otilde",    /* capital O, tilde */ 
                     51:   "Ouml",      /* capital O, dieresis or umlaut mark */ 
                     52:   "THORN",     /* capital THORN, Icelandic */ 
                     53:   "Uacute",    /* capital U, acute accent */ 
                     54:   "Ucirc",     /* capital U, circumflex accent */ 
                     55:   "Ugrave",    /* capital U, grave accent */ 
                     56:   "Uuml",      /* capital U, dieresis or umlaut mark */ 
                     57:   "Yacute",    /* capital Y, acute accent */ 
                     58:   "aacute",    /* small a, acute accent */ 
                     59:   "acirc",     /* small a, circumflex accent */ 
                     60:   "aelig",     /* small ae diphthong (ligature) */ 
                     61:   "agrave",    /* small a, grave accent */ 
                     62:   "amp",       /* ampersand */ 
                     63:   "aring",     /* small a, ring */ 
                     64:   "atilde",    /* small a, tilde */ 
                     65:   "auml",      /* small a, dieresis or umlaut mark */ 
                     66:   "ccedil",    /* small c, cedilla */ 
                     67:   "eacute",    /* small e, acute accent */ 
                     68:   "ecirc",     /* small e, circumflex accent */ 
                     69:   "egrave",    /* small e, grave accent */ 
                     70:   "eth",       /* small eth, Icelandic */ 
                     71:   "euml",      /* small e, dieresis or umlaut mark */ 
                     72:   "gt",                /* greater than */ 
                     73:   "iacute",    /* small i, acute accent */ 
                     74:   "icirc",     /* small i, circumflex accent */ 
                     75:   "igrave",    /* small i, grave accent */ 
                     76:   "iuml",      /* small i, dieresis or umlaut mark */ 
                     77:   "lt",                /* less than */ 
2.21      frystyk    78:   "nbsp",      /* non breaking space */
2.1       timbl      79:   "ntilde",    /* small n, tilde */ 
                     80:   "oacute",    /* small o, acute accent */ 
                     81:   "ocirc",     /* small o, circumflex accent */ 
                     82:   "ograve",    /* small o, grave accent */ 
                     83:   "oslash",    /* small o, slash */ 
                     84:   "otilde",    /* small o, tilde */ 
2.10      timbl      85:   "ouml",      /* small o, dieresis or umlaut mark */
                     86:   "quot",      /* double quote sign  - June 1994 */ 
2.1       timbl      87:   "szlig",     /* small sharp s, German (sz ligature) */ 
                     88:   "thorn",     /* small thorn, Icelandic */ 
                     89:   "uacute",    /* small u, acute accent */ 
                     90:   "ucirc",     /* small u, circumflex accent */ 
                     91:   "ugrave",    /* small u, grave accent */ 
                     92:   "uuml",      /* small u, dieresis or umlaut mark */ 
                     93:   "yacute",    /* small y, acute accent */ 
                     94:   "yuml",      /* small y, dieresis or umlaut mark */ 
                     95: };
                     96: 
2.27      frystyk    97: /*
2.29    ! frystyk    98: **     ATTRIBUTE DEFINITION MACROS (see HTMLPDTD.h)
        !            99: */
        !           100: 
        !           101: /*
        !           102:  * redefine the macros, so that the "stringized" attribute name
        !           103:  * is generated
        !           104:  */
        !           105: 
        !           106: #undef HTML_ATTR
        !           107: #define        HTML_ATTR(t,a)          { #a }
        !           108: #undef HTML_ATTRIBUTES
        !           109: #define        HTML_ATTRIBUTES(t)      { 0 }
        !           110: 
        !           111: /*
2.27      frystyk   112: **     ATTRIBUTE LISTS
                    113: */
2.1       timbl     114: 
2.27      frystyk   115: PRIVATE HTAttr no_attr[1] = 
                    116:        {{ 0 }};
                    117: 
                    118: PRIVATE HTAttr body_attr[HTML_BODY_ATTRIBUTES+1] = {   /* to catch images */
2.29    ! frystyk   119:        HTML_ATTR(BODY,ALINK),
        !           120:        HTML_ATTR(BODY,BACKGROUND),
        !           121:        HTML_ATTR(BODY,BGCOLOR),
        !           122:        HTML_ATTR(BODY,CLASS),
        !           123:        HTML_ATTR(BODY,DIR),
        !           124:        HTML_ATTR(BODY,ID),
        !           125:        HTML_ATTR(BODY,LANG),
        !           126:        HTML_ATTR(BODY,LINK),
        !           127:        HTML_ATTR(BODY,STYLE),
        !           128:        HTML_ATTR(BODY,TEXT),
        !           129:        HTML_ATTR(BODY,TITLE),
        !           130:        HTML_ATTR(BODY,VLINK),
        !           131:        HTML_ATTRIBUTES(BODY)
2.26      frystyk   132: };     
                    133: 
2.27      frystyk   134: PRIVATE HTAttr frame_attr[HTML_FRAME_ATTRIBUTES+1] = { /* frame attributes */
2.29    ! frystyk   135:        HTML_ATTR(FRAME,CLASS),
        !           136:        HTML_ATTR(FRAME,FRAMEBORDER),
        !           137:        HTML_ATTR(FRAME,ID),
        !           138:        HTML_ATTR(FRAME,NAME),
        !           139:        HTML_ATTR(FRAME,MARGINHEIGHT),
        !           140:        HTML_ATTR(FRAME,MARGINWIDTH),
        !           141:        HTML_ATTR(FRAME,NORESIZE),
        !           142:        HTML_ATTR(FRAME,LONGDESC),
        !           143:        HTML_ATTR(FRAME,SCROLLING),
        !           144:        HTML_ATTR(FRAME,SRC),
        !           145:        HTML_ATTR(FRAME,STYLE),
        !           146:        HTML_ATTR(FRAME,TARGET),
        !           147:        HTML_ATTR(FRAME,TITLE),
        !           148:        HTML_ATTRIBUTES(FRAME)
2.26      frystyk   149: };
                    150: 
2.27      frystyk   151: PRIVATE HTAttr frameset_attr[HTML_FRAMESET_ATTRIBUTES+1] = { /* frameset attributes */
2.29    ! frystyk   152:        HTML_ATTR(FRAMESET,CLASS),
        !           153:        HTML_ATTR(FRAMESET,COLS),
        !           154:        HTML_ATTR(FRAMESET,ID),
        !           155:        HTML_ATTR(FRAMESET,ROWS),
        !           156:        HTML_ATTR(FRAMESET,STYLE),
        !           157:        HTML_ATTR(FRAMESET,TITLE),
        !           158:        HTML_ATTRIBUTES(FRAMESET)
2.26      frystyk   159: };
                    160: 
2.27      frystyk   161: PRIVATE HTAttr a_attr[HTML_A_ATTRIBUTES+1] = {         /* Anchor attributes */
2.29    ! frystyk   162:        HTML_ATTR(A,ACCESSKEY),
        !           163:        HTML_ATTR(A,CHARSET),
        !           164:        HTML_ATTR(A,CLASS),
        !           165:        HTML_ATTR(A,COORDS),
        !           166:        HTML_ATTR(A,DIR),
        !           167:        HTML_ATTR(A,HREF),
        !           168:        HTML_ATTR(A,HREFLANG),
        !           169:        HTML_ATTR(A,ID),
        !           170:        HTML_ATTR(A,NAME),
        !           171:        HTML_ATTR(A,REL),
        !           172:        HTML_ATTR(A,REV),
        !           173:        HTML_ATTR(A,SHAPE),
        !           174:        HTML_ATTR(A,STYLE),
        !           175:        HTML_ATTR(A,TABINDEX),
        !           176:        HTML_ATTR(A,TARGET),
        !           177:        HTML_ATTR(A,TYPE),
        !           178:        HTML_ATTR(A,TITLE),
        !           179:        HTML_ATTRIBUTES(A)
2.1       timbl     180: };     
                    181: 
2.29    ! frystyk   182: PRIVATE HTAttr applet_attr[HTML_APPLET_ATTRIBUTES+1] = {
        !           183:        HTML_ATTR(APPLET,ALIGN),
        !           184:        HTML_ATTR(APPLET,ALT),
        !           185:        HTML_ATTR(APPLET,ARCHIVE),
        !           186:        HTML_ATTR(APPLET,CLASS),
        !           187:        HTML_ATTR(APPLET,CODE),
        !           188:        HTML_ATTR(APPLET,CODEBASE),
        !           189:        HTML_ATTR(APPLET,HEIGHT),
        !           190:        HTML_ATTR(APPLET,HSPACE),
        !           191:        HTML_ATTR(APPLET,ID),
        !           192:        HTML_ATTR(APPLET,NAME),
        !           193:        HTML_ATTR(APPLET,OBJECT),
        !           194:        HTML_ATTR(APPLET,STYLE),
        !           195:        HTML_ATTR(APPLET,TITLE),
        !           196:        HTML_ATTR(APPLET,VSPACE),
        !           197:        HTML_ATTR(APPLET,WIDTH),
        !           198:        HTML_ATTRIBUTES(APPLET)
        !           199: };
        !           200: 
2.27      frystyk   201: PRIVATE HTAttr area_attr[HTML_AREA_ATTRIBUTES+1] = {           /* Area attributes */
2.29    ! frystyk   202:        HTML_ATTR(AREA,ACCESSKEY),
        !           203:        HTML_ATTR(AREA,ALT),
        !           204:        HTML_ATTR(AREA,CLASS),
        !           205:        HTML_ATTR(AREA,COORDS),
        !           206:        HTML_ATTR(AREA,DIR),
        !           207:        HTML_ATTR(AREA,HREF),
        !           208:        HTML_ATTR(AREA,ID),
        !           209:        HTML_ATTR(AREA,NAME),
        !           210:        HTML_ATTR(AREA,NOHREF),
        !           211:        HTML_ATTR(AREA,LANG),
        !           212:        HTML_ATTR(AREA,SHAPE),
        !           213:        HTML_ATTR(AREA,STYLE),
        !           214:        HTML_ATTR(AREA,TABINDEX),
        !           215:        HTML_ATTR(AREA,TARGET),
        !           216:        HTML_ATTR(AREA,TITLE),
        !           217:        HTML_ATTRIBUTES(AREA)
2.27      frystyk   218: };     
                    219: 
                    220: PRIVATE HTAttr base_attr[HTML_BASE_ATTRIBUTES+1] = {   /* BASE attributes */
2.29    ! frystyk   221:        HTML_ATTR(BASE,HREF),
        !           222:         HTML_ATTR(BASE,TARGET),
        !           223:         HTML_ATTRIBUTES(BASE)
2.1       timbl     224: };     
                    225: 
2.29    ! frystyk   226: PRIVATE HTAttr bdo_attr[HTML_BDO_ATTRIBUTES+1] = {
        !           227:        HTML_ATTR(BDO,CLASS),
        !           228:        HTML_ATTR(BDO,DIR),
        !           229:        HTML_ATTR(BDO,ID),
        !           230:        HTML_ATTR(BDO,LANG),
        !           231:        HTML_ATTR(BDO,STYLE),
        !           232:        HTML_ATTR(BDO,TITLE),
        !           233:        HTML_ATTRIBUTES(BDO)
        !           234: };
        !           235: 
        !           236: PRIVATE HTAttr bq_attr[HTML_BQ_ATTRIBUTES+1] = {
        !           237:        HTML_ATTR(BQ,CITE),
        !           238:        HTML_ATTR(BQ,CLASS),
        !           239:        HTML_ATTR(BQ,DIR),
        !           240:        HTML_ATTR(BQ,ID),
        !           241:        HTML_ATTR(BQ,LANG),
        !           242:        HTML_ATTR(BQ,STYLE),
        !           243:        HTML_ATTR(BQ,TITLE),
        !           244:        HTML_ATTRIBUTES(BQ)
        !           245: };
        !           246: 
        !           247: PRIVATE HTAttr br_attr[HTML_BR_ATTRIBUTES+1] = {
        !           248:        HTML_ATTR(BR,CLASS),
        !           249:        HTML_ATTR(BR,CLEAR),
        !           250:        HTML_ATTR(BR,ID),
        !           251:        HTML_ATTR(BR,STYLE),
        !           252:        HTML_ATTR(BR,TITLE),
        !           253:        HTML_ATTRIBUTES(BR)
        !           254: };
        !           255: 
        !           256: PRIVATE HTAttr button_attr[HTML_BUTTON_ATTRIBUTES+1] = {
        !           257:        HTML_ATTR(BUTTON,ACCESSKEY),
        !           258:        HTML_ATTR(BUTTON,CLASS),
        !           259:        HTML_ATTR(BUTTON,DIR),
        !           260:        HTML_ATTR(BUTTON,DISABLED),
        !           261:        HTML_ATTR(BUTTON,ID),
        !           262:        HTML_ATTR(BUTTON,LANG),
        !           263:        HTML_ATTR(BUTTON,NAME),
        !           264:        HTML_ATTR(BUTTON,STYLE),
        !           265:        HTML_ATTR(BUTTON,TABINDEX),
        !           266:        HTML_ATTR(BUTTON,TITLE),
        !           267:        HTML_ATTR(BUTTON,TYPE),
        !           268:        HTML_ATTR(BUTTON,VALUE),
        !           269:        HTML_ATTRIBUTES(BUTTON),
        !           270: };
        !           271: 
        !           272: PRIVATE HTAttr col_attr[HTML_COL_ATTRIBUTES+1] = {
        !           273:        HTML_ATTR(COL,CLASS),
        !           274:        HTML_ATTR(COL,DIR),
        !           275:        HTML_ATTR(COL,ID),
        !           276:        HTML_ATTR(COL,LANG),
        !           277:        HTML_ATTR(COL,SPAN),
        !           278:        HTML_ATTR(COL,STYLE),
        !           279:        HTML_ATTR(COL,TITLE),
        !           280:        HTML_ATTR(COL,WIDTH),
        !           281:        HTML_ATTRIBUTES(COL)
        !           282: };
        !           283: 
        !           284: PRIVATE HTAttr changes_attr[HTML_CHANGES_ATTRIBUTES+1] = {
        !           285:        HTML_ATTR(CHANGES,CITE),
        !           286:        HTML_ATTR(CHANGES,CLASS),
        !           287:        HTML_ATTR(CHANGES,DATETIME),
        !           288:        HTML_ATTR(CHANGES,DIR),
        !           289:        HTML_ATTR(CHANGES,ID),
        !           290:        HTML_ATTR(CHANGES,LANG),
        !           291:        HTML_ATTR(CHANGES,STYLE),
        !           292:        HTML_ATTR(CHANGES,TITLE),
        !           293:        HTML_ATTRIBUTES(CHANGES)
        !           294: };
        !           295: 
        !           296: PRIVATE HTAttr font_attr[HTML_FONT_ATTRIBUTES+1] = {
        !           297:        HTML_ATTR(FONT,CLASS),
        !           298:        HTML_ATTR(FONT,COLOR),
        !           299:        HTML_ATTR(FONT,DIR),
        !           300:        HTML_ATTR(FONT,FACE),
        !           301:        HTML_ATTR(FONT,ID),
        !           302:        HTML_ATTR(FONT,LANG),
        !           303:        HTML_ATTR(FONT,SIZE),
        !           304:        HTML_ATTR(FONT,STYLE),
        !           305:        HTML_ATTR(FONT,TITLE),
        !           306:        HTML_ATTRIBUTES(FONT)
        !           307: };
        !           308: 
        !           309: PRIVATE HTAttr form_attr[HTML_FORM_ATTRIBUTES+1] = {
        !           310:        HTML_ATTR(FORM,ACCEPT),
        !           311:        { "ACCEPT-CHARSET" }, /* HTML_ATTR(FORM,ACCEPT_CHARSET) */
        !           312:        HTML_ATTR(FORM,ACTION),
        !           313:        HTML_ATTR(FORM,CLASS),
        !           314:        HTML_ATTR(FORM,DIR),
        !           315:        HTML_ATTR(FORM,ENCTYPE),
        !           316:        HTML_ATTR(FORM,ID),
        !           317:        HTML_ATTR(FORM,LANG),
        !           318:        HTML_ATTR(FORM,METHOD),
        !           319:        HTML_ATTR(FORM,STYLE),
        !           320:        HTML_ATTR(FORM,TARGET),
        !           321:        HTML_ATTR(FORM,TITLE),
        !           322:        HTML_ATTRIBUTES(FORM)
        !           323: };
        !           324: 
        !           325: PRIVATE HTAttr gen_attr[HTML_GEN_ATTRIBUTES+1] = { /* General, for many things */
        !           326:        HTML_ATTR(GEN,CLASS),
        !           327:        HTML_ATTR(GEN,DIR),
        !           328:        HTML_ATTR(GEN,ID),
        !           329:        HTML_ATTR(GEN,LANG),
        !           330:        HTML_ATTR(GEN,STYLE),
        !           331:        HTML_ATTR(GEN,TITLE),
        !           332:        HTML_ATTRIBUTES(GEN)
        !           333: };
        !           334: 
        !           335: PRIVATE HTAttr block_attr[HTML_BLOCK_ATTRIBUTES+1] = { /* DIV, SPAN, H1-H6 */
        !           336:        HTML_ATTR(BLOCK,ALIGN),
        !           337:        HTML_ATTR(BLOCK,CLASS),
        !           338:        HTML_ATTR(BLOCK,DIR),
        !           339:        HTML_ATTR(BLOCK,ID),
        !           340:        HTML_ATTR(BLOCK,LANG),
        !           341:        HTML_ATTR(BLOCK,STYLE),
        !           342:        HTML_ATTR(BLOCK,TITLE),
        !           343:        HTML_ATTRIBUTES(BLOCK)
        !           344: };
        !           345: 
        !           346: PRIVATE HTAttr head_attr[HTML_HEAD_ATTRIBUTES+1] = {
        !           347:        HTML_ATTR(HEAD,DIR),
        !           348:        HTML_ATTR(HEAD,LANG),
        !           349:        HTML_ATTR(HEAD,PROFILE),
        !           350:        HTML_ATTRIBUTES(HEAD)
        !           351: };
        !           352: 
        !           353: PRIVATE HTAttr hr_attr[HTML_HR_ATTRIBUTES+1] = {
        !           354:        HTML_ATTR(HR,ALIGN),
        !           355:        HTML_ATTR(HR,CLASS),
        !           356:        HTML_ATTR(HR,DIR),
        !           357:        HTML_ATTR(HR,ID),
        !           358:        HTML_ATTR(HR,LANG),
        !           359:        HTML_ATTR(HR,NOSHADE),
        !           360:        HTML_ATTR(HR,SIZE),
        !           361:        HTML_ATTR(HR,STYLE),
        !           362:        HTML_ATTR(HR,TITLE),
        !           363:        HTML_ATTR(HR,WIDTH),
        !           364:        HTML_ATTRIBUTES(HR)
        !           365: };
        !           366: 
        !           367: PRIVATE HTAttr html_attr[HTML_HTML_ATTRIBUTES+1] = {
        !           368:        HTML_ATTR(HTML,DIR),
        !           369:        HTML_ATTR(HTML,LANG),
        !           370:        HTML_ATTR(HTML,VERSION),
        !           371:        HTML_ATTRIBUTES(HTML)
        !           372: };
        !           373: 
        !           374: PRIVATE HTAttr iframe_attr[HTML_IFRAME_ATTRIBUTES+1] = {
        !           375:        HTML_ATTR(IFRAME,ALIGN),
        !           376:        HTML_ATTR(IFRAME,CLASS),
        !           377:        HTML_ATTR(IFRAME,FRAMEBORDER),
        !           378:        HTML_ATTR(IFRAME,HEIGHT),
        !           379:        HTML_ATTR(IFRAME,ID),
        !           380:        HTML_ATTR(IFRAME,LONGDESC),
        !           381:        HTML_ATTR(IFRAME,MARGINHEIGHT),
        !           382:        HTML_ATTR(IFRAME,MARGINWIDTH),
        !           383:        HTML_ATTR(IFRAME,NAME),
        !           384:        HTML_ATTR(IFRAME,SCROLLING),
        !           385:        HTML_ATTR(IFRAME,SRC),
        !           386:        HTML_ATTR(IFRAME,STYLE),
        !           387:        HTML_ATTR(IFRAME,TARGET),
        !           388:        HTML_ATTR(IFRAME,TITLE),
        !           389:        HTML_ATTR(IFRAME,WIDTH),
        !           390:        HTML_ATTRIBUTES(IFRAME)
        !           391: };
2.1       timbl     392: 
2.27      frystyk   393: PRIVATE HTAttr img_attr[HTML_IMG_ATTRIBUTES+1] = {     /* IMG attributes */
2.29    ! frystyk   394:        HTML_ATTR(IMG,ALIGN),
        !           395:        HTML_ATTR(IMG,ALT),
        !           396:        HTML_ATTR(IMG,BORDER),
        !           397:        HTML_ATTR(IMG,CLASS),
        !           398:        HTML_ATTR(IMG,DIR),
        !           399:        HTML_ATTR(IMG,HEIGHT),
        !           400:        HTML_ATTR(IMG,HSPACE),
        !           401:        HTML_ATTR(IMG,ID),
        !           402:        HTML_ATTR(IMG,ISMAP),
        !           403:        HTML_ATTR(IMG,LANG),
        !           404:        HTML_ATTR(IMG,LONGDESC),
        !           405:        HTML_ATTR(IMG,SRC),
        !           406:        HTML_ATTR(IMG,STYLE),
        !           407:        HTML_ATTR(IMG,TITLE),
        !           408:        HTML_ATTR(IMG,USEMAP),
        !           409:        HTML_ATTR(IMG,VSPACE),
        !           410:        HTML_ATTR(IMG,WIDTH),
        !           411:        HTML_ATTRIBUTES(IMG)
2.1       timbl     412: };     
                    413: 
2.27      frystyk   414: PRIVATE HTAttr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
2.29    ! frystyk   415:        HTML_ATTR(INPUT,ACCEPT),
        !           416:        HTML_ATTR(INPUT,ACCESSKEY),
        !           417:        HTML_ATTR(INPUT,ALIGN),
        !           418:        HTML_ATTR(INPUT,ALT),
        !           419:        HTML_ATTR(INPUT,CHECKED),
        !           420:        HTML_ATTR(INPUT,CLASS),
        !           421:        HTML_ATTR(INPUT,DIR),
        !           422:        HTML_ATTR(INPUT,DISABLED),
        !           423:        HTML_ATTR(INPUT,ID),
        !           424:        HTML_ATTR(INPUT,LANG),
        !           425:        HTML_ATTR(INPUT,MAXLENGTH),
        !           426:        HTML_ATTR(INPUT,NAME),
        !           427:        HTML_ATTR(INPUT,READONLY),
        !           428:        HTML_ATTR(INPUT,SIZE),
        !           429:        HTML_ATTR(INPUT,SRC),
        !           430:        HTML_ATTR(INPUT,STYLE),
        !           431:        HTML_ATTR(INPUT,TABINDEX),
        !           432:        HTML_ATTR(INPUT,TITLE),
        !           433:        HTML_ATTR(INPUT,TYPE),
        !           434:        HTML_ATTR(INPUT,USEMAP),
        !           435:        HTML_ATTR(INPUT,VALUE),
        !           436:        HTML_ATTRIBUTES(INPUT)
        !           437: };
        !           438: 
        !           439: PRIVATE HTAttr isindex_attr[HTML_ISINDEX_ATTRIBUTES+1] = {
        !           440:        HTML_ATTR(ISINDEX,CLASS),
        !           441:        HTML_ATTR(ISINDEX,DIR),
        !           442:        HTML_ATTR(ISINDEX,ID),
        !           443:        HTML_ATTR(ISINDEX,LANG),
        !           444:        HTML_ATTR(ISINDEX,PROMPT),
        !           445:        HTML_ATTR(ISINDEX,STYLE),
        !           446:        HTML_ATTR(ISINDEX,TITLE),
        !           447:        HTML_ATTRIBUTES(ISINDEX)
        !           448: };
        !           449: 
        !           450: PRIVATE HTAttr label_attr[HTML_LABEL_ATTRIBUTES+1] = {
        !           451:        HTML_ATTR(LABEL,ACCESSKEY),
        !           452:        HTML_ATTR(LABEL,CLASS),
        !           453:        HTML_ATTR(LABEL,DIR),
        !           454:        HTML_ATTR(LABEL,FOR),
        !           455:        HTML_ATTR(LABEL,ID),
        !           456:        HTML_ATTR(LABEL,LANG),
        !           457:        HTML_ATTR(LABEL,STYLE),
        !           458:        HTML_ATTR(LABEL,TITLE),
        !           459:        HTML_ATTRIBUTES(LABEL)
        !           460: };
        !           461: 
        !           462: PRIVATE HTAttr legend_attr[HTML_LEGEND_ATTRIBUTES+1] = {
        !           463:        HTML_ATTR(LEGEND,ACCESSKEY),
        !           464:        HTML_ATTR(LEGEND,ALIGN),
        !           465:        HTML_ATTR(LEGEND,CLASS),
        !           466:        HTML_ATTR(LEGEND,DIR),
        !           467:        HTML_ATTR(LEGEND,ID),
        !           468:        HTML_ATTR(LEGEND,LANG),
        !           469:        HTML_ATTR(LEGEND,STYLE),
        !           470:        HTML_ATTR(LEGEND,TITLE),
        !           471:        HTML_ATTRIBUTES(LEGEND)
        !           472: };
        !           473: 
        !           474: PRIVATE HTAttr li_attr[HTML_LI_ATTRIBUTES+1] = {
        !           475:        HTML_ATTR(LI,CLASS),
        !           476:        HTML_ATTR(LI,COMPACT),
        !           477:        HTML_ATTR(LI,DIR),
        !           478:        HTML_ATTR(LI,ID),
        !           479:        HTML_ATTR(LI,LANG),
        !           480:        HTML_ATTR(LI,STYLE),
        !           481:        HTML_ATTR(LI,TITLE),
        !           482:        HTML_ATTR(LI,TYPE),
        !           483:        HTML_ATTR(LI,VALUE),
        !           484:        HTML_ATTRIBUTES(LI)
2.1       timbl     485: };
                    486: 
2.27      frystyk   487: PRIVATE HTAttr link_attr[HTML_LINK_ATTRIBUTES+1] = {   /* link attributes */
2.29    ! frystyk   488:        HTML_ATTR(LINK,CHARSET),
        !           489:        HTML_ATTR(LINK,CLASS),
        !           490:        HTML_ATTR(LINK,DIR),
        !           491:        HTML_ATTR(LINK,HREF),
        !           492:        HTML_ATTR(LINK,HREFLANG),
        !           493:        HTML_ATTR(LINK,ID),
        !           494:        HTML_ATTR(LINK,LANG),
        !           495:        HTML_ATTR(LINK,MEDIA),
        !           496:        HTML_ATTR(LINK,REL),
        !           497:        HTML_ATTR(LINK,REV),
        !           498:        HTML_ATTR(LINK,STYLE),
        !           499:        HTML_ATTR(LINK,TARGET),
        !           500:        HTML_ATTR(LINK,TITLE),
        !           501:        HTML_ATTR(LINK,TYPE),
        !           502:        HTML_ATTRIBUTES(LINK)
2.27      frystyk   503: };     
                    504: 
2.28      frystyk   505: PRIVATE HTAttr map_attr[HTML_MAP_ATTRIBUTES+1] = {
2.29    ! frystyk   506:        HTML_ATTR(MAP,CLASS),
        !           507:        HTML_ATTR(MAP,DIR),
        !           508:        HTML_ATTR(MAP,ID),
        !           509:        HTML_ATTR(MAP,LANG),
        !           510:        HTML_ATTR(MAP,NAME),
        !           511:        HTML_ATTR(MAP,STYLE),
        !           512:        HTML_ATTR(MAP,TITLE),
        !           513:        HTML_ATTRIBUTES(MAP)
2.28      frystyk   514: };
                    515: 
2.27      frystyk   516: PRIVATE HTAttr meta_attr[HTML_META_ATTRIBUTES+1] = {
2.29    ! frystyk   517:        HTML_ATTR(META,CONTENT),
        !           518:        HTML_ATTR(META,DIR),
        !           519:        { "HTTP-EQUIV" },   /* HTML_ATTR(META,HTTP_EQUIV) */
        !           520:        HTML_ATTR(META,LANG),
        !           521:        HTML_ATTR(META,NAME),
        !           522:        HTML_ATTR(META,SCHEME),
        !           523:        HTML_ATTRIBUTES(META)
2.24      frystyk   524: };     
                    525: 
2.27      frystyk   526: PRIVATE HTAttr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
2.1       timbl     527:        { "N" },
                    528:        { 0 }   /* Terminate list */
                    529: };
                    530: 
2.29    ! frystyk   531: PRIVATE HTAttr object_attr[HTML_OBJECT_ATTRIBUTES+1] = {       /* object attributes */
        !           532:        HTML_ATTR(OBJECT,ALIGN),
        !           533:        HTML_ATTR(OBJECT,ARCHIVE),
        !           534:        HTML_ATTR(OBJECT,BORDER),
        !           535:        HTML_ATTR(OBJECT,CLASS),
        !           536:        HTML_ATTR(OBJECT,CLASSID),
        !           537:        HTML_ATTR(OBJECT,CODEBASE),
        !           538:        HTML_ATTR(OBJECT,CODETYPE),
        !           539:        HTML_ATTR(OBJECT,DATA),
        !           540:        HTML_ATTR(OBJECT,DECLARE),
        !           541:        HTML_ATTR(OBJECT,DIR),
        !           542:        HTML_ATTR(OBJECT,HEIGHT),
        !           543:        HTML_ATTR(OBJECT,HSPACE),
        !           544:        HTML_ATTR(OBJECT,ID),
        !           545:        HTML_ATTR(OBJECT,LANG),
        !           546:        HTML_ATTR(OBJECT,NAME),
        !           547:        HTML_ATTR(OBJECT,STANDBY),
        !           548:        HTML_ATTR(OBJECT,STYLE),
        !           549:        HTML_ATTR(OBJECT,TABINDEX),
        !           550:        HTML_ATTR(OBJECT,TITLE),
        !           551:        HTML_ATTR(OBJECT,TYPE),
        !           552:        HTML_ATTR(OBJECT,USEMAP),
        !           553:        HTML_ATTR(OBJECT,VSPACE),
        !           554:        HTML_ATTR(OBJECT,WIDTH),
        !           555:        HTML_ATTRIBUTES(OBJECT)
        !           556: };     
        !           557: 
        !           558: PRIVATE HTAttr ol_attr[HTML_OL_ATTRIBUTES+1] = {
        !           559:        HTML_ATTR(OL,CLASS),
        !           560:        HTML_ATTR(OL,COMPACT),
        !           561:        HTML_ATTR(OL,DIR),
        !           562:        HTML_ATTR(OL,ID),
        !           563:        HTML_ATTR(OL,LANG),
        !           564:        HTML_ATTR(OL,START),
        !           565:        HTML_ATTR(OL,STYLE),
        !           566:        HTML_ATTR(OL,TITLE),
        !           567:        HTML_ATTR(OL,TYPE),
        !           568:        HTML_ATTRIBUTES(OL)
        !           569: };
        !           570: 
        !           571: PRIVATE HTAttr optgroup_attr[HTML_OPTGROUP_ATTRIBUTES+1] = {
        !           572:        HTML_ATTR(OPTGROUP,CLASS),
        !           573:        HTML_ATTR(OPTGROUP,DISABLED),
        !           574:        HTML_ATTR(OPTGROUP,DIR),
        !           575:        HTML_ATTR(OPTGROUP,ID),
        !           576:        HTML_ATTR(OPTGROUP,LABEL),
        !           577:        HTML_ATTR(OPTGROUP,LANG),
        !           578:        HTML_ATTR(OPTGROUP,STYLE),
        !           579:        HTML_ATTR(OPTGROUP,TITLE),
        !           580:        HTML_ATTRIBUTES(OPTGROUP)
2.1       timbl     581: };
                    582: 
2.27      frystyk   583: PRIVATE HTAttr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
2.29    ! frystyk   584:        HTML_ATTR(OPTION,CLASS),
        !           585:        HTML_ATTR(OPTION,DISABLED),
        !           586:        HTML_ATTR(OPTION,DIR),
        !           587:        HTML_ATTR(OPTION,ID),
        !           588:        HTML_ATTR(OPTION,LABEL),
        !           589:        HTML_ATTR(OPTION,LANG),
        !           590:        HTML_ATTR(OPTION,SELECTED),
        !           591:        HTML_ATTR(OPTION,STYLE),
        !           592:        HTML_ATTR(OPTION,TITLE),
        !           593:        HTML_ATTR(OPTION,VALUE),
        !           594:        HTML_ATTRIBUTES(OPTION)
        !           595: };
        !           596: 
        !           597: PRIVATE HTAttr param_attr[HTML_PARAM_ATTRIBUTES+1] = {
        !           598:        HTML_ATTR(PARAM,ID),
        !           599:        HTML_ATTR(PARAM,NAME),
        !           600:        HTML_ATTR(PARAM,TYPE),
        !           601:        HTML_ATTR(PARAM,VALUE),
        !           602:        HTML_ATTR(PARAM,VALUETYPE),
        !           603:        HTML_ATTRIBUTES(PARAM)
        !           604: };
        !           605: 
        !           606: PRIVATE HTAttr pre_attr[HTML_PRE_ATTRIBUTES+1] = {
        !           607:        HTML_ATTR(PRE,CLASS),
        !           608:        HTML_ATTR(PRE,DIR),
        !           609:        HTML_ATTR(PRE,ID),
        !           610:        HTML_ATTR(PRE,LANG),
        !           611:        HTML_ATTR(PRE,STYLE),
        !           612:        HTML_ATTR(PRE,TITLE),
        !           613:        HTML_ATTR(PRE,WIDTH),
        !           614:        HTML_ATTRIBUTES(PRE)
        !           615: };
        !           616: 
        !           617: PRIVATE HTAttr script_attr[HTML_SCRIPT_ATTRIBUTES+1] = {
        !           618:        HTML_ATTR(SCRIPT,CHARSET),
        !           619:        HTML_ATTR(SCRIPT,DEFER),
        !           620:        HTML_ATTR(SCRIPT,LANGUAGE),
        !           621:        HTML_ATTR(SCRIPT,SRC),
        !           622:        HTML_ATTR(SCRIPT,TYPE),
        !           623:        HTML_ATTRIBUTES(SCRIPT)
2.1       timbl     624: };
                    625: 
2.27      frystyk   626: PRIVATE HTAttr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
2.29    ! frystyk   627:        HTML_ATTR(SELECT,CLASS),
        !           628:        HTML_ATTR(SELECT,DIR),
        !           629:        HTML_ATTR(SELECT,DISABLED),
        !           630:        HTML_ATTR(SELECT,ID),
        !           631:        HTML_ATTR(SELECT,LANG),
        !           632:        HTML_ATTR(SELECT,MULTIPLE),
        !           633:        HTML_ATTR(SELECT,NAME),
        !           634:        HTML_ATTR(SELECT,SIZE),
        !           635:        HTML_ATTR(SELECT,STYLE),
        !           636:        HTML_ATTR(SELECT,TABINDEX),
        !           637:        HTML_ATTR(SELECT,TITLE),
        !           638:        HTML_ATTRIBUTES(SELECT)
        !           639: };
        !           640: 
        !           641: PRIVATE HTAttr style_attr[HTML_STYLE_ATTRIBUTES+1] = {
        !           642:        HTML_ATTR(STYLE,DIR),
        !           643:        HTML_ATTR(STYLE,LANG),
        !           644:        HTML_ATTR(STYLE,MEDIA),
        !           645:        HTML_ATTR(STYLE,TITLE),
        !           646:        HTML_ATTR(STYLE,TYPE),
        !           647:        HTML_ATTRIBUTES(STYLE)
2.1       timbl     648: };
                    649: 
2.27      frystyk   650: PRIVATE HTAttr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
2.29    ! frystyk   651:        HTML_ATTR(TABLE,ALIGN),
        !           652:        HTML_ATTR(TABLE,BGCOLOR),
        !           653:        HTML_ATTR(TABLE,BORDER),
        !           654:        HTML_ATTR(TABLE,CELLPADDING),
        !           655:        HTML_ATTR(TABLE,CELLSPACING),
        !           656:        HTML_ATTR(TABLE,CLASS),
        !           657:        HTML_ATTR(TABLE,DIR),
        !           658:        HTML_ATTR(TABLE,FRAME),
        !           659:        HTML_ATTR(TABLE,ID),
        !           660:        HTML_ATTR(TABLE,LANG),
        !           661:        HTML_ATTR(TABLE,RULES),
        !           662:        HTML_ATTR(TABLE,SUMMARY),
        !           663:        HTML_ATTR(TABLE,STYLE),
        !           664:        HTML_ATTR(TABLE,TITLE),
        !           665:        HTML_ATTR(TABLE,WIDTH),
        !           666:        HTML_ATTRIBUTES(TABLE)
        !           667: };
        !           668: 
        !           669: PRIVATE HTAttr tele_attr[HTML_TELE_ATTRIBUTES+1] = {
        !           670:        HTML_ATTR(TELE,ALIGN),
        !           671:        HTML_ATTR(TELE,CHAR),
        !           672:        HTML_ATTR(TELE,CHAROFF),
        !           673:        HTML_ATTR(TELE,CLASS),
        !           674:        HTML_ATTR(TELE,DIR),
        !           675:        HTML_ATTR(TELE,ID),
        !           676:        HTML_ATTR(TELE,LANG),
        !           677:        HTML_ATTR(TELE,STYLE),
        !           678:        HTML_ATTR(TELE,TITLE),
        !           679:        HTML_ATTR(TELE,VALIGN),
        !           680:        HTML_ATTRIBUTES(TELE)
2.1       timbl     681: };
                    682: 
2.27      frystyk   683: PRIVATE HTAttr td_attr[HTML_TD_ATTRIBUTES+1] = {
2.29    ! frystyk   684:        HTML_ATTR(TD,ABBR),
        !           685:        HTML_ATTR(TD,ALIGN),
        !           686:        HTML_ATTR(TD,AXIS),
        !           687:        HTML_ATTR(TD,BGCOLOR),
        !           688:        HTML_ATTR(TD,CHAR),
        !           689:        HTML_ATTR(TD,CHAROFF),
        !           690:        HTML_ATTR(TD,CLASS),
        !           691:        HTML_ATTR(TD,COLSPAN),
        !           692:        HTML_ATTR(TD,DIR),
        !           693:        HTML_ATTR(TD,ID),
        !           694:        HTML_ATTR(TD,HEADERS),
        !           695:        HTML_ATTR(TD,HEIGHT),
        !           696:        HTML_ATTR(TD,LANG),
        !           697:        HTML_ATTR(TD,NOWRAP),
        !           698:        HTML_ATTR(TD,ROWSPAN),
        !           699:        HTML_ATTR(TD,SCOPE),
        !           700:        HTML_ATTR(TD,STYLE),
        !           701:        HTML_ATTR(TD,TITLE),
        !           702:        HTML_ATTR(TD,VALIGN),
        !           703:        HTML_ATTR(TD,WIDTH),
        !           704:        HTML_ATTRIBUTES(TD)
2.1       timbl     705: };
                    706: 
2.27      frystyk   707: PRIVATE HTAttr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
2.29    ! frystyk   708:        HTML_ATTR(TEXTAREA,CLASS),
        !           709:        HTML_ATTR(TEXTAREA,COLS),
        !           710:        HTML_ATTR(TEXTAREA,DIR),
        !           711:        HTML_ATTR(TEXTAREA,DISABLED),
        !           712:        HTML_ATTR(TEXTAREA,ID),
        !           713:        HTML_ATTR(TEXTAREA,LANG),
        !           714:        HTML_ATTR(TEXTAREA,NAME),
        !           715:        HTML_ATTR(TEXTAREA,READONLY),
        !           716:        HTML_ATTR(TEXTAREA,ROWS),
        !           717:        HTML_ATTR(TEXTAREA,STYLE),
        !           718:        HTML_ATTR(TEXTAREA,TABINDEX),
        !           719:        HTML_ATTR(TEXTAREA,TITLE),
        !           720:        HTML_ATTRIBUTES(TEXTAREA)
        !           721: };
        !           722: 
        !           723: PRIVATE HTAttr title_attr[HTML_TITLE_ATTRIBUTES+1] = {
        !           724:        HTML_ATTR(TITLE,DIR),
        !           725:        HTML_ATTR(TITLE,LANG),
        !           726:        HTML_ATTRIBUTES(TITLE)
2.1       timbl     727: };
                    728: 
2.27      frystyk   729: PRIVATE HTAttr ul_attr[HTML_UL_ATTRIBUTES+1] = {
2.29    ! frystyk   730:        HTML_ATTR(UL,CLASS),
        !           731:        HTML_ATTR(UL,COMPACT),
        !           732:        HTML_ATTR(UL,DIR),
        !           733:        HTML_ATTR(UL,ID),
        !           734:        HTML_ATTR(UL,LANG),
        !           735:        HTML_ATTR(UL,STYLE),
        !           736:        HTML_ATTR(UL,TITLE),
        !           737:        HTML_ATTR(UL,TYPE),
        !           738:        HTML_ATTRIBUTES(UL)
2.1       timbl     739: };
                    740: 
2.27      frystyk   741: /*
                    742: **     ELEMENTS
2.1       timbl     743: **     Must match definitions in HTMLPDTD.html!
                    744: **     Must be in alphabetical order.
                    745: **
                    746: **    Name,    Attributes,             content
                    747: */
2.27      frystyk   748: PRIVATE HTTag tags[HTML_ELEMENTS] = {
2.1       timbl     749:     { "A"      , a_attr,       HTML_A_ATTRIBUTES,      SGML_MIXED },
2.29    ! frystyk   750:     { "ABBR"    , gen_attr,     HTML_GEN_ATTRIBUTES,   SGML_MIXED },
2.1       timbl     751:     { "ACRONYM"        , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   752:     { "ADDRESS"        , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
        !           753:     { "APPLET"  , applet_attr,  HTML_APPLET_ATTRIBUTES, SGML_MIXED },
2.27      frystyk   754:     { "AREA"   , area_attr,    HTML_AREA_ATTRIBUTES,   SGML_EMPTY },
2.28      frystyk   755:     { "B"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.22      frystyk   756:     { "BASE"   , base_attr,    HTML_BASE_ATTRIBUTES,   SGML_EMPTY },
2.29    ! frystyk   757:     { "BASEFONT", font_attr,   HTML_FONT_ATTRIBUTES,   SGML_EMPTY },
        !           758:     { "BDO"     , bdo_attr,     HTML_BDO_ATTRIBUTES,    SGML_EMPTY },
2.28      frystyk   759:     { "BIG"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   760:     { "BLOCKQUOTE", bq_attr,   HTML_BQ_ATTRIBUTES,     SGML_MIXED },
2.26      frystyk   761:     { "BODY"   , body_attr,    HTML_BODY_ATTRIBUTES,   SGML_MIXED },
2.29    ! frystyk   762:     { "BR"     , br_attr,      HTML_BR_ATTRIBUTES,     SGML_EMPTY },
        !           763:     { "BUTTON" , button_attr,  HTML_BUTTON_ATTRIBUTES, SGML_MIXED },
        !           764:     { "CAPTION"        , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           765:     { "CENTER" , no_attr,      0,                      SGML_MIXED },
2.1       timbl     766:     { "CITE"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    767:     { "CODE"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   768:     { "COL"    , col_attr,     HTML_COL_ATTRIBUTES,    SGML_MIXED },
        !           769:     { "COLGROUP", col_attr,    HTML_COL_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     770:     { "DD"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_EMPTY },
2.29    ! frystyk   771:     { "DEL"    , changes_attr, HTML_CHANGES_ATTRIBUTES,SGML_EMPTY },
2.1       timbl     772:     { "DFN"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    773:     { "DIR"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   774:     { "DIV"    , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           775:     { "DL"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     776:     { "DT"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_EMPTY },
                    777:     { "EM"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   778:     { "FIELDSET", gen_attr,    HTML_GEN_ATTRIBUTES,    SGML_MIXED },
        !           779:     { "FONT"   , font_attr,    HTML_FONT_ATTRIBUTES,   SGML_MIXED },
2.1       timbl     780:     { "FORM"   , form_attr,    HTML_FORM_ATTRIBUTES,   SGML_MIXED },
2.26      frystyk   781:     { "FRAME"  , frame_attr,   HTML_FRAME_ATTRIBUTES,  SGML_EMPTY },
2.29    ! frystyk   782:     { "FRAMESET", frameset_attr,HTML_FRAMESET_ATTRIBUTES,SGML_MIXED },
        !           783:     { "H1"     , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           784:     { "H2"     , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           785:     { "H3"     , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           786:     { "H4"     , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           787:     { "H5"     , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           788:     { "H6"     , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           789:     { "HEAD"   , head_attr,    HTML_HEAD_ATTRIBUTES,   SGML_MIXED },
        !           790:     { "HR"     , hr_attr,      HTML_HR_ATTRIBUTES,     SGML_EMPTY },
        !           791:     { "HTML"   , html_attr,    HTML_HTML_ATTRIBUTES,   SGML_MIXED },  /* */
2.1       timbl     792:     { "I"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   793:     { "IFRAME" , iframe_attr,  HTML_IFRAME_ATTRIBUTES, SGML_MIXED },
2.7       frystyk   794:     { "IMG"     , img_attr,    HTML_IMG_ATTRIBUTES,    SGML_EMPTY },
2.1       timbl     795:     { "INPUT"  , input_attr,   HTML_INPUT_ATTRIBUTES,  SGML_EMPTY },
2.29    ! frystyk   796:     { "INS"    , changes_attr, HTML_CHANGES_ATTRIBUTES,SGML_MIXED },
        !           797:     { "ISINDEX" , isindex_attr,        HTML_ISINDEX_ATTRIBUTES,SGML_EMPTY },
2.1       timbl     798:     { "KBD"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   799:     { "LABEL"  , label_attr,   HTML_LABEL_ATTRIBUTES,  SGML_MIXED },
        !           800:     { "LEGEND" , legend_attr,  HTML_LEGEND_ATTRIBUTES, SGML_MIXED },
2.1       timbl     801:     { "LI"     , li_attr,      HTML_LI_ATTRIBUTES,     SGML_EMPTY },
                    802:     { "LINK"   , link_attr,    HTML_LINK_ATTRIBUTES,   SGML_EMPTY },
2.28      frystyk   803:     { "MAP"    , map_attr,     HTML_MAP_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   804:     { "META"   , meta_attr,    HTML_META_ATTRIBUTES,   SGML_EMPTY },
2.1       timbl     805:     { "MENU"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    806:     { "NEXTID"  , nextid_attr, 1,                      SGML_EMPTY },
2.29    ! frystyk   807:     { "NOFRAMES", gen_attr,    HTML_GEN_ATTRIBUTES,    SGML_MIXED },
        !           808:     { "NOSCRIPT", gen_attr,    HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.27      frystyk   809:     { "OBJECT" , object_attr,  HTML_OBJECT_ATTRIBUTES, SGML_MIXED },
2.29    ! frystyk   810:     { "OL"     , ol_attr,      HTML_OL_ATTRIBUTES,     SGML_MIXED },
        !           811:     { "OPTGROUP", optgroup_attr,HTML_OPTGROUP_ATTRIBUTES,SGML_MIXED },
2.8       timbl     812:     { "OPTION" , option_attr,  HTML_OPTION_ATTRIBUTES, SGML_EMPTY },/*Mixed?*/
2.29    ! frystyk   813:     { "P"      , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_EMPTY },
        !           814:     { "PARAM"  , param_attr,   HTML_PARAM_ATTRIBUTES,  SGML_EMPTY },
        !           815:     { "PRE"    , pre_attr,     HTML_PRE_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     816:     { "Q"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    817:     { "S"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    818:     { "SAMP"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   819:     { "SCRIPT" , script_attr,  HTML_SCRIPT_ATTRIBUTES, SGML_MIXED },
2.1       timbl     820:     { "SELECT" , select_attr,  HTML_SELECT_ATTRIBUTES, SGML_MIXED },
2.28      frystyk   821:     { "SMALL"  , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   822:     { "SPAN"   , block_attr,   HTML_BLOCK_ATTRIBUTES,  SGML_MIXED },
        !           823:     { "STRIKE" , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     824:     { "STRONG" , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.29    ! frystyk   825:     { "STYLE"  , style_attr,   HTML_STYLE_ATTRIBUTES,  SGML_MIXED },
2.1       timbl     826:     { "SUB"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    827:     { "SUP"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    828:     { "TABLE"  , table_attr,   HTML_TABLE_ATTRIBUTES,  SGML_MIXED },
2.29    ! frystyk   829:     { "TBODY"  , tele_attr,    HTML_TELE_ATTRIBUTES,   SGML_MIXED },
        !           830:     { "TD"     , td_attr,      HTML_TABLE_ATTRIBUTES,  SGML_EMPTY /*SGML_MIXED*/ },
2.1       timbl     831:     { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES,SGML_MIXED},
2.29    ! frystyk   832:     { "TFOOT"  , tele_attr,    HTML_TELE_ATTRIBUTES,   SGML_MIXED },
        !           833:     { "TH"     , td_attr,      HTML_TD_ATTRIBUTES,     SGML_EMPTY /*SGML_MIXED*/},
        !           834:     { "THEAD"  , tele_attr,    HTML_TELE_ATTRIBUTES,   SGML_MIXED },
        !           835:     { "TITLE"  , title_attr,   HTML_TITLE_ATTRIBUTES,  SGML_MIXED },
        !           836:     { "TR"     , tele_attr,    HTML_TELE_ATTRIBUTES,   SGML_EMPTY /*SGML_MIXED*/},
2.1       timbl     837:     { "TT"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    838:     { "U"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    839:     { "UL"     , ul_attr,      HTML_UL_ATTRIBUTES,     SGML_MIXED },
                    840:     { "VAR"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    841: };
                    842: 
2.27      frystyk   843: PRIVATE SGML_dtd HTMLP_dtd = {
2.18      frystyk   844:     tags,
2.27      frystyk   845:     HTML_ELEMENTS,
2.18      frystyk   846:     entities,
                    847:     sizeof(entities)/sizeof(char**)
2.1       timbl     848: };
                    849: 
2.27      frystyk   850: PRIVATE SGML_dtd * DTD = &HTMLP_dtd;
                    851: 
                    852: PUBLIC SGML_dtd * HTML_dtd (void)
                    853: {
                    854:     return DTD;
                    855: }
                    856: 
                    857: PUBLIC BOOL HTML_setDtd (const SGML_dtd * dtd)
                    858: {
                    859:     if (dtd) {
                    860:        DTD = (SGML_dtd *) dtd;
                    861:        return YES;
                    862:     }
                    863:     return NO;
                    864: }
2.1       timbl     865: 
                    866: /*     Start anchor element
                    867: **     --------------------
                    868: **
                    869: **     It is kinda convenient to have a particulr routine for
                    870: **     starting an anchor element, as everything else for HTML is
                    871: **     simple anyway.
                    872: */
2.17      frystyk   873: PUBLIC void HTStartAnchor (HTStructured * obj,
2.19      frystyk   874:                const char *  name,
                    875:                const char *  href)
2.1       timbl     876: {
                    877:     BOOL               present[HTML_A_ATTRIBUTES];
2.19      frystyk   878:     const char*                value[HTML_A_ATTRIBUTES];
2.1       timbl     879:     
                    880:     {
                    881:        int i;
                    882:        for(i=0; i<HTML_A_ATTRIBUTES; i++)
                    883:            present[i] = NO;
                    884:     }
                    885:     if (name) {
                    886:        present[HTML_A_NAME] = YES;
                    887:        value[HTML_A_NAME] = name;
                    888:     }
                    889:     if (href) {
                    890:         present[HTML_A_HREF] = YES;
                    891:         value[HTML_A_HREF] = href;
                    892:     }
                    893:     
                    894:     (*obj->isa->start_element)(obj, HTML_A , present, value);
                    895: 
                    896: }
                    897: 
2.5       frystyk   898: /*     Put image element
                    899: **     --------------------
                    900: **
                    901: **     Hopefully as usefull as HTStartAnchor. Henrik 23/03-94
                    902: */
2.17      frystyk   903: PUBLIC void HTMLPutImg (HTStructured * obj,
2.19      frystyk   904:                             const char * src,
                    905:                             const char * alt,
                    906:                             const char * align)
2.5       frystyk   907: {
                    908:     BOOL               present[HTML_IMG_ATTRIBUTES];
2.19      frystyk   909:     const char*                value[HTML_IMG_ATTRIBUTES];
2.5       frystyk   910:     
                    911:     {
                    912:        int i;
                    913:        for(i=0; i<HTML_IMG_ATTRIBUTES; i++)
                    914:            present[i] = NO;
                    915:     }
                    916:     if (src) {
                    917:        present[HTML_IMG_SRC] = YES;
                    918:        value[HTML_IMG_SRC] = src;
                    919:     }
                    920:     if (alt) {
                    921:         present[HTML_IMG_ALT] = YES;
                    922:         value[HTML_IMG_ALT] = alt;
                    923:     }
                    924:     if (align) {
                    925:         present[HTML_IMG_ALIGN] = YES;
                    926:         value[HTML_IMG_ALIGN] = align;
                    927:     }
                    928:     (*obj->isa->start_element)(obj, HTML_IMG , present, value);
2.7       frystyk   929:     /* (*obj->isa->end_element)(obj, HTML_IMG); */
2.5       frystyk   930: }
                    931: 
2.17      frystyk   932: PUBLIC void HTNextID (HTStructured * obj,
2.19      frystyk   933:                const char *    next_one)
2.1       timbl     934: {
                    935:     BOOL               present[HTML_NEXTID_ATTRIBUTES];
2.19      frystyk   936:     const char*                value[HTML_NEXTID_ATTRIBUTES];
2.1       timbl     937:     {
                    938:        int i;
                    939:        for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
                    940:            present[i] = NO;
                    941:     }
                    942:     present[HTML_NEXTID_N] = YES;
2.9       timbl     943:     value[HTML_NEXTID_N] = next_one;
2.1       timbl     944:     
                    945:     (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
                    946: 
                    947: }

Webmaster