Annotation of libwww/Library/src/HTMLPDTD.c, revision 2.12
2.12 ! frystyk 1: /* HTMLPDTD.c
! 2: ** STATIC DTD FOR HTML
! 3: **
! 4: ** (c) COPYRIGHT CERN 1994.
! 5: ** Please first read the full copyright statement in the file COPYRIGH.
2.1 timbl 6: **
7: ** 6 Nov 93 MD Increased size of img_attr array to make space
8: ** for terminator.
9: */
10:
11: #include "HTMLPDTD.h"
12:
13: /* Entity Names
14: ** ------------
15: **
16: ** This table must be matched exactly with ALL the translation tables
17: */
2.11 timbl 18:
2.10 timbl 19: static CONST char* entities[HTML_ENTITIES] = {
2.1 timbl 20: "AElig", /* capital AE diphthong (ligature) */
21: "Aacute", /* capital A, acute accent */
22: "Acirc", /* capital A, circumflex accent */
23: "Agrave", /* capital A, grave accent */
24: "Aring", /* capital A, ring */
25: "Atilde", /* capital A, tilde */
26: "Auml", /* capital A, dieresis or umlaut mark */
27: "Ccedil", /* capital C, cedilla */
28: "ETH", /* capital Eth, Icelandic */
29: "Eacute", /* capital E, acute accent */
30: "Ecirc", /* capital E, circumflex accent */
31: "Egrave", /* capital E, grave accent */
32: "Euml", /* capital E, dieresis or umlaut mark */
33: "Iacute", /* capital I, acute accent */
34: "Icirc", /* capital I, circumflex accent */
35: "Igrave", /* capital I, grave accent */
36: "Iuml", /* capital I, dieresis or umlaut mark */
37: "Ntilde", /* capital N, tilde */
38: "Oacute", /* capital O, acute accent */
39: "Ocirc", /* capital O, circumflex accent */
40: "Ograve", /* capital O, grave accent */
41: "Oslash", /* capital O, slash */
42: "Otilde", /* capital O, tilde */
43: "Ouml", /* capital O, dieresis or umlaut mark */
44: "THORN", /* capital THORN, Icelandic */
45: "Uacute", /* capital U, acute accent */
46: "Ucirc", /* capital U, circumflex accent */
47: "Ugrave", /* capital U, grave accent */
48: "Uuml", /* capital U, dieresis or umlaut mark */
49: "Yacute", /* capital Y, acute accent */
50: "aacute", /* small a, acute accent */
51: "acirc", /* small a, circumflex accent */
52: "aelig", /* small ae diphthong (ligature) */
53: "agrave", /* small a, grave accent */
54: "amp", /* ampersand */
55: "aring", /* small a, ring */
56: "atilde", /* small a, tilde */
57: "auml", /* small a, dieresis or umlaut mark */
58: "ccedil", /* small c, cedilla */
59: "eacute", /* small e, acute accent */
60: "ecirc", /* small e, circumflex accent */
61: "egrave", /* small e, grave accent */
62: "eth", /* small eth, Icelandic */
63: "euml", /* small e, dieresis or umlaut mark */
64: "gt", /* greater than */
65: "iacute", /* small i, acute accent */
66: "icirc", /* small i, circumflex accent */
67: "igrave", /* small i, grave accent */
68: "iuml", /* small i, dieresis or umlaut mark */
69: "lt", /* less than */
70: "ntilde", /* small n, tilde */
71: "oacute", /* small o, acute accent */
72: "ocirc", /* small o, circumflex accent */
73: "ograve", /* small o, grave accent */
74: "oslash", /* small o, slash */
75: "otilde", /* small o, tilde */
2.10 timbl 76: "ouml", /* small o, dieresis or umlaut mark */
77: "quot", /* double quote sign - June 1994 */
2.1 timbl 78: "szlig", /* small sharp s, German (sz ligature) */
79: "thorn", /* small thorn, Icelandic */
80: "uacute", /* small u, acute accent */
81: "ucirc", /* small u, circumflex accent */
82: "ugrave", /* small u, grave accent */
83: "uuml", /* small u, dieresis or umlaut mark */
84: "yacute", /* small y, acute accent */
85: "yuml", /* small y, dieresis or umlaut mark */
86: };
87:
88:
89:
90: /* Attribute Lists
91: ** ---------------
92: **
93: ** Lists must be in alphatbetical order by attribute name
94: ** The tag elements contain the number of attributes
95: */
96: static attr no_attr[1] =
97: {{ 0 }};
98:
99: static attr a_attr[HTML_A_ATTRIBUTES+1] = { /* Anchor attributes */
100: { "EFFECT" },
101: { "HREF"},
102: { "ID" },
103: { "METHODS" },
104: { "NAME" }, /* Should be ID */
105: { "PRINT" },
106: { "REL" }, /* Relationship */
107: { "REV" }, /* Reverse relationship */
108: { "SHAPE" },
109: { "TITLE" },
110: { 0 } /* Terminate list */
111: };
112:
113: static attr base_attr[] = { /* BASE attributes */
114: { "HREF"},
115: { 0 } /* Terminate list */
116: };
117:
118:
119: static attr changed_attr[] = {
120: { "ID" },
121: { "IDREF" },
122: { 0 } /* terminate list */
123: };
124:
125: static attr fig_attr[] = { /* Figures */
126: { "ALIGN" },
127: { "ID" },
128: { "INDEX" },
129: { "ISMAP" }, /* @@@ NO! */
130: { "LANG" },
131: { "SRC" },
132: { 0 } /* terminate list */
133: };
134:
135: static attr form_attr[] = { /* General, for many things */
136: { "ACTION" },
137: { "ID" },
138: { "INDEX" },
139: { "LANG" },
140: { "METHOD" },
141: { 0 } /* terminate list */
142: };
143:
144: static attr gen_attr[] = { /* General, for many things */
145: { "ID" },
146: { "INDEX" },
147: { "LANG" },
148: { 0 } /* terminate list */
149: };
150:
151: static attr htmlplus_attr[] = { /* wrapper HTMLPLUS */
152: { "FORMS" },
153: { "VERSION" },
154: { 0 } /* terminate list */
155: };
156:
157: static attr id_attr[2] = {
158: { "ID" },
159: { 0 } /* terminate list */
160: };
161:
162: static attr image_attr[HTML_IMAGE_ATTRIBUTES+1] = { /* Image attributes */
163: { "ALIGN" },
164: { "ISMAP"}, /* Use HTTP SpaceJump instead */
165: { "LANG" },
166: { "SEETHRU"},
167: { "SRC"},
168: { 0 } /* Terminate list */
169: };
170:
171: static attr img_attr[HTML_IMG_ATTRIBUTES+1] = { /* IMG attributes */
172: { "ALIGN" },
173: { "ALT" },
174: { "ISMAP"}, /* Use HTTP SpaceJump instead */
175: { "SEETHRU"},
176: { "SRC"},
177: { 0 } /* Terminate list */
178: };
179:
180: static attr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
181: { "ALIGN" },
182: { "CHECKED" },
183: { "DISABLED" },
184: { "ERROR" },
185: { "MAX" },
186: { "MIN" },
187: { "NAME" },
188: { "SIZE" },
189: { "SRC" },
190: { "TYPE" },
191: { "VALUE" },
2.2 timbl 192: { "0" }
2.1 timbl 193: };
194:
195: static attr l_attr[] = {
196: { "ALIGN"},
197: { "ID" },
198: { "LANG" },
199: { "INDEX" },
200: { 0 } /* Terminate list */
201: };
202:
203: static attr li_attr[] = {
204: { "ID" },
205: { "LANG" },
206: { "INDEX" },
207: { "SRC"},
208: { 0 } /* Terminate list */
209: };
210:
211: static attr link_attr[HTML_LINK_ATTRIBUTES+1] = { /* link attributes */
212: { "HREF"},
213: { "IDREF" },
214: { "METHODS" },
215: { "REL" }, /* Relationship */
216: { "REV" }, /* Reverse relationship */
217: { 0 } /* Terminate list */
218: };
219:
220: static attr list_attr[] = {
221: { "COMPACT"},
222: { "ID" },
223: { "LANG" },
224: { "INDEX" },
225: { 0 } /* Terminate list */
226: };
227:
2.3 frystyk 228: static attr glossary_attr[HTML_DL_ATTRIBUTES+1] = {
229: { "ID" },
230: { "COMPACT " },
231: { "INDEX" },
2.1 timbl 232: { 0 } /* Terminate list */
233: };
234:
235: static attr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
236: { "N" },
237: { 0 } /* Terminate list */
238: };
239:
240: static attr note_attr[HTML_NOTE_ATTRIBUTES+1] = { /* Footnotes etc etc */
241: { "ID" },
242: { "INDEX" },
243: { "LANG" },
244: { "ROLE" },
245: { 0 } /* terminate list */
246: };
247:
248: static attr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
249: { "DISABLED" },
250: { "LANG" },
251: { "SELECTED" },
252: { 0 }
253: };
254:
255: #ifdef OLD_CODE
256: static attr pre_attr[HTML_PRE_ATTRIBUTES+1] = {
257: { "WIDTH" },
258: { 0 } /* Terminate list */
259: };
260: #endif
261:
262: static attr render_attr[HTML_RENDER_ATTRIBUTES+1] = {
263: { "STYLE" },
264: { "TAG" },
265: { 0 } /* Terminate list */
266: };
267:
268: static attr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
269: { "ERROR" },
270: { "LANG" },
271: { "NAME" },
272: { "SEVERAL" },
273: { 0 },
274: };
275:
276: static attr tab_attr[HTML_TAB_ATTRIBUTES+1] = {
277: { "ALIGN" },
278: { "AT" },
279: { 0 }
280: };
281:
282: static attr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
283: { "BORDER" },
284: { "ID" },
285: { "INDEX" },
286: { "LANG" },
287: { 0 }
288: };
289:
290: static attr td_attr[HTML_TD_ATTRIBUTES+1] = {
291: { "ALIGN" },
292: { "COLSPAN" },
293: { "ROWSPAN" },
294: { "TAG" },
295: { 0 }
296: };
297:
298: static attr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
299: { "COLS" },
300: { "DISABLED" },
301: { "ERROR" },
302: { "LANG" },
303: { "NAME" },
304: { "ROWS" },
305: { 0 }
306: };
307:
308: static attr ul_attr[HTML_UL_ATTRIBUTES+1] = {
309: { "COMPACT" },
310: { "ID" },
311: { "INDEX" },
312: { "LANG" },
313: { "PLAIN" },
314: { "WRAP" },
315: { 0 }
316: };
317:
318:
319: /* Elements
320: ** --------
321: **
322: ** Must match definitions in HTMLPDTD.html!
323: ** Must be in alphabetical order.
324: **
325: ** HTML is included to allow HTML documents to be parsed as a subset.
2.4 frystyk 326: ** TITLE is changed to type SGML_MIXED so it get parsed as well
327: ** Henrik 08/03-94
2.1 timbl 328: **
329: ** Name, Attributes, content
330: */
331: static HTTag tags[HTMLP_ELEMENTS] = {
332: { "A" , a_attr, HTML_A_ATTRIBUTES, SGML_MIXED },
333: { "ABBREV" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
334: { "ABSTRACT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
335: { "ACRONYM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
336: { "ADDED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
337: { "ADDRESS" , no_attr, 0, SGML_MIXED },
338: { "ARG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
339: { "B" , no_attr, 0, SGML_MIXED },
340: { "BASE" , base_attr, HTML_BASE_ATTRIBUTES, SGML_MIXED },
341: { "BLOCKQUOTE", no_attr, 0, SGML_MIXED },
342: { "BODY" , no_attr, 0, SGML_MIXED },
343: { "BOX" , no_attr, 0, SGML_MIXED },
344: { "BR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
345: { "BYLINE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
346: { "CAPTION" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
347: { "CHANGED" , changed_attr, HTML_CHANGED_ATTRIBUTES, SGML_MIXED },
348: { "CITE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
349: { "CMD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
350: { "CODE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
351: { "COMMENT" , no_attr, 0, SGML_MIXED },
352: { "DD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
353: { "DFN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
354: { "DIR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
355: { "DL" , glossary_attr,HTML_DL_ATTRIBUTES, SGML_MIXED },
356: { "DT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
357: { "EM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
358: { "FIG" , fig_attr, HTML_FIG_ATTRIBUTES, SGML_MIXED },
359: { "FOOTNOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
360: { "FORM" , form_attr, HTML_FORM_ATTRIBUTES, SGML_MIXED },
361: { "H1" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
362: { "H2" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
363: { "H3" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
364: { "H4" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
365: { "H5" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
366: { "H6" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
367: { "H7" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
368: { "HEAD" , no_attr, 0, SGML_MIXED },
369: { "HR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
370: { "HTML" , no_attr, 0, SGML_MIXED }, /* */
2.2 timbl 371: { "HTMLPLUS", htmlplus_attr,HTML_HTMLPLUS_ATTRIBUTES, SGML_MIXED },
2.1 timbl 372: { "I" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
373: { "IMAGE" , image_attr, HTML_IMAGE_ATTRIBUTES, SGML_EMPTY },
2.7 frystyk 374: { "IMG" , img_attr, HTML_IMG_ATTRIBUTES, SGML_EMPTY },
2.1 timbl 375: { "INPUT" , input_attr, HTML_INPUT_ATTRIBUTES, SGML_EMPTY },
376: { "ISINDEX" , no_attr, 0, SGML_EMPTY },
377: { "KBD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
378: { "L" , l_attr, HTML_L_ATTRIBUTES, SGML_MIXED },
379: { "LI" , li_attr, HTML_LI_ATTRIBUTES, SGML_EMPTY },
380: { "LINK" , link_attr, HTML_LINK_ATTRIBUTES, SGML_EMPTY },
381: { "LISTING" , no_attr, 0, SGML_LITERAL },
382: { "LIT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
383: { "MARGIN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
384: { "MATH" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
385: { "MENU" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
386: { "NEXTID" , nextid_attr, 1, SGML_EMPTY },
387: { "NOTE" , note_attr, HTML_NOTE_ATTRIBUTES, SGML_EMPTY },
388: { "OL" , list_attr, HTML_LIST_ATTRIBUTES, SGML_MIXED },
2.8 timbl 389: { "OPTION" , option_attr, HTML_OPTION_ATTRIBUTES, SGML_EMPTY },/*Mixed?*/
2.1 timbl 390: { "OVER" , no_attr, 0, SGML_MIXED },
391: { "P" , l_attr, HTML_L_ATTRIBUTES, SGML_EMPTY },
392: { "PERSON" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
393: { "PLAINTEXT", no_attr, 0, SGML_LITERAL },
394: { "PRE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
395: { "Q" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
396: { "QUOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
397: { "RENDER" , render_attr, HTML_RENDER_ATTRIBUTES, SGML_MIXED },
398: { "REMOVED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
399: { "S" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
400: { "SAMP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
401: { "SELECT" , select_attr, HTML_SELECT_ATTRIBUTES, SGML_MIXED },
402: { "STRONG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
403: { "SUB" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
404: { "SUP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
405: { "TAB" , tab_attr, HTML_TAB_ATTRIBUTES, SGML_EMPTY },
406: { "TABLE" , table_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
407: { "TD" , td_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
408: { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES,SGML_MIXED},
409: { "TH" , td_attr, HTML_TD_ATTRIBUTES, SGML_MIXED },
2.4 frystyk 410: { "TITLE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
2.1 timbl 411: { "TR" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
412: { "TT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
413: { "U" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
414: { "UL" , ul_attr, HTML_UL_ATTRIBUTES, SGML_MIXED },
415: { "VAR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
416: { "XMP" , no_attr, 0, SGML_LITERAL }
417: };
418:
419:
420: #ifdef OLD_CODE
421: PUBLIC CONST SGML_dtd HTML_dtd = {
422: tags,
423: HTML_ELEMENTS,
424: entities,
425: sizeof(entities)/sizeof(char**)
426: };
427: #endif
428:
429: PUBLIC CONST SGML_dtd HTMLP_dtd = {
430: tags,
431: HTMLP_ELEMENTS,
432: entities,
433: sizeof(entities)/sizeof(char**)
434: };
435:
436: /* Utility Routine: useful for people building HTML objects */
437:
438: /* Start anchor element
439: ** --------------------
440: **
441: ** It is kinda convenient to have a particulr routine for
442: ** starting an anchor element, as everything else for HTML is
443: ** simple anyway.
444: */
445: struct _HTStructured {
446: HTStructuredClass * isa;
447: /* ... */
448: };
449:
450: PUBLIC void HTStartAnchor ARGS3(HTStructured *, obj,
451: CONST char *, name,
452: CONST char *, href)
453: {
454: BOOL present[HTML_A_ATTRIBUTES];
455: CONST char* value[HTML_A_ATTRIBUTES];
456:
457: {
458: int i;
459: for(i=0; i<HTML_A_ATTRIBUTES; i++)
460: present[i] = NO;
461: }
462: if (name) {
463: present[HTML_A_NAME] = YES;
464: value[HTML_A_NAME] = name;
465: }
466: if (href) {
467: present[HTML_A_HREF] = YES;
468: value[HTML_A_HREF] = href;
469: }
470:
471: (*obj->isa->start_element)(obj, HTML_A , present, value);
472:
473: }
474:
2.5 frystyk 475: /* Utility Routine: useful for people building HTML objects */
476:
477: /* Put image element
478: ** --------------------
479: **
480: ** Hopefully as usefull as HTStartAnchor. Henrik 23/03-94
481: */
482: PUBLIC void HTMLPutImg ARGS4(HTStructured *, obj,
483: CONST char *, src,
484: CONST char *, alt,
485: CONST char *, align)
486: {
487: BOOL present[HTML_IMG_ATTRIBUTES];
488: CONST char* value[HTML_IMG_ATTRIBUTES];
489:
490: {
491: int i;
492: for(i=0; i<HTML_IMG_ATTRIBUTES; i++)
493: present[i] = NO;
494: }
495: if (src) {
496: present[HTML_IMG_SRC] = YES;
497: value[HTML_IMG_SRC] = src;
498: }
499: if (alt) {
500: present[HTML_IMG_ALT] = YES;
501: value[HTML_IMG_ALT] = alt;
502: }
503: if (align) {
504: present[HTML_IMG_ALIGN] = YES;
505: value[HTML_IMG_ALIGN] = align;
506: }
507: (*obj->isa->start_element)(obj, HTML_IMG , present, value);
2.7 frystyk 508: /* (*obj->isa->end_element)(obj, HTML_IMG); */
2.5 frystyk 509: }
510:
511:
2.1 timbl 512: PUBLIC void HTNextID ARGS2(HTStructured *, obj,
2.9 timbl 513: CONST char *, next_one)
2.1 timbl 514: {
515: BOOL present[HTML_NEXTID_ATTRIBUTES];
516: CONST char* value[HTML_NEXTID_ATTRIBUTES];
517: {
518: int i;
519: for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
520: present[i] = NO;
521: }
522: present[HTML_NEXTID_N] = YES;
2.9 timbl 523: value[HTML_NEXTID_N] = next_one;
2.1 timbl 524:
525: (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
526:
527: }
2.5 frystyk 528:
529:
2.1 timbl 530:
Webmaster