PDFium Delphi Component Docs

FPdfBidi enhed

Enhed: FPdfBidi
Implementering af Unicode Bidirectional Algorithm (UAX #9), der opløser embedding-niveauer og visuel rækkefølge for tekst med blandede retninger

Syntax

type EPdfBidiError = class(Exception);
type TPdfBidiClass = (bcL, bcR, bcAL, bcEN, bcES, bcET, bcAN, bcCS, bcNSM, bcBN, bcB, bcS, bcWS, bcON, bcLRE, bcLRO, bcRLE, bcRLO, bcPDF, bcLRI, bcRLI, bcFSI, bcPDI);
type TPdfBidiParagraphDirection = (pbdAuto, pbdLeftToRight, pbdRightToLeft);
type TPdfBidiLevels = array of Byte;
type TPdfBidiOrder = array of Integer;
const PdfBidiMaxDepth = 125;
function PdfBidiClassOf(CodePoint: Cardinal): TPdfBidiClass;
function PdfBidiIsRtlCodePoint(CodePoint: Cardinal): Boolean;
function PdfResolveBidiLevels(const Text: WideString; Direction: TPdfBidiParagraphDirection; out Levels: TPdfBidiLevels; out ParagraphLevel: Byte): Boolean;
function PdfBidiVisualOrder(const Text: WideString; const Levels: TPdfBidiLevels): TPdfBidiOrder;
function PdfBidiParagraphIsRtl(const Text: WideString): Boolean;

Description

FPdfBidi implementerer Unicode Bidirectional Algorithm defineret af UAX #9, som beslutter retningen og den visuelle rækkefølge af tekst med blandede retninger, inden den måles eller tegnes. Et shaping-trin arbejder på et run, hvis retning og script allerede er afklaret, så kalderen skal først opløse den retning

Enheden dækker reglerne P2-P3 for afsnitsniveauet, X1-X10 for eksplicitte niveauer og isolating run sequences, W1-W7 for svage typer, N0-N2 for parentespar og neutraler, I1-I2 for implicitte niveauer og L1-L2 for niveaunulstilling og omrokeringen, inklusive isolate-initiatorer og BD16-parentespar

Opløsningen kører over kodepunkter frem for UTF-16-kodeenheder, og de opløste niveauer udfoldes til sidst tilbage på kodeenhederne, så begge halvdele af et surrogatpar bærer hver sit niveau

PdfResolveBidiLevels er indgangspunktet: Direction vælger P2-P3-scanningen via pbdAuto eller tvinger afsnitsniveauet fast, Levels modtager ét embedding-niveau pr. kodeenhed i Text, og ParagraphLevel modtager det niveau, afsnittet opløstes til. Resultatet er kun False ved tomt input, og Levels får altid størrelsen Length(Text)

PdfBidiVisualOrder anvender L2 på de niveauer og returnerer den logiske kodeenhedsindeks, der hører til på hver visuel position, så element nul af resultatet er den kodeenhed, der renderes længst til venstre. Text skal bruges for at holde et surrogatpar samlet, da det at vende dets to kodeenheder ville gøre parret til to u-parrede surrogater

PdfBidiClassOf eksponerer selve Bidi_Class-opslaget. Tabellen er afledt af Unicode Character Database og foldet sammen til intervaller; kodepunkter, som databasen ikke tildeler, falder tilbage til de standardintervaller, UAX #9 definerer for dem, det vil sige R-, AL-, ET- og BN-blokkene, og L alle andre steder

PdfBidiIsRtlCodePoint og PdfBidiParagraphIsRtl besvarer de to spørgsmål, en kalder normalt stiller inden layout: om ét kodepunkt er stærkt højre-til-venstre, og om et helt afsnit opløses højre-til-venstre under P2-P3

Functions

FunctionDescription
PdfBidiClassOfReturnerer TPdfBidiClass for et enkelt kodepunkt med intervaltabellen og UAX #9-standarderne for kodepunkter, databasen ikke tildeler
PdfBidiIsRtlCodePointReturnerer True, når kodepunktet er et stærkt højre-til-venstre-tegn, det vil sige bcR eller bcAL
PdfResolveBidiLevelsOpløser ét embedding-niveau pr. UTF-16-kodeenhed i Text ind i Levels og rapporterer afsnitsniveauet i ParagraphLevel; returnerer kun False ved tomt input
PdfBidiVisualOrderAnvender L2-omrokeringen på Levels og returnerer det logiske kodeenhedsindeks for hver visuel position, mens surrogatpar holdes intakte
PdfBidiParagraphIsRtlReturnerer True, når Text opløses til et højre-til-venstre-afsnitsniveau under P2-P3

Types

TypePurpose
EPdfBidiErrorException-klasse, som enheden erklærer til bidi-fejl; nedarver fra Exception
TPdfBidiClassBidi_Class for et kodepunkt, i den rækkefølge UAX #9 Table 4 lister værdierne
TPdfBidiParagraphDirectionVælger mellem P2-P3-detektion og en tvunget afsnitsretning
TPdfBidiLevelsarray of Byte med ét opløst embedding-niveau pr. UTF-16-kodeenhed
TPdfBidiOrderarray of Integer med logiske kodeenhedsindekser i visuel rækkefølge

Constants

ConstantValue and purpose
PdfBidiMaxDepth125, den maksimale eksplicitte nesting-dybde, X1 tillader; embeddings og isolates forbi den tælles som overflow i stedet for at hæve niveauet

TPdfBidiParagraphDirection values

ValueMeaning
pbdAutoAfleder afsnitsniveauet ud fra det første stærke tegn, jf. P2-P3
pbdLeftToRightTvinger afsnitsniveau 0
pbdRightToLeftTvinger afsnitsniveau 1

TPdfBidiClass values

ValueBidi_Class and category
bcLLeft_To_Right, stærk
bcRRight_To_Left, stærk
bcALArabic_Letter, stærk; bliver bcR under W3
bcENEuropean_Number, svag
bcESEuropean_Separator, svag
bcETEuropean_Terminator, svag
bcANArabic_Number, svag
bcCSCommon_Separator, svag
bcNSMNonspacing_Mark, svag; overtager den foregående tegns klasse under W1
bcBNBoundary_Neutral, svag; fjernes af X9
bcBParagraph_Separator, neutral; afslutter hver embedding under X8
bcSSegment_Separator, neutral
bcWSWhite_Space, neutral
bcONOther_Neutral, neutral; den klasse, parenteser bærer ind i N0
bcLRELeft_To_Right_Embedding, eksplicit formatering
bcLROLeft_To_Right_Override, eksplicit formatering
bcRLERight_To_Left_Embedding, eksplicit formatering
bcRLORight_To_Left_Override, eksplicit formatering
bcPDFPop_Directional_Format, eksplicit formatering; pop'er en embedding under X7
bcLRILeft_To_Right_Isolate, isolate-initiator
bcRLIRight_To_Left_Isolate, isolate-initiator
bcFSIFirst_Strong_Isolate, isolate-initiator, hvis retning kommer fra det første stærke tegn frem til det matchende bcPDI
bcPDIPop_Directional_Isolate, afslutter en isolate under X6a

Remarks

See Also

FPdfTextShaping, TPdf.AddShapedText, TPdf.FocusedFormFieldTextDirection