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

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.28    ! frystyk     6: **     @(#) $Id: HTMLPDTD.c,v 2.27 1999/01/06 15:38:47 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.1       timbl      15: #include "HTMLPDTD.h"
                     16: 
2.27      frystyk    17: struct _HTStructured {
                     18:     HTStructuredClass * isa;
                     19:        /* ... */
                     20: };
                     21: 
                     22: /*
                     23: **     ENTITY NAMES
2.1       timbl      24: **     This table must be matched exactly with ALL the translation tables
                     25: */
2.19      frystyk    26: PRIVATE const char* entities[HTML_ENTITIES] = {
2.1       timbl      27:   "AElig",     /* capital AE diphthong (ligature) */ 
                     28:   "Aacute",    /* capital A, acute accent */ 
                     29:   "Acirc",     /* capital A, circumflex accent */ 
                     30:   "Agrave",    /* capital A, grave accent */ 
                     31:   "Aring",     /* capital A, ring */ 
                     32:   "Atilde",    /* capital A, tilde */ 
                     33:   "Auml",      /* capital A, dieresis or umlaut mark */ 
                     34:   "Ccedil",    /* capital C, cedilla */ 
                     35:   "ETH",       /* capital Eth, Icelandic */ 
                     36:   "Eacute",    /* capital E, acute accent */ 
                     37:   "Ecirc",     /* capital E, circumflex accent */ 
                     38:   "Egrave",    /* capital E, grave accent */ 
                     39:   "Euml",      /* capital E, dieresis or umlaut mark */ 
                     40:   "Iacute",    /* capital I, acute accent */ 
                     41:   "Icirc",     /* capital I, circumflex accent */ 
                     42:   "Igrave",    /* capital I, grave accent */ 
                     43:   "Iuml",      /* capital I, dieresis or umlaut mark */ 
                     44:   "Ntilde",    /* capital N, tilde */ 
                     45:   "Oacute",    /* capital O, acute accent */ 
                     46:   "Ocirc",     /* capital O, circumflex accent */ 
                     47:   "Ograve",    /* capital O, grave accent */ 
                     48:   "Oslash",    /* capital O, slash */ 
                     49:   "Otilde",    /* capital O, tilde */ 
                     50:   "Ouml",      /* capital O, dieresis or umlaut mark */ 
                     51:   "THORN",     /* capital THORN, Icelandic */ 
                     52:   "Uacute",    /* capital U, acute accent */ 
                     53:   "Ucirc",     /* capital U, circumflex accent */ 
                     54:   "Ugrave",    /* capital U, grave accent */ 
                     55:   "Uuml",      /* capital U, dieresis or umlaut mark */ 
                     56:   "Yacute",    /* capital Y, acute accent */ 
                     57:   "aacute",    /* small a, acute accent */ 
                     58:   "acirc",     /* small a, circumflex accent */ 
                     59:   "aelig",     /* small ae diphthong (ligature) */ 
                     60:   "agrave",    /* small a, grave accent */ 
                     61:   "amp",       /* ampersand */ 
                     62:   "aring",     /* small a, ring */ 
                     63:   "atilde",    /* small a, tilde */ 
                     64:   "auml",      /* small a, dieresis or umlaut mark */ 
                     65:   "ccedil",    /* small c, cedilla */ 
                     66:   "eacute",    /* small e, acute accent */ 
                     67:   "ecirc",     /* small e, circumflex accent */ 
                     68:   "egrave",    /* small e, grave accent */ 
                     69:   "eth",       /* small eth, Icelandic */ 
                     70:   "euml",      /* small e, dieresis or umlaut mark */ 
                     71:   "gt",                /* greater than */ 
                     72:   "iacute",    /* small i, acute accent */ 
                     73:   "icirc",     /* small i, circumflex accent */ 
                     74:   "igrave",    /* small i, grave accent */ 
                     75:   "iuml",      /* small i, dieresis or umlaut mark */ 
                     76:   "lt",                /* less than */ 
2.21      frystyk    77:   "nbsp",      /* non breaking space */
2.1       timbl      78:   "ntilde",    /* small n, tilde */ 
                     79:   "oacute",    /* small o, acute accent */ 
                     80:   "ocirc",     /* small o, circumflex accent */ 
                     81:   "ograve",    /* small o, grave accent */ 
                     82:   "oslash",    /* small o, slash */ 
                     83:   "otilde",    /* small o, tilde */ 
2.10      timbl      84:   "ouml",      /* small o, dieresis or umlaut mark */
                     85:   "quot",      /* double quote sign  - June 1994 */ 
2.1       timbl      86:   "szlig",     /* small sharp s, German (sz ligature) */ 
                     87:   "thorn",     /* small thorn, Icelandic */ 
                     88:   "uacute",    /* small u, acute accent */ 
                     89:   "ucirc",     /* small u, circumflex accent */ 
                     90:   "ugrave",    /* small u, grave accent */ 
                     91:   "uuml",      /* small u, dieresis or umlaut mark */ 
                     92:   "yacute",    /* small y, acute accent */ 
                     93:   "yuml",      /* small y, dieresis or umlaut mark */ 
                     94: };
                     95: 
2.27      frystyk    96: /*
                     97: **     ATTRIBUTE LISTS
                     98: */
2.1       timbl      99: 
2.27      frystyk   100: PRIVATE HTAttr no_attr[1] = 
                    101:        {{ 0 }};
                    102: 
                    103: PRIVATE HTAttr body_attr[HTML_BODY_ATTRIBUTES+1] = {   /* to catch images */
2.26      frystyk   104:        { "BACKGROUND" },
                    105:        { 0 }   /* Terminate list */
                    106: };     
                    107: 
2.27      frystyk   108: PRIVATE HTAttr frame_attr[HTML_FRAME_ATTRIBUTES+1] = { /* frame attributes */
2.26      frystyk   109:        { "SRC" },
                    110:        { 0 }   /* Terminate list */
                    111: };
                    112: 
2.27      frystyk   113: PRIVATE HTAttr frameset_attr[HTML_FRAMESET_ATTRIBUTES+1] = { /* frameset attributes */
2.26      frystyk   114: 
                    115:        { "BORDER" },
                    116:        { "BORDERCOLOR" },
                    117:        { "COLS" },
                    118:        { "FRAMEBORDER" },
                    119:        { "ONBLUR" },
                    120:        { "ONFOCUS" },
                    121:        { "ONLOAD" },
                    122:        { "ONUNLOAD" },
                    123:        { "ROWS" },     
                    124:        { 0 }   /* Terminate list */
                    125: };
                    126: 
2.27      frystyk   127: PRIVATE HTAttr a_attr[HTML_A_ATTRIBUTES+1] = {         /* Anchor attributes */
2.1       timbl     128:        { "EFFECT" },
                    129:        { "HREF"},
                    130:        { "ID" },
                    131:        { "METHODS" },
                    132:        { "NAME" },                     /* Should be ID */
                    133:        { "PRINT" },
                    134:        { "REL" },                      /* Relationship */
                    135:        { "REV" },                      /* Reverse relationship */
                    136:        { "SHAPE" },
                    137:        { "TITLE" },
                    138:        { 0 }   /* Terminate list */
                    139: };     
                    140: 
2.27      frystyk   141: PRIVATE HTAttr area_attr[HTML_AREA_ATTRIBUTES+1] = {           /* Area attributes */
                    142:        { "ALT" },
                    143:        { "ACCESSKEY"},
                    144:        { "COORDS" },
                    145:        { "HREF" },
                    146:        { "NOHREF" },
                    147:        { "ONBLUR" },
                    148:        { "ONFOCUS" },
                    149:        { "SHAPE" },
                    150:        { "TABINDEX" },
                    151:        { 0 }   /* Terminate list */
                    152: };     
                    153: 
                    154: PRIVATE HTAttr base_attr[HTML_BASE_ATTRIBUTES+1] = {   /* BASE attributes */
2.1       timbl     155:        { "HREF"},
                    156:        { 0 }   /* Terminate list */
                    157: };     
                    158: 
                    159: 
2.27      frystyk   160: PRIVATE HTAttr changed_attr[] = {
2.1       timbl     161:        { "ID" },
                    162:        { "IDREF" },
                    163:        { 0 }   /* terminate list */
                    164: };
                    165: 
2.27      frystyk   166: PRIVATE HTAttr fig_attr[] = {          /* Figures */
2.1       timbl     167:        { "ALIGN" },
                    168:        { "ID" },
                    169:        { "INDEX" },
                    170:        { "ISMAP" },                            /* @@@ NO! */
                    171:        { "LANG" },
                    172:        { "SRC" },
                    173:        { 0 }   /* terminate list */
                    174: };
                    175: 
2.27      frystyk   176: PRIVATE HTAttr form_attr[] = {         /* General, for many things */
2.1       timbl     177:        { "ACTION" },
                    178:        { "ID" },
                    179:        { "INDEX" },
                    180:        { "LANG" },
                    181:        { "METHOD" },
                    182:        { 0 }   /* terminate list */
                    183: };
                    184: 
2.27      frystyk   185: PRIVATE HTAttr gen_attr[] = {          /* General, for many things */
2.1       timbl     186:        { "ID" },
                    187:        { "INDEX" },
                    188:        { "LANG" },
                    189:        { 0 }   /* terminate list */
                    190: };
                    191: 
2.27      frystyk   192: PRIVATE HTAttr htmlplus_attr[] = {             /* wrapper HTMLPLUS */
2.1       timbl     193:        { "FORMS" },
                    194:        { "VERSION" },
                    195:        { 0 }                           /* terminate list */
                    196: };
                    197: 
2.27      frystyk   198: PRIVATE HTAttr id_attr[2] = {
2.1       timbl     199:        { "ID" },
                    200:        { 0 }                           /* terminate list */
                    201: };
                    202: 
2.27      frystyk   203: PRIVATE HTAttr image_attr[HTML_IMAGE_ATTRIBUTES+1] = { /* Image attributes */
2.1       timbl     204:        { "ALIGN" },
                    205:        { "ISMAP"},                     /* Use HTTP SpaceJump instead */
                    206:        { "LANG" },
                    207:        { "SEETHRU"},
                    208:        { "SRC"},
                    209:        { 0 }   /* Terminate list */
                    210: };     
                    211: 
2.27      frystyk   212: PRIVATE HTAttr img_attr[HTML_IMG_ATTRIBUTES+1] = {     /* IMG attributes */
2.1       timbl     213:        { "ALIGN" },
                    214:        { "ALT" },
                    215:        { "ISMAP"},                     /* Use HTTP SpaceJump instead */
2.26      frystyk   216:        { "LOWSRC"},
2.1       timbl     217:        { "SEETHRU"},
                    218:        { "SRC"},
                    219:        { 0 }   /* Terminate list */
                    220: };     
                    221: 
2.27      frystyk   222: PRIVATE HTAttr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
2.1       timbl     223:        { "ALIGN" },
                    224:        { "CHECKED" },
                    225:        { "DISABLED" },
                    226:        { "ERROR" },
2.15      frystyk   227:        { "MAXLENGTH" },                /* WSM bug fix, was MAX */
2.1       timbl     228:        { "MIN" },
                    229:        { "NAME" }, 
                    230:        { "SIZE" },
                    231:        { "SRC" },
                    232:        { "TYPE" },
                    233:        { "VALUE" },
2.2       timbl     234:        { "0" }
2.1       timbl     235: };
                    236: 
