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.