mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-12 11:16:09 +02:00
LazUtils: New UTF8WrapText function for LazUTF8. Issue #28001, patch from Antônio Galvão.
git-svn-id: trunk@48924 -
This commit is contained in:
parent
662f81c5c1
commit
37ae3c0f43
@ -34,7 +34,7 @@ uses
|
|||||||
{$ifdef windows}
|
{$ifdef windows}
|
||||||
Windows,
|
Windows,
|
||||||
{$endif}
|
{$endif}
|
||||||
Classes, SysUtils;
|
Classes, SysUtils;
|
||||||
|
|
||||||
// AnsiToUTF8 and UTF8ToAnsi need a widestring manager under Linux, BSD, MacOSX
|
// AnsiToUTF8 and UTF8ToAnsi need a widestring manager under Linux, BSD, MacOSX
|
||||||
// but normally these OS use UTF-8 as system encoding so the widestringmanager
|
// but normally these OS use UTF-8 as system encoding so the widestringmanager
|
||||||
@ -114,6 +114,9 @@ function UTF8RightStr(const AText: String; const ACount: Integer): String;
|
|||||||
function UTF8QuotedStr(const S, Quote: string): string;
|
function UTF8QuotedStr(const S, Quote: string): string;
|
||||||
//Utf8 version of MidStr is just Utf8Copy with same parameters, so it is not implemented here
|
//Utf8 version of MidStr is just Utf8Copy with same parameters, so it is not implemented here
|
||||||
|
|
||||||
|
function UTF8WrapText(S, BreakStr :string; BreakChars :TSysCharSet; MaxCol: integer): string; overload;
|
||||||
|
function UTF8WrapText(S :string; MaxCol :integer) :string; overload;
|
||||||
|
|
||||||
type
|
type
|
||||||
TUTF8TrimFlag = (
|
TUTF8TrimFlag = (
|
||||||
u8tKeepStart,
|
u8tKeepStart,
|
||||||
@ -2734,6 +2737,71 @@ begin
|
|||||||
Result+=copy(S,CopyPos-PChar(S)+1,p-CopyPos)+Quote;
|
Result+=copy(S,CopyPos-PChar(S)+1,p-CopyPos)+Quote;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function UTF8WrapText(S, BreakStr :string; BreakChars :TSysCharSet; MaxCol: integer): string;
|
||||||
|
var
|
||||||
|
P :PChar;
|
||||||
|
CharLen :integer;
|
||||||
|
RightSpace : Integer = 0;
|
||||||
|
N :integer = 0;
|
||||||
|
i : Integer;
|
||||||
|
j : Integer;
|
||||||
|
Len :integer = 0;
|
||||||
|
ResultLen, RP :Integer;
|
||||||
|
begin
|
||||||
|
Result := '';
|
||||||
|
if (S = '') or (BreakStr = '') or (BreakChars = []) then Exit;
|
||||||
|
P := PChar(S);
|
||||||
|
while P^ <> #0 do
|
||||||
|
begin
|
||||||
|
CharLen := UTF8CharacterLength(P);
|
||||||
|
|
||||||
|
// Result := Result + Copy(P, 1, CharLen);
|
||||||
|
i := 1;
|
||||||
|
j := 0;
|
||||||
|
ResultLen := Length(Result);
|
||||||
|
SetLength(Result, ResultLen + CharLen);
|
||||||
|
while i <= CharLen do
|
||||||
|
begin
|
||||||
|
/// Result := Result + (P + j)^;
|
||||||
|
Result[ResultLen + i] := (P + J)^;
|
||||||
|
///
|
||||||
|
Inc(i);
|
||||||
|
Inc(j);
|
||||||
|
end;
|
||||||
|
//
|
||||||
|
|
||||||
|
Inc(N);
|
||||||
|
if P^ = {#10} BreakStr[Length(BreakStr)] then
|
||||||
|
N := 0;
|
||||||
|
if N > MaxCol then
|
||||||
|
begin
|
||||||
|
Len := Length(Result);
|
||||||
|
|
||||||
|
///// avoiding RPos
|
||||||
|
RP := Len;
|
||||||
|
//while Result[RP] <> #32 do
|
||||||
|
while not (Result[RP] in BreakChars) do
|
||||||
|
Dec(RP);
|
||||||
|
/////
|
||||||
|
|
||||||
|
RightSpace := Len - RP; //RPos(' ', Result);
|
||||||
|
if RightSpace > 0 then
|
||||||
|
begin
|
||||||
|
Dec(P, RightSpace);
|
||||||
|
SetLength(Result, Len - RightSpace);
|
||||||
|
end;
|
||||||
|
Result := Result + BreakStr;
|
||||||
|
N := 0;
|
||||||
|
end;
|
||||||
|
Inc(P, CharLen);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function UTF8WrapText(S :string; MaxCol: integer): string;
|
||||||
|
begin
|
||||||
|
Result := UTF8WrapText(S, LineEnding, [' ', '-', #9], MaxCol);
|
||||||
|
end;
|
||||||
|
|
||||||
function UTF8Trim(const s: string; Flags: TUTF8TrimFlags): string;
|
function UTF8Trim(const s: string; Flags: TUTF8TrimFlags): string;
|
||||||
var
|
var
|
||||||
p: PChar;
|
p: PChar;
|
||||||
|
Loading…
Reference in New Issue
Block a user