2.27      frystyk   237: PRIVATE HTAttr l_attr[] = {
2.1       timbl     238:        { "ALIGN"},
                    239:        { "ID" },
                    240:        { "LANG" },
                    241:        { "INDEX" },
                    242:        { 0 }   /* Terminate list */
                    243: };
                    244: 
2.27      frystyk   245: PRIVATE HTAttr li_attr[] = {
2.1       timbl     246:        { "ID" },
2.23      frystyk   247:        { "INDEX" },
2.1       timbl     248:        { "LANG" },
                    249:        { "SRC"},
                    250:        { 0 }   /* Terminate list */
                    251: };
                    252: 
2.27      frystyk   253: PRIVATE HTAttr link_attr[HTML_LINK_ATTRIBUTES+1] = {   /* link attributes */
2.23      frystyk   254:     { "CHARSET"},
                    255:     { "HREF"},
                    256:     { "HREFLANG"},
                    257:     { "MEDIA" },
                    258:     { "REL" },         /* Relationship */
                    259:     { "REV" },         /* Reverse relationship */
                    260:     { "TYPE" },
                    261:     { 0 }              /* Terminate list */
2.1       timbl     262: };     
                    263: 
2.27      frystyk   264: PRIVATE HTAttr object_attr[HTML_OBJECT_ATTRIBUTES+1] = {       /* object attributes */
                    265:     { "ARCHIVE" },
                    266:     { "CLASSID" },
                    267:     { "CODEBASE" },
                    268:     { "CODETYPE" },
                    269:     { "DATA" },
                    270:     { "DECLARE" },
                    271:     { "HIGHT" },
                    272:     { "NAME" },
                    273:     { "STANDBY" },
                    274:     { "TABINDEX" },
                    275:     { "TYPE" },
                    276:     { "USEMAP" },
                    277:     { "WIDTH" },
                    278:     { 0 }
                    279: };     
                    280: 
                    281: PRIVATE HTAttr list_attr[] = {
2.1       timbl     282:        { "COMPACT"},
                    283:        { "ID" },
                    284:        { "LANG" },
                    285:        { "INDEX" },
                    286:        { 0 }   /* Terminate list */
                    287: };
                    288: 
