Annotation of libwww/Library/src/HTMLPDTD.c, revision 2.25
2.12 frystyk 1: /* HTMLPDTD.c
2: ** STATIC DTD FOR HTML
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.25 ! frystyk 6: ** @(#) $Id: HTMLPDTD.c,v 2.24 1998/02/25 20:48:33 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:
93:
94:
95: /* Attribute Lists
96: ** ---------------
97: **
98: ** Lists must be in alphatbetical order by attribute name
99: ** The tag elements contain the number of attributes
100: */
2.17 frystyk 101: PRIVATE attr no_attr[1] =
2.1 timbl 102: {{ 0 }};
103:
2.17 frystyk 104: PRIVATE attr a_attr[HTML_A_ATTRIBUTES+1] = { /* Anchor attributes */
2.1 timbl 105: { "EFFECT" },
106: { "HREF"},
107: { "ID" },
108: { "METHODS" },
109: { "NAME" }, /* Should be ID */
110: { "PRINT" },
111: { "REL" }, /* Relationship */
112: { "REV" }, /* Reverse relationship */
113: { "SHAPE" },
114: { "TITLE" },
115: { 0 } /* Terminate list */
116: };
117:
2.22 frystyk 118: PRIVATE attr base_attr[HTML_BASE_ATTRIBUTES+1] = { /* BASE attributes */
2.1 timbl 119: { "HREF"},
120: { 0 } /* Terminate list */
121: };
122:
123:
2.17 frystyk 124: PRIVATE attr changed_attr[] = {
2.1 timbl 125: { "ID" },
126: { "IDREF" },
127: { 0 } /* terminate list */
128: };
129:
2.17 frystyk 130: PRIVATE attr fig_attr[] = { /* Figures */
2.1 timbl 131: { "ALIGN" },
132: { "ID" },
133: { "INDEX" },
134: { "ISMAP" }, /* @@@ NO! */
135: { "LANG" },
136: { "SRC" },
137: { 0 } /* terminate list */
138: };
139:
2.17 frystyk 140: PRIVATE attr form_attr[] = { /* General, for many things */
2.1 timbl 141: { "ACTION" },
142: { "ID" },
143: { "INDEX" },
144: { "LANG" },
145: { "METHOD" },
146: { 0 } /* terminate list */
147: };
148:
2.17 frystyk 149: PRIVATE attr gen_attr[] = { /* General, for many things */
2.1 timbl 150: { "ID" },
151: { "INDEX" },
152: { "LANG" },
153: { 0 } /* terminate list */
154: };
155:
2.17 frystyk 156: PRIVATE attr htmlplus_attr[] = { /* wrapper HTMLPLUS */
2.1 timbl 157: { "FORMS" },
158: { "VERSION" },
159: { 0 } /* terminate list */
160: };
161:
2.17 frystyk 162: PRIVATE attr id_attr[2] = {
2.1 timbl 163: { "ID" },
164: { 0 } /* terminate list */
165: };
166:
2.17 frystyk 167: PRIVATE attr image_attr[HTML_IMAGE_ATTRIBUTES+1] = { /* Image attributes */
2.1 timbl 168: { "ALIGN" },
169: { "ISMAP"}, /* Use HTTP SpaceJump instead */
170: { "LANG" },
171: { "SEETHRU"},
172: { "SRC"},
173: { 0 } /* Terminate list */
174: };
175:
2.17 frystyk 176: PRIVATE attr img_attr[HTML_IMG_ATTRIBUTES+1] = { /* IMG attributes */
2.1 timbl 177: { "ALIGN" },
178: { "ALT" },
179: { "ISMAP"}, /* Use HTTP SpaceJump instead */
180: { "SEETHRU"},
181: { "SRC"},
182: { 0 } /* Terminate list */
183: };
184:
2.17 frystyk 185: PRIVATE attr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
2.1 timbl 186: { "ALIGN" },
187: { "CHECKED" },
188: { "DISABLED" },
189: { "ERROR" },
2.15 frystyk 190: { "MAXLENGTH" }, /* WSM bug fix, was MAX */
2.1 timbl 191: { "MIN" },
192: { "NAME" },
193: { "SIZE" },
194: { "SRC" },
195: { "TYPE" },
196: { "VALUE" },
2.2 timbl 197: { "0" }
2.1 timbl 198: };
199:
2.17 frystyk 200: PRIVATE attr l_attr[] = {
2.1 timbl 201: { "ALIGN"},
202: { "ID" },
203: { "LANG" },
204: { "INDEX" },
205: { 0 } /* Terminate list */
206: };
207:
2.17 frystyk 208: PRIVATE attr li_attr[] = {
2.1 timbl 209: { "ID" },
2.23 frystyk 210: { "INDEX" },
2.1 timbl 211: { "LANG" },
212: { "SRC"},
213: { 0 } /* Terminate list */
214: };
215:
2.17 frystyk 216: PRIVATE attr link_attr[HTML_LINK_ATTRIBUTES+1] = { /* link attributes */
2.23 frystyk 217: { "CHARSET"},
218: { "HREF"},
219: { "HREFLANG"},
220: { "MEDIA" },
221: { "REL" }, /* Relationship */
222: { "REV" }, /* Reverse relationship */
223: { "TYPE" },
224: { 0 } /* Terminate list */
2.1 timbl 225: };
226:
2.17 frystyk 227: PRIVATE attr list_attr[] = {
2.1 timbl 228: { "COMPACT"},
229: { "ID" },
230: { "LANG" },
231: { "INDEX" },
232: { 0 } /* Terminate list */
233: };
234:
2.17 frystyk 235: PRIVATE attr glossary_attr[HTML_DL_ATTRIBUTES+1] = {
2.3 frystyk 236: { "ID" },
237: { "COMPACT " },
238: { "INDEX" },
2.1 timbl 239: { 0 } /* Terminate list */
240: };
241:
2.24 frystyk 242: PRIVATE attr meta_attr[HTML_META_ATTRIBUTES+1] = {
243: { "CONTENT"},
244: { "HTTP-EQUIV"},
245: { "NAME"},
246: { "SCHEME" },
247: { 0 } /* Terminate list */
248: };
249:
2.17 frystyk 250: PRIVATE attr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
2.1 timbl 251: { "N" },
252: { 0 } /* Terminate list */
253: };
254:
2.17 frystyk 255: PRIVATE attr note_attr[HTML_NOTE_ATTRIBUTES+1] = { /* Footnotes etc etc */
2.1 timbl 256: { "ID" },
257: { "INDEX" },
258: { "LANG" },
259: { "ROLE" },
260: { 0 } /* terminate list */
261: };
262:
2.17 frystyk 263: PRIVATE attr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
2.1 timbl 264: { "DISABLED" },
265: { "LANG" },
266: { "SELECTED" },
267: { 0 }
268: };
269:
2.17 frystyk 270: PRIVATE attr render_attr[HTML_RENDER_ATTRIBUTES+1] = {
2.1 timbl 271: { "STYLE" },
272: { "TAG" },
273: { 0 } /* Terminate list */
274: };
275:
2.17 frystyk 276: PRIVATE attr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
2.1 timbl 277: { "ERROR" },
278: { "LANG" },
2.15 frystyk 279: { "MULTIPLE" }, /* WSM bug fix, was SEVERAL */
2.1 timbl 280: { "NAME" },
2.15 frystyk 281: { "SIZE" }, /* WSM bug fix, missing */
2.1 timbl 282: { 0 },
283: };
284:
2.17 frystyk 285: PRIVATE attr tab_attr[HTML_TAB_ATTRIBUTES+1] = {
2.1 timbl 286: { "ALIGN" },
287: { "AT" },
288: { 0 }
289: };
290:
2.17 frystyk 291: PRIVATE attr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
2.1 timbl 292: { "BORDER" },
293: { "ID" },
294: { "INDEX" },
295: { "LANG" },
296: { 0 }
297: };
298:
2.17 frystyk 299: PRIVATE attr td_attr[HTML_TD_ATTRIBUTES+1] = {
2.1 timbl 300: { "ALIGN" },
301: { "COLSPAN" },
302: { "ROWSPAN" },
303: { "TAG" },
304: { 0 }
305: };
306:
2.17 frystyk 307: PRIVATE attr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
2.1 timbl 308: { "COLS" },
309: { "DISABLED" },
310: { "ERROR" },
311: { "LANG" },
312: { "NAME" },
313: { "ROWS" },
314: { 0 }
315: };
316:
2.17 frystyk 317: PRIVATE attr ul_attr[HTML_UL_ATTRIBUTES+1] = {
2.1 timbl 318: { "COMPACT" },
319: { "ID" },
320: { "INDEX" },
321: { "LANG" },
322: { "PLAIN" },
323: { "WRAP" },
324: { 0 }
325: };
326:
327:
328: /* Elements
329: ** --------
330: **
331: ** Must match definitions in HTMLPDTD.html!
332: ** Must be in alphabetical order.
333: **
334: ** HTML is included to allow HTML documents to be parsed as a subset.
2.4 frystyk 335: ** TITLE is changed to type SGML_MIXED so it get parsed as well
336: ** Henrik 08/03-94
2.1 timbl 337: **
338: ** Name, Attributes, content
339: */
2.17 frystyk 340: PRIVATE HTTag tags[HTMLP_ELEMENTS] = {
2.1 timbl 341: { "A" , a_attr, HTML_A_ATTRIBUTES, SGML_MIXED },
342: { "ABBREV" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
343: { "ABSTRACT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
344: { "ACRONYM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
345: { "ADDED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
346: { "ADDRESS" , no_attr, 0, SGML_MIXED },
347: { "ARG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
348: { "B" , no_attr, 0, SGML_MIXED },
2.22 frystyk 349: { "BASE" , base_attr, HTML_BASE_ATTRIBUTES, SGML_EMPTY },
2.1 timbl 350: { "BLOCKQUOTE", no_attr, 0, SGML_MIXED },
351: { "BODY" , no_attr, 0, SGML_MIXED },
352: { "BOX" , no_attr, 0, SGML_MIXED },
353: { "BR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
354: { "BYLINE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
355: { "CAPTION" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
356: { "CHANGED" , changed_attr, HTML_CHANGED_ATTRIBUTES, SGML_MIXED },
357: { "CITE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
358: { "CMD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
359: { "CODE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
360: { "COMMENT" , no_attr, 0, SGML_MIXED },
361: { "DD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
362: { "DFN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
363: { "DIR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
364: { "DL" , glossary_attr,HTML_DL_ATTRIBUTES, SGML_MIXED },
365: { "DT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
366: { "EM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
367: { "FIG" , fig_attr, HTML_FIG_ATTRIBUTES, SGML_MIXED },
368: { "FOOTNOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
369: { "FORM" , form_attr, HTML_FORM_ATTRIBUTES, SGML_MIXED },
370: { "H1" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
371: { "H2" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
372: { "H3" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
373: { "H4" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
374: { "H5" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
375: { "H6" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
376: { "H7" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
377: { "HEAD" , no_attr, 0, SGML_MIXED },
378: { "HR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
379: { "HTML" , no_attr, 0, SGML_MIXED }, /* */
2.2 timbl 380: { "HTMLPLUS", htmlplus_attr,HTML_HTMLPLUS_ATTRIBUTES, SGML_MIXED },
2.1 timbl 381: { "I" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
382: { "IMAGE" , image_attr, HTML_IMAGE_ATTRIBUTES, SGML_EMPTY },
2.7 frystyk 383: { "IMG" , img_attr, HTML_IMG_ATTRIBUTES, SGML_EMPTY },
2.1 timbl 384: { "INPUT" , input_attr, HTML_INPUT_ATTRIBUTES, SGML_EMPTY },
385: { "ISINDEX" , no_attr, 0, SGML_EMPTY },
386: { "KBD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
387: { "L" , l_attr, HTML_L_ATTRIBUTES, SGML_MIXED },
388: { "LI" , li_attr, HTML_LI_ATTRIBUTES, SGML_EMPTY },
389: { "LINK" , link_attr, HTML_LINK_ATTRIBUTES, SGML_EMPTY },
390: { "LISTING" , no_attr, 0, SGML_LITERAL },
391: { "LIT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
392: { "MARGIN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
393: { "MATH" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
394: { "MENU" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
2.24 frystyk 395: { "META" , meta_attr, HTML_META_ATTRIBUTES, SGML_EMPTY },
2.1 timbl 396: { "NEXTID" , nextid_attr, 1, SGML_EMPTY },
397: { "NOTE" , note_attr, HTML_NOTE_ATTRIBUTES, SGML_EMPTY },
398: { "OL" , list_attr, HTML_LIST_ATTRIBUTES, SGML_MIXED },
2.8 timbl 399: { "OPTION" , option_attr, HTML_OPTION_ATTRIBUTES, SGML_EMPTY },/*Mixed?*/
2.1 timbl 400: { "OVER" , no_attr, 0, SGML_MIXED },
401: { "P" , l_attr, HTML_L_ATTRIBUTES, SGML_EMPTY },
402: { "PERSON" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
403: { "PLAINTEXT", no_attr, 0, SGML_LITERAL },
404: { "PRE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
405: { "Q" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
406: { "QUOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
407: { "RENDER" , render_attr, HTML_RENDER_ATTRIBUTES, SGML_MIXED },
408: { "REMOVED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
409: { "S" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
410: { "SAMP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
411: { "SELECT" , select_attr, HTML_SELECT_ATTRIBUTES, SGML_MIXED },
412: { "STRONG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
413: { "SUB" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
414: { "SUP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
415: { "TAB" , tab_attr, HTML_TAB_ATTRIBUTES, SGML_EMPTY },
416: { "TABLE" , table_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
417: { "TD" , td_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
418: { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES,SGML_MIXED},
419: { "TH" , td_attr, HTML_TD_ATTRIBUTES, SGML_MIXED },
2.4 frystyk 420: { "TITLE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
2.1 timbl 421: { "TR" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
422: { "TT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
423: { "U" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
424: { "UL" , ul_attr, HTML_UL_ATTRIBUTES, SGML_MIXED },
425: { "VAR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
426: { "XMP" , no_attr, 0, SGML_LITERAL }
427: };
428:
429:
2.19 frystyk 430: PUBLIC const SGML_dtd HTMLP_dtd = {
2.18 frystyk 431: tags,
432: HTMLP_ELEMENTS,
433: entities,
434: sizeof(entities)/sizeof(char**)
2.1 timbl 435: };
436:
437: /* Utility Routine: useful for people building HTML objects */
438:
439: /* Start anchor element
440: ** --------------------
441: **
442: ** It is kinda convenient to have a particulr routine for
443: ** starting an anchor element, as everything else for HTML is
444: ** simple anyway.
445: */
446: struct _HTStructured {
447: HTStructuredClass * isa;
448: /* ... */
449: };
450:
2.17 frystyk 451: PUBLIC void HTStartAnchor (HTStructured * obj,
2.19 frystyk 452: const char * name,
453: const char * href)
2.1 timbl 454: {
455: BOOL present[HTML_A_ATTRIBUTES];
2.19 frystyk 456: const char* value[HTML_A_ATTRIBUTES];
2.1 timbl 457:
458: {
459: int i;
460: for(i=0; i<HTML_A_ATTRIBUTES; i++)
461: present[i] = NO;
462: }
463: if (name) {
464: present[HTML_A_NAME] = YES;
465: value[HTML_A_NAME] = name;
466: }
467: if (href) {
468: present[HTML_A_HREF] = YES;
469: value[HTML_A_HREF] = href;
470: }
471:
472: (*obj->isa->start_element)(obj, HTML_A , present, value);
473:
474: }
475:
2.5 frystyk 476: /* Utility Routine: useful for people building HTML objects */
477:
478: /* Put image element
479: ** --------------------
480: **
481: ** Hopefully as usefull as HTStartAnchor. Henrik 23/03-94
482: */
2.17 frystyk 483: PUBLIC void HTMLPutImg (HTStructured * obj,
2.19 frystyk 484: const char * src,
485: const char * alt,
486: const char * align)
2.5 frystyk 487: {
488: BOOL present[HTML_IMG_ATTRIBUTES];
2.19 frystyk 489: const char* value[HTML_IMG_ATTRIBUTES];
2.5 frystyk 490:
491: {
492: int i;
493: for(i=0; i<HTML_IMG_ATTRIBUTES; i++)
494: present[i] = NO;
495: }
496: if (src) {
497: present[HTML_IMG_SRC] = YES;
498: value[HTML_IMG_SRC] = src;
499: }
500: if (alt) {
501: present[HTML_IMG_ALT] = YES;
502: value[HTML_IMG_ALT] = alt;
503: }
504: if (align) {
505: present[HTML_IMG_ALIGN] = YES;
506: value[HTML_IMG_ALIGN] = align;
507: }
508: (*obj->isa->start_element)(obj, HTML_IMG , present, value);
2.7 frystyk 509: /* (*obj->isa->end_element)(obj, HTML_IMG); */
2.5 frystyk 510: }
511:
512:
2.17 frystyk 513: PUBLIC void HTNextID (HTStructured * obj,
2.19 frystyk 514: const char * next_one)
2.1 timbl 515: {
516: BOOL present[HTML_NEXTID_ATTRIBUTES];
2.19 frystyk 517: const char* value[HTML_NEXTID_ATTRIBUTES];
2.1 timbl 518: {
519: int i;
520: for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
521: present[i] = NO;
522: }
523: present[HTML_NEXTID_N] = YES;
2.9 timbl 524: value[HTML_NEXTID_N] = next_one;
2.1 timbl 525:
526: (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
527:
528: }
Webmaster