HTMLPDTD.c
上传用户:zlh9724
上传日期:2007-01-04
资源大小:1991k
文件大小:14k
源码类别:

浏览器

开发平台:

Unix_Linux

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