PDFium Delphi Component Docs

หน่วย FPdfBidi

Unit: FPdfBidi
การ implement Unicode Bidirectional Algorithm (UAX #9) ที่หา embedding level และลำดับการแสดงผลของข้อความที่มีทิศทางผสม

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 implement Unicode Bidirectional Algorithm ตามที่ UAX #9 กำหนด ซึ่งเป็นตัวชี้ทิศทางและลำดับการแสดงผลของข้อความที่มีทิศทางผสม ก่อนที่ข้อความจะถูกวัดขนาดหรือวาด ส่วนขั้นตอน shaping ทำงานกับ run ที่ทิศทางและสคริปต์ถูกตัดสินไปแล้ว ผู้เรียกจึงต้องหาทิศทางนั้นให้เสร็จก่อน

ยูนิตนี้ครอบคลุมกฎ P2-P3 สำหรับระดับย่อหน้า X1-X10 สำหรับ explicit level และ isolating run sequence W1-W7 สำหรับชนิด weak N0-N2 สำหรับคู่วงเล็บและอักขระกลาง I1-I2 สำหรับ implicit level และ L1-L2 สำหรับการรีเซ็ตระดับและการจัดลำดับใหม่ รวมถึง isolate initiator และคู่วงเล็บตาม BD16

การหาค่าทำงานบน code point แทนที่จะเป็น UTF-16 code unit แล้วค่อยขยายระดับที่ได้กลับลงบน code unit ในตอนจบ ทั้งสองครึ่งของ surrogate pair จึงมีระดับเท่ากัน

PdfResolveBidiLevels เป็น entry point หลัก: Direction เลือกการสแกน P2-P3 ผ่าน pbdAuto หรือบังคับระดับย่อหน้า Levels รับ embedding level หนึ่งค่าต่อ code unit ของ Text และ ParagraphLevel รับระดับที่ย่อหน้าตกลงใช้ ผลลัพธ์เป็น False เฉพาะเมื่ออินพุตว่างเปล่า และ Levels มีขนาดเท่ากับ Length(Text) เสมอ

PdfBidiVisualOrder ใช้กฎ L2 กับระดับเหล่านั้น แล้วคืนดัชนี code unit เชิงตรรกะที่ควรอยู่แต่ละตำแหน่งการแสดงผล องค์ประกอบตัวที่ศูนย์ของผลลัพธ์จึงเป็น code unit ที่วาดอยู่ซ้ายสุด ต้องมี Text เพื่อรักษา surrogate pair ให้อยู่ด้วยกัน เพราะการสลับ code unit ทั้งสองจะทำให้คู่นั้นกลายเป็น surrogate สองตัวที่ไม่มีคู่

PdfBidiClassOf เปิดเผยการค้น Bidi_Class ตรง ๆ ตารางมาจาก Unicode Character Database แล้วยุบเป็นช่วง ๆ code point ที่ฐานข้อมูลไม่ได้กำหนดจะ fallback ไปใช้ช่วงเริ่มต้นที่ UAX #9 กำหนดไว้ ได้แก่บล็อก R, AL, ET และ BN ส่วนที่เหลือเป็น L

PdfBidiIsRtlCodePoint และ PdfBidiParagraphIsRtl ตอบสองคำถามที่ผู้เรียกมักถามก่อนจัดเลย์เอาต์: code point หนึ่งตัวเป็น right-to-left แบบ strong หรือไม่ และย่อหน้าทั้งย่อหน้าตกลงเป็น right-to-left ภายใต้ P2-P3 หรือไม่

Functions

FunctionDescription
PdfBidiClassOfคืน TPdfBidiClass ของ code point หนึ่งตัว โดยใช้ตารางช่วงและค่าเริ่มต้นของ UAX #9 สำหรับ code point ที่ฐานข้อมูลไม่ได้กำหนด
PdfBidiIsRtlCodePointคืน True เมื่อ code point เป็นอักขระ right-to-left แบบ strong คือ bcR หรือ bcAL
PdfResolveBidiLevelsหา embedding level หนึ่งค่าต่อ UTF-16 code unit ของ Text ลงใน Levels และรายงานระดับย่อหน้าใน ParagraphLevel คืน False เฉพาะเมื่ออินพุตว่างเปล่า
PdfBidiVisualOrderใช้การจัดลำดับใหม่ L2 กับ Levels แล้วคืนดัชนี code unit เชิงตรรกะสำหรับแต่ละตำแหน่งการแสดงผล โดยรักษา surrogate pair ให้คงอยู่ครบ
PdfBidiParagraphIsRtlคืน True เมื่อ Text ตกลงเป็นระดับย่อหน้า right-to-left ภายใต้ P2-P3

Types

TypePurpose
EPdfBidiErrorคลาสข้อยกเว้นที่ยูนิตประกาศไว้สำหรับความล้มเหลวด้าน bidi สืบทอดจาก Exception
TPdfBidiClassBidi_Class ของ code point เรียงตามลำดับค่าใน UAX #9 Table 4
TPdfBidiParagraphDirectionเลือกระหว่างการตรวจหาตาม P2-P3 กับการบังคับทิศทางย่อหน้า
TPdfBidiLevelsarray of Byte เก็บ embedding level ที่หาได้หนึ่งค่าต่อ UTF-16 code unit
TPdfBidiOrderarray of Integer เก็บดัชนี code unit เชิงตรรกะเรียงตามลำดับการแสดงผล

Constants

ConstantValue and purpose
PdfBidiMaxDepth125 คือความลึกการซ้อนแบบ explicit สูงสุดที่ X1 ยอมให้ embedding และ isolate ที่เกินจะถูกนับเป็น overflow แทนที่จะเพิ่มระดับ

TPdfBidiParagraphDirection values

ValueMeaning
pbdAutoหาระดับย่อหน้าจากอักขระ strong ตัวแรก ตาม P2-P3
pbdLeftToRightบังคับระดับย่อหน้า 0
pbdRightToLeftบังคับระดับย่อหน้า 1

TPdfBidiClass values

ValueBidi_Class and category
bcLLeft_To_Right, strong
bcRRight_To_Left, strong
bcALArabic_Letter, strong; กลายเป็น bcR ภายใต้ W3
bcENEuropean_Number, weak
bcESEuropean_Separator, weak
bcETEuropean_Terminator, weak
bcANArabic_Number, weak
bcCSCommon_Separator, weak
bcNSMNonspacing_Mark, weak; รับคลาสของอักขระก่อนหน้าภายใต้ W1
bcBNBoundary_Neutral, weak; ถูกลบโดย X9
bcBParagraph_Separator, neutral; สิ้นสุด embedding ทุกชั้นภายใต้ X8
bcSSegment_Separator, neutral
bcWSWhite_Space, neutral
bcONOther_Neutral, neutral; คลาสที่วงเล็บถือเข้าไปใน N0
bcLRELeft_To_Right_Embedding, explicit formatting
bcLROLeft_To_Right_Override, explicit formatting
bcRLERight_To_Left_Embedding, explicit formatting
bcRLORight_To_Left_Override, explicit formatting
bcPDFPop_Directional_Format, explicit formatting; ปิด embedding หนึ่งชั้นภายใต้ X7
bcLRILeft_To_Right_Isolate, isolate initiator
bcRLIRight_To_Left_Isolate, isolate initiator
bcFSIFirst_Strong_Isolate, isolate initiator ที่ทิศทางมาจากอักขระ strong ตัวแรกจนถึง bcPDI ที่จับคู่กัน
bcPDIPop_Directional_Isolate, สิ้นสุด isolate ภายใต้ X6a

Remarks

See Also

FPdfTextShaping, TPdf.AddShapedText, TPdf.FocusedFormFieldTextDirection