fpc/utils/unicode/weight_derivation.inc

134 lines
3.8 KiB
PHP

function IsCJK_Unified_Ideographs(ACodePoint : Cardinal) : Boolean;inline;
begin
Result := (ACodePoint >= $4E00) and (ACodePoint <= $9FFF); // $9FCC, $9FFF
end;
function IsCJK_Compatibility_Ideographs(ACodePoint : Cardinal) : Boolean;inline;
begin
Result := (ACodePoint >= $F900) and (ACodePoint <= $FAFF);
end;
function IsTangut(ACodePoint : Cardinal) : Boolean;inline;
begin
Result := (ACodePoint >= $17000) and (ACodePoint <= $187FF);
end;
function IsTangutComponent(ACodePoint : Cardinal) : Boolean;inline;
begin
Result := (ACodePoint >= $18800) and (ACodePoint <= $18AFF);
end;
function IsTangutSupplement(ACodePoint : Cardinal) : Boolean;inline;
begin
Result := (ACodePoint >= $18D00) and (ACodePoint <= $18D7F);
end;
procedure DeriveWeightTangut(const ACodePoint : Cardinal; AResult : PUCA_PropWeights);inline;
begin
AResult[0].Weights[0] := Word($FB00);
AResult[0].Weights[1] := $20;
AResult[0].Weights[2] := $2;
AResult[1].Weights[0] := (ACodePoint - $17000) or $8000;
AResult[1].Weights[1] := 0;
AResult[1].Weights[2] := 0;
end;
function IsNushu(ACodePoint : Cardinal) : Boolean;inline;
begin
Result := (ACodePoint >= $1B170) and (ACodePoint <= $1B2FF);
end;
function IsKhitanSmallScript(ACodePoint : Cardinal) : Boolean;inline;
begin
Result := (ACodePoint >= $18B00) and (ACodePoint <= $18CFF);
end;
procedure DeriveWeightNushu(const ACodePoint : Cardinal; AResult : PUCA_PropWeights);inline;
begin
AResult[0].Weights[0] := Word($FB01);
AResult[0].Weights[1] := $20;
AResult[0].Weights[2] := $2;
AResult[1].Weights[0] := (ACodePoint - $1B170) or $8000;
AResult[1].Weights[1] := 0;
AResult[1].Weights[2] := 0;
end;
procedure DeriveWeightKhitanSmallScript(const ACodePoint : Cardinal; AResult : PUCA_PropWeights);inline;
begin
AResult[0].Weights[0] := Word($FB02);
AResult[0].Weights[1] := $20;
AResult[0].Weights[2] := $2;
AResult[1].Weights[0] := (ACodePoint - $18B00) or $8000;
AResult[1].Weights[1] := 0;
AResult[1].Weights[2] := 0;
end;
{$IFDEF UNI_BUILD_TIME}
function isUnifiedIdeograph(const ACodePoint : Cardinal; const AUnifiedIdeographs : TCodePointRecArray) : boolean;
begin
Result := IsIncluded(ACodePoint,AUnifiedIdeographs);
end;
{$ENDIF UNI_BUILD_TIME}
{$IFNDEF UNI_BUILD_TIME}
function isUnifiedIdeograph(const ACodePoint : Cardinal) : boolean;
var
p : PUC_Prop;
begin
p := GetProps(ACodePoint);
Result := (p <> nil) and p^.UnifiedIdeograph;
end;
{$ENDIF UNI_BUILD_TIME}
procedure DeriveWeight(
const ACodePoint : Cardinal;
AResult : PUCA_PropWeights
{$IFDEF UNI_BUILD_TIME}
;const AUnifiedIdeographs : TCodePointRecArray
{$ENDIF UNI_BUILD_TIME}
);
const
BASE_1 = Word($FB40);
BASE_2 = Word($FB80);
BASE_3 = Word($FBC0);
var
base : Word;
ui : boolean;
begin
if IsTangut(ACodePoint) or
IsTangutComponent(ACodePoint) or
IsTangutSupplement(ACodePoint)
then begin
DeriveWeightTangut(ACodePoint,AResult);
end else if IsNushu(ACodePoint) then begin
DeriveWeightNushu(ACodePoint,AResult);
end else if IsKhitanSmallScript(ACodePoint) then begin
DeriveWeightKhitanSmallScript(ACodePoint,AResult);
end else begin
ui := isUnifiedIdeograph(ACodePoint{$IFDEF UNI_BUILD_TIME},AUnifiedIdeographs{$ENDIF UNI_BUILD_TIME});
if ui and
(IsCJK_Unified_Ideographs(ACodePoint) or IsCJK_Compatibility_Ideographs(ACodePoint))
then begin
base := BASE_1
end else if ui and
not(IsCJK_Unified_Ideographs(ACodePoint) or IsCJK_Compatibility_Ideographs(ACodePoint))
then begin
base := BASE_2
end else begin
base := BASE_3;
end;
AResult[0].Weights[0] := base + (ACodePoint shr 15);
AResult[0].Weights[1] := $20;
AResult[0].Weights[2] := $2;
AResult[1].Weights[0] := (ACodePoint and $7FFF) or $8000;
AResult[1].Weights[1] := 0;
AResult[1].Weights[2] := 0;
end;
end;