2.27      frystyk   289: PRIVATE HTAttr glossary_attr[HTML_DL_ATTRIBUTES+1] = {
2.3       frystyk   290:        { "ID" },
                    291:        { "COMPACT " },
                    292:        { "INDEX" },
2.1       timbl     293:        { 0 }   /* Terminate list */
                    294: };
                    295: 
2.28    ! frystyk   296: PRIVATE HTAttr map_attr[HTML_MAP_ATTRIBUTES+1] = {
        !           297:        { "NAME"},
        !           298:        { 0 }   /* Terminate list */
        !           299: };
        !           300: 
2.27      frystyk   301: PRIVATE HTAttr meta_attr[HTML_META_ATTRIBUTES+1] = {
2.24      frystyk   302:     { "CONTENT"},
                    303:     { "HTTP-EQUIV"},
                    304:     { "NAME"},
                    305:     { "SCHEME" },
                    306:     { 0 }              /* Terminate list */
                    307: };     
                    308: 
2.27      frystyk   309: PRIVATE HTAttr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
2.1       timbl     310:        { "N" },
                    311:        { 0 }   /* Terminate list */
                    312: };
                    313: 
2.27      frystyk   314: PRIVATE HTAttr note_attr[HTML_NOTE_ATTRIBUTES+1] = {   /* Footnotes etc etc */
2.1       timbl     315:        { "ID" },
                    316:        { "INDEX" },
                    317:        { "LANG" },
                    318:        { "ROLE" },
                    319:        { 0 }   /* terminate list */
                    320: };
                    321: 
