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