htmldefs.pp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. {
  2. $Id$
  3. This file is part of the Free Component Library
  4. HTML definitions and utility functions
  5. Copyright (c) 2000-2002 by
  6. Areca Systems GmbH / Sebastian Guenther, [email protected]
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit HTMLDefs;
  14. {$MODE objfpc}
  15. {$H+}
  16. interface
  17. type
  18. THTMLElementFlags = set of (
  19. efSubelementContent, // may have subelements
  20. efPCDATAContent, // may have PCDATA content
  21. efPreserveWhitespace); // preserve all whitespace
  22. PHTMLElementProps = ^THTMLElementProps;
  23. THTMLElementProps = record
  24. Name: String;
  25. Flags: THTMLElementFlags;
  26. end;
  27. const
  28. HTMLElProps: array[0..78] of THTMLElementProps = (
  29. (Name: 'a'; Flags: [efSubelementContent, efPCDATAContent]),
  30. (Name: 'abbr'; Flags: [efSubelementContent, efPCDATAContent]),
  31. (Name: 'acronym'; Flags: [efSubelementContent, efPCDATAContent]),
  32. (Name: 'address'; Flags: [efSubelementContent, efPCDATAContent]),
  33. (Name: 'applet'; Flags: [efSubelementContent, efPCDATAContent]),
  34. (Name: 'b'; Flags: [efSubelementContent, efPCDATAContent]),
  35. (Name: 'basefont'; Flags: []),
  36. (Name: 'bdo'; Flags: [efSubelementContent, efPCDATAContent]),
  37. (Name: 'big'; Flags: [efSubelementContent, efPCDATAContent]),
  38. (Name: 'blockquote';Flags: [efSubelementContent]),
  39. (Name: 'body'; Flags: [efSubelementContent]),
  40. (Name: 'br'; Flags: []),
  41. (Name: 'button'; Flags: [efSubelementContent, efPCDATAContent]),
  42. (Name: 'caption'; Flags: [efSubelementContent, efPCDATAContent]),
  43. (Name: 'center'; Flags: [efSubelementContent]),
  44. (Name: 'cite'; Flags: [efSubelementContent, efPCDATAContent]),
  45. (Name: 'code'; Flags: [efSubelementContent, efPCDATAContent]),
  46. (Name: 'col'; Flags: []),
  47. (Name: 'colgroup'; Flags: [efSubelementContent]),
  48. (Name: 'del'; Flags: [efSubelementContent]),
  49. (Name: 'dfn'; Flags: [efSubelementContent, efPCDATAContent]),
  50. (Name: 'dir'; Flags: [efSubelementContent]),
  51. (Name: 'div'; Flags: [efSubelementContent]),
  52. (Name: 'dl'; Flags: [efSubelementContent]),
  53. (Name: 'em'; Flags: [efSubelementContent, efPCDATAContent]),
  54. (Name: 'fieldset'; Flags: [efSubelementContent, efPCDATAContent]),
  55. (Name: 'font'; Flags: [efSubelementContent, efPCDATAContent]),
  56. (Name: 'form'; Flags: [efSubelementContent]),
  57. (Name: 'h1'; Flags: [efSubelementContent, efPCDATAContent]),
  58. (Name: 'h2'; Flags: [efSubelementContent, efPCDATAContent]),
  59. (Name: 'h3'; Flags: [efSubelementContent, efPCDATAContent]),
  60. (Name: 'h4'; Flags: [efSubelementContent, efPCDATAContent]),
  61. (Name: 'h5'; Flags: [efSubelementContent, efPCDATAContent]),
  62. (Name: 'h6'; Flags: [efSubelementContent, efPCDATAContent]),
  63. (Name: 'head'; Flags: [efSubelementContent]),
  64. (Name: 'hr'; Flags: []),
  65. (Name: 'html'; Flags: [efSubelementContent]),
  66. (Name: 'i'; Flags: [efSubelementContent, efPCDATAContent]),
  67. (Name: 'iframe'; Flags: [efSubelementContent]),
  68. (Name: 'img'; Flags: []),
  69. (Name: 'input'; Flags: []),
  70. (Name: 'ins'; Flags: [efSubelementContent]),
  71. (Name: 'isindex'; Flags: []),
  72. (Name: 'kbd'; Flags: [efSubelementContent, efPCDATAContent]),
  73. (Name: 'label'; Flags: [efSubelementContent, efPCDATAContent]),
  74. (Name: 'link'; Flags: []),
  75. (Name: 'map'; Flags: [efSubelementContent]),
  76. (Name: 'menu'; Flags: [efSubelementContent]),
  77. (Name: 'meta'; Flags: []),
  78. (Name: 'noframes'; Flags: [efSubelementContent, efPCDATAContent]),
  79. (Name: 'noscript'; Flags: [efSubelementContent, efPCDATAContent]),
  80. (Name: 'object'; Flags: [efSubelementContent, efPCDATAContent]),
  81. (Name: 'ol'; Flags: [efSubelementContent]),
  82. (Name: 'p'; Flags: [efSubelementContent, efPCDATAContent]),
  83. (Name: 'pre'; Flags: [efSubelementContent, efPCDATAContent, efPreserveWhitespace]),
  84. (Name: 'q'; Flags: [efSubelementContent, efPCDATAContent]),
  85. (Name: 's'; Flags: [efSubelementContent, efPCDATAContent]),
  86. (Name: 'samp'; Flags: [efSubelementContent, efPCDATAContent]),
  87. (Name: 'script'; Flags: [efPCDATAContent]),
  88. (Name: 'select'; Flags: [efSubelementContent]),
  89. (Name: 'small'; Flags: [efSubelementContent, efPCDATAContent]),
  90. (Name: 'span'; Flags: [efSubelementContent, efPCDATAContent]),
  91. (Name: 'strike'; Flags: [efSubelementContent, efPCDATAContent]),
  92. (Name: 'strong'; Flags: [efSubelementContent, efPCDATAContent]),
  93. (Name: 'style'; Flags: [efPCDATAContent]),
  94. (Name: 'sub'; Flags: [efSubelementContent, efPCDATAContent]),
  95. (Name: 'sup'; Flags: [efSubelementContent, efPCDATAContent]),
  96. (Name: 'table'; Flags: [efSubelementContent]),
  97. (Name: 'textarea'; Flags: [efPCDATAContent]),
  98. (Name: 'tbody'; Flags: [efSubelementContent]),
  99. (Name: 'td'; Flags: [efSubelementContent, efPCDATAContent]),
  100. (Name: 'tfoot'; Flags: [efSubelementContent]),
  101. (Name: 'th'; Flags: [efSubelementContent, efPCDATAContent]),
  102. (Name: 'thead'; Flags: [efSubelementContent]),
  103. (Name: 'tr'; Flags: [efSubelementContent]),
  104. (Name: 'tt'; Flags: [efSubelementContent, efPCDATAContent]),
  105. (Name: 'u'; Flags: [efSubelementContent, efPCDATAContent]),
  106. (Name: 'ul'; Flags: [efSubelementContent]),
  107. (Name: 'var'; Flags: [efSubelementContent, efPCDATAContent]));
  108. // ISO8859-1 mapping:
  109. HTMLEntities: array[#160..#255] of String = (
  110. // 160-191
  111. 'nbsp', 'iexcl', 'cent', 'pound', 'curren', 'yen', 'brvbar', 'sect',
  112. 'uml', 'copy', 'ordf', 'laquo', 'not', 'shy', 'reg', 'macr',
  113. 'deg', 'plusmn', 'sup2', 'sup3', 'acute', 'micro', 'para', 'middot',
  114. 'cedil', 'sup1', 'ordm', 'raquo', 'frac14', 'frac12', 'frac34', 'iquest',
  115. // 192-223
  116. 'Agrave', 'Aacute', 'Acirc', 'Atilde', 'Auml', 'Aring', 'AElig', 'Ccedil',
  117. 'Egrave', 'Eacute', 'Ecirc', 'Euml', 'Igrave', 'Iacute', 'Icirc', 'Iuml',
  118. 'ETH', 'Ntilde', 'Ograve', 'Oacute', 'Ocirc', 'Otilde', 'Ouml', 'times',
  119. 'Oslash', 'Ugrave', 'Uacute', 'Ucirc', 'Uuml', 'Yacute', 'THORN', 'szlig',
  120. // 224-255
  121. 'agrave', 'aacute', 'acirc', 'atilde', 'auml', 'aring', 'aelig', 'ccedil',
  122. 'egrave', 'eacute', 'ecirc', 'euml', 'igrave', 'iacute', 'icirc', 'iuml',
  123. 'eth', 'ntilde', 'ograve', 'oacute', 'ocirc', 'otilde', 'ouml', 'divide',
  124. 'oslash', 'ugrave', 'uacute', 'ucirc', 'uuml', 'yacute', 'thorn', 'yuml');
  125. UnicodeHTMLEntities: array[0..141] of String = (
  126. 'Alpha', // #913
  127. 'Beta', // #914
  128. 'Gamma', // #915
  129. 'Delta', // #916
  130. 'Epsilon', // #917
  131. 'Zeta', // #918
  132. 'Eta', // #919
  133. 'Theta', // #920
  134. 'Iota', // #921
  135. 'Kappa', // #922
  136. 'Lambda', // #923
  137. 'Mu', // #924
  138. 'Nu', // #925
  139. 'Xi', // #926
  140. 'Omicron', // #927
  141. 'Pi', // #928
  142. 'Rho', // #929
  143. 'Sigma', // #931
  144. 'Tau', // #932
  145. 'Upsilon', // #933
  146. 'Phi', // #934
  147. 'Chi', // #935
  148. 'Psi', // #936
  149. 'Omega', // #937
  150. 'alpha', // #945
  151. 'beta', // #946
  152. 'gamma', // #947
  153. 'delta', // #948
  154. 'epsilon', // #949
  155. 'zeta', // #950
  156. 'eta', // #951
  157. 'theta', // #952
  158. 'iota', // #953
  159. 'kappa', // #954
  160. 'lambda', // #955
  161. 'mu', // #956
  162. 'nu', // #957
  163. 'xi', // #958
  164. 'omicron', // #959
  165. 'pi', // #960
  166. 'rho', // #961
  167. 'sigmaf', // #962
  168. 'sigma', // #963
  169. 'tau', // #964
  170. 'upsilon', // #965
  171. 'phi', // #966
  172. 'chi', // #967
  173. 'psi', // #968
  174. 'omega', // #969
  175. 'thetasym', // #977
  176. 'upsih', // #978
  177. 'piv', // #982
  178. 'ensp', // #8194
  179. 'emsp', // #8195
  180. 'thinsp', // #8201
  181. 'zwnj', // #8204
  182. 'zwj', // #8205
  183. 'lrm', // #8206
  184. 'rlm', // #8207
  185. 'ndash', // #8211
  186. 'mdash', // #8212
  187. 'lsquo', // #8216
  188. 'rsquo', // #8217
  189. 'sbquo', // #8218
  190. 'ldquo', // #8220
  191. 'rdquo', // #8221
  192. 'bdquo', // #8222
  193. 'dagger', // #8224
  194. 'Dagger', // #8225
  195. 'bull', // #8226
  196. 'hellip', // #8230
  197. 'permil', // #8240
  198. 'prime', // #8242
  199. 'lsaquo', // #8249
  200. 'rsaquo', // #8250
  201. 'oline', // #8254
  202. 'frasl', // #8260
  203. 'image', // #8465
  204. 'weierp', // #8472
  205. 'real', // #8476
  206. 'trade', // #8482
  207. 'alefsym', // #8501
  208. 'larr', // #8592
  209. 'uarr', // #8593
  210. 'rarr', // #8594
  211. 'darr', // #8595
  212. 'harr', // #8596
  213. 'crarr', // #8629
  214. 'lArr', // #8656
  215. 'uArr', // #8657
  216. 'rArr', // #8658
  217. 'dArr', // #8659
  218. 'hArr', // #8660
  219. 'forall', // #8704
  220. 'part', // #8706
  221. 'exist', // #8707
  222. 'empty', // #8709
  223. 'nabla', // #8711
  224. 'isin', // #8712
  225. 'notin', // #8713
  226. 'ni', // #8715
  227. 'prod', // #8719
  228. 'sum', // #8721
  229. 'minus', // #8722
  230. 'lowast', // #8727
  231. 'radic', // #8730
  232. 'prop', // #8733
  233. 'infin', // #8734
  234. 'ang', // #8736
  235. 'and', // #8743
  236. 'or', // #8744
  237. 'cap', // #8745
  238. 'cup', // #8746
  239. 'int', // #8747
  240. 'there4', // #8756
  241. 'sim', // #8764
  242. 'cong', // #8773
  243. 'asymp', // #8776
  244. 'ne', // #8800
  245. 'equiv', // #8801
  246. 'le', // #8804
  247. 'ge', // #8805
  248. 'sub', // #8834
  249. 'sup', // #8835
  250. 'nsub', // #8836
  251. 'sube', // #8838
  252. 'supe', // #8839
  253. 'oplus', // #8853
  254. 'otimes', // #8855
  255. 'perp', // #8869
  256. 'sdot', // #8901
  257. 'lceil', // #8968
  258. 'rceil', // #8969
  259. 'lfloor', // #8970
  260. 'rfloor', // #8971
  261. 'lang', // #9001
  262. 'rang', // #9002
  263. 'loz', // #9674
  264. 'spades', // #9824
  265. 'clubs', // #9827
  266. 'hearts', // #9829
  267. 'diams' // #9830
  268. );
  269. function ResolveHTMLEntityReference(const Name: String;
  270. var Entity: Char): Boolean;
  271. implementation
  272. uses SysUtils;
  273. function ResolveHTMLEntityReference(const Name: String;
  274. var Entity: Char): Boolean;
  275. var
  276. Ent: Char;
  277. i: Integer;
  278. begin
  279. if Name = 'quot' then
  280. begin
  281. Entity := '"';
  282. Result := True;
  283. end else if Name = 'apos' then
  284. begin
  285. Entity := '''';
  286. Result := True;
  287. end else if Name = 'amp' then
  288. begin
  289. Entity := '&';
  290. Result := True;
  291. end else if Name = 'lt' then
  292. begin
  293. Entity := '<';
  294. Result := True;
  295. end else if Name = 'gt' then
  296. begin
  297. Entity := '>';
  298. Result := True;
  299. end else if (Length(Name) > 0) and (Name[1] = '#') then
  300. begin
  301. for i := 2 to Length(Name) do
  302. if (Name[i] < '0') or (Name[i] > '9') then
  303. break;
  304. if i > 2 then
  305. begin
  306. Entity := Chr(StrToInt(Copy(Name, 2, i - 1)));
  307. Result := True;
  308. end else
  309. Result := False;
  310. end else
  311. begin
  312. for Ent := Low(HTMLEntities) to High(HTMLEntities) do
  313. if HTMLEntities[Ent] = Name then
  314. begin
  315. Entity := Ent;
  316. Result := True;
  317. exit;
  318. end;
  319. Result := False;
  320. end;
  321. end;
  322. end.
  323. {
  324. $Log$
  325. Revision 1.2 2003-03-16 22:32:44 sg
  326. * Fixed td and th attributes
  327. Revision 1.1 2002/11/29 18:04:25 sg
  328. * Improved HTML writing, now uses the HTML definition unit
  329. (moved from FPDoc into FCL)
  330. }