mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 09:41:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| unit TAHtml;
 | |
| 
 | |
| {$H+}
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   fpimage, Classes;
 | |
| 
 | |
| function ReplaceHTMLEntities(const AText: String): String;
 | |
| function HTMLToFontSize(AText: String): Integer;
 | |
| function HTMLToFPColor(const AText: String): TFPColor;
 | |
| 
 | |
| 
 | |
| implementation
 | |
| 
 | |
| uses
 | |
|   SysUtils, htmldefs, LazUTF8,
 | |
|   TAChartUtils, TAGeometry;
 | |
| 
 | |
| function ReplaceHTMLEntities(const AText: String): String;
 | |
| var
 | |
|   i: Integer;
 | |
|   s: WideString;
 | |
|   wch: WideChar = #0;
 | |
| begin
 | |
|   Result := '';
 | |
|   i := 1;
 | |
|   while (i <= Length(AText)) do
 | |
|   begin
 | |
|     case AText[i] of
 | |
|       '&': begin
 | |
|              s := '';
 | |
|              inc(i);
 | |
|              while (i <= Length(AText)) and (AText[i] <> ';') do begin
 | |
|                s := s + WideChar(AText[i]);
 | |
|                inc(i);
 | |
|              end;
 | |
|              if ResolveHTMLEntityReference(s, wch) then
 | |
|                Result := Result + UnicodeToUTF8(cardinal(wch));
 | |
|            end;
 | |
|       else Result := Result + AText[i];
 | |
|     end;
 | |
|     inc(i);
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| function HTMLToFPColor(const AText: String): TFPColor;
 | |
| var
 | |
|   i: Integer;
 | |
|   len: Integer;
 | |
| begin
 | |
|   Result := colBlack;
 | |
|   // AText is already upper-cased by the calling routine.
 | |
|   case AText of
 | |
|     'AQUA'   : Result := colAqua;
 | |
|     'BLACK'  : Result := colBlack;
 | |
|     'BLUE'   : Result := colBlue;
 | |
|     'CYAN'   : Result := colCyan;
 | |
|     'FUCHSIA': Result := colFuchsia;
 | |
|     'GRAY'   : Result := colGray;
 | |
|     'GREY'   : Result := colGray;
 | |
|     'GREEN'  : Result := colGreen;
 | |
|     'LIME'   : Result := colLime;
 | |
|     'MAGENTA': Result := colMagenta;
 | |
|     'MAROON' : Result := colMaroon;
 | |
|     'NAVY'   : Result := colNavy;
 | |
|     'OLIVE'  : Result := colOlive;
 | |
|     'PURPLE' : Result := colPurple;
 | |
|     'RED'    : Result := colRed;
 | |
|     'SILVER' : Result := colSilver;
 | |
|     'TEAL'   : Result := colTeal;
 | |
|     'WHITE'  : Result := colWhite;
 | |
|     'YELLOW' : Result := colYellow;
 | |
|     else       if (pos('#', AText) = 1) then begin
 | |
|                  len := Length(AText);
 | |
|                  if not (len in [7, 4]) then
 | |
|                    exit;
 | |
|                  for i:=2 to len do
 | |
|                    if not (AText[i] in ['0'..'9', 'A'..'F']) then
 | |
|                      exit;
 | |
|                  if len = 7 then begin
 | |
|                    Result.Red := StrToInt('$' + copy(AText, 2, 2)) shl 8;
 | |
|                    Result.Green := StrToInt('$' + copy(AText, 4, 2)) shl 8;
 | |
|                    Result.Blue := StrToInt('$' + copy(AText, 6, 2)) shl 8;
 | |
|                  end else
 | |
|                  if len = 4 then begin
 | |
|                    Result.Red := StrToInt('$' + AText[2] + AText[2]) shl 8;
 | |
|                    Result.Green := StrToInt('$' + AText[3] + AText[3]) shl 8;
 | |
|                    Result.Blue := StrToInt('$' + AText[4] + AText[4]) shl 8;
 | |
|                  end;
 | |
|                end;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| function HTMLToFontSize(AText: String): Integer;
 | |
| begin
 | |
|   case AText of
 | |
|     'X-SMALL',  '1' : Result := 7;
 | |
|     'SMALL',    '2' : Result := 10;
 | |
|     'MEDIUM',   '3' : Result := 12;
 | |
|     'LARGE',    '4' : Result := 14;
 | |
|     'X-LARGE',  '5' : Result := 18;
 | |
|     'XX-LARGE', '6' : Result := 24;
 | |
|   else
 | |
|     if Pos('PT', AText) = Length(AText)-1 then
 | |
|       Result := StrToInt(Copy(AText, 1, Length(AText) - 2))
 | |
|     else
 | |
|     if Pos('PX', AText) = Length(AText)-1 then
 | |
|     begin
 | |
|       Result := StrToInt(Copy(AText, 1, Length(AText) - 2));
 | |
|       Result := Result * 72 div 96;  // Assuming a 96 ppi screen here!
 | |
|     end else
 | |
|       Result := 9;
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| end.
 | |
| 
 | 
