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;
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
| Function | Description |
|---|---|
PdfBidiClassOf | Returnerer TPdfBidiClass for et enkelt kodepunkt med intervaltabellen og UAX #9-standarderne for kodepunkter, databasen ikke tildeler |
PdfBidiIsRtlCodePoint | Returnerer True, når kodepunktet er et stærkt højre-til-venstre-tegn, det vil sige bcR eller bcAL |
PdfResolveBidiLevels | Opløser ét embedding-niveau pr. UTF-16-kodeenhed i Text ind i Levels og rapporterer afsnitsniveauet i ParagraphLevel; returnerer kun False ved tomt input |
PdfBidiVisualOrder | Anvender L2-omrokeringen på Levels og returnerer det logiske kodeenhedsindeks for hver visuel position, mens surrogatpar holdes intakte |
PdfBidiParagraphIsRtl | Returnerer True, når Text opløses til et højre-til-venstre-afsnitsniveau under P2-P3 |
| Type | Purpose |
|---|---|
EPdfBidiError | Exception-klasse, som enheden erklærer til bidi-fejl; nedarver fra Exception |
TPdfBidiClass | Bidi_Class for et kodepunkt, i den rækkefølge UAX #9 Table 4 lister værdierne |
TPdfBidiParagraphDirection | Vælger mellem P2-P3-detektion og en tvunget afsnitsretning |
TPdfBidiLevels | array of Byte med ét opløst embedding-niveau pr. UTF-16-kodeenhed |
TPdfBidiOrder | array of Integer med logiske kodeenhedsindekser i visuel rækkefølge |
| Constant | Value and purpose |
|---|---|
PdfBidiMaxDepth | 125, den maksimale eksplicitte nesting-dybde, X1 tillader; embeddings og isolates forbi den tælles som overflow i stedet for at hæve niveauet |
| Value | Meaning |
|---|---|
pbdAuto | Afleder afsnitsniveauet ud fra det første stærke tegn, jf. P2-P3 |
pbdLeftToRight | Tvinger afsnitsniveau 0 |
pbdRightToLeft | Tvinger afsnitsniveau 1 |
| Value | Bidi_Class and category |
|---|---|
bcL | Left_To_Right, stærk |
bcR | Right_To_Left, stærk |
bcAL | Arabic_Letter, stærk; bliver bcR under W3 |
bcEN | European_Number, svag |
bcES | European_Separator, svag |
bcET | European_Terminator, svag |
bcAN | Arabic_Number, svag |
bcCS | Common_Separator, svag |
bcNSM | Nonspacing_Mark, svag; overtager den foregående tegns klasse under W1 |
bcBN | Boundary_Neutral, svag; fjernes af X9 |
bcB | Paragraph_Separator, neutral; afslutter hver embedding under X8 |
bcS | Segment_Separator, neutral |
bcWS | White_Space, neutral |
bcON | Other_Neutral, neutral; den klasse, parenteser bærer ind i N0 |
bcLRE | Left_To_Right_Embedding, eksplicit formatering |
bcLRO | Left_To_Right_Override, eksplicit formatering |
bcRLE | Right_To_Left_Embedding, eksplicit formatering |
bcRLO | Right_To_Left_Override, eksplicit formatering |
bcPDF | Pop_Directional_Format, eksplicit formatering; pop'er en embedding under X7 |
bcLRI | Left_To_Right_Isolate, isolate-initiator |
bcRLI | Right_To_Left_Isolate, isolate-initiator |
bcFSI | First_Strong_Isolate, isolate-initiator, hvis retning kommer fra det første stærke tegn frem til det matchende bcPDI |
bcPDI | Pop_Directional_Isolate, afslutter en isolate under X6a |
bcB-separator inde i Text nulstiller alle åbne embeddings under X8, så tekst med flere afsnit bør splittes op inden opløsningenLength(Levels) er lig Length(Text), og et surrogatpar optager to poster med samme niveauPdfBidiVisualOrder ikke ser noget hul i niveau-arrayetPdfBidiVisualOrder returnerer identitetsrækkefølgen, når intet ulige niveau er til stede, fordi logisk rækkefølge i det tilfælde allerede er visuel rækkefølgeTPdfBidiLevels og TPdfBidiOrder er dynamiske arrays, der ejes af kalderen og frigives ved den sædvanlige referencetælling