htmldefs.pp 11 KB

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