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

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

Webmaster