229 lines
6.1 KiB
Plaintext
229 lines
6.1 KiB
Plaintext
|
{
|
||
|
$Project$
|
||
|
$Workfile$
|
||
|
$Revision$
|
||
|
$DateUTC$
|
||
|
$Id$
|
||
|
|
||
|
This file is part of the Indy (Internet Direct) project, and is offered
|
||
|
under the dual-licensing agreement described on the Indy website.
|
||
|
(http://www.indyproject.org/)
|
||
|
|
||
|
Copyright:
|
||
|
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
|
||
|
}
|
||
|
{
|
||
|
$Log$
|
||
|
}
|
||
|
{
|
||
|
Rev 1.7 2/15/2005 9:25:00 AM DSiders
|
||
|
Modified StrHtmlEncode, StrHtmlDecode to ignore apostrophe character and
|
||
|
entity (not defined for HTML 4).
|
||
|
Added StrXHtmlEncode, StrXHtmlDecode.
|
||
|
Added comments to describe various functions.
|
||
|
|
||
|
Rev 1.6 7/30/2004 7:49:30 AM JPMugaas
|
||
|
Removed unneeded DotNET excludes.
|
||
|
|
||
|
Rev 1.5 2004.02.03 5:44:26 PM czhower
|
||
|
Name changes
|
||
|
|
||
|
Rev 1.4 2004.02.03 2:12:20 PM czhower
|
||
|
$I path change
|
||
|
|
||
|
Rev 1.3 24/01/2004 19:30:28 CCostelloe
|
||
|
Cleaned up warnings
|
||
|
|
||
|
Rev 1.2 10/12/2003 2:01:48 PM BGooijen
|
||
|
Compiles in DotNet
|
||
|
|
||
|
Rev 1.1 10/10/2003 11:06:54 PM SPerry
|
||
|
|
||
|
Rev 1.0 11/13/2002 08:02:02 AM JPMugaas
|
||
|
|
||
|
2000-03-27 Pete Mee
|
||
|
- Added FindFirstOf, FindFirstNotOf,TrimAllOf functions.
|
||
|
|
||
|
2002-01-03 Andrew P.Rybin
|
||
|
- StrHTMLEnc/Dec,BinToHexStr,IsWhiteString
|
||
|
}
|
||
|
|
||
|
unit IdStrings;
|
||
|
|
||
|
interface
|
||
|
|
||
|
{$i IdCompilerDefines.inc}
|
||
|
|
||
|
{
|
||
|
IsWhiteString
|
||
|
Returns TRUE when AStr contains only whitespace characters
|
||
|
TAB (decimal 9), SPACE (decimal 32), or an empty string.
|
||
|
}
|
||
|
function IsWhiteString(const AStr: String): Boolean;
|
||
|
|
||
|
{
|
||
|
BinToHexStr
|
||
|
converts the byte value in AData to its representation as
|
||
|
a 2-byte hexadecimal value without the '$' prefix.
|
||
|
For instance: 'FF', 'FE', or '0A'
|
||
|
}
|
||
|
function BinToHexStr(AData: Byte): String;
|
||
|
|
||
|
{
|
||
|
Encode and decode characters representing pre-defined character
|
||
|
entities for HTML 4.
|
||
|
handles &<>" characters
|
||
|
}
|
||
|
function StrHtmlEncode (const AStr: String): String;
|
||
|
function StrHtmlDecode (const AStr: String): String;
|
||
|
|
||
|
{
|
||
|
Encode and decode characters representing pre-defined character
|
||
|
entities for XHTML, XML.
|
||
|
handles &<>"' characters
|
||
|
}
|
||
|
function StrXHtmlEncode(const ASource: String): String;
|
||
|
function StrXHtmlDecode(const ASource: String): String;
|
||
|
|
||
|
{
|
||
|
SplitString splits a string into left and right parts,
|
||
|
i.e. SplitString('Namespace:tag', ':'..) will return 'Namespace' and 'tag'
|
||
|
}
|
||
|
procedure SplitString(const AStr, AToken: String; var VLeft, VRight: String);
|
||
|
|
||
|
{
|
||
|
CommaAdd
|
||
|
Appends AStr2 to the right of AStr1 and returns the result.
|
||
|
If there is any content in AStr1, a comma will be appended
|
||
|
prior to the value of AStr2.
|
||
|
}
|
||
|
function CommaAdd(Const AStr1, AStr2:String):string;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses
|
||
|
SysUtils,
|
||
|
IdException,
|
||
|
IdGlobal,
|
||
|
IdGlobalProtocols;
|
||
|
|
||
|
function StrHtmlEncode (const AStr: String): String;
|
||
|
begin
|
||
|
// TODO: use StringsReplace() instead
|
||
|
{
|
||
|
Result := StringsReplace(AStr,
|
||
|
['&', '<', '>', '"'], {do not localize
|
||
|
['&', '<', '>', '"'] {do not localize
|
||
|
);
|
||
|
}
|
||
|
Result := ReplaceAll(AStr, '&', '&'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '<', '<'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '>', '>'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '"', '"'); {do not localize}
|
||
|
end;
|
||
|
|
||
|
function StrHtmlDecode (const AStr: String): String;
|
||
|
begin
|
||
|
// TODO: use StringsReplace() instead
|
||
|
{
|
||
|
Result := StringsReplace(AStr,
|
||
|
['"', '>', '<', '&'], {do not localize
|
||
|
['"', '>', '<', '&'] {do not localize
|
||
|
);
|
||
|
}
|
||
|
Result := ReplaceAll(AStr, '"', '"'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '>', '>'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '<', '<'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '&', '&'); {do not localize}
|
||
|
end;
|
||
|
|
||
|
function StrXHtmlEncode(const ASource: String): String;
|
||
|
begin
|
||
|
//TODO: use StringsReplace() instead
|
||
|
{
|
||
|
Result := StringsReplace(ASource,
|
||
|
['&', '<', '>', '"', ''''], {do not localize
|
||
|
['&', '<', '>', '"', '''] {do not localize
|
||
|
);
|
||
|
}
|
||
|
Result := ReplaceAll(ASource, '&', '&'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '<', '<'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '>', '>'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '"', '"'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '''', '''); {do not localize}
|
||
|
end;
|
||
|
|
||
|
function StrXHtmlDecode(const ASource: String): String;
|
||
|
begin
|
||
|
// TODO: use StringsReplace() instead
|
||
|
{
|
||
|
Result := StringsReplace(ASource,
|
||
|
[''', '"', '>', '<', '&'], {do not localize
|
||
|
['''', '"', '>', '<', '&'] {do not localize
|
||
|
);
|
||
|
}
|
||
|
Result := ReplaceAll(ASource, ''', ''''); {do not localize}
|
||
|
Result := ReplaceAll(Result, '"', '"'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '>', '>'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '<', '<'); {do not localize}
|
||
|
Result := ReplaceAll(Result, '&', '&'); {do not localize}
|
||
|
end;
|
||
|
|
||
|
// SP - 10/10/2003
|
||
|
function BinToHexStr(AData: Byte): String;
|
||
|
begin
|
||
|
Result := IdHexDigits[AData shr 4] + IdHexDigits[AData and $F];
|
||
|
end;
|
||
|
|
||
|
function IsWhiteString(const AStr: String): Boolean;
|
||
|
var
|
||
|
i: Integer;
|
||
|
LLen: Integer;
|
||
|
begin
|
||
|
Result := True;
|
||
|
LLen := Length(AStr);
|
||
|
|
||
|
if LLen > 0 then
|
||
|
begin
|
||
|
for i := 1 to LLen do
|
||
|
begin
|
||
|
if not CharIsInSet(AStr, i, LWS) then
|
||
|
begin
|
||
|
Result := FALSE;
|
||
|
Break;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure SplitString(const AStr, AToken: String; var VLeft, VRight: String);
|
||
|
var
|
||
|
i: Integer;
|
||
|
LLocalStr: String;
|
||
|
begin
|
||
|
{ It is possible that VLeft or VRight may be the same variable as AStr.
|
||
|
So we copy it first }
|
||
|
LLocalStr := AStr;
|
||
|
i := Pos(AToken, LLocalStr);
|
||
|
if i = 0 then
|
||
|
begin
|
||
|
VLeft := LLocalStr;
|
||
|
VRight := '';
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
VLeft := Copy(LLocalStr, 1, i - 1);
|
||
|
VRight := Copy(LLocalStr, i + Length(AToken), Length(LLocalStr));
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function CommaAdd(Const AStr1, AStr2:String):string;
|
||
|
begin
|
||
|
if AStr1 = '' then
|
||
|
result := AStr2
|
||
|
else
|
||
|
result := AStr1 + ',' + AStr2;
|
||
|
end;
|
||
|
|
||
|
end.
|