2.27      frystyk   322: PRIVATE HTAttr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
2.1       timbl     323:        { "DISABLED" },
                    324:        { "LANG" },
                    325:        { "SELECTED" },
                    326:        { 0 }
                    327: };
                    328: 
2.27      frystyk   329: PRIVATE HTAttr render_attr[HTML_RENDER_ATTRIBUTES+1] = {
2.1       timbl     330:        { "STYLE" },
                    331:        { "TAG" },
                    332:        { 0 }   /* Terminate list */
                    333: };
                    334: 
2.27      frystyk   335: PRIVATE HTAttr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
2.1       timbl     336:        { "ERROR" },
                    337:        { "LANG" },
2.15      frystyk   338:        { "MULTIPLE" },                 /* WSM bug fix, was SEVERAL */
2.1       timbl     339:        { "NAME" },
2.15      frystyk   340:        { "SIZE" },                     /* WSM bug fix, missing */
2.1       timbl     341:        { 0 },
                    342: };
                    343: 
2.27      frystyk   344: PRIVATE HTAttr tab_attr[HTML_TAB_ATTRIBUTES+1] = {
2.1       timbl     345:        { "ALIGN" },
                    346:        { "AT" },
                    347:        { 0 }
                    348: };
                    349: 
2.27      frystyk   350: PRIVATE HTAttr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
2.1       timbl     351:        { "BORDER" },
                    352:        { "ID" },
                    353:        { "INDEX" },
                    354:        { "LANG" },
                    355:        { 0 }
                    356: };
                    357: 
2.27      frystyk   358: PRIVATE HTAttr td_attr[HTML_TD_ATTRIBUTES+1] = {
2.1       timbl     359:        { "ALIGN" },
                    360:        { "COLSPAN" },
                    361:        { "ROWSPAN" },
                    362:        { "TAG" },
                    363:        { 0 }
                    364: };
                    365: 
