fpc/fcl/xml/htmldefs.pp
fpc 790a4fe2d3 * log and id tags removed
git-svn-id: trunk@42 -
2005-05-21 09:42:41 +00:00

349 lines
12 KiB
ObjectPascal

{
This file is part of the Free Component Library
HTML definitions and utility functions
Copyright (c) 2000-2002 by
Areca Systems GmbH / Sebastian Guenther, sg@freepascal.org
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
unit HTMLDefs;
{$MODE objfpc}
{$H+}
interface
type
THTMLElementFlags = set of (
efSubelementContent, // may have subelements
efPCDATAContent, // may have PCDATA content
efPreserveWhitespace); // preserve all whitespace
PHTMLElementProps = ^THTMLElementProps;
THTMLElementProps = record
Name: String;
Flags: THTMLElementFlags;
end;
const
HTMLElProps: array[0..78] of THTMLElementProps = (
(Name: 'a'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'abbr'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'acronym'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'address'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'applet'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'b'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'basefont'; Flags: []),
(Name: 'bdo'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'big'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'blockquote';Flags: [efSubelementContent]),
(Name: 'body'; Flags: [efSubelementContent]),
(Name: 'br'; Flags: []),
(Name: 'button'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'caption'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'center'; Flags: [efSubelementContent]),
(Name: 'cite'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'code'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'col'; Flags: []),
(Name: 'colgroup'; Flags: [efSubelementContent]),
(Name: 'del'; Flags: [efSubelementContent]),
(Name: 'dfn'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'dir'; Flags: [efSubelementContent]),
(Name: 'div'; Flags: [efSubelementContent]),
(Name: 'dl'; Flags: [efSubelementContent]),
(Name: 'em'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'fieldset'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'font'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'form'; Flags: [efSubelementContent]),
(Name: 'h1'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'h2'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'h3'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'h4'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'h5'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'h6'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'head'; Flags: [efSubelementContent]),
(Name: 'hr'; Flags: []),
(Name: 'html'; Flags: [efSubelementContent]),
(Name: 'i'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'iframe'; Flags: [efSubelementContent]),
(Name: 'img'; Flags: []),
(Name: 'input'; Flags: []),
(Name: 'ins'; Flags: [efSubelementContent]),
(Name: 'isindex'; Flags: []),
(Name: 'kbd'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'label'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'link'; Flags: []),
(Name: 'map'; Flags: [efSubelementContent]),
(Name: 'menu'; Flags: [efSubelementContent]),
(Name: 'meta'; Flags: []),
(Name: 'noframes'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'noscript'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'object'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'ol'; Flags: [efSubelementContent]),
(Name: 'p'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'pre'; Flags: [efSubelementContent, efPCDATAContent, efPreserveWhitespace]),
(Name: 'q'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 's'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'samp'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'script'; Flags: [efPCDATAContent]),
(Name: 'select'; Flags: [efSubelementContent]),
(Name: 'small'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'span'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'strike'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'strong'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'style'; Flags: [efPCDATAContent]),
(Name: 'sub'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'sup'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'table'; Flags: [efSubelementContent]),
(Name: 'textarea'; Flags: [efPCDATAContent]),
(Name: 'tbody'; Flags: [efSubelementContent]),
(Name: 'td'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'tfoot'; Flags: [efSubelementContent]),
(Name: 'th'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'thead'; Flags: [efSubelementContent]),
(Name: 'tr'; Flags: [efSubelementContent]),
(Name: 'tt'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'u'; Flags: [efSubelementContent, efPCDATAContent]),
(Name: 'ul'; Flags: [efSubelementContent]),
(Name: 'var'; Flags: [efSubelementContent, efPCDATAContent]));
// ISO8859-1 mapping:
HTMLEntities: array[#160..#255] of String = (
// 160-191
'nbsp', 'iexcl', 'cent', 'pound', 'curren', 'yen', 'brvbar', 'sect',
'uml', 'copy', 'ordf', 'laquo', 'not', 'shy', 'reg', 'macr',
'deg', 'plusmn', 'sup2', 'sup3', 'acute', 'micro', 'para', 'middot',
'cedil', 'sup1', 'ordm', 'raquo', 'frac14', 'frac12', 'frac34', 'iquest',
// 192-223
'Agrave', 'Aacute', 'Acirc', 'Atilde', 'Auml', 'Aring', 'AElig', 'Ccedil',
'Egrave', 'Eacute', 'Ecirc', 'Euml', 'Igrave', 'Iacute', 'Icirc', 'Iuml',
'ETH', 'Ntilde', 'Ograve', 'Oacute', 'Ocirc', 'Otilde', 'Ouml', 'times',
'Oslash', 'Ugrave', 'Uacute', 'Ucirc', 'Uuml', 'Yacute', 'THORN', 'szlig',
// 224-255
'agrave', 'aacute', 'acirc', 'atilde', 'auml', 'aring', 'aelig', 'ccedil',
'egrave', 'eacute', 'ecirc', 'euml', 'igrave', 'iacute', 'icirc', 'iuml',
'eth', 'ntilde', 'ograve', 'oacute', 'ocirc', 'otilde', 'ouml', 'divide',
'oslash', 'ugrave', 'uacute', 'ucirc', 'uuml', 'yacute', 'thorn', 'yuml');
UnicodeHTMLEntities: array[0..141] of String = (
'Alpha', // #913
'Beta', // #914
'Gamma', // #915
'Delta', // #916
'Epsilon', // #917
'Zeta', // #918
'Eta', // #919
'Theta', // #920
'Iota', // #921
'Kappa', // #922
'Lambda', // #923
'Mu', // #924
'Nu', // #925
'Xi', // #926
'Omicron', // #927
'Pi', // #928
'Rho', // #929
'Sigma', // #931
'Tau', // #932
'Upsilon', // #933
'Phi', // #934
'Chi', // #935
'Psi', // #936
'Omega', // #937
'alpha', // #945
'beta', // #946
'gamma', // #947
'delta', // #948
'epsilon', // #949
'zeta', // #950
'eta', // #951
'theta', // #952
'iota', // #953
'kappa', // #954
'lambda', // #955
'mu', // #956
'nu', // #957
'xi', // #958
'omicron', // #959
'pi', // #960
'rho', // #961
'sigmaf', // #962
'sigma', // #963
'tau', // #964
'upsilon', // #965
'phi', // #966
'chi', // #967
'psi', // #968
'omega', // #969
'thetasym', // #977
'upsih', // #978
'piv', // #982
'ensp', // #8194
'emsp', // #8195
'thinsp', // #8201
'zwnj', // #8204
'zwj', // #8205
'lrm', // #8206
'rlm', // #8207
'ndash', // #8211
'mdash', // #8212
'lsquo', // #8216
'rsquo', // #8217
'sbquo', // #8218
'ldquo', // #8220
'rdquo', // #8221
'bdquo', // #8222
'dagger', // #8224
'Dagger', // #8225
'bull', // #8226
'hellip', // #8230
'permil', // #8240
'prime', // #8242
'lsaquo', // #8249
'rsaquo', // #8250
'oline', // #8254
'frasl', // #8260
'image', // #8465
'weierp', // #8472
'real', // #8476
'trade', // #8482
'alefsym', // #8501
'larr', // #8592
'uarr', // #8593
'rarr', // #8594
'darr', // #8595
'harr', // #8596
'crarr', // #8629
'lArr', // #8656
'uArr', // #8657
'rArr', // #8658
'dArr', // #8659
'hArr', // #8660
'forall', // #8704
'part', // #8706
'exist', // #8707
'empty', // #8709
'nabla', // #8711
'isin', // #8712
'notin', // #8713
'ni', // #8715
'prod', // #8719
'sum', // #8721
'minus', // #8722
'lowast', // #8727
'radic', // #8730
'prop', // #8733
'infin', // #8734
'ang', // #8736
'and', // #8743
'or', // #8744
'cap', // #8745
'cup', // #8746
'int', // #8747
'there4', // #8756
'sim', // #8764
'cong', // #8773
'asymp', // #8776
'ne', // #8800
'equiv', // #8801
'le', // #8804
'ge', // #8805
'sub', // #8834
'sup', // #8835
'nsub', // #8836
'sube', // #8838
'supe', // #8839
'oplus', // #8853
'otimes', // #8855
'perp', // #8869
'sdot', // #8901
'lceil', // #8968
'rceil', // #8969
'lfloor', // #8970
'rfloor', // #8971
'lang', // #9001
'rang', // #9002
'loz', // #9674
'spades', // #9824
'clubs', // #9827
'hearts', // #9829
'diams' // #9830
);
function ResolveHTMLEntityReference(const Name: String;
var Entity: Char): Boolean;
implementation
uses SysUtils;
function ResolveHTMLEntityReference(const Name: String;
var Entity: Char): Boolean;
var
Ent: Char;
i: Integer;
begin
if Name = 'quot' then
begin
Entity := '"';
Result := True;
end else if Name = 'apos' then
begin
Entity := '''';
Result := True;
end else if Name = 'amp' then
begin
Entity := '&';
Result := True;
end else if Name = 'lt' then
begin
Entity := '<';
Result := True;
end else if Name = 'gt' then
begin
Entity := '>';
Result := True;
end else if (Length(Name) > 0) and (Name[1] = '#') then
begin
for i := 2 to Length(Name) do
if (Name[i] < '0') or (Name[i] > '9') then
break;
if i > 2 then
begin
Entity := Chr(StrToInt(Copy(Name, 2, i - 1)));
Result := True;
end else
Result := False;
end else
begin
for Ent := Low(HTMLEntities) to High(HTMLEntities) do
if HTMLEntities[Ent] = Name then
begin
Entity := Ent;
Result := True;
exit;
end;
Result := False;
end;
end;
end.