diff --git a/components/tachart/demo/html/main.pas b/components/tachart/demo/html/main.pas
index 521772d75e..4116fbdc5d 100644
--- a/components/tachart/demo/html/main.pas
+++ b/components/tachart/demo/html/main.pas
@@ -56,7 +56,7 @@ implementation
{$R *.lfm}
uses
- Math, TAChartUtils, {$IFDEF WINDOWS}TADrawerWMF,{$ENDIF} TADrawerSVG;
+ TAChartUtils, {$IFDEF WINDOWS}TADrawerWMF,{$ENDIF} TADrawerSVG;
{ TMainForm }
diff --git a/components/tachart/tahtml.pas b/components/tachart/tahtml.pas
index a60bd700ad..67d611549b 100644
--- a/components/tachart/tahtml.pas
+++ b/components/tachart/tahtml.pas
@@ -15,423 +15,14 @@ function HTMLToFPColor(const AText: String): TFPColor;
implementation
uses
- SysUtils, math, contnrs,
+ SysUtils, math, contnrs, htmldefs, LazUTF8,
TAChartUtils, TAGeometry;
-type
- THtmlEntities = class(TFPStringHashTable)
- public
- procedure Add(const AEntName, AEntNum, AUtf8: String); reintroduce;
- end;
-
-var
- HtmlEntities: THtmlEntities = nil;
-
-procedure THtmlEntities.Add(const AEntName, AEntNum, AUtf8: String);
-begin
- inherited Add(AEntName, AUtf8);
- inherited Add(AEntNum, AUtf8);
-end;
-
-// https://www.w3schools.com/charsets/ref_utf_basic_latin.asp
-procedure PopulateHtmlEntities;
-begin
- if HtmlEntities <> nil then
- exit;
- HtmlEntities := THtmlEntities.Create;
- with HtmlEntities do begin
- // Latin Basic
- Add('quot', '34', '"');
- Add('amp', '38', '&');
- Add('apos', '39', '''');
- Add('lt', '60', '<');
- Add('gt', '61', '>');
-
- // Latin Supplement
- Add('nbsp', '160', ' ');
- Add('iexcl', '161', '¡');
- Add('cent', '162', '¢');
- Add('pound', '163', '£');
- Add('curren', '164', '¤');
- Add('yen', '165', '¥');
- Add('brvbar', '166', '¦');
- Add('sect', '167', '§');
- Add('uml', '168', '¨');
- Add('copy', '169', '©');
- Add('ordf', '170', 'ª');
- Add('laquo', '171', '«');
- Add('not', '172', '¬');
- Add('reg', '174', '®');
- Add('macr', '175', '¯');
- Add('deg', '176', '°');
- Add('plusmn', '177', '±');
- Add('sup2', '178', '²');
- Add('sup3', '179', '³');
- Add('acute', '180', '´');
- Add('micro', '181', 'µ');
- Add('para', '182', '¶');
- Add('middot', '183', '·');
- Add('cedil', '184', '¸');
- Add('sup1', '185', '¹');
- Add('ordm', '186', 'º');
- Add('raquo', '187', '»');
- Add('frac14', '188', '¼');
- Add('frac12', '189', '½');
- Add('frac34', '190', '¾');
- Add('iquest', '191', '¿');
- Add('Agrave', '192', 'À');
- Add('Aacute', '193', 'Á');
- Add('Acirc', '194', 'Â');
- Add('Atilde', '195', 'Ã');
- Add('Auml', '196', 'Ä');
- Add('Aring', '197', 'Å');
- Add('AElig', '198', 'Æ');
- Add('Ccedil', '199', 'Ç');
- Add('Egrave', '200', 'È');
- Add('Eacute', '201', 'É');
- Add('Ecirc', '202', 'Ê');
- Add('Euml', '203', 'Ë');
- Add('Igrave', '204', 'Ì');
- Add('Iacute', '205', 'Í');
- Add('Icirc', '206', 'Î');
- Add('Iuml', '207', 'Ï');
- Add('ETH', '208', 'Ð');
- Add('Ntilde', '209', 'Ñ');
- Add('Ograve', '210', 'Ò');
- Add('Oacute', '211', 'Ó');
- Add('Ocirc', '212', 'Ô');
- Add('Otilde', '213', 'Õ');
- Add('Ouml', '214', 'Ö');
- Add('times', '215', '×');
- Add('Oslash', '216', 'Ø');
- Add('Ugrave', '217', 'Ù');
- Add('Uacute', '218', 'Ú');
- Add('Ucirc', '219', 'Û');
- Add('Uuml', '220', 'Ü');
- Add('Yacute', '221', 'Ý');
- Add('THORN', '222', 'Þ');
- Add('szlig', '223', 'ß');
- Add('agrave', '224', 'à');
- Add('aacute', '225', 'á');
- Add('acirc', '226', 'â');
- Add('atilde', '227', 'ã');
- Add('auml', '228', 'ä');
- Add('aring', '229', 'å');
- Add('aelig', '230', 'æ');
- Add('ccedil', '231', 'ç');
- Add('egrave', '232', 'è');
- Add('eacute', '233', 'é');
- Add('ecirc', '234', 'ê');
- Add('euml', '235', 'ë');
- Add('igrave', '236', 'ì');
- Add('iacute', '237', 'í');
- Add('icircl', '238', 'î');
- Add('iuml', '239', 'ï');
- Add('eth', '240', 'ð');
- Add('ntilde', '241', 'ñ');
- Add('ograve', '242', 'ò');
- Add('oacute', '243', 'ô');
- Add('ocirc', '244', 'ô');
- Add('otilde', '245', 'õ');
- Add('ouml', '246', 'ö');
- Add('divide', '247', '÷');
- Add('oslash', '248', 'ø');
- Add('ugrave', '249', 'ù');
- Add('uacute', '250', 'ú');
- Add('ucirc', '251', 'û');
- Add('uuml', '252', 'ü');
- Add('yacute', '253', 'ý');
- Add('thorn', '254', 'þ');
- Add('yuml', '255', 'ÿ');
-
- // Latin Extended A
- Add('Amacr', '256', 'Ā');
- Add('amacr', '257', 'ā');
- Add('Abreve', '258', 'Ă');
- Add('abreve', '259', 'ă');
- Add('Aogon', '260', 'Ą');
- Add('aogon', '261', 'ą');
- Add('Cacute', '262', 'Ć');
- Add('cacute', '263', 'ć');
- Add('Ccirc', '264', 'Ĉ');
- Add('ccirc', '265', 'ĉ');
- Add('Cdot', '266', 'Ċ');
- Add('cdot', '267', 'ċ');
- Add('Ccaron', '268', 'Č');
- Add('ccaron', '269', 'č');
- Add('Dcaron', '270', 'Ď');
- Add('dcaron', '271', 'ď');
- Add('Dstrok', '272', 'Đ');
- Add('dstrok', '273', 'đ');
- Add('Emacr', '274', 'Ē');
- Add('emacr', '275', 'ē');
- Add('Edot', '278', 'Ė');
- Add('edot', '279', 'ė');
- Add('Eogon', '280', 'Ę');
- Add('eogon', '281', 'ę');
- Add('Ecaron', '282', 'Ě');
- Add('ecaron', '283', 'ě');
- Add('Gcirc', '284', 'Ĝ');
- Add('gcirc', '285', 'ĝ');
- Add('Gbreve', '286', 'Ğ');
- Add('gbreve', '287', 'ğ');
- Add('Gdot', '288', 'Ġ');
- Add('gdot', '289', 'ġ');
- Add('Gcedil', '290', 'Ģ');
- Add('gcedil', '291', 'ģ');
- Add('Hcirc', '292', 'Ĥ');
- Add('hcirc', '293', 'ĥ');
- Add('Hstrok', '294', 'Ħ');
- Add('hstrok', '295', 'ħ');
- Add('Itilde', '296', 'Ĩ');
- Add('itilde', '297', 'ĩ');
- Add('Imacr', '298', 'Ī');
- Add('imacr', '299', 'ī');
- Add('Iogon', '302', 'Į');
- Add('iogon', '303', 'į');
- Add('Idot', '304', 'İ');
- Add('inodot', '305', 'ı');
- Add('IJlig', '306', 'IJ');
- Add('ijlig', '307', 'ij');
- Add('Jcirc', '308', 'Ĵ');
- Add('jcirc', '309', 'ĵ');
- Add('Kcedil', '310', 'Ķ');
- Add('kcedil', '311', 'ķ');
- Add('kgreen', '312', 'ĸ');
- Add('Lacute', '313', 'Ĺ');
- Add('lacute', '314', 'ĺ');
- Add('Lcedil', '315', 'Ļ');
- Add('lcedil', '316', 'ļ');
- Add('Lcaron', '317', 'Ľ');
- Add('lcaron', '318', 'ľ');
- Add('Lmidot', '319', 'Ŀ');
- Add('lmidot', '320', 'ŀ');
- Add('Lstrok', '321', 'Ł');
- Add('lstrok', '322', 'ł');
- Add('Nacute', '323', 'Ń');
- Add('nacute', '324', 'ń');
- Add('Ncedil', '325', 'Ņ');
- Add('ncedil', '326', 'ņ');
- Add('Ncaron', '327', 'Ň');
- Add('ncaron', '328', 'ň');
- Add('napos', '329', 'ʼn');
- Add('ENG', '330', 'Ŋ');
- Add('eng', '331', 'ŋ');
- Add('Omacr', '332', 'Ō');
- Add('omacr', '333', 'ō');
- Add('Odblac', '336', 'Ő');
- Add('odblac', '337', 'ő');
- Add('OElig', '338', 'Œ');
- Add('oelig', '339', 'œ');
- Add('Racute', '340', 'Ŕ');
- Add('racute', '341', 'ŕ');
- Add('Rcedil', '342', 'Ŗ');
- Add('rcedil', '343', 'ŗ');
- Add('Rcaron', '344', 'Ř');
- Add('rcaron', '345', 'ř');
- Add('Sacute', '346', 'Ś');
- Add('sacute', '347', 'ś');
- Add('Scirc', '348', 'Ŝ');
- Add('scirc', '349', 'ŝ');
- Add('Scedil', '350', 'Ş');
- Add('scedil', '351', 'ş');
- Add('Scaron', '352', 'Š');
- Add('scaron', '353', 'š');
- Add('Tcedil', '354', 'Ţ');
- Add('tcedil', '355', 'ţ');
- Add('Tcaron', '356', 'Ť');
- Add('tcaron', '357', 'ť');
- Add('Tstrok', '358', 'Ŧ');
- Add('tstrok', '359', 'ŧ');
- Add('Utilde', '360', 'Ũ');
- Add('utilde', '361', 'ũ');
- Add('Umacr', '362', 'Ū');
- Add('umacr', '363', 'ū');
- Add('Ubreve', '364', 'Ŭ');
- Add('ubreve', '365', 'ŭ');
- Add('Uring', '366', 'Ů');
- Add('uring', '367', 'ů');
- Add('Udblac', '368', 'Ű');
- Add('udblac', '369', 'ű');
- Add('Uogon', '370', 'Ų');
- Add('uogon', '371', 'ų');
- Add('Wcirc', '372', 'Ŵ');
- Add('wcirc', '373', 'ŵ');
- Add('Ycirc', '374', 'Ŷ');
- Add('ycirc', '375', 'ŷ');
- Add('Yuml', '376', 'Ÿ');
- Add('Zacute', '377', 'Ź');
- Add('zacute', '378', 'ź');
- Add('Zdot', '379', 'Ż');
- Add('zdot', '380', 'ż');
- Add('Zcaron', '381', 'Ž');
- Add('zcaron', '382', 'ž');
-
- // Latin Extended B
- Add('fnof', '402', 'ƒ');
- Add('imped', '437', 'Ƶ');
- Add('gacute', '501', 'ǵ');
- Add('jmath', '567', 'ȷ');
-
- // Modified letters
- Add('circ', '710', 'ˆ');
- Add('tilde', '732', '˜');
-
- // Greek and coptic
- Add('Alpha', '913', 'Α');
- Add('Beta', '914', 'Β');
- Add('Gamma', '915', 'Γ');
- Add('Delta', '916', 'Δ');
- Add('Epsilon', '917', 'Ε');
- Add('Zeta', '918', 'Ζ');
- Add('Eta', '919', 'Η');
- Add('Theta', '920', 'Θ');
- Add('Iota', '921', 'Ι');
- Add('Kappa', '922', 'Κ');
- Add('Lambda', '923', 'Λ');
- Add('Mu', '924', 'Μ');
- Add('Nu', '925', 'Ν');
- Add('Xi', '926', 'Ξ');
- Add('Omicron', '927', 'Ο');
- Add('Pi', '928', 'Π');
- Add('Rho', '929', 'Ρ');
- Add('Sigma', '931', 'Σ');
- Add('Tau', '932', 'Τ');
- Add('Upsilon', '933', 'Υ');
- Add('Phi', '934', 'Φ');
- Add('Chi', '935', 'Χ');
- Add('Psi', '936', 'Ψ');
- Add('Omega', '937', 'Ω');
-
- Add('alpha', '945', 'α');
- Add('beta', '946', 'β');
- Add('gamma', '947', 'γ');
- Add('delta', '948', 'δ');
- Add('epsilon', '949', 'ε');
- Add('zeta', '950', 'ζ');
- Add('eta', '951', 'η');
- Add('theta', '952', 'θ');
- Add('iota', '953', 'ι');
- Add('kappa', '954', 'κ');
- Add('lambda', '955', 'λ');
- Add('mu', '956', 'μ');
- Add('nu', '957', 'ν');
- Add('xi', '958', 'ξ');
- Add('omicron', '959', 'ο');
- Add('pi', '960', 'π');
- Add('rho', '961', 'ρ');
- Add('sigmaf', '962', 'ς');
- Add('sigma', '963', 'σ');
- Add('tau', '964', 'τ');
- Add('upsilon', '965', 'υ');
- Add('phi', '966', 'φ');
- Add('chi', '967', 'χ');
- Add('psi', '968', 'ψ');
- Add('omega', '969', 'ω');
- Add('thetasym','977', 'ϑ');
- Add('upsih', '978', 'ϒ');
- Add('straightphi', '981', 'ϕ');
- Add('piv', '982', 'ϖ'); // ??? should be vertical pi
- Add('Gammad', '988', 'Ϝ');
- Add('gammad', '987', 'ϝ');
- Add('varkappa','1008', 'ϰ');
- Add('varrho', '1009', 'ϱ');
- Add('straightepsilon', '1013', 'ϵ');
- Add('backepsilon', '1014', '϶');
-
- // Currency
- Add('euro', '8364', '€');
-
- // Arrows
- Add('larr', '8592', '←');
- Add('uarr', '8593', '↑');
- Add('rarr', '8594', '→');
- Add('darr', '8595', '↓');
- Add('harr', '8596', '↔');
- Add('crarr', '8629', '↵');
- Add('lArr', '8656', '⇐');
- Add('uArr', '8657', '⇑');
- Add('rArr', '8658', '⇒');
- Add('dArr', '8659', '⇓');
- Add('hArr', '8860', '⇔');
-
- // Math operators
- Add('forall', '8704', '∀');
- Add('part', '8706', '∂');
- Add('exist', '8707', '∃');
- Add('empty', '8709', '∅');
- Add('nabla', '8711', '∇');
- Add('isin', '8712', '∈');
- Add('notin', '8713', '∉');
- Add('ni', '8715', '∋');
- Add('prod', '8719', '∏');
- Add('sum', '8721', '∑');
- Add('minus', '8722', '−');
- Add('lowast', '8728', '∗');
- Add('radic', '8730', '√');
- Add('prop', '8733', '∝');
- Add('infin', '8734', '∞');
- Add('ang', '8736', '∠');
- Add('and', '8743', '∧');
- Add('or', '8744', '∨');
- Add('cap', '8745', '∩');
- Add('cup', '8746', '∪');
- Add('int', '8747', '∫');
- Add('there4', '8756', '∴');
- Add('sim', '8764', '∼');
- Add('cong', '8773', '≅');
- Add('asymp', '9776', '≅');
- Add('ne', '8800', '≠');
- Add('equiv', '8801', '≡');
- Add('le', '8804', '≤');
- Add('ge', '8805', '≥');
- Add('sub', '8834', '⊂');
- Add('sup', '8835', '⊃');
- Add('nsub', '8836', '⊄');
- Add('sube', '8838', '⊆');
- Add('supe', '8839', '⊇');
- Add('oplus', '8853', '⊕');
- Add('otimes', '8855', '⊗');
- Add('perp', '8859', '⊥');
- Add('sdot', '8901', '⋅');
-
- // Geometric shapes
- Add('loz', '9674', '◊');
-
- // Misc symbols
- Add('spades', '9824', '♠');
- Add('clubs', '9827', '♣');
- Add('hearts', '9829', '♥');
- Add('diams', '9830', '♦');
- end;
-end;
-
-function HTMLEntityToUTF8(s: String): String;
-var
- n: Integer;
-begin
- if s = '' then
- exit('');
-
- if HtmlEntities = nil then
- PopulateHtmlEntities;
-
- if (Length(s) > 1) and (s[1] = '#') then begin
- Delete(s, 1, 1);
- if (s[1] = 'x') then begin
- s[1] := '$';
- n := StrToInt(s);
- s := IntToStr(n);
- end;
- end;
-
- Result := HTMLEntities[s];
-end;
-
function ReplaceHTMLEntities(const AText: String): String;
var
i: Integer;
- s: String;
+ s: WideString;
+ wch: WideChar = #0;
begin
Result := '';
i := 1;
@@ -442,10 +33,11 @@ begin
s := '';
inc(i);
while (i <= Length(AText)) and (AText[i] <> ';') do begin
- s := s + AText[i];
+ s := s + WideChar(AText[i]);
inc(i);
end;
- Result := Result + HTMLEntityToUTF8(s);
+ if ResolveHTMLEntityReference(s, wch) then
+ Result := Result + UnicodeToUTF8(cardinal(wch));
end;
else Result := Result + AText[i];
end;
@@ -523,11 +115,5 @@ begin
end;
end;
-
-initialization
-
-finalization
- HTMLEntities.Free;
-
end.