Annotation of libwww/Library/src/HTMLPDTD.c, revision 2.1
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" },
! 191: };
! 192:
! 193: static attr l_attr[] = {
! 194: { "ALIGN"},
! 195: { "ID" },
! 196: { "LANG" },
! 197: { "INDEX" },
! 198: { 0 } /* Terminate list */
! 199: };
! 200:
! 201: static attr li_attr[] = {
! 202: { "ID" },
! 203: { "LANG" },
! 204: { "INDEX" },
! 205: { "SRC"},
! 206: { 0 } /* Terminate list */
! 207: };
! 208:
! 209: static attr link_attr[HTML_LINK_ATTRIBUTES+1] = { /* link attributes */
! 210: { "HREF"},
! 211: { "IDREF" },
! 212: { "METHODS" },
! 213: { "REL" }, /* Relationship */
! 214: { "REV" }, /* Reverse relationship */
! 215: { 0 } /* Terminate list */
! 216: };
! 217:
! 218: static attr list_attr[] = {
! 219: { "COMPACT"},
! 220: { "ID" },
! 221: { "LANG" },
! 222: { "INDEX" },
! 223: { 0 } /* Terminate list */
! 224: };
! 225:
! 226: static attr glossary_attr[] = {
! 227: { "COMPACT" },
! 228: { 0 } /* Terminate list */
! 229: };
! 230:
! 231: static attr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
! 232: { "N" },
! 233: { 0 } /* Terminate list */
! 234: };
! 235:
! 236: static attr note_attr[HTML_NOTE_ATTRIBUTES+1] = { /* Footnotes etc etc */
! 237: { "ID" },
! 238: { "INDEX" },
! 239: { "LANG" },
! 240: { "ROLE" },
! 241: { 0 } /* terminate list */
! 242: };
! 243:
! 244: static attr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
! 245: { "DISABLED" },
! 246: { "LANG" },
! 247: { "SELECTED" },
! 248: { 0 }
! 249: };
! 250:
! 251: #ifdef OLD_CODE
! 252: static attr pre_attr[HTML_PRE_ATTRIBUTES+1] = {
! 253: { "WIDTH" },
! 254: { 0 } /* Terminate list */
! 255: };
! 256: #endif
! 257:
! 258: static attr render_attr[HTML_RENDER_ATTRIBUTES+1] = {
! 259: { "STYLE" },
! 260: { "TAG" },
! 261: { 0 } /* Terminate list */
! 262: };
! 263:
! 264: static attr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
! 265: { "ERROR" },
! 266: { "LANG" },
! 267: { "NAME" },
! 268: { "SEVERAL" },
! 269: { 0 },
! 270: };
! 271:
! 272: static attr tab_attr[HTML_TAB_ATTRIBUTES+1] = {
! 273: { "ALIGN" },
! 274: { "AT" },
! 275: { 0 }
! 276: };
! 277:
! 278: static attr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
! 279: { "BORDER" },
! 280: { "ID" },
! 281: { "INDEX" },
! 282: { "LANG" },
! 283: { 0 }
! 284: };
! 285:
! 286: static attr td_attr[HTML_TD_ATTRIBUTES+1] = {
! 287: { "ALIGN" },
! 288: { "COLSPAN" },
! 289: { "ROWSPAN" },
! 290: { "TAG" },
! 291: { 0 }
! 292: };
! 293:
! 294: static attr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
! 295: { "COLS" },
! 296: { "DISABLED" },
! 297: { "ERROR" },
! 298: { "LANG" },
! 299: { "NAME" },
! 300: { "ROWS" },
! 301: { 0 }
! 302: };
! 303:
! 304: static attr ul_attr[HTML_UL_ATTRIBUTES+1] = {
! 305: { "COMPACT" },
! 306: { "ID" },
! 307: { "INDEX" },
! 308: { "LANG" },
! 309: { "PLAIN" },
! 310: { "WRAP" },
! 311: { 0 }
! 312: };
! 313:
! 314:
! 315: /* Elements
! 316: ** --------
! 317: **
! 318: ** Must match definitions in HTMLPDTD.html!
! 319: ** Must be in alphabetical order.
! 320: **
! 321: ** HTML is included to allow HTML documents to be parsed as a subset.
! 322: **
! 323: ** Name, Attributes, content
! 324: */
! 325: static HTTag tags[HTMLP_ELEMENTS] = {
! 326: { "A" , a_attr, HTML_A_ATTRIBUTES, SGML_MIXED },
! 327: { "ABBREV" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 328: { "ABSTRACT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 329: { "ACRONYM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 330: { "ADDED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 331: { "ADDRESS" , no_attr, 0, SGML_MIXED },
! 332: { "ARG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 333: { "B" , no_attr, 0, SGML_MIXED },
! 334: { "BASE" , base_attr, HTML_BASE_ATTRIBUTES, SGML_MIXED },
! 335: { "BLOCKQUOTE", no_attr, 0, SGML_MIXED },
! 336: { "BODY" , no_attr, 0, SGML_MIXED },
! 337: { "BOX" , no_attr, 0, SGML_MIXED },
! 338: { "BR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
! 339: { "BYLINE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 340: { "CAPTION" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 341: { "CHANGED" , changed_attr, HTML_CHANGED_ATTRIBUTES, SGML_MIXED },
! 342: { "CITE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 343: { "CMD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 344: { "CODE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 345: { "COMMENT" , no_attr, 0, SGML_MIXED },
! 346: { "DD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
! 347: { "DFN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 348: { "DIR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 349: { "DL" , glossary_attr,HTML_DL_ATTRIBUTES, SGML_MIXED },
! 350: { "DT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
! 351: { "EM" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 352: { "FIG" , fig_attr, HTML_FIG_ATTRIBUTES, SGML_MIXED },
! 353: { "FOOTNOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 354: { "FORM" , form_attr, HTML_FORM_ATTRIBUTES, SGML_MIXED },
! 355: { "H1" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 356: { "H2" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 357: { "H3" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 358: { "H4" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 359: { "H5" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 360: { "H6" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 361: { "H7" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 362: { "HEAD" , no_attr, 0, SGML_MIXED },
! 363: { "HTMLPLUS", htmlplus_attr,HTML_HTMLPLUS_ATTRIBUTES, SGML_MIXED },
! 364: { "HR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_EMPTY },
! 365: { "HTML" , no_attr, 0, SGML_MIXED }, /* */
! 366: { "I" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 367: { "IMAGE" , image_attr, HTML_IMAGE_ATTRIBUTES, SGML_EMPTY },
! 368: { "IMG" , img_attr, HTML_IMG_ATTRIBUTES, SGML_EMPTY },
! 369: { "INPUT" , input_attr, HTML_INPUT_ATTRIBUTES, SGML_EMPTY },
! 370: { "ISINDEX" , no_attr, 0, SGML_EMPTY },
! 371: { "KBD" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 372: { "L" , l_attr, HTML_L_ATTRIBUTES, SGML_MIXED },
! 373: { "LI" , li_attr, HTML_LI_ATTRIBUTES, SGML_EMPTY },
! 374: { "LINK" , link_attr, HTML_LINK_ATTRIBUTES, SGML_EMPTY },
! 375: { "LISTING" , no_attr, 0, SGML_LITERAL },
! 376: { "LIT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 377: { "MARGIN" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 378: { "MATH" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
! 379: { "MENU" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 380: { "NEXTID" , nextid_attr, 1, SGML_EMPTY },
! 381: { "NOTE" , note_attr, HTML_NOTE_ATTRIBUTES, SGML_EMPTY },
! 382: { "OL" , list_attr, HTML_LIST_ATTRIBUTES, SGML_MIXED },
! 383: { "OPTION" , option_attr, HTML_OPTION_ATTRIBUTES, SGML_MIXED },
! 384: { "OVER" , no_attr, 0, SGML_MIXED },
! 385: { "P" , l_attr, HTML_L_ATTRIBUTES, SGML_EMPTY },
! 386: { "PERSON" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 387: { "PLAINTEXT", no_attr, 0, SGML_LITERAL },
! 388: { "PRE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 389: { "Q" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 390: { "QUOTE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 391: { "RENDER" , render_attr, HTML_RENDER_ATTRIBUTES, SGML_MIXED },
! 392: { "REMOVED" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 393: { "S" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 394: { "SAMP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 395: { "SELECT" , select_attr, HTML_SELECT_ATTRIBUTES, SGML_MIXED },
! 396: { "STRONG" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 397: { "SUB" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 398: { "SUP" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 399: { "TAB" , tab_attr, HTML_TAB_ATTRIBUTES, SGML_EMPTY },
! 400: { "TABLE" , table_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
! 401: { "TD" , td_attr, HTML_TABLE_ATTRIBUTES, SGML_MIXED },
! 402: { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES,SGML_MIXED},
! 403: { "TH" , td_attr, HTML_TD_ATTRIBUTES, SGML_MIXED },
! 404: { "TITLE" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_CDATA },
! 405: { "TR" , id_attr, HTML_ID_ATTRIBUTE, SGML_MIXED },
! 406: { "TT" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 407: { "U" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 408: { "UL" , ul_attr, HTML_UL_ATTRIBUTES, SGML_MIXED },
! 409: { "VAR" , gen_attr, HTML_GEN_ATTRIBUTES, SGML_MIXED },
! 410: { "XMP" , no_attr, 0, SGML_LITERAL }
! 411: };
! 412:
! 413:
! 414: #ifdef OLD_CODE
! 415: PUBLIC CONST SGML_dtd HTML_dtd = {
! 416: tags,
! 417: HTML_ELEMENTS,
! 418: entities,
! 419: sizeof(entities)/sizeof(char**)
! 420: };
! 421: #endif
! 422:
! 423: PUBLIC CONST SGML_dtd HTMLP_dtd = {
! 424: tags,
! 425: HTMLP_ELEMENTS,
! 426: entities,
! 427: sizeof(entities)/sizeof(char**)
! 428: };
! 429:
! 430: /* Utility Routine: useful for people building HTML objects */
! 431:
! 432: /* Start anchor element
! 433: ** --------------------
! 434: **
! 435: ** It is kinda convenient to have a particulr routine for
! 436: ** starting an anchor element, as everything else for HTML is
! 437: ** simple anyway.
! 438: */
! 439: struct _HTStructured {
! 440: HTStructuredClass * isa;
! 441: /* ... */
! 442: };
! 443:
! 444: PUBLIC void HTStartAnchor ARGS3(HTStructured *, obj,
! 445: CONST char *, name,
! 446: CONST char *, href)
! 447: {
! 448: BOOL present[HTML_A_ATTRIBUTES];
! 449: CONST char* value[HTML_A_ATTRIBUTES];
! 450:
! 451: {
! 452: int i;
! 453: for(i=0; i<HTML_A_ATTRIBUTES; i++)
! 454: present[i] = NO;
! 455: }
! 456: if (name) {
! 457: present[HTML_A_NAME] = YES;
! 458: value[HTML_A_NAME] = name;
! 459: }
! 460: if (href) {
! 461: present[HTML_A_HREF] = YES;
! 462: value[HTML_A_HREF] = href;
! 463: }
! 464:
! 465: (*obj->isa->start_element)(obj, HTML_A , present, value);
! 466:
! 467: }
! 468:
! 469: PUBLIC void HTNextID ARGS2(HTStructured *, obj,
! 470: int, next_one)
! 471: {
! 472: BOOL present[HTML_NEXTID_ATTRIBUTES];
! 473: CONST char* value[HTML_NEXTID_ATTRIBUTES];
! 474: char string[10];
! 475:
! 476: sprintf(string, "z%i", next_one);
! 477: {
! 478: int i;
! 479: for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
! 480: present[i] = NO;
! 481: }
! 482: present[HTML_NEXTID_N] = YES;
! 483: value[HTML_NEXTID_N] = string;
! 484:
! 485: (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
! 486:
! 487: }
! 488:
Webmaster