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