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

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

Webmaster