2.27      frystyk   366: PRIVATE HTAttr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
2.1       timbl     367:        { "COLS" },
                    368:        { "DISABLED" },
                    369:        { "ERROR" },
                    370:        { "LANG" },
                    371:        { "NAME" },
                    372:        { "ROWS" },
                    373:        { 0 }
                    374: };
                    375: 
2.27      frystyk   376: PRIVATE HTAttr ul_attr[HTML_UL_ATTRIBUTES+1] = {
2.1       timbl     377:        { "COMPACT" },
                    378:        { "ID" },
                    379:        { "INDEX" },
                    380:        { "LANG" },
                    381:        { "PLAIN" },
                    382:        { "WRAP" },
                    383:        { 0 }
                    384: };
                    385: 
2.27      frystyk   386: /*
                    387: **     ELEMENTS
2.1       timbl     388: **     Must match definitions in HTMLPDTD.html!
                    389: **     Must be in alphabetical order.
                    390: **
                    391: **    Name,    Attributes,             content
                    392: */
2.27      frystyk   393: PRIVATE HTTag tags[HTML_ELEMENTS] = {
2.1       timbl     394:     { "A"      , a_attr,       HTML_A_ATTRIBUTES,      SGML_MIXED },
                    395:     { "ABBREV"  , gen_attr,     HTML_GEN_ATTRIBUTES,   SGML_MIXED },
                    396:     { "ABSTRACT" , gen_attr,   HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    397:     { "ACRONYM"        , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    398:     { "ADDED"  , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    399:     { "ADDRESS"        , no_attr,      0,                      SGML_MIXED },
2.27      frystyk   400:     { "AREA"   , area_attr,    HTML_AREA_ATTRIBUTES,   SGML_EMPTY },
2.1       timbl     401:     { "ARG"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.28    ! frystyk   402:     { "B"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.22      frystyk   403:     { "BASE"   , base_attr,    HTML_BASE_ATTRIBUTES,   SGML_EMPTY },
2.28    ! frystyk   404:     { "BIG"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     405:     { "BLOCKQUOTE", no_attr,   0,                      SGML_MIXED },
2.26      frystyk   406:     { "BODY"   , body_attr,    HTML_BODY_ATTRIBUTES,   SGML_MIXED },
2.1       timbl     407:     { "BOX"    , no_attr,      0,                      SGML_MIXED },
                    408:     { "BR"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_EMPTY },
                    409:     { "BYLINE" , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    410:     { "CAPTION"        , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    411:     { "CHANGED"        , changed_attr, HTML_CHANGED_ATTRIBUTES, SGML_MIXED },
                    412:     { "CITE"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    413:     { "CMD"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    414:     { "CODE"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    415:     { "COMMENT"        , no_attr,      0,                      SGML_MIXED },
                    416:     { "DD"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_EMPTY },
                    417:     { "DFN"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    418:     { "DIR"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.28    ! frystyk   419:     { "DIV"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     420:     { "DL"     , glossary_attr,HTML_DL_ATTRIBUTES,     SGML_MIXED },
                    421:     { "DT"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_EMPTY },
                    422:     { "EM"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    423:     { "FIG"    , fig_attr,     HTML_FIG_ATTRIBUTES,    SGML_MIXED },
                    424:     { "FOOTNOTE" , gen_attr,   HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    425:     { "FORM"   , form_attr,    HTML_FORM_ATTRIBUTES,   SGML_MIXED },
2.26      frystyk   426:     { "FRAME"  , frame_attr,   HTML_FRAME_ATTRIBUTES,  SGML_EMPTY },
                    427:     { "FRAMESET", frameset_attr,HTML_FRAMESET_ATTRIBUTES, SGML_EMPTY },
2.1       timbl     428:     { "H1"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    429:     { "H2"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    430:     { "H3"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    431:     { "H4"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    432:     { "H5"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    433:     { "H6"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    434:     { "H7"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    435:     { "HEAD"   , no_attr,      0,                      SGML_MIXED },
                    436:     { "HR"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_EMPTY },
                    437:     { "HTML"   , no_attr,      0,                      SGML_MIXED },  /* */
2.2       timbl     438:     { "HTMLPLUS", htmlplus_attr,HTML_HTMLPLUS_ATTRIBUTES, SGML_MIXED },
2.1       timbl     439:     { "I"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    440:     { "IMAGE"  , image_attr,   HTML_IMAGE_ATTRIBUTES,  SGML_EMPTY },
2.7       frystyk   441:     { "IMG"     , img_attr,    HTML_IMG_ATTRIBUTES,    SGML_EMPTY },
2.1       timbl     442:     { "INPUT"  , input_attr,   HTML_INPUT_ATTRIBUTES,  SGML_EMPTY },
                    443:     { "ISINDEX" , no_attr,     0,                      SGML_EMPTY },
                    444:     { "KBD"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    445:     { "L"      , l_attr,       HTML_L_ATTRIBUTES,      SGML_MIXED },
                    446:     { "LI"     , li_attr,      HTML_LI_ATTRIBUTES,     SGML_EMPTY },
                    447:     { "LINK"   , link_attr,    HTML_LINK_ATTRIBUTES,   SGML_EMPTY },
                    448:     { "LISTING"        , no_attr,      0,                      SGML_LITERAL },
                    449:     { "LIT"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.28    ! frystyk   450:     { "MAP"    , map_attr,     HTML_MAP_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     451:     { "MARGIN" , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    452:     { "MATH"   , id_attr,      HTML_ID_ATTRIBUTE,      SGML_MIXED },
                    453:     { "MENU"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.24      frystyk   454:     { "META"   , meta_attr,    HTML_META_ATTRIBUTES,   SGML_EMPTY },
2.1       timbl     455:     { "NEXTID"  , nextid_attr, 1,                      SGML_EMPTY },
                    456:     { "NOTE"   , note_attr,    HTML_NOTE_ATTRIBUTES,   SGML_EMPTY },
2.26      frystyk   457:     { "NOFRAMES", no_attr,     0,                      SGML_MIXED },
2.27      frystyk   458:     { "OBJECT" , object_attr,  HTML_OBJECT_ATTRIBUTES, SGML_MIXED },
2.1       timbl     459:     { "OL"     , list_attr,    HTML_LIST_ATTRIBUTES,   SGML_MIXED },
2.8       timbl     460:     { "OPTION" , option_attr,  HTML_OPTION_ATTRIBUTES, SGML_EMPTY },/*Mixed?*/
2.1       timbl     461:     { "OVER"   , no_attr,      0,                      SGML_MIXED },
                    462:     { "P"      , l_attr,       HTML_L_ATTRIBUTES,      SGML_EMPTY },
                    463:     { "PERSON" , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    464:     { "PLAINTEXT", no_attr,    0,                      SGML_LITERAL },
                    465:     { "PRE"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    466:     { "Q"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    467:     { "QUOTE"  , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    468:     { "RENDER" , render_attr,  HTML_RENDER_ATTRIBUTES, SGML_MIXED },
                    469:     { "REMOVED"        , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    470:     { "S"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    471:     { "SAMP"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    472:     { "SELECT" , select_attr,  HTML_SELECT_ATTRIBUTES, SGML_MIXED },
2.28    ! frystyk   473:     { "SMALL"  , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
        !           474:     { "SPAN"   , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     475:     { "STRONG" , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    476:     { "SUB"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    477:     { "SUP"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    478:     { "TAB"    , tab_attr,     HTML_TAB_ATTRIBUTES,    SGML_EMPTY },
                    479:     { "TABLE"  , table_attr,   HTML_TABLE_ATTRIBUTES,  SGML_MIXED },
                    480:     { "TD"     , td_attr,      HTML_TABLE_ATTRIBUTES,  SGML_MIXED },
                    481:     { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES,SGML_MIXED},
                    482:     { "TH"     , td_attr,      HTML_TD_ATTRIBUTES,     SGML_MIXED },
2.4       frystyk   483:     { "TITLE"  , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
2.1       timbl     484:     { "TR"     , id_attr,      HTML_ID_ATTRIBUTE,      SGML_MIXED },
                    485:     { "TT"     , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    486:     { "U"      , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    487:     { "UL"     , ul_attr,      HTML_UL_ATTRIBUTES,     SGML_MIXED },
                    488:     { "VAR"    , gen_attr,     HTML_GEN_ATTRIBUTES,    SGML_MIXED },
                    489:     { "XMP"    , no_attr,      0,                      SGML_LITERAL }
                    490: };
                    491: 
2.27      frystyk   492: PRIVATE SGML_dtd HTMLP_dtd = {
2.18      frystyk   493:     tags,
2.27      frystyk   494:     HTML_ELEMENTS,
2.18      frystyk   495:     entities,
                    496:     sizeof(entities)/sizeof(char**)
2.1       timbl     497: };
                    498: 
2.27      frystyk   499: PRIVATE SGML_dtd * DTD = &HTMLP_dtd;
                    500: 
                    501: PUBLIC SGML_dtd * HTML_dtd (void)
                    502: {
                    503:     return DTD;
                    504: }
                    505: 
                    506: PUBLIC BOOL HTML_setDtd (const SGML_dtd * dtd)
                    507: {
                    508:     if (dtd) {
                    509:        DTD = (SGML_dtd *) dtd;
                    510:        return YES;
                    511:     }
                    512:     return NO;
                    513: }
2.1       timbl     514: 
                    515: /*     Start anchor element
                    516: **     --------------------
                    517: **
                    518: **     It is kinda convenient to have a particulr routine for
                    519: **     starting an anchor element, as everything else for HTML is
                    520: **     simple anyway.
                    521: */
2.17      frystyk   522: PUBLIC void HTStartAnchor (HTStructured * obj,
2.19      frystyk   523:                const char *  name,
                    524:                const char *  href)
2.1       timbl     525: {
                    526:     BOOL               present[HTML_A_ATTRIBUTES];
2.19      frystyk   527:     const char*                value[HTML_A_ATTRIBUTES];
2.1       timbl     528:     
                    529:     {
                    530:        int i;
                    531:        for(i=0; i<HTML_A_ATTRIBUTES; i++)
                    532:            present[i] = NO;
                    533:     }
                    534:     if (name) {
                    535:        present[HTML_A_NAME] = YES;
                    536:        value[HTML_A_NAME] = name;
                    537:     }
                    538:     if (href) {
                    539:         present[HTML_A_HREF] = YES;
                    540:         value[HTML_A_HREF] = href;
                    541:     }
                    542:     
                    543:     (*obj->isa->start_element)(obj, HTML_A , present, value);
                    544: 
                    545: }
                    546: 
2.5       frystyk   547: /*     Put image element
                    548: **     --------------------
                    549: **
                    550: **     Hopefully as usefull as HTStartAnchor. Henrik 23/03-94
                    551: */
2.17      frystyk   552: PUBLIC void HTMLPutImg (HTStructured * obj,
2.19      frystyk   553:                             const char * src,
                    554:                             const char * alt,
                    555:                             const char * align)
2.5       frystyk   556: {
                    557:     BOOL               present[HTML_IMG_ATTRIBUTES];
2.19      frystyk   558:     const char*                value[HTML_IMG_ATTRIBUTES];
2.5       frystyk   559:     
                    560:     {
                    561:        int i;
                    562:        for(i=0; i<HTML_IMG_ATTRIBUTES; i++)
                    563:            present[i] = NO;
                    564:     }
                    565:     if (src) {
                    566:        present[HTML_IMG_SRC] = YES;
                    567:        value[HTML_IMG_SRC] = src;
                    568:     }
                    569:     if (alt) {
                    570:         present[HTML_IMG_ALT] = YES;
                    571:         value[HTML_IMG_ALT] = alt;
                    572:     }
                    573:     if (align) {
                    574:         present[HTML_IMG_ALIGN] = YES;
                    575:         value[HTML_IMG_ALIGN] = align;
                    576:     }
                    577:     (*obj->isa->start_element)(obj, HTML_IMG , present, value);
2.7       frystyk   578:     /* (*obj->isa->end_element)(obj, HTML_IMG); */
2.5       frystyk   579: }
                    580: 
2.17      frystyk   581: PUBLIC void HTNextID (HTStructured * obj,
2.19      frystyk   582:                const char *    next_one)
2.1       timbl     583: {
                    584:     BOOL               present[HTML_NEXTID_ATTRIBUTES];
2.19      frystyk   585:     const char*                value[HTML_NEXTID_ATTRIBUTES];
2.1       timbl     586:     {
                    587:        int i;
                    588:        for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
                    589:            present[i] = NO;
                    590:     }
                    591:     present[HTML_NEXTID_N] = YES;
2.9       timbl     592:     value[HTML_NEXTID_N] = next_one;
2.1       timbl     593:     
                    594:     (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
                    595: 
                    596: }

Webmaster