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