pdfnative 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shaping/thai-shaper.ts","../../src/shaping/script-detect.ts","../../src/shaping/multi-font.ts","../../src/fonts/encoding.ts","../../src/shaping/script-registry.ts","../../src/shaping/bengali-shaper.ts","../../src/shaping/tamil-shaper.ts","../../src/shaping/devanagari-shaper.ts","../../src/shaping/arabic-shaper.ts","../../src/shaping/bidi.ts","../../src/core/encoding-context.ts","../../src/fonts/font-embedder.ts","../../src/fonts/font-loader.ts","../../src/fonts/font-subsetter.ts","../../src/core/pdf-tags.ts","../../src/core/pdf-text.ts","../../src/core/pdf-stream.ts","../../src/core/pdf-layout.ts","../../src/core/pdf-color.ts","../../src/core/pdf-assembler.ts","../../src/core/pdf-builder.ts","../../src/worker/pdf-worker.ts"],"names":["i","isConsonant","HALANT","NUKTA","RA","hex","shaped","pos","pdfString"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * pdfnative — Thai Mini-Shaper\r\n * =============================\r\n * Pure JS OpenType GSUB + GPOS shaping for Thai script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - GSUB SingleSubst: tall consonant → short variant (ป ฝ ฟ ฬ)\r\n * - GPOS MarkToBase: above/below vowels + tone marks anchoring\r\n * - GPOS MarkToMark: stacking marks (tone above vowel)\r\n * - Sara Am (U+0E33) decomposition → nikhahit + sara aa\r\n *\r\n * References:\r\n * - Unicode Standard §16.4 Thai\r\n * - OpenType spec §6.2 GSUB LookupType 1, §7.4 GPOS LookupType 4\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\n\r\n// ── Thai Unicode Constants ───────────────────────────────────────────\r\n\r\n/** Thai Unicode block range */\r\nexport const THAI_START = 0x0E00;\r\nexport const THAI_END = 0x0E7F;\r\n\r\n/**\r\n * Thai character classification by combining class.\r\n * 0 = consonant / base\r\n * 1 = above vowel / tone (renders above base)\r\n * 2 = below vowel (renders below base)\r\n * 3 = leading vowel (renders before base, zero-width)\r\n * 4 = following vowel (renders after base at x-advance)\r\n */\r\nconst THAI_CLASS: Record<number, number> = {\r\n // Leading vowels\r\n 0x0E40: 3, 0x0E41: 3, 0x0E42: 3, 0x0E43: 3, 0x0E44: 3,\r\n // Above-base marks: above vowels\r\n 0x0E31: 1, 0x0E34: 1, 0x0E35: 1, 0x0E36: 1, 0x0E37: 1,\r\n 0x0E47: 1, 0x0E4D: 1, 0x0E4E: 1,\r\n // Above-base marks: tone marks\r\n 0x0E48: 1, 0x0E49: 1, 0x0E4A: 1, 0x0E4B: 1,\r\n // Below-base marks: below vowels\r\n 0x0E38: 2, 0x0E39: 2, 0x0E3A: 2,\r\n // Thanthakhat (cancellation mark) — above\r\n 0x0E4C: 1,\r\n};\r\n\r\n/**\r\n * Tall consonants whose ascender may clash with above marks.\r\n * ป (U+0E1B), ฝ (U+0E1D), ฟ (U+0E1F), ฬ (U+0E2C)\r\n */\r\nconst TALL_CONSONANTS = new Set([0x0E1B, 0x0E1D, 0x0E1F, 0x0E2C]);\r\n\r\n// ── Interface for cluster ────────────────────────────────────────────\r\n\r\ninterface ThaiCluster {\r\n base: number;\r\n aboves: number[];\r\n belows: number[];\r\n leadings: number[];\r\n}\r\n\r\n// ── Cluster Builder ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Build text clusters: each cluster = { base, aboves, belows, leadings }.\r\n * Sara Am (U+0E33) is decomposed into Nikhahit (U+0E4D) + Sara Aa (U+0E32).\r\n */\r\nexport function buildThaiClusters(str: string): ThaiCluster[] {\r\n const clusters: ThaiCluster[] = [];\r\n let i = 0;\r\n while (i < str.length) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n const step = cp > 0xFFFF ? 2 : 1;\r\n\r\n // Sara Am decomposition — U+0E33 → U+0E4D (nikhahit) + U+0E32 (sara aa)\r\n if (cp === 0x0E33) {\r\n if (clusters.length > 0) {\r\n clusters[clusters.length - 1].aboves.push(0x0E4D);\r\n } else {\r\n clusters.push({ base: 0x0E4D, aboves: [], belows: [], leadings: [] });\r\n }\r\n clusters.push({ base: 0x0E32, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n continue;\r\n }\r\n\r\n const cls = THAI_CLASS[cp];\r\n\r\n if (cls === 3) {\r\n // Leading vowel — belongs to the NEXT base consonant\r\n const nextI = i + step;\r\n const nextCp = nextI < str.length ? (str.codePointAt(nextI) ?? 0) : 0;\r\n const nextStep = nextCp > 0xFFFF ? 2 : 1;\r\n if (nextCp && !THAI_CLASS[nextCp]) {\r\n clusters.push({ base: nextCp, aboves: [], belows: [], leadings: [cp] });\r\n i += step + nextStep;\r\n } else {\r\n clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n }\r\n } else if (!cls || cls === 4) {\r\n clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n } else if (cls === 1) {\r\n if (clusters.length > 0) clusters[clusters.length - 1].aboves.push(cp);\r\n else clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n } else if (cls === 2) {\r\n if (clusters.length > 0) clusters[clusters.length - 1].belows.push(cp);\r\n else clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n } else {\r\n i += step;\r\n }\r\n }\r\n return clusters;\r\n}\r\n\r\n// ── Thai Shaper ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Thai text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Thai string\r\n * @param fontData - Font data with cmap, gsub, markAnchors, mark2mark, metrics, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeThaiText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, gsub, markAnchors, widths, defaultWidth } = fontData;\r\n const m2m = fontData.mark2mark || { mark1Anchors: {}, mark2Classes: {} };\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function normCp(cp: number): number {\r\n return (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n }\r\n\r\n function resolveGid(cp: number, applyGsub = false): number {\r\n const baseGid = cmap[normCp(cp)] || 0;\r\n if (applyGsub && gsub[baseGid] !== undefined) return gsub[baseGid];\r\n return baseGid;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function getMark2MarkOffset(mark1Gid: number, mark2Gid: number): { dx: number; dy: number } | null {\r\n const m1Anchor = m2m.mark1Anchors && m2m.mark1Anchors[mark1Gid];\r\n const m2Class = m2m.mark2Classes && m2m.mark2Classes[mark2Gid];\r\n if (!m1Anchor || !m2Class) return null;\r\n const classIdx = m2Class[0];\r\n const m1Pt = m1Anchor[classIdx];\r\n if (!m1Pt) return null;\r\n return { dx: m1Pt[0] - m2Class[1], dy: m1Pt[1] - m2Class[2] };\r\n }\r\n\r\n function resolveMarkGid(markCp: number, applyGsub: boolean): number {\r\n const gid = cmap[markCp] || 0;\r\n if (applyGsub && gsub[gid] !== undefined) return gsub[gid];\r\n return gid;\r\n }\r\n\r\n const clusters = buildThaiClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const hasAbove = cluster.aboves.length > 0;\r\n const hasBelow = cluster.belows.length > 0;\r\n\r\n const baseGid = resolveGid(cluster.base, hasAbove || hasBelow);\r\n const baseAdv = getAdv(baseGid);\r\n const isTallBase = TALL_CONSONANTS.has(cluster.base);\r\n\r\n // Leading vowels\r\n for (const lvCp of cluster.leadings) {\r\n const lvGid = cmap[lvCp] || 0;\r\n shaped.push({ gid: lvGid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n\r\n // Base glyph\r\n shaped.push({ gid: baseGid, dx: 0, dy: 0, isZeroAdvance: false });\r\n\r\n // Above marks with Mark-to-Mark stacking\r\n let prevAboveMarkGid: number | null = null;\r\n let prevAboveMarkDx = 0;\r\n let prevAboveMarkDy = 0;\r\n for (let ai = 0; ai < cluster.aboves.length; ai++) {\r\n const abvCp = cluster.aboves[ai];\r\n const markGid = resolveMarkGid(abvCp, isTallBase);\r\n const markAnchor = getMarkAnchor(markGid);\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n if (ai > 0 && prevAboveMarkGid !== null) {\r\n const m2mOffset = getMark2MarkOffset(prevAboveMarkGid, markGid);\r\n if (m2mOffset) {\r\n dx = prevAboveMarkDx + m2mOffset.dx;\r\n dy = prevAboveMarkDy + m2mOffset.dy;\r\n } else if (markAnchor) {\r\n const baseAnchor = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchor) {\r\n dx = baseAnchor[0] - markAnchor.x - baseAdv;\r\n dy = baseAnchor[1] - markAnchor.y;\r\n }\r\n }\r\n } else {\r\n if (markAnchor) {\r\n const baseAnchor = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchor) {\r\n dx = baseAnchor[0] - markAnchor.x - baseAdv;\r\n dy = baseAnchor[1] - markAnchor.y;\r\n }\r\n }\r\n }\r\n\r\n shaped.push({ gid: markGid, dx, dy, isZeroAdvance: true });\r\n prevAboveMarkGid = markGid;\r\n prevAboveMarkDx = dx;\r\n prevAboveMarkDy = dy;\r\n }\r\n\r\n // Below marks\r\n for (const blwCp of cluster.belows) {\r\n const markGid = cmap[blwCp] || 0;\r\n const markAnchor = getMarkAnchor(markGid);\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n if (markAnchor) {\r\n const baseAnchor = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchor) {\r\n dx = baseAnchor[0] - markAnchor.x - baseAdv;\r\n dy = baseAnchor[1] - markAnchor.y;\r\n }\r\n }\r\n\r\n shaped.push({ gid: markGid, dx, dy, isZeroAdvance: true });\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n\r\n/**\r\n * Check whether a string contains any Thai characters.\r\n */\r\nexport function containsThai(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c >= THAI_START && c <= THAI_END) return true;\r\n }\r\n return false;\r\n}\r\n","/**\r\n * pdfnative — Script Detection\r\n * =============================\r\n * Detects Unicode script ranges in text to determine which fonts are needed.\r\n */\r\n\r\n/**\r\n * Languages requiring Unicode font embedding (non-WinAnsi scripts).\r\n * Latin-script languages using Helvetica built-in don't need embedding.\r\n */\r\nexport function needsUnicodeFont(lang: string): boolean {\r\n return ['th', 'ja', 'zh', 'ko', 'el', 'hi', 'tr', 'vi', 'pl', 'ar', 'he', 'ru', 'ka', 'hy'].includes(lang);\r\n}\r\n\r\n/**\r\n * Detect which additional font languages are needed to render user text\r\n * containing scripts foreign to the primary language.\r\n *\r\n * @param texts - User-visible strings (labels, categories, account names)\r\n * @param primaryLang - Current language code\r\n * @returns Language codes needing fallback fonts (excluding primaryLang)\r\n */\r\nexport function detectFallbackLangs(texts: string[], primaryLang: string): Set<string> {\r\n const needed = new Set<string>();\r\n for (const text of texts) {\r\n if (!text) continue;\r\n for (let i = 0; i < text.length; i++) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) i++;\r\n // Greek and Coptic + Greek Extended → 'el'\r\n if ((cp >= 0x0370 && cp <= 0x03FF) || (cp >= 0x1F00 && cp <= 0x1FFF)) { needed.add('el'); continue; }\r\n // Devanagari + Devanagari Extended → 'hi'\r\n if ((cp >= 0x0900 && cp <= 0x097F) || (cp >= 0xA8E0 && cp <= 0xA8FF)) { needed.add('hi'); continue; }\r\n // Thai script → 'th'\r\n if (cp >= 0x0E00 && cp <= 0x0E7F) { needed.add('th'); continue; }\r\n // Hiragana / Katakana → 'ja'\r\n if (cp >= 0x3040 && cp <= 0x30FF) { needed.add('ja'); continue; }\r\n // Hangul Syllables + Jamo + Compat Jamo → 'ko'\r\n if ((cp >= 0xAC00 && cp <= 0xD7AF) || (cp >= 0x1100 && cp <= 0x11FF) ||\r\n (cp >= 0x3130 && cp <= 0x318F)) { needed.add('ko'); continue; }\r\n // CJK Unified Ideographs → default to 'zh' (SC has broadest coverage)\r\n if ((cp >= 0x4E00 && cp <= 0x9FFF) || (cp >= 0x3400 && cp <= 0x4DBF) ||\r\n (cp >= 0xF900 && cp <= 0xFAFF)) {\r\n if (!['ja', 'zh', 'ko'].includes(primaryLang)) needed.add('zh');\r\n continue;\r\n }\r\n // Currency symbols\r\n if (cp === 0x20A9 || cp === 0xFFE6) { needed.add('ko'); continue; }\r\n if (cp === 0x20B9) { needed.add('hi'); continue; }\r\n if (cp === 0xFFE5) { needed.add('ja'); continue; }\r\n // Latin Extended Additional → Vietnamese\r\n if ((cp >= 0x1E00 && cp <= 0x1EFF) || cp === 0x20AB || cp === 0x0110 || cp === 0x0111 || cp === 0x0103 || cp === 0x0102) { needed.add('vi'); continue; }\r\n // Polish-specific Latin Extended-A chars\r\n if (cp === 0x0104 || cp === 0x0105 || cp === 0x0106 || cp === 0x0107 ||\r\n cp === 0x0118 || cp === 0x0119 || cp === 0x0141 || cp === 0x0142 ||\r\n cp === 0x0143 || cp === 0x0144 || cp === 0x015A || cp === 0x015B ||\r\n cp === 0x0179 || cp === 0x017A || cp === 0x017B || cp === 0x017C) { needed.add('pl'); continue; }\r\n // Latin Extended-A → Turkish special chars + Turkish Lira\r\n if ((cp >= 0x0100 && cp <= 0x017F) || cp === 0x20BA) { needed.add('tr'); continue; }\r\n // Hebrew → 'he'\r\n if (cp >= 0x0590 && cp <= 0x05FF) { needed.add('he'); continue; }\r\n // Arabic → 'ar'\r\n if ((cp >= 0x0600 && cp <= 0x06FF) || (cp >= 0x0750 && cp <= 0x077F) || (cp >= 0xFB50 && cp <= 0xFDFF) || (cp >= 0xFE70 && cp <= 0xFEFF)) { needed.add('ar'); continue; }\r\n // Cyrillic + Cyrillic Supplement → 'ru'\r\n if ((cp >= 0x0400 && cp <= 0x04FF) || (cp >= 0x0500 && cp <= 0x052F)) { needed.add('ru'); continue; }\r\n // Georgian + Georgian Supplement → 'ka'\r\n if ((cp >= 0x10A0 && cp <= 0x10FF) || (cp >= 0x2D00 && cp <= 0x2D2F)) { needed.add('ka'); continue; }\r\n // Armenian + Armenian Ligatures → 'hy'\r\n if ((cp >= 0x0530 && cp <= 0x058F) || (cp >= 0xFB13 && cp <= 0xFB17)) { needed.add('hy'); continue; }\r\n }\r\n }\r\n needed.delete(primaryLang);\r\n return needed;\r\n}\r\n\r\n/**\r\n * Detect the preferred font language for a single Unicode codepoint.\r\n * Returns the language code of the font most appropriate for rendering.\r\n *\r\n * @param cp - Unicode codepoint\r\n * @returns Language code ('el', 'hi', 'th', 'ja', 'ko', 'zh', 'vi', 'pl', 'tr', 'he', 'ar', 'ru', 'ka', 'hy') or null for Latin/common\r\n */\r\nexport function detectCharLang(cp: number): string | null {\r\n if ((cp >= 0x0370 && cp <= 0x03FF) || (cp >= 0x1F00 && cp <= 0x1FFF)) return 'el';\r\n if ((cp >= 0x0900 && cp <= 0x097F) || (cp >= 0xA8E0 && cp <= 0xA8FF)) return 'hi';\r\n if (cp >= 0x0E00 && cp <= 0x0E7F) return 'th';\r\n if (cp >= 0x3040 && cp <= 0x30FF) return 'ja';\r\n if ((cp >= 0xAC00 && cp <= 0xD7AF) || (cp >= 0x1100 && cp <= 0x11FF) || (cp >= 0x3130 && cp <= 0x318F)) return 'ko';\r\n if ((cp >= 0x4E00 && cp <= 0x9FFF) || (cp >= 0x3400 && cp <= 0x4DBF) || (cp >= 0xF900 && cp <= 0xFAFF)) return 'zh';\r\n if ((cp >= 0x1E00 && cp <= 0x1EFF) || cp === 0x20AB || cp === 0x0110 || cp === 0x0111 || cp === 0x0103 || cp === 0x0102) return 'vi';\r\n if (cp === 0x0104 || cp === 0x0105 || cp === 0x0106 || cp === 0x0107 ||\r\n cp === 0x0118 || cp === 0x0119 || cp === 0x0141 || cp === 0x0142 ||\r\n cp === 0x0143 || cp === 0x0144 || cp === 0x015A || cp === 0x015B ||\r\n cp === 0x0179 || cp === 0x017A || cp === 0x017B || cp === 0x017C) return 'pl';\r\n if ((cp >= 0x0100 && cp <= 0x017F) || cp === 0x20BA) return 'tr';\r\n // Hebrew\r\n if (cp >= 0x0590 && cp <= 0x05FF) return 'he';\r\n // Arabic + Arabic Supplement + Arabic Presentation Forms\r\n if ((cp >= 0x0600 && cp <= 0x06FF) || (cp >= 0x0750 && cp <= 0x077F) || (cp >= 0xFB50 && cp <= 0xFDFF) || (cp >= 0xFE70 && cp <= 0xFEFF)) return 'ar';\r\n // Cyrillic + Cyrillic Supplement\r\n if ((cp >= 0x0400 && cp <= 0x04FF) || (cp >= 0x0500 && cp <= 0x052F)) return 'ru';\r\n // Georgian + Georgian Supplement\r\n if ((cp >= 0x10A0 && cp <= 0x10FF) || (cp >= 0x2D00 && cp <= 0x2D2F)) return 'ka';\r\n // Armenian + Armenian Ligatures\r\n if ((cp >= 0x0530 && cp <= 0x058F) || (cp >= 0xFB13 && cp <= 0xFB17)) return 'hy';\r\n return null;\r\n}\r\n","/**\r\n * pdfnative — Multi-Font Text Run Splitter\r\n * ==========================================\r\n * Split text into runs, each assigned to the font whose cmap covers it.\r\n * Uses \"continuation bias\": if the current font covers the next codepoint,\r\n * it stays in the same run (minimizes font switches on shared Latin/space chars).\r\n */\r\n\r\nimport type { FontEntry } from '../types/pdf-types.js';\r\nimport { detectCharLang } from './script-detect.js';\r\n\r\n/** A text run with its assigned font entry */\r\nexport interface FontRun {\r\n text: string;\r\n entry: FontEntry;\r\n}\r\n\r\n/**\r\n * Split a string into text runs, each assigned to the font whose cmap covers it.\r\n *\r\n * @param str - Input text\r\n * @param fontEntries - Font list (primary first)\r\n * @returns Runs with assigned font entry\r\n */\r\nexport function splitTextByFont(str: string, fontEntries: FontEntry[]): FontRun[] {\r\n if (!str || fontEntries.length === 0) return [];\r\n if (fontEntries.length === 1) return [{ text: str, entry: fontEntries[0] }];\r\n\r\n const runs: FontRun[] = [];\r\n let currentEntry: FontEntry | null = null;\r\n let currentText = '';\r\n\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n const charLen = cp > 0xFFFF ? 2 : 1;\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n const char = str.substring(i, i + charLen);\r\n\r\n // Continuation bias: if current font covers this cp, keep going\r\n if (currentEntry && currentEntry.fontData.cmap[normCp]) {\r\n currentText += char;\r\n i += charLen;\r\n continue;\r\n }\r\n\r\n // Find best font entry whose cmap covers this codepoint.\r\n // Prefer font whose lang matches the codepoint's script.\r\n let newEntry: FontEntry | null = null;\r\n const charLang = detectCharLang(normCp);\r\n if (charLang) {\r\n for (const fe of fontEntries) {\r\n if (fe.lang === charLang && fe.fontData.cmap[normCp]) { newEntry = fe; break; }\r\n }\r\n }\r\n if (!newEntry) {\r\n for (const fe of fontEntries) {\r\n if (fe.fontData.cmap[normCp]) { newEntry = fe; break; }\r\n }\r\n }\r\n // If no font covers it, fall back to primary (will render .notdef)\r\n if (!newEntry) newEntry = fontEntries[0];\r\n\r\n // Font switch → flush current run\r\n if (newEntry !== currentEntry) {\r\n if (currentText && currentEntry) runs.push({ text: currentText, entry: currentEntry });\r\n currentEntry = newEntry;\r\n currentText = char;\r\n } else {\r\n currentText += char;\r\n }\r\n i += charLen;\r\n }\r\n if (currentText && currentEntry) runs.push({ text: currentText, entry: currentEntry });\r\n return runs;\r\n}\r\n","/**\r\n * pdfnative — WinAnsi Encoding\r\n * ==============================\r\n * Text encoding and font reference logic for Latin (WinAnsi/Helvetica)\r\n * and Unicode (CIDFont/Identity-H) modes.\r\n */\r\n\r\nimport type { FontEntry, TextRun, EncodingContext } from '../types/pdf-types.js';\r\nimport { shapeThaiText, containsThai } from '../shaping/thai-shaper.js';\r\nimport { splitTextByFont } from '../shaping/multi-font.js';\r\n\r\n// ── WinAnsi Encoding ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Encode a JavaScript string to WinAnsiEncoding (ISO-8859-1 superset).\r\n * Characters outside this encoding are replaced with '?'.\r\n */\r\nexport function toWinAnsi(str: string): string {\r\n if (!str) return '';\r\n let r = '';\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c >= 0x20 && c <= 0x7E) r += str[i];\r\n else if (c >= 0xA0 && c <= 0xFF) r += str[i];\r\n // CP1252 0x80–0x9F — punctuation & symbols absent from ISO-8859-1\r\n else if (c === 0x20AC) r += '\\x80'; // € euro sign\r\n else if (c === 0x201A) r += '\\x82'; // ‚ single low-9 quote\r\n else if (c === 0x0192) r += '\\x83'; // ƒ latin small f with hook\r\n else if (c === 0x201E) r += '\\x84'; // „ double low-9 quote\r\n else if (c === 0x2026) r += '\\x85'; // … horizontal ellipsis\r\n else if (c === 0x2020) r += '\\x86'; // † dagger\r\n else if (c === 0x2021) r += '\\x87'; // ‡ double dagger\r\n else if (c === 0x02C6) r += '\\x88'; // ˆ modifier circumflex\r\n else if (c === 0x2030) r += '\\x89'; // ‰ per mille\r\n else if (c === 0x0160) r += '\\x8A'; // Š S with caron\r\n else if (c === 0x2039) r += '\\x8B'; // ‹ single left-pointing angle quote\r\n else if (c === 0x0152) r += '\\x8C'; // Œ ligature OE\r\n else if (c === 0x017D) r += '\\x8E'; // Ž Z with caron\r\n else if (c === 0x2018) r += '\\x91'; // ' left single quote\r\n else if (c === 0x2019) r += '\\x92'; // ' right single quote\r\n else if (c === 0x201C) r += '\\x93'; // \" left double quote\r\n else if (c === 0x201D) r += '\\x94'; // \" right double quote\r\n else if (c === 0x2022) r += '\\x95'; // • bullet\r\n else if (c === 0x2013) r += '\\x96'; // – en-dash\r\n else if (c === 0x2014) r += '\\x97'; // — em-dash\r\n else if (c === 0x02DC) r += '\\x98'; // ˜ small tilde\r\n else if (c === 0x2122) r += '\\x99'; // ™ trademark\r\n else if (c === 0x0161) r += '\\x9A'; // š s with caron\r\n else if (c === 0x203A) r += '\\x9B'; // › single right-pointing angle quote\r\n else if (c === 0x0153) r += '\\x9C'; // œ ligature oe\r\n else if (c === 0x017E) r += '\\x9E'; // ž z with caron\r\n else if (c === 0x0178) r += '\\x9F'; // Ÿ Y with diaeresis\r\n else if (c === 0xA0 || c === 0x202F) r += ' ';\r\n else if (c === 0x09 || c === 0x0A || c === 0x0D) r += ' ';\r\n else if (c < 0x20) { /* skip control chars */ }\r\n else r += '?';\r\n }\r\n return r;\r\n}\r\n\r\n/**\r\n * Create a PDF string literal: encode to WinAnsi and escape (, ), \\.\r\n */\r\nexport function pdfString(str: string): string {\r\n const s = toWinAnsi(str);\r\n return '(' + s.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)') + ')';\r\n}\r\n\r\n/** Truncate string to max characters, appending '..' if needed. */\r\nexport function truncate(str: string, max: number): string {\r\n if (!str || str.length <= max) return str || '';\r\n if (max <= 2) return '..';\r\n return str.slice(0, max - 2) + '..';\r\n}\r\n\r\n/**\r\n * Approximate text width in points using Helvetica character metrics.\r\n */\r\nexport function helveticaWidth(str: string, sz: number): number {\r\n let w = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) i++; // skip surrogate pair\r\n if (cp >= 48 && cp <= 57) w += 556;\r\n else if (cp >= 65 && cp <= 90) w += 680;\r\n else if (cp >= 97 && cp <= 122) w += 500;\r\n else if (cp === 32) w += 278;\r\n else if (cp === 46 || cp === 44) w += 278;\r\n else if (cp === 43) w += 584;\r\n else if (cp === 45) w += 333;\r\n else if (cp === 47 || cp === 58) w += 278;\r\n // Unicode typographic characters\r\n else if (cp === 0x2014) w += 1000; // em-dash\r\n else if (cp === 0x2013) w += 556; // en-dash\r\n else if (cp === 0x2026) w += 1000; // ellipsis\r\n else if (cp === 0x2018 || cp === 0x2019) w += 222; // single curly quotes\r\n else if (cp === 0x201C || cp === 0x201D) w += 333; // double curly quotes\r\n else if (cp === 0x20AC) w += 556; // Euro sign\r\n else w += 556;\r\n }\r\n return w * sz / 1000;\r\n}\r\n\r\n// ── Encoding Context Factory ─────────────────────────────────────────\r\n\r\n/**\r\n * Create an encoding context that encapsulates text encoding and font reference logic.\r\n * Latin mode uses WinAnsi/Helvetica, Unicode mode uses CIDFont/Identity-H.\r\n *\r\n * @param fontEntries - Array of font entries (primary first). Empty = Latin mode.\r\n */\r\nexport function createEncodingContext(fontEntries: FontEntry[]): EncodingContext {\r\n if (!fontEntries || fontEntries.length === 0) {\r\n return {\r\n isUnicode: false,\r\n fontEntries: [],\r\n ps: pdfString,\r\n tw: helveticaWidth,\r\n textRuns: () => [],\r\n f1: '/F1',\r\n f2: '/F2'\r\n };\r\n }\r\n\r\n const primary = fontEntries[0];\r\n\r\n // Track used glyph IDs per font for subsetting\r\n const _usedGids = new Map<string, Set<number>>();\r\n for (const fe of fontEntries) _usedGids.set(fe.fontRef, new Set());\r\n\r\n function _trackGid(fontRef: string, gid: number): void {\r\n const s = _usedGids.get(fontRef);\r\n if (s) s.add(gid);\r\n }\r\n\r\n return {\r\n isUnicode: true,\r\n fontEntries,\r\n fontData: primary.fontData,\r\n f1: primary.fontRef,\r\n f2: primary.fontRef,\r\n getUsedGids() { return _usedGids; },\r\n\r\n textRuns(str: string, sz: number): TextRun[] {\r\n if (!str) return [];\r\n const rawRuns = splitTextByFont(str, fontEntries);\r\n return rawRuns.map(run => {\r\n const fd = run.entry.fontData;\r\n const upm = fd.metrics.unitsPerEm;\r\n const fontRef = run.entry.fontRef;\r\n\r\n if (containsThai(run.text)) {\r\n const shaped = shapeThaiText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return { text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm };\r\n }\r\n\r\n let hex = '';\r\n let designW = 0;\r\n for (let i = 0; i < run.text.length; i++) {\r\n const rawCp = run.text.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = fd.cmap[cp] || 0;\r\n _trackGid(fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n const gw = fd.widths[gid];\r\n designW += gw !== undefined ? gw : fd.defaultWidth;\r\n }\r\n return { text: run.text, fontRef, fontData: fd, shaped: null, hexStr: '<' + hex.toUpperCase() + '>', widthPt: designW * sz / upm };\r\n });\r\n },\r\n\r\n ps(str: string): string {\r\n if (!str) return '<>';\r\n const { cmap } = primary.fontData;\r\n if (!containsThai(str)) {\r\n let hex = '';\r\n for (let i = 0; i < str.length; i++) {\r\n const rawCp = str.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = cmap[cp] || 0;\r\n _trackGid(primary.fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n }\r\n return '<' + hex.toUpperCase() + '>';\r\n }\r\n const shaped = shapeThaiText(str, primary.fontData);\r\n let hex = '';\r\n for (const g of shaped) { _trackGid(primary.fontRef, g.gid); hex += g.gid.toString(16).padStart(4, '0'); }\r\n return '<' + hex.toUpperCase() + '>';\r\n },\r\n\r\n tw(str: string, sz: number): number {\r\n if (!str) return 0;\r\n const runs = this.textRuns(str, sz);\r\n let total = 0;\r\n for (const run of runs) total += run.widthPt;\r\n return total;\r\n },\r\n };\r\n}\r\n","/**\r\n * pdfnative — Script Registry\r\n * ============================\r\n * Centralised Unicode range constants and script detection predicates.\r\n * Single source of truth for all script identification logic.\r\n */\r\n\r\n// ── Arabic ───────────────────────────────────────────────────────────\r\n\r\n/** Arabic Unicode block start. */\r\nexport const ARABIC_START = 0x0600;\r\n/** Arabic Unicode block end. */\r\nexport const ARABIC_END = 0x06FF;\r\n/** Arabic Supplement block. */\r\nexport const ARABIC_SUPPLEMENT_START = 0x0750;\r\nexport const ARABIC_SUPPLEMENT_END = 0x077F;\r\n/** Arabic Extended-A block. */\r\nexport const ARABIC_EXTENDED_A_START = 0x08A0;\r\nexport const ARABIC_EXTENDED_A_END = 0x08FF;\r\n/** Arabic Presentation Forms-A. */\r\nexport const ARABIC_PRES_A_START = 0xFB50;\r\nexport const ARABIC_PRES_A_END = 0xFDFF;\r\n/** Arabic Presentation Forms-B. */\r\nexport const ARABIC_PRES_B_START = 0xFE70;\r\nexport const ARABIC_PRES_B_END = 0xFEFF;\r\n\r\n// ── Hebrew ───────────────────────────────────────────────────────────\r\n\r\n/** Hebrew Unicode block. */\r\nexport const HEBREW_START = 0x0590;\r\nexport const HEBREW_END = 0x05FF;\r\n/** Hebrew Presentation Forms. */\r\nexport const HEBREW_PRES_START = 0xFB1D;\r\nexport const HEBREW_PRES_END = 0xFB4F;\r\n\r\n// ── Thai ─────────────────────────────────────────────────────────────\r\n\r\n/** Thai Unicode block. */\r\nexport const THAI_START = 0x0E00;\r\nexport const THAI_END = 0x0E7F;\r\n\r\n// ── Greek ────────────────────────────────────────────────────────────\r\n\r\nexport const GREEK_START = 0x0370;\r\nexport const GREEK_END = 0x03FF;\r\nexport const GREEK_EXT_START = 0x1F00;\r\nexport const GREEK_EXT_END = 0x1FFF;\r\n\r\n// ── Devanagari ───────────────────────────────────────────────────────\r\n\r\nexport const DEVANAGARI_START = 0x0900;\r\nexport const DEVANAGARI_END = 0x097F;\r\nexport const DEVANAGARI_EXT_START = 0xA8E0;\r\nexport const DEVANAGARI_EXT_END = 0xA8FF;\r\n\r\n// ── CJK / Kana / Hangul ─────────────────────────────────────────────\r\n\r\nexport const HIRAGANA_START = 0x3040;\r\nexport const KATAKANA_END = 0x30FF;\r\nexport const HANGUL_START = 0xAC00;\r\nexport const HANGUL_END = 0xD7AF;\r\nexport const JAMO_START = 0x1100;\r\nexport const JAMO_END = 0x11FF;\r\nexport const COMPAT_JAMO_START = 0x3130;\r\nexport const COMPAT_JAMO_END = 0x318F;\r\nexport const CJK_UNIFIED_START = 0x4E00;\r\nexport const CJK_UNIFIED_END = 0x9FFF;\r\nexport const CJK_EXT_A_START = 0x3400;\r\nexport const CJK_EXT_A_END = 0x4DBF;\r\nexport const CJK_COMPAT_START = 0xF900;\r\nexport const CJK_COMPAT_END = 0xFAFF;\r\n\r\n// ── Cyrillic ─────────────────────────────────────────────────────────\r\n\r\nexport const CYRILLIC_START = 0x0400;\r\nexport const CYRILLIC_END = 0x04FF;\r\nexport const CYRILLIC_SUPPLEMENT_START = 0x0500;\r\nexport const CYRILLIC_SUPPLEMENT_END = 0x052F;\r\nexport const CYRILLIC_EXT_A_START = 0x2DE0;\r\nexport const CYRILLIC_EXT_A_END = 0x2DFF;\r\nexport const CYRILLIC_EXT_B_START = 0xA640;\r\nexport const CYRILLIC_EXT_B_END = 0xA69F;\r\n\r\n// ── Georgian ─────────────────────────────────────────────────────────\r\n\r\nexport const GEORGIAN_START = 0x10A0;\r\nexport const GEORGIAN_END = 0x10FF;\r\nexport const GEORGIAN_SUPPLEMENT_START = 0x2D00;\r\nexport const GEORGIAN_SUPPLEMENT_END = 0x2D2F;\r\n\r\n// ── Armenian ─────────────────────────────────────────────────────────\r\n\r\nexport const ARMENIAN_START = 0x0530;\r\nexport const ARMENIAN_END = 0x058F;\r\nexport const ARMENIAN_LIGATURES_START = 0xFB13;\r\nexport const ARMENIAN_LIGATURES_END = 0xFB17;\r\n\r\n// ── Bengali ──────────────────────────────────────────────────────────\r\n\r\n/** Bengali Unicode block. */\r\nexport const BENGALI_START = 0x0980;\r\nexport const BENGALI_END = 0x09FF;\r\n\r\n// ── Tamil ────────────────────────────────────────────────────────────\r\n\r\n/** Tamil Unicode block. */\r\nexport const TAMIL_START = 0x0B80;\r\nexport const TAMIL_END = 0x0BFF;\r\n\r\n// ── Script Predicates ────────────────────────────────────────────────\r\n\r\n/** Check if a codepoint falls in any Arabic Unicode block. */\r\nexport function isArabicCodepoint(cp: number): boolean {\r\n return (cp >= ARABIC_START && cp <= ARABIC_END) ||\r\n (cp >= ARABIC_SUPPLEMENT_START && cp <= ARABIC_SUPPLEMENT_END) ||\r\n (cp >= ARABIC_EXTENDED_A_START && cp <= ARABIC_EXTENDED_A_END) ||\r\n (cp >= ARABIC_PRES_A_START && cp <= ARABIC_PRES_A_END) ||\r\n (cp >= ARABIC_PRES_B_START && cp <= ARABIC_PRES_B_END);\r\n}\r\n\r\n/** Check if a codepoint falls in any Hebrew Unicode block. */\r\nexport function isHebrewCodepoint(cp: number): boolean {\r\n return (cp >= HEBREW_START && cp <= HEBREW_END) ||\r\n (cp >= HEBREW_PRES_START && cp <= HEBREW_PRES_END);\r\n}\r\n\r\n/** Check if a codepoint falls in the Thai Unicode block. */\r\nexport function isThaiCodepoint(cp: number): boolean {\r\n return cp >= THAI_START && cp <= THAI_END;\r\n}\r\n\r\n/** Check if a codepoint falls in any Cyrillic Unicode block. */\r\nexport function isCyrillicCodepoint(cp: number): boolean {\r\n return (cp >= CYRILLIC_START && cp <= CYRILLIC_END) ||\r\n (cp >= CYRILLIC_SUPPLEMENT_START && cp <= CYRILLIC_SUPPLEMENT_END) ||\r\n (cp >= CYRILLIC_EXT_A_START && cp <= CYRILLIC_EXT_A_END) ||\r\n (cp >= CYRILLIC_EXT_B_START && cp <= CYRILLIC_EXT_B_END);\r\n}\r\n\r\n/** Check if a codepoint falls in any Georgian Unicode block. */\r\nexport function isGeorgianCodepoint(cp: number): boolean {\r\n return (cp >= GEORGIAN_START && cp <= GEORGIAN_END) ||\r\n (cp >= GEORGIAN_SUPPLEMENT_START && cp <= GEORGIAN_SUPPLEMENT_END);\r\n}\r\n\r\n/** Check if a codepoint falls in any Armenian Unicode block. */\r\nexport function isArmenianCodepoint(cp: number): boolean {\r\n return (cp >= ARMENIAN_START && cp <= ARMENIAN_END) ||\r\n (cp >= ARMENIAN_LIGATURES_START && cp <= ARMENIAN_LIGATURES_END);\r\n}\r\n\r\n/** Check if a codepoint falls in the Bengali Unicode block. */\r\nexport function isBengaliCodepoint(cp: number): boolean {\r\n return cp >= BENGALI_START && cp <= BENGALI_END;\r\n}\r\n\r\n/** Check if a codepoint falls in the Tamil Unicode block. */\r\nexport function isTamilCodepoint(cp: number): boolean {\r\n return cp >= TAMIL_START && cp <= TAMIL_END;\r\n}\r\n\r\n/** Check if a codepoint falls in any Devanagari Unicode block. */\r\nexport function isDevanagariCodepoint(cp: number): boolean {\r\n return (cp >= DEVANAGARI_START && cp <= DEVANAGARI_END) ||\r\n (cp >= DEVANAGARI_EXT_START && cp <= DEVANAGARI_EXT_END);\r\n}\r\n\r\n// ── Text-Level Detection ─────────────────────────────────────────────\r\n\r\n/** Check if text contains Arabic characters requiring shaping. */\r\nexport function containsArabic(text: string): boolean {\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n if (isArabicCodepoint(cp)) return true;\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check if text contains Hebrew characters. */\r\nexport function containsHebrew(text: string): boolean {\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n if (isHebrewCodepoint(cp)) return true;\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Thai characters. */\r\nexport function containsThai(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isThaiCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Bengali characters. */\r\nexport function containsBengali(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isBengaliCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Tamil characters. */\r\nexport function containsTamil(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isTamilCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Devanagari characters. */\r\nexport function containsDevanagari(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isDevanagariCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n","/**\r\n * pdfnative — Bengali Mini-Shaper\r\n * =================================\r\n * Pure JS OpenType GSUB + GPOS shaping for Bengali script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - Syllable cluster building (base + halant-mediated conjuncts)\r\n * - Reph detection and reordering (Ra + Halant at start → reph above last base)\r\n * - Vowel sign reordering (pre-base matras like ি move before visual base)\r\n * - Nukta (U+09BC) attachment to preceding consonant\r\n * - GSUB SingleSubst: contextual glyph substitution\r\n * - GPOS MarkToBase: combining mark positioning (vowel signs, chandrabindu)\r\n * - GPOS MarkToMark: stacked marks\r\n *\r\n * References:\r\n * - Unicode Standard §12.2 Bengali\r\n * - OpenType spec: Script-specific shaping for Bengali (Indic2)\r\n * - ISO 15924 script code: Beng\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport { BENGALI_START, BENGALI_END, containsBengali } from './script-registry.js';\r\n\r\n// Re-export range constants\r\nexport { BENGALI_START, BENGALI_END, containsBengali };\r\n\r\n// ── Bengali character classification ─────────────────────────────────\r\n\r\n/** Halant / Virama — joins consonants into conjuncts. */\r\nconst HALANT = 0x09CD;\r\n/** Nukta — modifies preceding consonant. */\r\nconst NUKTA = 0x09BC;\r\n/** Ra — used for reph formation when followed by halant at syllable start. */\r\nconst RA = 0x09B0;\r\n\r\n/**\r\n * Bengali character type classification.\r\n * 0 = consonant (Ka–Ha, Ya, Ra etc.)\r\n * 1 = independent vowel (base character)\r\n * 2 = dependent vowel sign (matra) — above\r\n * 3 = dependent vowel sign (matra) — below\r\n * 4 = dependent vowel sign (matra) — pre-base (reordered left of base)\r\n * 5 = dependent vowel sign (matra) — post-base (right of base)\r\n * 6 = modifier (chandrabindu, anusvara, visarga)\r\n * 7 = halant/virama\r\n * 8 = nukta\r\n * 9 = number/digit\r\n */\r\nfunction bengaliCharType(cp: number): number {\r\n if (cp === HALANT) return 7;\r\n if (cp === NUKTA) return 8;\r\n // Modifiers\r\n if (cp >= 0x0981 && cp <= 0x0983) return 6;\r\n // Independent vowels U+0985–U+0994\r\n if (cp >= 0x0985 && cp <= 0x0994) return 1;\r\n // Consonants U+0995–U+09B9 (Ka to Ha)\r\n if (cp >= 0x0995 && cp <= 0x09B9) return 0;\r\n // Dependent vowel signs — classify by position\r\n // Pre-base matras (render left of base)\r\n if (cp === 0x09BF) return 4; // ি (i)\r\n if (cp === 0x09C7) return 4; // ে (e)\r\n if (cp === 0x09C8) return 4; // ৈ (ai)\r\n // Below-base matras\r\n if (cp === 0x09C1 || cp === 0x09C2 || cp === 0x09C3 || cp === 0x09C4) return 3;\r\n // Above-base matras\r\n if (cp === 0x09BE) return 5; // া (aa) — post-base\r\n if (cp === 0x09C0) return 5; // ী (ii) — post-base\r\n // Split vowel signs: ো (o) = ে + া, ৌ (au) = ে + ৌ\r\n if (cp === 0x09CB) return 4; // ো — pre-base component\r\n if (cp === 0x09CC) return 4; // ৌ — pre-base component\r\n // Other dependent vowel signs\r\n if (cp >= 0x09BE && cp <= 0x09CC) return 2;\r\n // Au length mark\r\n if (cp === 0x09D7) return 5;\r\n // Bengali digits\r\n if (cp >= 0x09E6 && cp <= 0x09EF) return 9;\r\n // Ya-phalaa, Ra-phalaa (secondary forms are consonants)\r\n if (cp === 0x09DF) return 0; // YYA\r\n // Avagraha U+09BD\r\n if (cp === 0x09BD) return 1;\r\n // Khanda Ta U+09CE\r\n if (cp === 0x09CE) return 0;\r\n return -1;\r\n}\r\n\r\n/** Check if a codepoint is a Bengali consonant. */\r\nfunction isConsonant(cp: number): boolean {\r\n return bengaliCharType(cp) === 0;\r\n}\r\n\r\n// ── Cluster building ─────────────────────────────────────────────────\r\n\r\ninterface BengaliCluster {\r\n /** Codepoints in logical order. */\r\n codepoints: number[];\r\n /** Index of the base consonant within codepoints. */\r\n baseIndex: number;\r\n /** Whether this syllable starts with Ra + Halant (reph). */\r\n hasReph: boolean;\r\n /** Indices of pre-base matra codepoints. */\r\n preBaseMatras: number[];\r\n}\r\n\r\n/**\r\n * Build syllable clusters from Bengali text.\r\n * A Bengali syllable: [Reph] [C + H]* C [nukta] [matras] [modifiers]\r\n */\r\nexport function buildBengaliClusters(str: string): BengaliCluster[] {\r\n const clusters: BengaliCluster[] = [];\r\n const cps: number[] = [];\r\n\r\n // Collect codepoints\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n let i = 0;\r\n while (i < cps.length) {\r\n const cp = cps[i];\r\n const type = bengaliCharType(cp);\r\n\r\n // Not a Bengali character — emit as standalone\r\n if (type < 0 || cp < BENGALI_START || cp > BENGALI_END) {\r\n clusters.push({ codepoints: [cp], baseIndex: 0, hasReph: false, preBaseMatras: [] });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Start of a syllable\r\n const syllable: number[] = [];\r\n let baseIdx = 0;\r\n let hasReph = false;\r\n const preMatras: number[] = [];\r\n\r\n // Check for reph: Ra + Halant at start followed by a consonant\r\n if (isConsonant(cp) && cp === RA && i + 2 < cps.length &&\r\n cps[i + 1] === HALANT && isConsonant(cps[i + 2])) {\r\n hasReph = true;\r\n syllable.push(cp, cps[i + 1]); // Ra + Halant\r\n i += 2;\r\n }\r\n\r\n // Consume consonant + halant sequences (C + H + C + H + ... + C)\r\n let lastConsonantIdx = -1;\r\n while (i < cps.length) {\r\n const cc = cps[i];\r\n const ct = bengaliCharType(cc);\r\n\r\n if (ct === 0) { // consonant\r\n lastConsonantIdx = syllable.length;\r\n syllable.push(cc);\r\n i++;\r\n\r\n // Nukta after consonant\r\n if (i < cps.length && cps[i] === NUKTA) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // Halant after consonant — check if followed by another consonant\r\n if (i < cps.length && cps[i] === HALANT) {\r\n if (i + 1 < cps.length && isConsonant(cps[i + 1])) {\r\n syllable.push(cps[i]); // halant\r\n i++;\r\n continue; // consume next consonant\r\n } else {\r\n // Explicit halant (visible virama) — end of consonant sequence\r\n syllable.push(cps[i]);\r\n i++;\r\n break;\r\n }\r\n }\r\n break; // no halant → end of consonant sequence\r\n } else {\r\n break; // not a consonant\r\n }\r\n }\r\n\r\n baseIdx = lastConsonantIdx >= 0 ? lastConsonantIdx : 0;\r\n\r\n // Consume dependent vowel signs (matras)\r\n while (i < cps.length) {\r\n const ct = bengaliCharType(cps[i]);\r\n if (ct >= 2 && ct <= 5) {\r\n if (ct === 4) {\r\n preMatras.push(syllable.length);\r\n }\r\n syllable.push(cps[i]);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Consume modifiers (chandrabindu, anusvara, visarga)\r\n while (i < cps.length && bengaliCharType(cps[i]) === 6) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // If syllable is empty (standalone vowel, digit, etc.)\r\n if (syllable.length === 0) {\r\n syllable.push(cps[i] ?? 0x20);\r\n i++;\r\n }\r\n\r\n clusters.push({\r\n codepoints: syllable,\r\n baseIndex: hasReph ? baseIdx + 2 : baseIdx, // Adjust for reph prefix\r\n hasReph,\r\n preBaseMatras: preMatras,\r\n });\r\n }\r\n\r\n return clusters;\r\n}\r\n\r\n// ── Bengali Shaper ───────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Bengali text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Bengali string\r\n * @param fontData - Font data with cmap, gsub, markAnchors, mark2mark, metrics, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeBengaliText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, gsub, ligatures, markAnchors, widths, defaultWidth } = fontData;\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function resolveGid(cp: number): number {\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n return cmap[normCp] || 0;\r\n }\r\n\r\n function resolveGidGsub(cp: number): number {\r\n const gid = resolveGid(cp);\r\n if (gsub[gid] !== undefined) return gsub[gid];\r\n return gid;\r\n }\r\n\r\n /**\r\n * Try to match a GID sequence against the GSUB ligature table.\r\n * Returns the ligature result GID and the number of GIDs consumed,\r\n * or null if no ligature matches.\r\n *\r\n * Ligature entries are sorted longest-first for greedy matching.\r\n */\r\n function tryLigature(gids: number[]): { resultGid: number; consumed: number } | null {\r\n if (!ligatures || gids.length < 2) return null;\r\n const firstGid = gids[0];\r\n const entries = ligatures[firstGid];\r\n if (!entries) return null;\r\n\r\n for (const entry of entries) {\r\n // entry = [resultGid, comp1, comp2, ...]\r\n const compCount = entry.length - 1;\r\n if (compCount > gids.length - 1) continue;\r\n let match = true;\r\n for (let ci = 0; ci < compCount; ci++) {\r\n if (gids[1 + ci] !== entry[1 + ci]) { match = false; break; }\r\n }\r\n if (match) return { resultGid: entry[0], consumed: compCount + 1 };\r\n }\r\n return null;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function emitGlyph(gid: number, isZero: boolean, baseGid?: number): void {\r\n if (isZero && baseGid !== undefined) {\r\n const markAnchor = getMarkAnchor(gid);\r\n if (markAnchor) {\r\n const baseAnchorPt = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchorPt) {\r\n const baseAdv = getAdv(baseGid);\r\n shaped.push({\r\n gid, dx: baseAnchorPt[0] - markAnchor.x - baseAdv,\r\n dy: baseAnchorPt[1] - markAnchor.y, isZeroAdvance: true,\r\n });\r\n return;\r\n }\r\n }\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: true });\r\n } else {\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n }\r\n\r\n const clusters = buildBengaliClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const { codepoints, hasReph, preBaseMatras } = cluster;\r\n\r\n // Determine base glyph index (adjusted for reph)\r\n const baseStart = hasReph ? 2 : 0;\r\n let baseGid = 0;\r\n\r\n // Find the effective base consonant GID\r\n // The base is the last consonant before matras/modifiers\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = bengaliCharType(codepoints[ci]);\r\n if (ct === 0) {\r\n baseGid = resolveGid(codepoints[ci]);\r\n } else if (ct >= 2) {\r\n break; // hit matras/modifiers\r\n }\r\n }\r\n\r\n // Track split vowel post-base components\r\n const splitPostComponents: number[] = [];\r\n\r\n // Emit pre-base matras first (before the consonant cluster)\r\n for (const mIdx of preBaseMatras) {\r\n if (mIdx < codepoints.length) {\r\n const mCp = codepoints[mIdx];\r\n // Split vowel signs: ো (U+09CB) = ে (U+09C7) + া (U+09BE)\r\n // ৌ (U+09CC) = ে (U+09C7) + ৌ-component (U+09D7)\r\n if (mCp === 0x09CB) {\r\n emitGlyph(resolveGid(0x09C7), false);\r\n splitPostComponents.push(0x09BE);\r\n } else if (mCp === 0x09CC) {\r\n emitGlyph(resolveGid(0x09C7), false);\r\n splitPostComponents.push(0x09D7);\r\n } else {\r\n emitGlyph(resolveGid(mCp), false);\r\n }\r\n }\r\n }\r\n\r\n // Emit consonant cluster — try ligature matching first\r\n // Collect the consonant+halant sequence as GIDs for ligature lookup\r\n const clusterGids: number[] = [];\r\n const clusterEndIdx: number[] = []; // maps each GID position back to codepoint index\r\n let matraStart = codepoints.length;\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = bengaliCharType(codepoints[ci]);\r\n if (ct === 0 || ct === 7 || ct === 8) {\r\n clusterGids.push(resolveGid(codepoints[ci]));\r\n clusterEndIdx.push(ci);\r\n } else if (ct < 0 || ct === 1 || ct === 9) {\r\n // Non-Bengali char, independent vowel, or digit — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n } else {\r\n matraStart = ci;\r\n break;\r\n }\r\n }\r\n\r\n // Try ligature substitution on the full consonant+halant GID sequence\r\n let ligConsumed = 0;\r\n const ligResult = tryLigature(clusterGids);\r\n if (ligResult) {\r\n // Ligature matched — emit single glyph for the entire matched sequence\r\n emitGlyph(ligResult.resultGid, false);\r\n baseGid = ligResult.resultGid;\r\n ligConsumed = ligResult.consumed;\r\n\r\n // Emit any remaining consonant+halant glyphs not consumed by the ligature\r\n let gi = ligConsumed;\r\n while (gi < clusterGids.length) {\r\n const subSeq = clusterGids.slice(gi);\r\n const subLig = tryLigature(subSeq);\r\n if (subLig) {\r\n emitGlyph(subLig.resultGid, false);\r\n gi += subLig.consumed;\r\n } else {\r\n // No further ligature — emit individual glyph\r\n const origCi = clusterEndIdx[gi];\r\n const ct = bengaliCharType(codepoints[origCi]);\r\n if (ct === 7) {\r\n emitGlyph(clusterGids[gi], true, baseGid);\r\n } else {\r\n emitGlyph(clusterGids[gi], false);\r\n }\r\n gi++;\r\n }\r\n }\r\n } else {\r\n // No ligature match — emit individual consonant+halant glyphs\r\n for (let ci = baseStart; ci < matraStart; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = bengaliCharType(cp);\r\n if (ct === 0) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 7) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 8) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n }\r\n }\r\n }\r\n\r\n // Emit matras and modifiers\r\n for (let ci = matraStart; ci < codepoints.length; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = bengaliCharType(cp);\r\n\r\n // Skip pre-base matras (already emitted above)\r\n if (ct === 4) continue;\r\n\r\n if (ct === 2 || ct === 3) {\r\n // Above/below mark — GPOS positioned\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 5) {\r\n // Post-base matra — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 6) {\r\n // Modifiers — zero-advance marks\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 9) {\r\n // Digit — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else {\r\n emitGlyph(resolveGid(cp), false);\r\n }\r\n }\r\n\r\n // Emit split vowel post-base components\r\n for (const postCp of splitPostComponents) {\r\n emitGlyph(resolveGid(postCp), false);\r\n }\r\n\r\n // Emit reph (Ra + Halant) as above mark on base — placed after base cluster\r\n if (hasReph) {\r\n const raGid = resolveGidGsub(RA);\r\n const halantGid = resolveGid(HALANT);\r\n // Reph rendered as combining mark above the base\r\n emitGlyph(raGid, true, baseGid);\r\n emitGlyph(halantGid, true, baseGid);\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n","/**\r\n * pdfnative — Tamil Mini-Shaper\r\n * ===============================\r\n * Pure JS OpenType GSUB + GPOS shaping for Tamil script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - Syllable cluster building (base + pulli-mediated conjuncts)\r\n * - Vowel sign reordering (pre-base matras like ெ, ே, ை move before visual base)\r\n * - Split vowel signs: ொ = ெ + ா, ோ = ே + ா, ௌ = ெ + ௗ\r\n * - GSUB SingleSubst: contextual glyph substitution\r\n * - GPOS MarkToBase: combining mark positioning\r\n * - GPOS MarkToMark: stacked marks\r\n *\r\n * Tamil is simpler than Bengali: no reph, no nukta, no below-base conjuncts.\r\n * Only has pulli (virama) for consonant joining and pre-base matra reordering.\r\n *\r\n * References:\r\n * - Unicode Standard §12.6 Tamil\r\n * - OpenType spec: Script-specific shaping for Tamil (Indic2)\r\n * - ISO 15924 script code: Taml\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport { TAMIL_START, TAMIL_END, containsTamil } from './script-registry.js';\r\n\r\n// Re-export range constants\r\nexport { TAMIL_START, TAMIL_END, containsTamil };\r\n\r\n// ── Tamil character constants ────────────────────────────────────────\r\n\r\n/** Pulli / Virama — suppresses inherent vowel, joins consonants. */\r\nconst PULLI = 0x0BCD;\r\n\r\n/**\r\n * Tamil character type classification.\r\n * 0 = consonant (Ka–Ha)\r\n * 1 = independent vowel (base character)\r\n * 2 = dependent vowel sign (matra) — above\r\n * 3 = dependent vowel sign (matra) — below (none in Tamil standard but reserved)\r\n * 4 = dependent vowel sign (matra) — pre-base (reordered left of base)\r\n * 5 = dependent vowel sign (matra) — post-base (right of base)\r\n * 6 = modifier (anusvara, visarga, OM)\r\n * 7 = pulli/virama\r\n * 9 = number/digit\r\n */\r\nfunction tamilCharType(cp: number): number {\r\n if (cp === PULLI) return 7;\r\n // Anusvara (U+0B82), Visarga (U+0B83)\r\n if (cp === 0x0B82 || cp === 0x0B83) return 6;\r\n // Independent vowels U+0B85–U+0B94\r\n if (cp >= 0x0B85 && cp <= 0x0B94) return 1;\r\n // Consonants U+0B95–U+0BB9\r\n if (cp >= 0x0B95 && cp <= 0x0BB9) return 0;\r\n // Dependent vowel signs — classify by position\r\n // Pre-base matras (render left of base)\r\n if (cp === 0x0BBF) return 4; // ி (i)\r\n if (cp === 0x0BC6) return 4; // ெ (e)\r\n if (cp === 0x0BC7) return 4; // ே (ee)\r\n if (cp === 0x0BC8) return 4; // ை (ai)\r\n // Split vowel signs — pre-base component\r\n if (cp === 0x0BCA) return 4; // ொ (o) = ெ + ா\r\n if (cp === 0x0BCB) return 4; // ோ (oo) = ே + ா\r\n if (cp === 0x0BCC) return 4; // ௌ (au) = ெ + ௗ\r\n // Post-base matras\r\n if (cp === 0x0BBE) return 5; // ா (aa)\r\n if (cp === 0x0BC0) return 5; // ீ (ii)\r\n // Above-base marks\r\n if (cp === 0x0BC1 || cp === 0x0BC2) return 2; // ு (u), ூ (uu)\r\n // Au length mark\r\n if (cp === 0x0BD7) return 5;\r\n // Other matras\r\n if (cp >= 0x0BBE && cp <= 0x0BCC) return 2;\r\n // Tamil digits\r\n if (cp >= 0x0BE6 && cp <= 0x0BEF) return 9;\r\n // Tamil special chars (day, month, etc.)\r\n if (cp >= 0x0BF0 && cp <= 0x0BFA) return 9;\r\n // OM U+0BD0\r\n if (cp === 0x0BD0) return 6;\r\n return -1;\r\n}\r\n\r\n/** Check if a codepoint is a Tamil consonant. */\r\nfunction isConsonant(cp: number): boolean {\r\n return tamilCharType(cp) === 0;\r\n}\r\n\r\n// ── Cluster building ─────────────────────────────────────────────────\r\n\r\ninterface TamilCluster {\r\n /** Codepoints in logical order. */\r\n codepoints: number[];\r\n /** Index of the base consonant within codepoints. */\r\n baseIndex: number;\r\n /** Indices of pre-base matra codepoints. */\r\n preBaseMatras: number[];\r\n}\r\n\r\n/**\r\n * Build syllable clusters from Tamil text.\r\n * A Tamil syllable: [C + Pulli]* C [matras] [modifiers]\r\n */\r\nexport function buildTamilClusters(str: string): TamilCluster[] {\r\n const clusters: TamilCluster[] = [];\r\n const cps: number[] = [];\r\n\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n let i = 0;\r\n while (i < cps.length) {\r\n const cp = cps[i];\r\n const type = tamilCharType(cp);\r\n\r\n // Not a Tamil character — emit as standalone\r\n if (type < 0 || cp < TAMIL_START || cp > TAMIL_END) {\r\n clusters.push({ codepoints: [cp], baseIndex: 0, preBaseMatras: [] });\r\n i++;\r\n continue;\r\n }\r\n\r\n const syllable: number[] = [];\r\n let lastConsonantIdx = -1;\r\n const preMatras: number[] = [];\r\n\r\n // Consume consonant + pulli sequences\r\n while (i < cps.length) {\r\n const cc = cps[i];\r\n const ct = tamilCharType(cc);\r\n\r\n if (ct === 0) { // consonant\r\n lastConsonantIdx = syllable.length;\r\n syllable.push(cc);\r\n i++;\r\n\r\n // Pulli after consonant — check if followed by another consonant\r\n if (i < cps.length && cps[i] === PULLI) {\r\n if (i + 1 < cps.length && isConsonant(cps[i + 1])) {\r\n syllable.push(cps[i]); // pulli\r\n i++;\r\n continue; // consume next consonant\r\n } else {\r\n // Explicit pulli (visible virama)\r\n syllable.push(cps[i]);\r\n i++;\r\n break;\r\n }\r\n }\r\n break;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const baseIdx = lastConsonantIdx >= 0 ? lastConsonantIdx : 0;\r\n\r\n // Consume dependent vowel signs (matras)\r\n while (i < cps.length) {\r\n const ct = tamilCharType(cps[i]);\r\n if (ct >= 2 && ct <= 5) {\r\n if (ct === 4) {\r\n preMatras.push(syllable.length);\r\n }\r\n syllable.push(cps[i]);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Consume modifiers\r\n while (i < cps.length && tamilCharType(cps[i]) === 6) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n if (syllable.length === 0) {\r\n syllable.push(cps[i] ?? 0x20);\r\n i++;\r\n }\r\n\r\n clusters.push({\r\n codepoints: syllable,\r\n baseIndex: baseIdx,\r\n preBaseMatras: preMatras,\r\n });\r\n }\r\n\r\n return clusters;\r\n}\r\n\r\n// ── Tamil Shaper ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Tamil text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Tamil string\r\n * @param fontData - Font data with cmap, gsub, markAnchors, mark2mark, metrics, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeTamilText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, ligatures, markAnchors, widths, defaultWidth } = fontData;\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function resolveGid(cp: number): number {\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n return cmap[normCp] || 0;\r\n }\r\n\r\n /**\r\n * Try to match a GID sequence against the GSUB ligature table.\r\n * Returns the ligature result GID and the number of GIDs consumed,\r\n * or null if no ligature matches.\r\n */\r\n function tryLigature(gids: number[]): { resultGid: number; consumed: number } | null {\r\n if (!ligatures || gids.length < 2) return null;\r\n const firstGid = gids[0];\r\n const entries = ligatures[firstGid];\r\n if (!entries) return null;\r\n\r\n for (const entry of entries) {\r\n const compCount = entry.length - 1;\r\n if (compCount > gids.length - 1) continue;\r\n let match = true;\r\n for (let ci = 0; ci < compCount; ci++) {\r\n if (gids[1 + ci] !== entry[1 + ci]) { match = false; break; }\r\n }\r\n if (match) return { resultGid: entry[0], consumed: compCount + 1 };\r\n }\r\n return null;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function emitGlyph(gid: number, isZero: boolean, baseGid?: number): void {\r\n if (isZero && baseGid !== undefined) {\r\n const markAnchor = getMarkAnchor(gid);\r\n if (markAnchor) {\r\n const baseAnchorPt = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchorPt) {\r\n const baseAdv = getAdv(baseGid);\r\n shaped.push({\r\n gid, dx: baseAnchorPt[0] - markAnchor.x - baseAdv,\r\n dy: baseAnchorPt[1] - markAnchor.y, isZeroAdvance: true,\r\n });\r\n return;\r\n }\r\n }\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: true });\r\n } else {\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n }\r\n\r\n const clusters = buildTamilClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const { codepoints, preBaseMatras } = cluster;\r\n\r\n // Find the effective base consonant GID\r\n let baseGid = 0;\r\n for (let ci = 0; ci < codepoints.length; ci++) {\r\n const ct = tamilCharType(codepoints[ci]);\r\n if (ct === 0) {\r\n baseGid = resolveGid(codepoints[ci]);\r\n } else if (ct >= 2) {\r\n break;\r\n }\r\n }\r\n\r\n // Track split vowel post-base components that need emitting after base\r\n const splitPostComponents: number[] = [];\r\n\r\n // Emit pre-base matras first\r\n for (const mIdx of preBaseMatras) {\r\n if (mIdx < codepoints.length) {\r\n const mCp = codepoints[mIdx];\r\n // Split vowel signs: ொ (U+0BCA) = ெ (U+0BC6) + ா (U+0BBE)\r\n // ோ (U+0BCB) = ே (U+0BC7) + ா (U+0BBE)\r\n // ௌ (U+0BCC) = ெ (U+0BC6) + ௗ (U+0BD7)\r\n if (mCp === 0x0BCA) {\r\n emitGlyph(resolveGid(0x0BC6), false);\r\n splitPostComponents.push(0x0BBE);\r\n } else if (mCp === 0x0BCB) {\r\n emitGlyph(resolveGid(0x0BC7), false);\r\n splitPostComponents.push(0x0BBE);\r\n } else if (mCp === 0x0BCC) {\r\n emitGlyph(resolveGid(0x0BC6), false);\r\n splitPostComponents.push(0x0BD7);\r\n } else {\r\n emitGlyph(resolveGid(mCp), false);\r\n }\r\n }\r\n }\r\n\r\n // Emit consonant cluster — try ligature matching first\r\n // Collect the consonant+pulli sequence as GIDs for ligature lookup\r\n const clusterGids: number[] = [];\r\n const clusterEndIdx: number[] = [];\r\n let matraStart = codepoints.length;\r\n for (let ci = 0; ci < codepoints.length; ci++) {\r\n const ct = tamilCharType(codepoints[ci]);\r\n if (ct === 0 || ct === 7) {\r\n clusterGids.push(resolveGid(codepoints[ci]));\r\n clusterEndIdx.push(ci);\r\n } else if (ct >= 2) {\r\n matraStart = ci;\r\n break;\r\n } else if (ct < 0) {\r\n // Non-Tamil character (space, punctuation) — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n } else if (ct === 1) {\r\n // Independent vowel — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n }\r\n }\r\n\r\n // Try ligature substitution on the full consonant+pulli GID sequence\r\n let ligConsumed = 0;\r\n const ligResult = tryLigature(clusterGids);\r\n if (ligResult) {\r\n emitGlyph(ligResult.resultGid, false);\r\n baseGid = ligResult.resultGid;\r\n ligConsumed = ligResult.consumed;\r\n\r\n // Emit remaining unconsumed glyphs\r\n let gi = ligConsumed;\r\n while (gi < clusterGids.length) {\r\n const subSeq = clusterGids.slice(gi);\r\n const subLig = tryLigature(subSeq);\r\n if (subLig) {\r\n emitGlyph(subLig.resultGid, false);\r\n gi += subLig.consumed;\r\n } else {\r\n const origCi = clusterEndIdx[gi];\r\n const ct = tamilCharType(codepoints[origCi]);\r\n if (ct === 7) {\r\n emitGlyph(clusterGids[gi], true, baseGid);\r\n } else {\r\n emitGlyph(clusterGids[gi], false);\r\n }\r\n gi++;\r\n }\r\n }\r\n } else {\r\n // No ligature match — emit individual glyphs\r\n for (let ci = 0; ci < matraStart; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = tamilCharType(cp);\r\n if (ct === 0) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 7) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n }\r\n }\r\n }\r\n\r\n // Emit matras and modifiers\r\n for (let ci = matraStart; ci < codepoints.length; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = tamilCharType(cp);\r\n\r\n // Skip pre-base matras (already emitted)\r\n if (ct === 4) continue;\r\n\r\n if (ct === 2 || ct === 3) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 5) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 6) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 9) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else {\r\n emitGlyph(resolveGid(cp), false);\r\n }\r\n }\r\n\r\n // Emit split vowel post-base components\r\n for (const postCp of splitPostComponents) {\r\n emitGlyph(resolveGid(postCp), false);\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n","/**\r\n * pdfnative — Devanagari Mini-Shaper\r\n * ====================================\r\n * Pure JS OpenType GSUB + GPOS shaping for Devanagari script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - Syllable cluster building (base + halant-mediated conjuncts)\r\n * - Reph detection and reordering (Ra + Halant at start → reph above last base)\r\n * - Vowel sign reordering (pre-base matra ि moves before visual base)\r\n * - Nukta (U+093C) attachment to preceding consonant\r\n * - GSUB LigatureSubst: conjunct formation (C + Halant + C → ligature glyph)\r\n * - GSUB SingleSubst: contextual glyph substitution\r\n * - GPOS MarkToBase: combining mark positioning (matras, chandrabindu)\r\n *\r\n * References:\r\n * - Unicode Standard §12.1 Devanagari\r\n * - OpenType spec: Script-specific shaping for Devanagari (dev2)\r\n * - ISO 15924 script code: Deva\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport { DEVANAGARI_START, DEVANAGARI_END, containsDevanagari } from './script-registry.js';\r\n\r\n// Re-export range constants\r\nexport { DEVANAGARI_START, DEVANAGARI_END, containsDevanagari };\r\n\r\n// ── Devanagari character classification ──────────────────────────────\r\n\r\n/** Halant / Virama — joins consonants into conjuncts. */\r\nconst HALANT = 0x094D;\r\n/** Nukta — modifies preceding consonant. */\r\nconst NUKTA = 0x093C;\r\n/** Ra — used for reph formation when followed by halant at syllable start. */\r\nconst RA = 0x0930;\r\n\r\n/**\r\n * Devanagari character type classification.\r\n * 0 = consonant (Ka–Ha)\r\n * 1 = independent vowel (base character)\r\n * 2 = dependent vowel sign (matra) — above\r\n * 3 = dependent vowel sign (matra) — below\r\n * 4 = dependent vowel sign (matra) — pre-base (reordered left of base)\r\n * 5 = dependent vowel sign (matra) — post-base (right of base)\r\n * 6 = modifier (chandrabindu, anusvara, visarga)\r\n * 7 = halant/virama\r\n * 8 = nukta\r\n * 9 = number/digit\r\n */\r\nfunction devanagariCharType(cp: number): number {\r\n if (cp === HALANT) return 7;\r\n if (cp === NUKTA) return 8;\r\n // Modifiers: Chandrabindu (U+0901), Anusvara (U+0902), Visarga (U+0903)\r\n if (cp >= 0x0901 && cp <= 0x0903) return 6;\r\n // Independent vowels U+0904–U+0914\r\n if (cp >= 0x0904 && cp <= 0x0914) return 1;\r\n // Consonants U+0915–U+0939 (Ka to Ha)\r\n if (cp >= 0x0915 && cp <= 0x0939) return 0;\r\n // Pre-base matra: ि (short i) U+093F\r\n if (cp === 0x093F) return 4;\r\n // Below-base matras: ु (U+0941), ू (U+0942), ृ (U+0943), ॄ (U+0944)\r\n if (cp >= 0x0941 && cp <= 0x0944) return 3;\r\n // Post-base matras: ा (U+093E), ी (U+0940)\r\n if (cp === 0x093E || cp === 0x0940) return 5;\r\n // Above-base matras: े (U+0947), ै (U+0948)\r\n if (cp === 0x0947 || cp === 0x0948) return 2;\r\n // Split vowel matras: ो (U+094B) = े + ा, ौ (U+094C) = े + ौ\r\n if (cp === 0x094B || cp === 0x094C) return 4;\r\n // Other dependent vowel signs\r\n if (cp >= 0x0945 && cp <= 0x094C) return 2;\r\n // Devanagari digits\r\n if (cp >= 0x0966 && cp <= 0x096F) return 9;\r\n // Additional consonants (QA, KHHA, GHHA, ZA, DDDHA, RHA, FA, YYA)\r\n if (cp >= 0x0958 && cp <= 0x095F) return 0;\r\n // Avagraha U+093D\r\n if (cp === 0x093D) return 1;\r\n // OM U+0950\r\n if (cp === 0x0950) return 1;\r\n return -1;\r\n}\r\n\r\n/** Check if a codepoint is a Devanagari consonant. */\r\nfunction isConsonant(cp: number): boolean {\r\n return devanagariCharType(cp) === 0;\r\n}\r\n\r\n// ── Cluster building ─────────────────────────────────────────────────\r\n\r\ninterface DevanagariCluster {\r\n /** Codepoints in logical order. */\r\n codepoints: number[];\r\n /** Index of the base consonant within codepoints. */\r\n baseIndex: number;\r\n /** Whether this syllable starts with Ra + Halant (reph). */\r\n hasReph: boolean;\r\n /** Indices of pre-base matra codepoints. */\r\n preBaseMatras: number[];\r\n}\r\n\r\n/**\r\n * Build syllable clusters from Devanagari text.\r\n * A Devanagari syllable: [Reph] [C + H]* C [nukta] [matras] [modifiers]\r\n */\r\nexport function buildDevanagariClusters(str: string): DevanagariCluster[] {\r\n const clusters: DevanagariCluster[] = [];\r\n const cps: number[] = [];\r\n\r\n // Collect codepoints\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n let i = 0;\r\n while (i < cps.length) {\r\n const cp = cps[i];\r\n const type = devanagariCharType(cp);\r\n\r\n // Not a Devanagari character — emit as standalone\r\n if (type < 0 || cp < DEVANAGARI_START || cp > DEVANAGARI_END) {\r\n clusters.push({ codepoints: [cp], baseIndex: 0, hasReph: false, preBaseMatras: [] });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Start of a syllable\r\n const syllable: number[] = [];\r\n let hasReph = false;\r\n const preMatras: number[] = [];\r\n\r\n // Check for reph: Ra + Halant at start followed by a consonant\r\n if (isConsonant(cp) && cp === RA && i + 2 < cps.length &&\r\n cps[i + 1] === HALANT && isConsonant(cps[i + 2])) {\r\n hasReph = true;\r\n syllable.push(cp, cps[i + 1]); // Ra + Halant\r\n i += 2;\r\n }\r\n\r\n // Consume consonant + halant sequences (C + H + C + H + ... + C)\r\n let lastConsonantIdx = -1;\r\n while (i < cps.length) {\r\n const cc = cps[i];\r\n const ct = devanagariCharType(cc);\r\n\r\n if (ct === 0) { // consonant\r\n lastConsonantIdx = syllable.length;\r\n syllable.push(cc);\r\n i++;\r\n\r\n // Nukta after consonant\r\n if (i < cps.length && cps[i] === NUKTA) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // Halant after consonant — check if followed by another consonant\r\n if (i < cps.length && cps[i] === HALANT) {\r\n if (i + 1 < cps.length && isConsonant(cps[i + 1])) {\r\n syllable.push(cps[i]); // halant\r\n i++;\r\n continue; // consume next consonant\r\n } else {\r\n // Explicit halant (visible virama) — end of consonant sequence\r\n syllable.push(cps[i]);\r\n i++;\r\n break;\r\n }\r\n }\r\n break; // no halant → end of consonant sequence\r\n } else {\r\n break; // not a consonant\r\n }\r\n }\r\n\r\n const baseIdx = lastConsonantIdx >= 0 ? lastConsonantIdx : 0;\r\n\r\n // Consume dependent vowel signs (matras)\r\n while (i < cps.length) {\r\n const ct = devanagariCharType(cps[i]);\r\n if (ct >= 2 && ct <= 5) {\r\n if (ct === 4) {\r\n preMatras.push(syllable.length);\r\n }\r\n syllable.push(cps[i]);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Consume modifiers (chandrabindu, anusvara, visarga)\r\n while (i < cps.length && devanagariCharType(cps[i]) === 6) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // If syllable is empty (standalone vowel, digit, etc.)\r\n if (syllable.length === 0) {\r\n syllable.push(cps[i] ?? 0x20);\r\n i++;\r\n }\r\n\r\n clusters.push({\r\n codepoints: syllable,\r\n baseIndex: hasReph ? baseIdx + 2 : baseIdx,\r\n hasReph,\r\n preBaseMatras: preMatras,\r\n });\r\n }\r\n\r\n return clusters;\r\n}\r\n\r\n// ── Devanagari Shaper ────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Devanagari text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Devanagari string\r\n * @param fontData - Font data with cmap, gsub, ligatures, markAnchors, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeDevanagariText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, gsub, ligatures, markAnchors, widths, defaultWidth } = fontData;\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function resolveGid(cp: number): number {\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n return cmap[normCp] || 0;\r\n }\r\n\r\n /**\r\n * Try to match a GID sequence against the GSUB ligature table.\r\n * Returns the ligature result GID and the number of GIDs consumed,\r\n * or null if no ligature matches.\r\n *\r\n * Ligature entries are sorted longest-first for greedy matching.\r\n */\r\n function tryLigature(gids: number[]): { resultGid: number; consumed: number } | null {\r\n if (!ligatures || gids.length < 2) return null;\r\n const firstGid = gids[0];\r\n const entries = ligatures[firstGid];\r\n if (!entries) return null;\r\n\r\n for (const entry of entries) {\r\n // entry = [resultGid, comp1, comp2, ...]\r\n const compCount = entry.length - 1;\r\n if (compCount > gids.length - 1) continue;\r\n let match = true;\r\n for (let ci = 0; ci < compCount; ci++) {\r\n if (gids[1 + ci] !== entry[1 + ci]) { match = false; break; }\r\n }\r\n if (match) return { resultGid: entry[0], consumed: compCount + 1 };\r\n }\r\n return null;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function emitGlyph(gid: number, isZero: boolean, baseGid?: number): void {\r\n if (isZero && baseGid !== undefined) {\r\n const markAnchor = getMarkAnchor(gid);\r\n if (markAnchor) {\r\n const baseAnchorPt = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchorPt) {\r\n const baseAdv = getAdv(baseGid);\r\n shaped.push({\r\n gid, dx: baseAnchorPt[0] - markAnchor.x - baseAdv,\r\n dy: baseAnchorPt[1] - markAnchor.y, isZeroAdvance: true,\r\n });\r\n return;\r\n }\r\n }\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: true });\r\n } else {\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n }\r\n\r\n const clusters = buildDevanagariClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const { codepoints, hasReph, preBaseMatras } = cluster;\r\n\r\n // Determine base glyph index (adjusted for reph)\r\n const baseStart = hasReph ? 2 : 0;\r\n let baseGid = 0;\r\n\r\n // Find the effective base consonant GID\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = devanagariCharType(codepoints[ci]);\r\n if (ct === 0) {\r\n baseGid = resolveGid(codepoints[ci]);\r\n } else if (ct >= 2) {\r\n break;\r\n }\r\n }\r\n\r\n // Track split vowel post-base components\r\n const splitPostComponents: number[] = [];\r\n\r\n // Emit pre-base matras first (before the consonant cluster)\r\n for (const mIdx of preBaseMatras) {\r\n if (mIdx < codepoints.length) {\r\n const mCp = codepoints[mIdx];\r\n // Split vowel signs: ो (U+094B) = े (U+0947) + ा (U+093E)\r\n // ौ (U+094C) = े (U+0947) + ौ-component\r\n if (mCp === 0x094B) {\r\n emitGlyph(resolveGid(0x0947), false);\r\n splitPostComponents.push(0x093E);\r\n } else if (mCp === 0x094C) {\r\n emitGlyph(resolveGid(0x0947), false);\r\n splitPostComponents.push(0x094C);\r\n } else {\r\n emitGlyph(resolveGid(mCp), false);\r\n }\r\n }\r\n }\r\n\r\n // Emit reph (Ra + Halant) — positioned as zero-advance mark above base\r\n if (hasReph) {\r\n // Reph pair: try GSUB for reph form\r\n const raGid = resolveGid(RA);\r\n const halantGid = resolveGid(HALANT);\r\n const rephLig = tryLigature([raGid, halantGid]);\r\n if (rephLig) {\r\n emitGlyph(rephLig.resultGid, true, baseGid);\r\n } else {\r\n const raGsubbed = gsub[raGid] !== undefined ? gsub[raGid] : raGid;\r\n emitGlyph(raGsubbed, true, baseGid);\r\n }\r\n }\r\n\r\n // Emit consonant cluster — try ligature matching first\r\n const clusterGids: number[] = [];\r\n const clusterEndIdx: number[] = [];\r\n let matraStart = codepoints.length;\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = devanagariCharType(codepoints[ci]);\r\n if (ct === 0 || ct === 7 || ct === 8) {\r\n clusterGids.push(resolveGid(codepoints[ci]));\r\n clusterEndIdx.push(ci);\r\n } else if (ct < 0 || ct === 1 || ct === 9) {\r\n // Non-Devanagari char, independent vowel, or digit — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n } else {\r\n matraStart = ci;\r\n break;\r\n }\r\n }\r\n\r\n // Try ligature substitution on the full consonant+halant GID sequence\r\n const ligResult = tryLigature(clusterGids);\r\n if (ligResult) {\r\n emitGlyph(ligResult.resultGid, false);\r\n baseGid = ligResult.resultGid;\r\n\r\n // Emit remaining unconsumed glyphs\r\n let gi = ligResult.consumed;\r\n while (gi < clusterGids.length) {\r\n const subSeq = clusterGids.slice(gi);\r\n const subLig = tryLigature(subSeq);\r\n if (subLig) {\r\n emitGlyph(subLig.resultGid, false);\r\n gi += subLig.consumed;\r\n } else {\r\n const origCi = clusterEndIdx[gi];\r\n const ct = devanagariCharType(codepoints[origCi]);\r\n if (ct === 7) {\r\n emitGlyph(clusterGids[gi], true, baseGid);\r\n } else {\r\n emitGlyph(clusterGids[gi], false);\r\n }\r\n gi++;\r\n }\r\n }\r\n } else {\r\n // No ligature match — emit individual consonant+halant glyphs\r\n for (let ci = baseStart; ci < matraStart; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = devanagariCharType(cp);\r\n if (ct === 0) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 7) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 8) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n }\r\n }\r\n }\r\n\r\n // Emit matras and modifiers\r\n for (let ci = matraStart; ci < codepoints.length; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = devanagariCharType(cp);\r\n\r\n // Skip pre-base matras (already emitted above)\r\n if (ct === 4) continue;\r\n\r\n if (ct === 2 || ct === 3) {\r\n // Above/below mark — GPOS positioned\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 5) {\r\n // Post-base matra — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 6) {\r\n // Modifiers — zero-advance marks\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 9) {\r\n // Digit — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else {\r\n emitGlyph(resolveGid(cp), false);\r\n }\r\n }\r\n\r\n // Emit split vowel post-base components\r\n for (const postCp of splitPostComponents) {\r\n emitGlyph(resolveGid(postCp), false);\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n","/**\r\n * pdfnative — Arabic Text Shaper\r\n * ================================\r\n * Unicode Presentation Forms-based positional shaping for Arabic script.\r\n * Handles the four positional forms (isolated, initial, medial, final)\r\n * and common ligatures (lam-alef).\r\n *\r\n * Arabic letters change shape based on their position in a word:\r\n * - Isolated: standalone letter (no joining)\r\n * - Initial: beginning of a connected sequence\r\n * - Medial: middle of a connected sequence\r\n * - Final: end of a connected sequence\r\n *\r\n * Uses Unicode Arabic Presentation Forms B (U+FE70-U+FEFF) to look up\r\n * positional glyph IDs directly from the font's cmap, instead of relying\r\n * on complex GSUB table parsing. This works reliably with all fonts that\r\n * include Arabic Presentation Forms in their cmap (standard for Noto, etc.).\r\n *\r\n * References:\r\n * - Unicode Standard §9.2 Arabic\r\n * - Unicode Arabic Presentation Forms B (U+FE70-U+FEFF)\r\n * - ISO 32000-1 §9 (text rendering)\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport {\r\n ARABIC_START, ARABIC_END, HEBREW_START, HEBREW_END,\r\n containsArabic, containsHebrew,\r\n} from './script-registry.js';\r\n\r\n// Re-export range constants for backward compatibility\r\nexport { ARABIC_START, ARABIC_END, HEBREW_START, HEBREW_END, containsArabic, containsHebrew };\r\n\r\n/**\r\n * Arabic joining type classification.\r\n * D = Dual joining (joins on both sides)\r\n * R = Right joining (joins to the right only)\r\n * C = Join causing (e.g., TATWEEL)\r\n * U = Non-joining\r\n * T = Transparent (non-spacing marks)\r\n */\r\ntype JoiningType = 'D' | 'R' | 'C' | 'U' | 'T';\r\n\r\n/**\r\n * Determine the joining type of an Arabic character.\r\n */\r\nfunction getJoiningType(cp: number): JoiningType {\r\n // Non-spacing marks (transparent)\r\n if ((cp >= 0x064B && cp <= 0x065F) || // Harakat (vowel marks)\r\n cp === 0x0670 || // Superscript alef\r\n (cp >= 0x06D6 && cp <= 0x06DC) ||\r\n (cp >= 0x06DF && cp <= 0x06E4) ||\r\n (cp >= 0x06E7 && cp <= 0x06E8) ||\r\n (cp >= 0x06EA && cp <= 0x06ED) ||\r\n (cp >= 0x0610 && cp <= 0x061A)) return 'T';\r\n\r\n // TATWEEL (kashida) - join causing\r\n if (cp === 0x0640) return 'C';\r\n\r\n // Dual-joining letters (most Arabic letters)\r\n // Note: This is a simplified classification. Full UCD has per-character data.\r\n if ((cp >= 0x0626 && cp <= 0x0628) || // YEH HAMZA, BA series\r\n (cp >= 0x062A && cp <= 0x062E) || // TA through KHA \r\n (cp >= 0x0633 && cp <= 0x063A) || // SEEN through GHAIN\r\n (cp >= 0x0641 && cp <= 0x0647) || // FA through HA\r\n cp === 0x0649 || // ALEF MAKSURA\r\n cp === 0x064A || // YA\r\n cp === 0x0678 || // HIGH HAMZA YEH\r\n (cp >= 0x069A && cp <= 0x06BF) || // Extended Arabic\r\n (cp >= 0x06C1 && cp <= 0x06C3) ||\r\n (cp >= 0x06CC && cp <= 0x06CE) ||\r\n (cp >= 0x06D0 && cp <= 0x06D3) ||\r\n cp === 0x06D5 ||\r\n cp === 0x06FA ||\r\n cp === 0x06FB ||\r\n cp === 0x06FC) return 'D';\r\n\r\n // Right-joining letters (ALEF, DAL, THAL, RA, ZAI, WAW, etc.)\r\n if (cp === 0x0622 || cp === 0x0623 || cp === 0x0624 || cp === 0x0625 ||\r\n cp === 0x0627 || // ALEF\r\n cp === 0x0629 || // TEH MARBUTA\r\n cp === 0x062F || cp === 0x0630 || // DAL, THAL\r\n cp === 0x0631 || cp === 0x0632 || // RA, ZAIN\r\n cp === 0x0648 || // WAW\r\n (cp >= 0x0671 && cp <= 0x0673) ||\r\n cp === 0x0675 || cp === 0x0676 || cp === 0x0677 ||\r\n (cp >= 0x0688 && cp <= 0x0699) || // Extended DAL/RA series\r\n cp === 0x06C0 ||\r\n (cp >= 0x06C4 && cp <= 0x06CB) ||\r\n cp === 0x06CF ||\r\n cp === 0x06EE || cp === 0x06EF) return 'R';\r\n\r\n // Everything else in Arabic block is non-joining\r\n if (cp >= ARABIC_START && cp <= ARABIC_END) return 'U';\r\n\r\n // Non-Arabic → non-joining\r\n return 'U';\r\n}\r\n\r\n// ── Arabic Presentation Forms B (U+FE70-U+FEFF) ─────────────────────\r\n\r\n/**\r\n * Unicode Arabic Presentation Forms B mapping.\r\n * Maps base Arabic codepoints to their positional form codepoints.\r\n * These are standard Unicode codepoints that fonts include in their cmap,\r\n * providing direct glyph access without GSUB table parsing.\r\n */\r\ninterface ArabicPresForm {\r\n readonly isol: number;\r\n readonly fina?: number;\r\n readonly init?: number;\r\n readonly medi?: number;\r\n}\r\n\r\nconst ARABIC_PRES_FORMS: ReadonlyMap<number, ArabicPresForm> = new Map([\r\n [0x0621, { isol: 0xFE80 }],\r\n [0x0622, { isol: 0xFE81, fina: 0xFE82 }],\r\n [0x0623, { isol: 0xFE83, fina: 0xFE84 }],\r\n [0x0624, { isol: 0xFE85, fina: 0xFE86 }],\r\n [0x0625, { isol: 0xFE87, fina: 0xFE88 }],\r\n [0x0626, { isol: 0xFE89, fina: 0xFE8A, init: 0xFE8B, medi: 0xFE8C }],\r\n [0x0627, { isol: 0xFE8D, fina: 0xFE8E }],\r\n [0x0628, { isol: 0xFE8F, fina: 0xFE90, init: 0xFE91, medi: 0xFE92 }],\r\n [0x0629, { isol: 0xFE93, fina: 0xFE94 }],\r\n [0x062A, { isol: 0xFE95, fina: 0xFE96, init: 0xFE97, medi: 0xFE98 }],\r\n [0x062B, { isol: 0xFE99, fina: 0xFE9A, init: 0xFE9B, medi: 0xFE9C }],\r\n [0x062C, { isol: 0xFE9D, fina: 0xFE9E, init: 0xFE9F, medi: 0xFEA0 }],\r\n [0x062D, { isol: 0xFEA1, fina: 0xFEA2, init: 0xFEA3, medi: 0xFEA4 }],\r\n [0x062E, { isol: 0xFEA5, fina: 0xFEA6, init: 0xFEA7, medi: 0xFEA8 }],\r\n [0x062F, { isol: 0xFEA9, fina: 0xFEAA }],\r\n [0x0630, { isol: 0xFEAB, fina: 0xFEAC }],\r\n [0x0631, { isol: 0xFEAD, fina: 0xFEAE }],\r\n [0x0632, { isol: 0xFEAF, fina: 0xFEB0 }],\r\n [0x0633, { isol: 0xFEB1, fina: 0xFEB2, init: 0xFEB3, medi: 0xFEB4 }],\r\n [0x0634, { isol: 0xFEB5, fina: 0xFEB6, init: 0xFEB7, medi: 0xFEB8 }],\r\n [0x0635, { isol: 0xFEB9, fina: 0xFEBA, init: 0xFEBB, medi: 0xFEBC }],\r\n [0x0636, { isol: 0xFEBD, fina: 0xFEBE, init: 0xFEBF, medi: 0xFEC0 }],\r\n [0x0637, { isol: 0xFEC1, fina: 0xFEC2, init: 0xFEC3, medi: 0xFEC4 }],\r\n [0x0638, { isol: 0xFEC5, fina: 0xFEC6, init: 0xFEC7, medi: 0xFEC8 }],\r\n [0x0639, { isol: 0xFEC9, fina: 0xFECA, init: 0xFECB, medi: 0xFECC }],\r\n [0x063A, { isol: 0xFECD, fina: 0xFECE, init: 0xFECF, medi: 0xFED0 }],\r\n [0x0641, { isol: 0xFED1, fina: 0xFED2, init: 0xFED3, medi: 0xFED4 }],\r\n [0x0642, { isol: 0xFED5, fina: 0xFED6, init: 0xFED7, medi: 0xFED8 }],\r\n [0x0643, { isol: 0xFED9, fina: 0xFEDA, init: 0xFEDB, medi: 0xFEDC }],\r\n [0x0644, { isol: 0xFEDD, fina: 0xFEDE, init: 0xFEDF, medi: 0xFEE0 }],\r\n [0x0645, { isol: 0xFEE1, fina: 0xFEE2, init: 0xFEE3, medi: 0xFEE4 }],\r\n [0x0646, { isol: 0xFEE5, fina: 0xFEE6, init: 0xFEE7, medi: 0xFEE8 }],\r\n [0x0647, { isol: 0xFEE9, fina: 0xFEEA, init: 0xFEEB, medi: 0xFEEC }],\r\n [0x0648, { isol: 0xFEED, fina: 0xFEEE }],\r\n [0x0649, { isol: 0xFEEF, fina: 0xFEF0 }],\r\n [0x064A, { isol: 0xFEF1, fina: 0xFEF2, init: 0xFEF3, medi: 0xFEF4 }],\r\n]);\r\n\r\n/** Lam-Alef ligature presentation forms: [isolatedCP, finalCP]. */\r\nconst LAM_ALEF_PRES: ReadonlyMap<number, readonly [number, number]> = new Map([\r\n [0x0622, [0xFEF5, 0xFEF6]], // LAM + ALEF WITH MADDA ABOVE\r\n [0x0623, [0xFEF7, 0xFEF8]], // LAM + ALEF WITH HAMZA ABOVE\r\n [0x0625, [0xFEF9, 0xFEFA]], // LAM + ALEF WITH HAMZA BELOW\r\n [0x0627, [0xFEFB, 0xFEFC]], // LAM + ALEF\r\n]);\r\n\r\n// ── Positional Form Selection ────────────────────────────────────────\r\n\r\n/** Positional form tags matching OpenType GSUB features. */\r\ntype PositionalForm = 'isol' | 'init' | 'medi' | 'fina';\r\n\r\n/**\r\n * Determine the positional form for each character in an Arabic word.\r\n * Uses joining type analysis to decide isolated/initial/medial/final forms.\r\n *\r\n * @param codePoints - Array of code points (logical order)\r\n * @returns Array of positional form tags\r\n */\r\nfunction resolvePositionalForms(codePoints: number[]): PositionalForm[] {\r\n const len = codePoints.length;\r\n const forms: PositionalForm[] = new Array(len).fill('isol');\r\n const joining = codePoints.map(getJoiningType);\r\n\r\n for (let i = 0; i < len; i++) {\r\n if (joining[i] === 'T' || joining[i] === 'U') continue;\r\n\r\n // Find previous non-transparent joining character\r\n let prevJoin: JoiningType = 'U';\r\n for (let j = i - 1; j >= 0; j--) {\r\n if (joining[j] !== 'T') { prevJoin = joining[j]; break; }\r\n }\r\n\r\n // Find next non-transparent joining character\r\n let nextJoin: JoiningType = 'U';\r\n for (let j = i + 1; j < len; j++) {\r\n if (joining[j] !== 'T') { nextJoin = joining[j]; break; }\r\n }\r\n\r\n const joinsToPrev = prevJoin === 'D' || prevJoin === 'C';\r\n const joinsToNext = (nextJoin === 'D' || nextJoin === 'R' || nextJoin === 'C') &&\r\n (joining[i] === 'D' || joining[i] === 'C');\r\n\r\n if (joinsToPrev && joinsToNext) {\r\n forms[i] = 'medi';\r\n } else if (joinsToPrev) {\r\n forms[i] = 'fina';\r\n } else if (joinsToNext) {\r\n forms[i] = 'init';\r\n } else {\r\n forms[i] = 'isol';\r\n }\r\n }\r\n\r\n return forms;\r\n}\r\n\r\n// ── Lam-Alef Ligature ────────────────────────────────────────────────\r\n\r\n/** Alef variants that form ligatures with Lam. */\r\nconst LAM = 0x0644;\r\nconst ALEF_VARIANTS = new Set([0x0622, 0x0623, 0x0625, 0x0627]);\r\n\r\n/**\r\n * Check if a codepoint pair should form a Lam-Alef ligature.\r\n *\r\n * @param cp1 - First code point (expected Lam U+0644)\r\n * @param cp2 - Second code point (expected Alef variant)\r\n * @returns True if the pair forms a Lam-Alef ligature\r\n */\r\nexport function isLamAlef(cp1: number, cp2: number): boolean {\r\n return cp1 === LAM && ALEF_VARIANTS.has(cp2);\r\n}\r\n\r\n// ── Main Shaping API ─────────────────────────────────────────────────\r\n\r\n// containsArabic and containsHebrew are re-exported from script-registry above\r\n\r\n/**\r\n * Shape Arabic text using Unicode Presentation Forms.\r\n * Applies isolated/initial/medial/final forms by looking up the\r\n * positional presentation form codepoint in the font's cmap,\r\n * and handles Lam-Alef ligatures.\r\n *\r\n * @param str - Input Arabic text (logical order)\r\n * @param fontData - Font data with cmap and widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeArabicText(str: string, fontData: FontData): ShapedGlyph[] {\r\n if (!str) return [];\r\n\r\n // Extract code points\r\n const codePoints: number[] = [];\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n codePoints.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n // Resolve positional forms\r\n const forms = resolvePositionalForms(codePoints);\r\n\r\n // Apply presentation form substitutions and build glyph array\r\n const glyphs: ShapedGlyph[] = [];\r\n const cmap = fontData.cmap;\r\n\r\n for (let i = 0; i < codePoints.length; i++) {\r\n const cp = codePoints[i];\r\n\r\n // Check for Lam-Alef ligature\r\n if (i < codePoints.length - 1 && isLamAlef(cp, codePoints[i + 1])) {\r\n const ligForms = LAM_ALEF_PRES.get(codePoints[i + 1]);\r\n if (ligForms) {\r\n // Determine if the ligature is in final form (Lam joins to previous)\r\n const isFinal = forms[i] === 'medi' || forms[i] === 'fina';\r\n const ligCP = isFinal ? ligForms[1] : ligForms[0];\r\n const ligGid = cmap[ligCP];\r\n if (ligGid) {\r\n glyphs.push({ gid: ligGid, dx: 0, dy: 0, isZeroAdvance: false });\r\n i++; // Skip the Alef\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n // Get base glyph ID from cmap\r\n let gid = cmap[cp] ?? 0;\r\n\r\n // Apply positional form via Unicode Presentation Forms\r\n const presForm = ARABIC_PRES_FORMS.get(cp);\r\n if (presForm) {\r\n const form = forms[i];\r\n let presCP: number | undefined;\r\n if (form === 'init') presCP = presForm.init;\r\n else if (form === 'medi') presCP = presForm.medi;\r\n else if (form === 'fina') presCP = presForm.fina;\r\n else presCP = presForm.isol;\r\n\r\n if (presCP) {\r\n const presGid = cmap[presCP];\r\n if (presGid) gid = presGid;\r\n }\r\n }\r\n\r\n // Transparent marks get zero advance\r\n const joining = getJoiningType(cp);\r\n const isZeroAdvance = joining === 'T';\r\n\r\n glyphs.push({ gid, dx: 0, dy: 0, isZeroAdvance });\r\n }\r\n\r\n return glyphs;\r\n}\r\n","/**\r\n * pdfnative — Simplified Unicode Bidirectional Algorithm\r\n * =======================================================\r\n * Pure JS implementation of a subset of UAX #9 (Unicode Bidirectional Algorithm).\r\n * Sufficient for real-world Arabic/Hebrew + Latin mixed text in PDF documents.\r\n *\r\n * Supported:\r\n * - Embedding levels 0 (LTR) and 1 (RTL)\r\n * - Character types: L, R, AL, EN, AN, ES, ET, CS, WS, ON, NSM, BN\r\n * - Weak type resolution (W1-W7)\r\n * - Neutral type resolution (N1-N2)\r\n * - Reordering (L2 — reverse RTL runs)\r\n * - Paragraph level detection (P2-P3)\r\n *\r\n * Not supported (rare/unnecessary for PDF):\r\n * - Explicit embeddings (LRE/RLE), overrides (LRO/RLO), isolates (LRI/RLI/FSI)\r\n * - Levels > 2\r\n *\r\n * References:\r\n * - Unicode Standard Annex #9: https://unicode.org/reports/tr9/\r\n * - ISO 32000-1 §14.8.2.3 (logical structure and reading order)\r\n */\r\n\r\n// ── Bidi Character Types ─────────────────────────────────────────────\r\n\r\n/** Bidirectional character type classification. */\r\nexport type BidiType = 'L' | 'R' | 'AL' | 'EN' | 'AN' | 'ES' | 'ET' | 'CS' | 'WS' | 'ON' | 'NSM' | 'BN';\r\n\r\n/** A run of text with a resolved embedding level. */\r\nexport interface BidiRun {\r\n readonly text: string;\r\n readonly level: number; // 0 = LTR, 1 = RTL\r\n readonly start: number; // Offset in the source text\r\n}\r\n\r\n// ── Character Type Classification ────────────────────────────────────\r\n\r\n/**\r\n * Classify a Unicode code point into its bidi character type.\r\n * Based on Unicode Character Database BidiClass property.\r\n *\r\n * @param cp - Unicode code point\r\n * @returns Bidi character type classification\r\n */\r\nexport function classifyBidiType(cp: number): BidiType {\r\n // ── Specific types BEFORE broad block ranges ─────────────────────\r\n\r\n // Non-spacing marks (must be before Arabic block check)\r\n if ((cp >= 0x0300 && cp <= 0x036F) || // Combining Diacritical Marks\r\n (cp >= 0x0591 && cp <= 0x05BD) || // Hebrew marks\r\n (cp >= 0x05BF && cp <= 0x05BF) ||\r\n (cp >= 0x05C1 && cp <= 0x05C2) ||\r\n (cp >= 0x05C4 && cp <= 0x05C5) ||\r\n (cp >= 0x05C7 && cp <= 0x05C7) ||\r\n (cp >= 0x0610 && cp <= 0x061A) || // Arabic marks\r\n (cp >= 0x064B && cp <= 0x065F) || // Arabic harakat\r\n (cp >= 0x0670 && cp <= 0x0670) || // Arabic superscript alef\r\n (cp >= 0x06D6 && cp <= 0x06DC) ||\r\n (cp >= 0x06DF && cp <= 0x06E4) ||\r\n (cp >= 0x06E7 && cp <= 0x06E8) ||\r\n (cp >= 0x06EA && cp <= 0x06ED) ||\r\n (cp >= 0xFE20 && cp <= 0xFE2F)) return 'NSM';\r\n\r\n // Boundary neutrals (must be before Arabic Presentation Forms-B)\r\n if (cp === 0x200B || cp === 0x200C || cp === 0x200D ||\r\n cp === 0x200E || cp === 0x200F || cp === 0xFEFF) return 'BN';\r\n\r\n // Arabic-Indic digits (must be before Arabic block)\r\n if (cp >= 0x0660 && cp <= 0x0669) return 'AN';\r\n // Extended Arabic-Indic digits\r\n if (cp >= 0x06F0 && cp <= 0x06F9) return 'AN';\r\n\r\n // European digits 0-9\r\n if (cp >= 0x0030 && cp <= 0x0039) return 'EN';\r\n\r\n // European separators\r\n if (cp === 0x002B || cp === 0x002D) return 'ES'; // + -\r\n // European terminators\r\n if (cp === 0x0023 || cp === 0x0024 || cp === 0x0025 ||\r\n cp === 0x00A2 || cp === 0x00A3 || cp === 0x00A4 || cp === 0x00A5 ||\r\n cp === 0x20AC || cp === 0x20B9 || cp === 0x20BA) return 'ET';\r\n\r\n // Common separators\r\n if (cp === 0x002C || cp === 0x002E || cp === 0x002F || cp === 0x003A || cp === 0x00A0) return 'CS';\r\n\r\n // Whitespace\r\n if (cp === 0x0020 || cp === 0x0009 || cp === 0x000A || cp === 0x000D ||\r\n cp === 0x000C || cp === 0x2000 || cp === 0x200A ||\r\n cp === 0x2028 || cp === 0x2029 || cp === 0x202F || cp === 0x205F || cp === 0x3000) return 'WS';\r\n\r\n // ── Broad block ranges ───────────────────────────────────────────\r\n\r\n // Arabic block U+0600-06FF → AL\r\n if (cp >= 0x0600 && cp <= 0x06FF) return 'AL';\r\n // Arabic Supplement U+0750-077F → AL\r\n if (cp >= 0x0750 && cp <= 0x077F) return 'AL';\r\n // Arabic Extended-A U+08A0-08FF → AL\r\n if (cp >= 0x08A0 && cp <= 0x08FF) return 'AL';\r\n // Arabic Presentation Forms-A U+FB50-FDFF → AL\r\n if (cp >= 0xFB50 && cp <= 0xFDFF) return 'AL';\r\n // Arabic Presentation Forms-B U+FE70-FEFE → AL (FEFF is BN, handled above)\r\n if (cp >= 0xFE70 && cp <= 0xFEFE) return 'AL';\r\n\r\n // Hebrew U+0590-05FF → R (marks already handled above as NSM)\r\n if (cp >= 0x05D0 && cp <= 0x05EA) return 'R'; // Hebrew letters\r\n if (cp >= 0x05F0 && cp <= 0x05F4) return 'R'; // Hebrew yod/punctuation\r\n // Misc Hebrew/RTL: Syriac, Thaana\r\n if (cp >= 0x0700 && cp <= 0x074F) return 'R'; // Syriac\r\n if (cp >= 0x0780 && cp <= 0x07BF) return 'R'; // Thaana\r\n if (cp >= 0xFB1D && cp <= 0xFB4F) return 'R'; // Hebrew Presentation Forms\r\n\r\n // Latin, CJK, etc. → L (default)\r\n if (cp >= 0x0041 && cp <= 0x005A) return 'L'; // A-Z\r\n if (cp >= 0x0061 && cp <= 0x007A) return 'L'; // a-z\r\n if (cp >= 0x00C0 && cp <= 0x024F) return 'L'; // Latin Extended\r\n if (cp >= 0x0370 && cp <= 0x03FF) return 'L'; // Greek\r\n if (cp >= 0x0400 && cp <= 0x04FF) return 'L'; // Cyrillic\r\n if (cp >= 0x0E00 && cp <= 0x0E7F) return 'L'; // Thai\r\n if (cp >= 0x0900 && cp <= 0x097F) return 'L'; // Devanagari\r\n if (cp >= 0x3040 && cp <= 0x30FF) return 'L'; // Japanese Kana\r\n if (cp >= 0x4E00 && cp <= 0x9FFF) return 'L'; // CJK\r\n if (cp >= 0xAC00 && cp <= 0xD7AF) return 'L'; // Hangul\r\n\r\n // Punctuation → ON (Other Neutral)\r\n if (cp >= 0x0021 && cp <= 0x002F) return 'ON';\r\n if (cp >= 0x003A && cp <= 0x0040) return 'ON';\r\n if (cp >= 0x005B && cp <= 0x0060) return 'ON';\r\n if (cp >= 0x007B && cp <= 0x007E) return 'ON';\r\n if (cp >= 0x00A1 && cp <= 0x00BF) return 'ON';\r\n // General Punctuation: dashes, quotes, leaders, etc. (U+2010–U+205E)\r\n if (cp >= 0x2010 && cp <= 0x2027) return 'ON';\r\n if (cp >= 0x2030 && cp <= 0x205E) return 'ON';\r\n\r\n // Default: Left-to-right for unclassified\r\n return 'L';\r\n}\r\n\r\n// ── Paragraph Level Detection (P2-P3) ────────────────────────────────\r\n\r\n/**\r\n * Determine the paragraph embedding level.\r\n * P2: Find first strong character (L, R, AL).\r\n * P3: If R or AL → level 1, else level 0.\r\n *\r\n * @param types - Array of bidi character types for the paragraph\r\n * @returns 0 for LTR, 1 for RTL\r\n */\r\nexport function detectParagraphLevel(types: BidiType[]): number {\r\n for (const t of types) {\r\n if (t === 'L') return 0;\r\n if (t === 'R' || t === 'AL') return 1;\r\n }\r\n return 0; // default LTR\r\n}\r\n\r\n// ── Weak Type Resolution (W1-W7) ────────────────────────────────────\r\n\r\n/**\r\n * Apply weak type resolution rules W1-W7 from UAX #9.\r\n * Modifies types array in place.\r\n */\r\nfunction resolveWeakTypes(types: BidiType[], paraLevel: number): void {\r\n const len = types.length;\r\n\r\n // W1: NSM → type of previous character (or paragraph embedding direction)\r\n let prevType: BidiType = paraLevel === 0 ? 'L' : 'R';\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'NSM') {\r\n types[i] = prevType;\r\n }\r\n prevType = types[i];\r\n }\r\n\r\n // W2: EN after AL → AN\r\n let lastStrong: BidiType = paraLevel === 0 ? 'L' : 'R';\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'R' || types[i] === 'L' || types[i] === 'AL') {\r\n lastStrong = types[i];\r\n } else if (types[i] === 'EN' && lastStrong === 'AL') {\r\n types[i] = 'AN';\r\n }\r\n }\r\n\r\n // W3: AL → R\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'AL') types[i] = 'R';\r\n }\r\n\r\n // W4: ES between EN → EN; CS between EN → EN; CS between AN → AN\r\n for (let i = 1; i < len - 1; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {\r\n types[i] = 'EN';\r\n } else if (types[i] === 'CS') {\r\n if (types[i - 1] === 'EN' && types[i + 1] === 'EN') types[i] = 'EN';\r\n else if (types[i - 1] === 'AN' && types[i + 1] === 'AN') types[i] = 'AN';\r\n }\r\n }\r\n\r\n // W5: ET adjacent to EN → EN\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'ET') {\r\n // Check backward\r\n let found = false;\r\n for (let j = i - 1; j >= 0; j--) {\r\n if (types[j] === 'EN') { found = true; break; }\r\n if (types[j] !== 'ET' && types[j] !== 'BN') break;\r\n }\r\n if (!found) {\r\n // Check forward\r\n for (let j = i + 1; j < len; j++) {\r\n if (types[j] === 'EN') { found = true; break; }\r\n if (types[j] !== 'ET' && types[j] !== 'BN') break;\r\n }\r\n }\r\n if (found) types[i] = 'EN';\r\n }\r\n }\r\n\r\n // W6: remaining ES, ET, CS → ON\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'ES' || types[i] === 'ET' || types[i] === 'CS') {\r\n types[i] = 'ON';\r\n }\r\n }\r\n\r\n // W7: EN preceded by L (in run direction) → L\r\n lastStrong = paraLevel === 0 ? 'L' : 'R';\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'L' || types[i] === 'R') {\r\n lastStrong = types[i];\r\n } else if (types[i] === 'EN' && lastStrong === 'L') {\r\n types[i] = 'L';\r\n }\r\n }\r\n}\r\n\r\n// ── Neutral Type Resolution (N1-N2) ─────────────────────────────────\r\n\r\n/**\r\n * Apply neutral type resolution rules N1-N2 from UAX #9.\r\n * Modifies types array in place.\r\n */\r\nfunction resolveNeutralTypes(types: BidiType[], paraLevel: number): void {\r\n const len = types.length;\r\n const paraDir: BidiType = paraLevel === 0 ? 'L' : 'R';\r\n\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] !== 'ON' && types[i] !== 'WS' && types[i] !== 'BN') continue;\r\n\r\n // Find start of neutral run\r\n const start = i;\r\n while (i < len && (types[i] === 'ON' || types[i] === 'WS' || types[i] === 'BN')) i++;\r\n const end = i; // exclusive\r\n\r\n // Find surrounding strong types\r\n let prevStrong: BidiType = paraDir;\r\n for (let j = start - 1; j >= 0; j--) {\r\n if (types[j] === 'L' || types[j] === 'R' || types[j] === 'EN' || types[j] === 'AN') {\r\n prevStrong = (types[j] === 'EN' || types[j] === 'AN') ? 'R' : types[j];\r\n break;\r\n }\r\n }\r\n\r\n let nextStrong: BidiType = paraDir;\r\n for (let j = end; j < len; j++) {\r\n if (types[j] === 'L' || types[j] === 'R' || types[j] === 'EN' || types[j] === 'AN') {\r\n nextStrong = (types[j] === 'EN' || types[j] === 'AN') ? 'R' : types[j];\r\n break;\r\n }\r\n }\r\n\r\n // N1: If same direction, neutrals inherit that direction\r\n // N2: Otherwise, inherit paragraph embedding level direction\r\n const resolved: BidiType = (prevStrong === nextStrong) ? prevStrong : paraDir;\r\n for (let j = start; j < end; j++) {\r\n types[j] = resolved;\r\n }\r\n }\r\n}\r\n\r\n// ── Level Assignment ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Assign embedding levels based on resolved types and paragraph level.\r\n */\r\nfunction assignLevels(types: BidiType[], paraLevel: number): number[] {\r\n const levels: number[] = [];\r\n for (const t of types) {\r\n if (paraLevel === 0) {\r\n // LTR paragraph: R/AL/AN → level 1, EN → level 2 (but we simplify to 1)\r\n levels.push((t === 'R' || t === 'AN') ? 1 : 0);\r\n } else {\r\n // RTL paragraph: L/EN → level 2 (but we simplify to 0 for L)\r\n levels.push((t === 'L') ? 2 : 1);\r\n }\r\n }\r\n return levels;\r\n}\r\n\r\n// ── Glyph Mirroring ──────────────────────────────────────────────────\r\n\r\n/** Mirroring pairs for bidirectional text. ~40 common pairs. */\r\nconst MIRROR_MAP: Record<number, number> = {\r\n 0x0028: 0x0029, // ( → )\r\n 0x0029: 0x0028, // ) → (\r\n 0x003C: 0x003E, // < → >\r\n 0x003E: 0x003C, // > → <\r\n 0x005B: 0x005D, // [ → ]\r\n 0x005D: 0x005B, // ] → [\r\n 0x007B: 0x007D, // { → }\r\n 0x007D: 0x007B, // } → {\r\n 0x00AB: 0x00BB, // « → »\r\n 0x00BB: 0x00AB, // » → «\r\n 0x2039: 0x203A, // ‹ → ›\r\n 0x203A: 0x2039, // › → ‹\r\n 0x2045: 0x2046, // ⁅ → ⁆\r\n 0x2046: 0x2045, // ⁆ → ⁅\r\n 0x207D: 0x207E, // ⁽ → ⁾\r\n 0x207E: 0x207D, // ⁾ → ⁽\r\n 0x208D: 0x208E, // ₍ → ₎\r\n 0x208E: 0x208D, // ₎ → ₍\r\n 0x2329: 0x232A, // 〈 → 〉\r\n 0x232A: 0x2329, // 〉 → 〈\r\n 0x27E6: 0x27E7, // ⟦ → ⟧\r\n 0x27E7: 0x27E6, // ⟧ → ⟦\r\n 0x27E8: 0x27E9, // ⟨ → ⟩\r\n 0x27E9: 0x27E8, // ⟩ → ⟨\r\n 0x27EA: 0x27EB, // ⟪ → ⟫\r\n 0x27EB: 0x27EA, // ⟫ → ⟪\r\n 0x2983: 0x2984, // ⦃ → ⦄\r\n 0x2984: 0x2983, // ⦄ → ⦃\r\n 0x2985: 0x2986, // ⦅ → ⦆\r\n 0x2986: 0x2985, // ⦆ → ⦅\r\n 0x2987: 0x2988, // ⦇ → ⦈\r\n 0x2988: 0x2987, // ⦈ → ⦇\r\n 0x2989: 0x298A, // ⦉ → ⦊\r\n 0x298A: 0x2989, // ⦊ → ⦉\r\n 0x298B: 0x298C, // ⦋ → ⦌\r\n 0x298C: 0x298B, // ⦌ → ⦋\r\n 0x3008: 0x3009, // 〈 → 〉\r\n 0x3009: 0x3008, // 〉 → 〈\r\n 0x300A: 0x300B, // 《 → 》\r\n 0x300B: 0x300A, // 》 → 《\r\n};\r\n\r\n/**\r\n * Apply glyph mirroring for a code point in RTL context.\r\n * Returns the mirrored code point, or the original if no mirror exists.\r\n *\r\n * @param cp - Unicode code point to mirror\r\n * @returns Mirrored code point (e.g. '(' → ')') or the original\r\n */\r\nexport function mirrorCodePoint(cp: number): number {\r\n return MIRROR_MAP[cp] ?? cp;\r\n}\r\n\r\n// ── Practical Fixups ─────────────────────────────────────────────────\r\n\r\n/** Sentence-terminating punctuation codepoints. */\r\nconst SENTENCE_PUNCT = new Set([\r\n 0x002E, // .\r\n 0x002C, // ,\r\n 0x003B, // ;\r\n 0x003A, // :\r\n 0x0021, // !\r\n 0x003F, // ?\r\n]);\r\n\r\n/**\r\n * In RTL paragraphs, keep sentence punctuation (. , ; : ! ?) attached to\r\n * the preceding LTR word. Standard N2 assigns paragraph direction (R) when\r\n * neighbors disagree, causing \"pdfnative.\" to split into \"pdfnative\" + \".\".\r\n * We reassign the punctuation to L so it stays in the same LTR run.\r\n */\r\nfunction fixPunctuationAffinity(types: BidiType[], codePoints: number[], len: number): void {\r\n for (let i = 1; i < len; i++) {\r\n if (types[i] === 'R' && SENTENCE_PUNCT.has(codePoints[i])) {\r\n // Check if preceding non-WS character is L\r\n let prevIdx = i - 1;\r\n while (prevIdx >= 0 && (types[prevIdx] === 'WS' || types[prevIdx] === 'BN')) prevIdx--;\r\n if (prevIdx >= 0 && types[prevIdx] === 'L') {\r\n types[i] = 'L';\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Simplified bracket pairing for parentheses, square brackets, and curly braces.\r\n * When brackets enclose LTR content in an RTL paragraph, the opener and closer\r\n * should share the LTR level so they visually surround the content.\r\n * Handles: ( ), [ ], { }\r\n */\r\nfunction fixBracketPairing(types: BidiType[], codePoints: number[], len: number): void {\r\n const OPEN_BRACKETS: Record<number, number> = {\r\n 0x0028: 0x0029, // ( → )\r\n 0x005B: 0x005D, // [ → ]\r\n 0x007B: 0x007D, // { → }\r\n };\r\n\r\n for (let i = 0; i < len; i++) {\r\n const closer = OPEN_BRACKETS[codePoints[i]];\r\n if (closer === undefined) continue;\r\n // Found an opening bracket — find the matching closer\r\n let depth = 1;\r\n let closeIdx = -1;\r\n for (let j = i + 1; j < len; j++) {\r\n if (codePoints[j] === codePoints[i]) depth++;\r\n else if (codePoints[j] === closer) {\r\n depth--;\r\n if (depth === 0) { closeIdx = j; break; }\r\n }\r\n }\r\n if (closeIdx === -1) continue;\r\n // Check if the content between brackets contains any L\r\n let hasL = false;\r\n for (let j = i + 1; j < closeIdx; j++) {\r\n if (types[j] === 'L') { hasL = true; break; }\r\n }\r\n if (hasL) {\r\n // Assign opener and closer to L so they stay with the LTR content\r\n types[i] = 'L';\r\n types[closeIdx] = 'L';\r\n }\r\n }\r\n}\r\n\r\n// ── Main API ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Resolve bidirectional text into ordered runs with embedding levels.\r\n *\r\n * @param text - Input text in logical order\r\n * @returns Array of BidiRun objects in visual order\r\n */\r\nexport function resolveBidiRuns(text: string): BidiRun[] {\r\n if (!text) return [];\r\n\r\n // Extract code points\r\n const codePoints: number[] = [];\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n codePoints.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n const len = codePoints.length;\r\n if (len === 0) return [];\r\n\r\n // Step 1: Classify\r\n const types: BidiType[] = codePoints.map(classifyBidiType);\r\n\r\n // Step 2: Detect paragraph level (P2-P3)\r\n const paraLevel = detectParagraphLevel(types);\r\n\r\n // Step 3: Resolve weak types (W1-W7)\r\n resolveWeakTypes(types, paraLevel);\r\n\r\n // Step 4: Resolve neutral types (N1-N2)\r\n resolveNeutralTypes(types, paraLevel);\r\n\r\n // Step 4b: Practical fixups for common mixed RTL/LTR patterns.\r\n // Standard N2 assigns paragraph direction to neutrals between opposing strong\r\n // types. This causes periods after LTR words to drift into RTL runs and\r\n // bracket pairs around LTR content to split across runs. We fix these by\r\n // keeping sentence punctuation with the preceding LTR text and by pairing\r\n // brackets with their enclosed content.\r\n if (paraLevel === 1) {\r\n fixPunctuationAffinity(types, codePoints, len);\r\n fixBracketPairing(types, codePoints, len);\r\n }\r\n\r\n // Step 5: Assign levels\r\n const levels = assignLevels(types, paraLevel);\r\n\r\n // Step 6: Build runs of same level\r\n const runs: BidiRun[] = [];\r\n let runStart = 0;\r\n let runLevel = levels[0];\r\n // Map from codepoint index to string index\r\n const cpToStr: number[] = [];\r\n let strIdx = 0;\r\n for (let i = 0; i < len; i++) {\r\n cpToStr.push(strIdx);\r\n strIdx += codePoints[i] > 0xFFFF ? 2 : 1;\r\n }\r\n cpToStr.push(strIdx); // sentinel\r\n\r\n for (let i = 1; i <= len; i++) {\r\n if (i === len || levels[i] !== runLevel) {\r\n const start = cpToStr[runStart];\r\n const end = cpToStr[i];\r\n let runText = text.substring(start, end);\r\n // Reverse RTL runs for visual order.\r\n // Note: do NOT apply glyph mirroring (UAX #9 L4) here — our rendering\r\n // model pre-reverses text for a left-to-right PDF engine. The reversal\r\n // itself swaps bracket/paren positions correctly: logical \"(X)\" becomes\r\n // visual \")X(\" → PDF renders L→R as \")X(\" → reader reads R→L as \"(X)\".\r\n // Applying mirrorCodePoint would double-swap and produce wrong output.\r\n if (runLevel % 2 === 1) {\r\n runText = reverseString(runText);\r\n }\r\n runs.push({ text: runText, level: runLevel, start });\r\n if (i < len) {\r\n runStart = i;\r\n runLevel = levels[i];\r\n }\r\n }\r\n }\r\n\r\n // L2 reordering: for RTL paragraphs, reverse run order so that\r\n // the first logical run (rightmost visually) appears last in the\r\n // array — txt() renders runs left-to-right, so English text must\r\n // come first and Hebrew/Arabic text last.\r\n if (paraLevel === 1 && runs.length > 1) {\r\n runs.reverse();\r\n }\r\n\r\n return runs;\r\n}\r\n\r\n/**\r\n * Check if text contains any RTL characters (Arabic or Hebrew).\r\n *\r\n * @param text - Input text string\r\n * @returns True if text contains R or AL bidi types\r\n */\r\nexport function containsRTL(text: string): boolean {\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n const t = classifyBidiType(cp);\r\n if (t === 'R' || t === 'AL') return true;\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n return false;\r\n}\r\n\r\n// ── Internal Helpers ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Reverse a string while keeping surrogate pairs intact.\r\n *\r\n * @param str - Input string to reverse\r\n * @returns Reversed string with valid surrogate pair ordering\r\n */\r\nexport function reverseString(str: string): string {\r\n const cps: number[] = [];\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n cps.reverse();\r\n return String.fromCodePoint(...cps);\r\n}\r\n","/**\r\n * pdfnative — Encoding Context Factory\r\n * ======================================\r\n * Creates encoding contexts that bridge font encoding (WinAnsi/CIDFont)\r\n * with text shaping (Thai, Arabic, BiDi, multi-font fallback).\r\n *\r\n * Separated from encoding.ts to maintain unidirectional dependency flow:\r\n * core/ can import from both fonts/ and shaping/, while fonts/ stays\r\n * independent of shaping/.\r\n */\r\n\r\nimport type { FontEntry, FontData, TextRun, EncodingContext } from '../types/pdf-types.js';\r\nimport { pdfString, helveticaWidth } from '../fonts/encoding.js';\r\nimport { shapeThaiText } from '../shaping/thai-shaper.js';\r\nimport { shapeBengaliText } from '../shaping/bengali-shaper.js';\r\nimport { shapeTamilText } from '../shaping/tamil-shaper.js';\r\nimport { shapeDevanagariText } from '../shaping/devanagari-shaper.js';\r\nimport { shapeArabicText } from '../shaping/arabic-shaper.js';\r\nimport { splitTextByFont } from '../shaping/multi-font.js';\r\nimport { resolveBidiRuns, containsRTL, reverseString } from '../shaping/bidi.js';\r\nimport { isArabicCodepoint, containsThai, containsArabic, containsBengali, containsTamil, containsDevanagari } from '../shaping/script-registry.js';\r\n\r\n// ── Helvetica Fallback Helpers ───────────────────────────────────────\r\n\r\n/** Check if a codepoint is WinAnsi-encodable (basic Latin + Latin-1 Supplement + extras). */\r\nfunction isWinAnsi(cp: number): boolean {\r\n if ((cp >= 0x20 && cp <= 0x7E) || (cp >= 0xA0 && cp <= 0xFF)) return true;\r\n // Extended WinAnsi: full Windows-1252 range 0x80–0x9F\r\n if (cp === 0x20AC || cp === 0x201A || cp === 0x0192 || cp === 0x201E) return true;\r\n if (cp === 0x2026 || cp === 0x2020 || cp === 0x2021 || cp === 0x02C6) return true;\r\n if (cp === 0x2030 || cp === 0x0160 || cp === 0x2039 || cp === 0x0152) return true;\r\n if (cp === 0x017D || cp === 0x2018 || cp === 0x2019 || cp === 0x201C) return true;\r\n if (cp === 0x201D || cp === 0x2022 || cp === 0x2013 || cp === 0x2014) return true;\r\n if (cp === 0x02DC || cp === 0x2122 || cp === 0x0161 || cp === 0x203A) return true;\r\n if (cp === 0x0153 || cp === 0x017E || cp === 0x0178) return true;\r\n if (cp === 0x202F || cp === 0x09 || cp === 0x0A || cp === 0x0D) return true;\r\n return false;\r\n}\r\n\r\ninterface ArabicSegment { text: string; arabic: boolean; }\r\n\r\n/**\r\n * Split text into Arabic-shapeable and non-Arabic segments.\r\n * Spaces adjacent to Arabic chars stay in the Arabic segment;\r\n * non-Arabic chars without a CIDFont glyph form their own segments.\r\n */\r\nfunction splitArabicNonArabic(text: string, fd: FontData): ArabicSegment[] {\r\n const segments: ArabicSegment[] = [];\r\n let cur = '';\r\n let curArabic = false;\r\n\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n const charLen = cp > 0xFFFF ? 2 : 1;\r\n const char = text.substring(i, i + charLen);\r\n const isAr = isArabicCodepoint(cp);\r\n // Space is Arabic-adjacent if the CIDFont has a glyph for it\r\n const isArSpace = cp === 0x20 && (fd.cmap[0x20] ?? 0) > 0;\r\n\r\n if (isAr || isArSpace) {\r\n if (cur && !curArabic) { segments.push({ text: cur, arabic: false }); cur = ''; }\r\n curArabic = true;\r\n cur += char;\r\n } else {\r\n if (cur && curArabic) { segments.push({ text: cur, arabic: true }); cur = ''; }\r\n curArabic = false;\r\n cur += char;\r\n }\r\n i += charLen;\r\n }\r\n if (cur) segments.push({ text: cur, arabic: curArabic });\r\n return segments;\r\n}\r\n\r\n/**\r\n * Build TextRuns for a non-shaped text segment, splitting into CIDFont and\r\n * Helvetica sub-runs based on cmap coverage. Characters with no CIDFont glyph\r\n * that are WinAnsi-encodable fall back to Helvetica (/F1).\r\n */\r\nfunction buildTextRunsWithFallback(\r\n text: string,\r\n fontRef: string,\r\n fd: FontData,\r\n sz: number,\r\n trackGid: (ref: string, gid: number) => void,\r\n): TextRun[] {\r\n const upm = fd.metrics.unitsPerEm;\r\n const result: TextRun[] = [];\r\n let mode: 'cid' | 'hel' | null = null;\r\n let cidChars = '';\r\n let cidHex = '';\r\n let cidDesignW = 0;\r\n let helChars = '';\r\n\r\n function flushCid(): void {\r\n if (!cidChars) return;\r\n result.push({\r\n text: cidChars, fontRef, fontData: fd, shaped: null,\r\n hexStr: `<${cidHex.toUpperCase()}>`,\r\n widthPt: cidDesignW * sz / upm,\r\n });\r\n cidChars = '';\r\n cidHex = '';\r\n cidDesignW = 0;\r\n }\r\n\r\n function flushHel(): void {\r\n if (!helChars) return;\r\n result.push({\r\n text: helChars, fontRef: '/F1', fontData: fd, shaped: null,\r\n hexStr: pdfString(helChars),\r\n widthPt: helveticaWidth(helChars, sz),\r\n });\r\n helChars = '';\r\n }\r\n\r\n for (let i = 0; i < text.length;) {\r\n const rawCp = text.codePointAt(i) ?? 0;\r\n const charLen = rawCp > 0xFFFF ? 2 : 1;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const char = text.substring(i, i + charLen);\r\n const gid = fd.cmap[cp] ?? 0;\r\n\r\n if (gid === 0 && isWinAnsi(cp)) {\r\n // No CIDFont glyph, but WinAnsi-encodable → Helvetica\r\n if (mode === 'cid') flushCid();\r\n mode = 'hel';\r\n helChars += char;\r\n } else if (mode === 'hel' && isWinAnsi(cp)) {\r\n // Stay in Helvetica for WinAnsi chars (avoids font-switching on spaces\r\n // between Latin words when the CIDFont happens to cover space)\r\n helChars += char;\r\n } else {\r\n if (mode === 'hel') flushHel();\r\n mode = 'cid';\r\n cidChars += char;\r\n trackGid(fontRef, gid);\r\n cidHex += gid.toString(16).padStart(4, '0');\r\n const gw = fd.widths[gid];\r\n cidDesignW += gw !== undefined ? gw : fd.defaultWidth;\r\n }\r\n i += charLen;\r\n }\r\n if (mode === 'cid') flushCid();\r\n if (mode === 'hel') flushHel();\r\n\r\n return result;\r\n}\r\n\r\n// ── Encoding Context Factory ─────────────────────────────────────────\r\n\r\n/**\r\n * Create an encoding context that encapsulates text encoding and font reference logic.\r\n * Latin mode uses WinAnsi/Helvetica, Unicode mode uses CIDFont/Identity-H.\r\n *\r\n * @param fontEntries - Array of font entries (primary first). Empty = Latin mode.\r\n */\r\nexport function createEncodingContext(fontEntries: FontEntry[]): EncodingContext {\r\n if (!fontEntries || fontEntries.length === 0) {\r\n return {\r\n isUnicode: false,\r\n fontEntries: [],\r\n ps: pdfString,\r\n tw: helveticaWidth,\r\n textRuns: () => [],\r\n f1: '/F1',\r\n f2: '/F2'\r\n };\r\n }\r\n\r\n const primary = fontEntries[0];\r\n\r\n // Track used glyph IDs per font for subsetting\r\n const _usedGids = new Map<string, Set<number>>();\r\n for (const fe of fontEntries) _usedGids.set(fe.fontRef, new Set());\r\n\r\n function _trackGid(fontRef: string, gid: number): void {\r\n const s = _usedGids.get(fontRef);\r\n if (s) s.add(gid);\r\n }\r\n\r\n return {\r\n isUnicode: true,\r\n fontEntries,\r\n fontData: primary.fontData,\r\n f1: primary.fontRef,\r\n f2: primary.fontRef,\r\n getUsedGids() { return _usedGids; },\r\n\r\n textRuns(str: string, sz: number): TextRun[] {\r\n if (!str) return [];\r\n\r\n // ── RTL path: BiDi reordering ────────────────────────────\r\n if (containsRTL(str)) {\r\n const bidiRuns = resolveBidiRuns(str);\r\n const result: TextRun[] = [];\r\n\r\n for (const bRun of bidiRuns) {\r\n const isRTL = bRun.level % 2 === 1;\r\n const fontRuns = splitTextByFont(bRun.text, fontEntries);\r\n\r\n for (const fRun of fontRuns) {\r\n const fd = fRun.entry.fontData;\r\n const upm = fd.metrics.unitsPerEm;\r\n const fontRef = fRun.entry.fontRef;\r\n\r\n if (isRTL && containsArabic(fRun.text)) {\r\n // Split into Arabic-shapeable segments and non-Arabic segments.\r\n // Non-Arabic chars (e.g. em-dash) without a CIDFont glyph must\r\n // fall back to Helvetica, not pass through shapeArabicText()\r\n // where they would produce .notdef (gid 0).\r\n const segments = splitArabicNonArabic(fRun.text, fd);\r\n for (const seg of segments) {\r\n if (seg.arabic) {\r\n const logical = reverseString(seg.text);\r\n const shaped = shapeArabicText(logical, fd);\r\n const visual = shaped.slice().reverse();\r\n let designW = 0;\r\n for (const g of visual) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: seg.text, fontRef, fontData: fd, shaped: visual, hexStr: null, widthPt: designW * sz / upm });\r\n } else {\r\n // Non-Arabic segment: use Helvetica fallback\r\n const subRuns = buildTextRunsWithFallback(seg.text, fontRef, fd, sz, _trackGid);\r\n result.push(...subRuns);\r\n }\r\n }\r\n } else if (isRTL) {\r\n // RTL non-Arabic (Hebrew etc.): text already reversed by BiDi\r\n // Use fallback helper to handle Latin chars not covered by CIDFont\r\n const subRuns = buildTextRunsWithFallback(fRun.text, fontRef, fd, sz, _trackGid);\r\n result.push(...subRuns);\r\n } else {\r\n // LTR run: standard path\r\n if (containsThai(fRun.text)) {\r\n const shaped = shapeThaiText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else if (containsBengali(fRun.text)) {\r\n const shaped = shapeBengaliText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else if (containsTamil(fRun.text)) {\r\n const shaped = shapeTamilText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else if (containsDevanagari(fRun.text)) {\r\n const shaped = shapeDevanagariText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else {\r\n // LTR non-shaped: use fallback helper\r\n const subRuns = buildTextRunsWithFallback(fRun.text, fontRef, fd, sz, _trackGid);\r\n result.push(...subRuns);\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // ── LTR path: existing logic ─────────────────────────────\r\n const rawRuns = splitTextByFont(str, fontEntries);\r\n return rawRuns.flatMap(run => {\r\n const fd = run.entry.fontData;\r\n const fontRef = run.entry.fontRef;\r\n const upm = fd.metrics.unitsPerEm;\r\n\r\n if (containsThai(run.text)) {\r\n const shaped = shapeThaiText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n if (containsBengali(run.text)) {\r\n const shaped = shapeBengaliText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n if (containsTamil(run.text)) {\r\n const shaped = shapeTamilText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n if (containsDevanagari(run.text)) {\r\n const shaped = shapeDevanagariText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n return buildTextRunsWithFallback(run.text, fontRef, fd, sz, _trackGid);\r\n });\r\n },\r\n\r\n ps(str: string): string {\r\n if (!str) return '<>';\r\n const { cmap } = primary.fontData;\r\n\r\n // BiDi path for RTL text\r\n if (containsRTL(str)) {\r\n const bidiRuns = resolveBidiRuns(str);\r\n let hex = '';\r\n for (const bRun of bidiRuns) {\r\n const isRTL = bRun.level % 2 === 1;\r\n if (isRTL && containsArabic(bRun.text)) {\r\n const logical = reverseString(bRun.text);\r\n const shaped = shapeArabicText(logical, primary.fontData);\r\n for (let i = shaped.length - 1; i >= 0; i--) {\r\n _trackGid(primary.fontRef, shaped[i].gid);\r\n hex += shaped[i].gid.toString(16).padStart(4, '0');\r\n }\r\n } else {\r\n for (let i = 0; i < bRun.text.length; i++) {\r\n const rawCp = bRun.text.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = cmap[cp] || 0;\r\n _trackGid(primary.fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n }\r\n }\r\n }\r\n return `<${hex.toUpperCase()}>`;\r\n }\r\n\r\n if (!containsThai(str) && !containsBengali(str) && !containsTamil(str) && !containsDevanagari(str)) {\r\n let hex = '';\r\n for (let i = 0; i < str.length; i++) {\r\n const rawCp = str.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = cmap[cp] || 0;\r\n _trackGid(primary.fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n }\r\n return `<${hex.toUpperCase()}>`;\r\n }\r\n // Shaped text path (Thai, Bengali, Tamil, Devanagari)\r\n const shapeFn = containsThai(str) ? shapeThaiText\r\n : containsBengali(str) ? shapeBengaliText\r\n : containsTamil(str) ? shapeTamilText\r\n : shapeDevanagariText;\r\n const shaped = shapeFn(str, primary.fontData);\r\n let hex = '';\r\n for (const g of shaped) { _trackGid(primary.fontRef, g.gid); hex += g.gid.toString(16).padStart(4, '0'); }\r\n return `<${hex.toUpperCase()}>`;\r\n },\r\n\r\n tw(str: string, sz: number): number {\r\n if (!str) return 0;\r\n const runs = this.textRuns(str, sz);\r\n let total = 0;\r\n for (const run of runs) total += run.widthPt;\r\n return total;\r\n },\r\n };\r\n}\r\n","/**\r\n * pdfnative — Font Embedder\r\n * ===========================\r\n * Helpers for embedding CIDFont Type2 fonts in PDF:\r\n * - Base64 → binary string decoder\r\n * - ToUnicode CMap builder\r\n * - Compact /W width array builder\r\n */\r\n\r\n/**\r\n * Decode a base64 string to a single-byte binary string.\r\n * Each character maps to exactly one byte (charCode ≤ 0xFF).\r\n */\r\nexport function base64ToByteString(b64: string): string {\r\n if (typeof atob === 'function') {\r\n return atob(b64);\r\n }\r\n // Node.js fallback\r\n const buf = (globalThis as Record<string, unknown>)['Buffer'] as { from(s: string, e: string): Uint8Array };\r\n const bytes = buf.from(b64, 'base64');\r\n let result = '';\r\n for (let i = 0; i < bytes.length; i++) {\r\n result += String.fromCharCode(bytes[i]);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Build a PDF ToUnicode CMap stream for CIDFont.\r\n * Maps glyph IDs back to Unicode code points for text selection/search.\r\n *\r\n * @param cmap - Unicode codepoint → glyph ID mapping\r\n * @param usedGids - Only include these glyph IDs (subset optimization)\r\n */\r\nexport function buildToUnicodeCMap(cmap: Record<number, number>, usedGids: Set<number>): string {\r\n // Invert cmap: glyphId → unicode codepoint (keep lowest codepoint)\r\n const glyphToUnicode: Record<number, number> = {};\r\n for (const [cp, gid] of Object.entries(cmap)) {\r\n const cpNum = Number(cp);\r\n if (!glyphToUnicode[gid] || cpNum < glyphToUnicode[gid]) {\r\n glyphToUnicode[gid] = cpNum;\r\n }\r\n }\r\n\r\n // Build bfchar entries (max 100 per block per PDF spec)\r\n const entries: [number, number][] = Object.entries(glyphToUnicode)\r\n .map(([gid, cp]) => [Number(gid), cp] as [number, number])\r\n .filter(([gid]) => !usedGids || usedGids.has(gid))\r\n .sort((a, b) => a[0] - b[0]);\r\n\r\n const chunks: string[] = [];\r\n for (let i = 0; i < entries.length; i += 100) {\r\n const batch = entries.slice(i, i + 100);\r\n const lines = batch.map(([gid, cp]) => {\r\n const gidHex = gid.toString(16).padStart(4, '0').toUpperCase();\r\n if (cp > 0xFFFF) {\r\n const hi = 0xD800 + ((cp - 0x10000) >> 10);\r\n const lo = 0xDC00 + ((cp - 0x10000) & 0x3FF);\r\n return `<${gidHex}> <${hi.toString(16).toUpperCase()}${lo.toString(16).toUpperCase()}>`;\r\n }\r\n return `<${gidHex}> <${cp.toString(16).padStart(4, '0').toUpperCase()}>`;\r\n });\r\n chunks.push(`${batch.length} beginbfchar\\n${lines.join('\\n')}\\nendbfchar`);\r\n }\r\n\r\n return [\r\n '/CIDInit /ProcSet findresource begin',\r\n '12 dict begin',\r\n 'begincmap',\r\n '/CIDSystemInfo',\r\n '<< /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def',\r\n '/CMapName /Adobe-Identity-UCS def',\r\n '/CMapType 2 def',\r\n '1 begincodespacerange',\r\n '<0000> <FFFF>',\r\n 'endcodespacerange',\r\n ...chunks,\r\n 'endcmap',\r\n 'CMapName currentdict /CMap defineresource pop',\r\n 'end',\r\n 'end'\r\n ].join('\\n');\r\n}\r\n\r\n/**\r\n * Build a compact /W array string for the CIDFont dictionary using only used GIDs.\r\n * Groups consecutive GIDs into ranges.\r\n *\r\n * @param widths - Full glyph widths table\r\n * @param usedGids - Set of used glyph IDs\r\n * @returns Compact /W array string, or null if no valid entries\r\n */\r\nexport function buildSubsetWidthArray(widths: Record<number, number>, usedGids: Set<number>): string | null {\r\n if (!usedGids || usedGids.size === 0) return null;\r\n const sorted = [...usedGids].filter(g => widths[g] !== undefined).sort((a, b) => a - b);\r\n if (sorted.length === 0) return null;\r\n\r\n const parts: string[] = [];\r\n let i = 0;\r\n while (i < sorted.length) {\r\n const start = sorted[i];\r\n const run = [widths[start]];\r\n while (i + 1 < sorted.length && sorted[i + 1] === sorted[i] + 1) {\r\n i++;\r\n run.push(widths[sorted[i]]);\r\n }\r\n parts.push(`${start} [${run.join(' ')}]`);\r\n i++;\r\n }\r\n return parts.join(' ');\r\n}\r\n","/**\r\n * pdfnative — Font Loader\r\n * =========================\r\n * Configurable font registry and lazy-loading.\r\n * Users register font data loaders, which are invoked on demand and cached.\r\n */\r\n\r\nimport type { FontData } from '../types/pdf-types.js';\r\n\r\n/** Font loader function type — returns a FontData or module with default export */\r\nexport type FontLoader = () => Promise<FontData | { default: FontData }>;\r\n\r\n/** Global font registry: language code → loader function */\r\nconst _fontRegistry = new Map<string, FontLoader>();\r\n\r\n/** Cache for loaded font data */\r\nconst _fontDataCache = new Map<string, FontData>();\r\n\r\n/**\r\n * Per-FontData decoded binary cache. WeakMap ensures entries are GC'd when FontData\r\n * is no longer referenced (e.g., after clearFontCache / resetFontRegistry).\r\n * Avoids re-running base64 decode + charCodeAt loop on every buildPDF() call.\r\n */\r\nconst _fontBinaryCache = new WeakMap<FontData, Uint8Array>();\r\n\r\n/**\r\n * Decode the TTF binary for a FontData object and return a cached Uint8Array.\r\n * Subsequent calls for the same FontData instance are zero-cost (WeakMap lookup).\r\n *\r\n * This is an internal helper used by pdf-builder and pdf-document to feed\r\n * subsetTTF() the Uint8Array path, skipping the charCodeAt decode loop.\r\n */\r\nexport function getDecodedFontBytes(fontData: FontData): Uint8Array {\r\n const cached = _fontBinaryCache.get(fontData);\r\n if (cached) return cached;\r\n\r\n // Decode base64 → Uint8Array (runs once per FontData instance)\r\n let bytes: Uint8Array;\r\n if (typeof atob === 'function') {\r\n const binaryStr = atob(fontData.ttfBase64);\r\n bytes = new Uint8Array(binaryStr.length);\r\n for (let i = 0; i < binaryStr.length; i++) bytes[i] = binaryStr.charCodeAt(i);\r\n } else {\r\n const buf = (globalThis as Record<string, unknown>)['Buffer'] as { from(s: string, e: string): Uint8Array };\r\n bytes = buf.from(fontData.ttfBase64, 'base64');\r\n }\r\n\r\n _fontBinaryCache.set(fontData, bytes);\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Register a font data loader for a language.\r\n *\r\n * @example\r\n * ```ts\r\n * registerFont('th', () => import('./fonts/noto-thai-data.js'));\r\n * registerFont('ja', () => import('./fonts/noto-jp-data.js'));\r\n * ```\r\n */\r\nexport function registerFont(lang: string, loader: FontLoader): void {\r\n _fontRegistry.set(lang, loader);\r\n}\r\n\r\n/**\r\n * Register multiple font loaders at once.\r\n *\r\n * @example\r\n * ```ts\r\n * registerFonts({\r\n * th: () => import('./fonts/noto-thai-data.js'),\r\n * ja: () => import('./fonts/noto-jp-data.js'),\r\n * });\r\n * ```\r\n */\r\nexport function registerFonts(fonts: Record<string, FontLoader>): void {\r\n for (const [lang, loader] of Object.entries(fonts)) {\r\n _fontRegistry.set(lang, loader);\r\n }\r\n}\r\n\r\n/**\r\n * Lazy-load pre-built font data for a language.\r\n * Returns cached data if already loaded. Retries once on failure.\r\n *\r\n * @param lang - Language code (e.g. 'th', 'ja', 'zh')\r\n * @returns Font data or null if unavailable\r\n */\r\nexport async function loadFontData(lang: string): Promise<FontData | null> {\r\n const cached = _fontDataCache.get(lang);\r\n if (cached) return cached;\r\n\r\n const loader = _fontRegistry.get(lang);\r\n if (!loader) return null;\r\n\r\n // Retry once after 500ms to handle cache race on fresh install\r\n for (let attempt = 0; attempt < 2; attempt++) {\r\n try {\r\n const mod = await loader();\r\n // Support both direct FontData and ES module default export\r\n const fontData = ('default' in mod) ? mod.default : mod;\r\n _fontDataCache.set(lang, fontData as FontData);\r\n return fontData as FontData;\r\n } catch {\r\n if (attempt === 0) {\r\n await new Promise(r => setTimeout(r, 500));\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Check if a font loader is registered for the given language.\r\n */\r\nexport function hasFontLoader(lang: string): boolean {\r\n return _fontRegistry.has(lang);\r\n}\r\n\r\n/**\r\n * Get all registered language codes.\r\n */\r\nexport function getRegisteredLangs(): string[] {\r\n return [..._fontRegistry.keys()];\r\n}\r\n\r\n/**\r\n * Clear font cache (useful for testing).\r\n */\r\nexport function clearFontCache(): void {\r\n _fontDataCache.clear();\r\n}\r\n\r\n/**\r\n * Clear all registered fonts and cache (useful for testing).\r\n */\r\nexport function resetFontRegistry(): void {\r\n _fontRegistry.clear();\r\n _fontDataCache.clear();\r\n}\r\n","/**\r\n * pdfnative — TTF Font Subsetter\r\n * ================================\r\n * Subset a TrueType font binary to contain only used glyphs.\r\n * Retains original GID numbering (Identity-H compatible).\r\n * Resolves compound glyph component dependencies recursively.\r\n */\r\n\r\n/**\r\n * Subset a TTF binary to contain only used glyphs.\r\n * Returns the subset TTF as a binary string (for PDF stream embedding).\r\n *\r\n * Accepts either a pre-decoded `Uint8Array` (zero-copy, preferred for cached font data)\r\n * or a binary string (legacy path, used when the font was loaded via `atob`).\r\n *\r\n * @param ttfInput - Full TTF as Uint8Array (preferred) or binary string\r\n * @param usedGids - Set of glyph IDs used in the document\r\n * @returns Subset TTF as binary string\r\n */\r\nexport function subsetTTF(ttfInput: Uint8Array | string, usedGids: Set<number>): string {\r\n try {\r\n let u8: Uint8Array;\r\n let len: number;\r\n\r\n if (ttfInput instanceof Uint8Array) {\r\n // Zero-copy path: use the buffer directly, no charCodeAt loop\r\n u8 = ttfInput;\r\n len = u8.length;\r\n } else {\r\n // Legacy string path: decode binary string to Uint8Array\r\n len = ttfInput.length;\r\n const buf = new ArrayBuffer(len);\r\n u8 = new Uint8Array(buf);\r\n for (let i = 0; i < len; i++) u8[i] = ttfInput.charCodeAt(i);\r\n }\r\n\r\n if (len < 12) return ttfInput instanceof Uint8Array ? uint8ToBinaryString(u8) : ttfInput; // Too small for a valid TTF offset table\r\n const view = new DataView(u8.buffer, u8.byteOffset, u8.byteLength);\r\n\r\n // Parse offset table & table directory\r\n const numTables = view.getUint16(4);\r\n const dirEnd = 12 + numTables * 16;\r\n if (dirEnd > len) return ttfInput instanceof Uint8Array ? uint8ToBinaryString(u8) : ttfInput; // Table directory exceeds buffer\r\n const tables: Record<string, { offset: number; length: number }> = {};\r\n for (let i = 0; i < numTables; i++) {\r\n const off = 12 + i * 16;\r\n const tag = String.fromCharCode(u8[off], u8[off + 1], u8[off + 2], u8[off + 3]);\r\n tables[tag] = {\r\n offset: view.getUint32(off + 8),\r\n length: view.getUint32(off + 12)\r\n };\r\n }\r\n\r\n const head = tables['head'];\r\n const maxp = tables['maxp'];\r\n const loca = tables['loca'];\r\n const glyf = tables['glyf'];\r\n if (!head || !maxp || !loca || !glyf) return ttfInput instanceof Uint8Array ? uint8ToBinaryString(u8) : ttfInput;\r\n\r\n const numGlyphs = view.getUint16(maxp.offset + 4);\r\n const locaFormat = view.getInt16(head.offset + 50);\r\n\r\n // Read original loca offsets\r\n const origOffsets = new Uint32Array(numGlyphs + 1);\r\n for (let i = 0; i <= numGlyphs; i++) {\r\n origOffsets[i] = locaFormat === 0\r\n ? view.getUint16(loca.offset + i * 2) * 2\r\n : view.getUint32(loca.offset + i * 4);\r\n }\r\n\r\n // Always include GID 0 (.notdef — required by PDF spec)\r\n const allGids = new Set(usedGids);\r\n allGids.add(0);\r\n\r\n // Resolve compound glyph component references recursively.\r\n // Iteration limit prevents excessive processing on deeply nested or malicious fonts.\r\n const MAX_COMPOUND_ITERATIONS = 10_000;\r\n let iterations = 0;\r\n const queue = [...allGids];\r\n while (queue.length > 0) {\r\n if (++iterations > MAX_COMPOUND_ITERATIONS) break;\r\n const gid = queue.pop();\r\n if (gid === undefined || gid >= numGlyphs) continue;\r\n const off = origOffsets[gid];\r\n const next = origOffsets[gid + 1];\r\n if (off >= next) continue;\r\n const glyfOff = glyf.offset + off;\r\n if (glyfOff + 10 > len) continue; // Not enough room for glyph header\r\n if (view.getInt16(glyfOff) >= 0) continue; // simple glyph\r\n // Compound glyph — extract component GIDs\r\n let pos = glyfOff + 10;\r\n let flags;\r\n do {\r\n if (pos + 4 > len) break; // Bounds check for flags + GID\r\n flags = view.getUint16(pos);\r\n const componentGid = view.getUint16(pos + 2);\r\n if (!allGids.has(componentGid)) {\r\n allGids.add(componentGid);\r\n queue.push(componentGid);\r\n }\r\n pos += 4;\r\n if (flags & 0x0001) pos += 4; else pos += 2;\r\n if (flags & 0x0008) pos += 2;\r\n else if (flags & 0x0040) pos += 4;\r\n else if (flags & 0x0080) pos += 8;\r\n } while (flags & 0x0020);\r\n }\r\n\r\n // Build new glyf table (only used glyph outlines)\r\n const glyfChunks: Uint8Array[] = [];\r\n const newOffsets = new Uint32Array(numGlyphs + 1);\r\n let curOff = 0;\r\n for (let gid = 0; gid < numGlyphs; gid++) {\r\n newOffsets[gid] = curOff;\r\n if (allGids.has(gid)) {\r\n const off = origOffsets[gid];\r\n const next = origOffsets[gid + 1];\r\n const glyphLen = next - off;\r\n if (glyphLen > 0) {\r\n glyfChunks.push(u8.slice(glyf.offset + off, glyf.offset + next));\r\n curOff += glyphLen;\r\n if (glyphLen & 1) { glyfChunks.push(new Uint8Array(1)); curOff += 1; }\r\n }\r\n }\r\n }\r\n newOffsets[numGlyphs] = curOff;\r\n\r\n // Assemble new glyf\r\n const newGlyf = new Uint8Array(curOff);\r\n let pos = 0;\r\n for (const chunk of glyfChunks) { newGlyf.set(chunk, pos); pos += chunk.length; }\r\n\r\n // Build new loca (always long format)\r\n const newLocaBuf = new ArrayBuffer((numGlyphs + 1) * 4);\r\n const newLocaView = new DataView(newLocaBuf);\r\n for (let i = 0; i <= numGlyphs; i++) newLocaView.setUint32(i * 4, newOffsets[i]);\r\n const newLoca = new Uint8Array(newLocaBuf);\r\n\r\n // Tables required for PDF CIDFontType2\r\n const PDF_TABLES = new Set(['head', 'hhea', 'maxp', 'OS/2', 'cmap', 'hmtx', 'loca', 'glyf', 'name', 'post']);\r\n const tableTags = Object.keys(tables).filter(t => PDF_TABLES.has(t)).sort();\r\n const newTableData: Record<string, Uint8Array> = {};\r\n for (const tag of tableTags) {\r\n const t = tables[tag];\r\n newTableData[tag] = u8.slice(t.offset, t.offset + t.length);\r\n }\r\n newTableData['glyf'] = newGlyf;\r\n newTableData['loca'] = newLoca;\r\n\r\n // Update head: indexToLocFormat = 1 (long), zero checkSumAdjustment\r\n const headCopy = new Uint8Array(newTableData['head']);\r\n new DataView(headCopy.buffer, headCopy.byteOffset, headCopy.byteLength).setInt16(50, 1);\r\n new DataView(headCopy.buffer, headCopy.byteOffset, headCopy.byteLength).setUint32(8, 0);\r\n newTableData['head'] = headCopy;\r\n\r\n // Assemble new TTF binary\r\n const numNewTables = tableTags.length;\r\n const headerSize = 12 + numNewTables * 16;\r\n let totalSize = headerSize;\r\n const tableFileOffsets: Record<string, number> = {};\r\n for (const tag of tableTags) {\r\n tableFileOffsets[tag] = totalSize;\r\n totalSize += newTableData[tag].length;\r\n if (totalSize & 3) totalSize += 4 - (totalSize & 3);\r\n }\r\n\r\n const output = new Uint8Array(totalSize);\r\n const outView = new DataView(output.buffer);\r\n\r\n // Offset table header\r\n outView.setUint32(0, 0x00010000);\r\n outView.setUint16(4, numNewTables);\r\n let entrySelector = 0, searchRange = 1;\r\n while (searchRange * 2 <= numNewTables) { searchRange *= 2; entrySelector++; }\r\n searchRange *= 16;\r\n outView.setUint16(6, searchRange);\r\n outView.setUint16(8, entrySelector);\r\n outView.setUint16(10, numNewTables * 16 - searchRange);\r\n\r\n // Table directory entries\r\n for (let i = 0; i < tableTags.length; i++) {\r\n const tag = tableTags[i];\r\n const off = 12 + i * 16;\r\n for (let j = 0; j < 4; j++) output[off + j] = tag.charCodeAt(j);\r\n outView.setUint32(off + 4, ttfChecksum(newTableData[tag]));\r\n outView.setUint32(off + 8, tableFileOffsets[tag]);\r\n outView.setUint32(off + 12, newTableData[tag].length);\r\n }\r\n\r\n // Write table data\r\n for (const tag of tableTags) output.set(newTableData[tag], tableFileOffsets[tag]);\r\n\r\n // Convert Uint8Array back to binary string\r\n let result = '';\r\n for (let i = 0; i < output.length; i += 8192) {\r\n const end = Math.min(i + 8192, output.length);\r\n result += String.fromCharCode.apply(null, Array.from(output.subarray(i, end)));\r\n }\r\n return result;\r\n } catch {\r\n return ttfInput instanceof Uint8Array ? uint8ToBinaryString(ttfInput) : ttfInput;\r\n }\r\n}\r\n\r\n/**\r\n * Convert a Uint8Array to a binary string (for PDF stream embedding).\r\n * Uses chunked String.fromCharCode.apply to avoid call-stack overflow on large arrays.\r\n */\r\nexport function uint8ToBinaryString(u8: Uint8Array): string {\r\n let result = '';\r\n for (let i = 0; i < u8.length; i += 8192) {\r\n const end = Math.min(i + 8192, u8.length);\r\n result += String.fromCharCode.apply(null, Array.from(u8.subarray(i, end)));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Compute TTF table checksum (sum of 32-bit big-endian words).\r\n */\r\nexport function ttfChecksum(data: Uint8Array): number {\r\n const len = data.length;\r\n const padded = len & 3 ? new Uint8Array([...data, ...new Uint8Array(4 - (len & 3))]) : data;\r\n const view = new DataView(padded.buffer, padded.byteOffset, padded.byteLength);\r\n let sum = 0;\r\n for (let i = 0; i < padded.length; i += 4) sum = (sum + view.getUint32(i)) >>> 0;\r\n return sum;\r\n}\r\n","/**\r\n * pdfnative — Tagged PDF & PDF/A Support\r\n * ========================================\r\n * Structure tree, marked content operators, XMP metadata, and OutputIntent\r\n * for PDF/UA accessibility and PDF/A archival compliance.\r\n *\r\n * ISO 14289-1 (PDF/UA-1): logical reading order via structure tree\r\n * ISO 19005-1 (PDF/A-1b): archival with mandatory embedded fonts + XMP\r\n * ISO 32000-1 §14.7: structure tree and marked content\r\n * ISO 32000-1 §14.8: tagged PDF conventions\r\n */\r\n\r\nimport type { PdfAttachment } from '../types/pdf-types.js';\r\n\r\n// ── Marked Content Operators ─────────────────────────────────────────\r\n\r\n/**\r\n * Wrap content stream operators in a /Span marked content sequence\r\n * with /ActualText for text extraction fidelity.\r\n *\r\n * @param content - PDF content stream operators to wrap\r\n * @param actualText - Original Unicode text for extraction\r\n * @param mcid - Marked content identifier (links to structure tree)\r\n * @returns Wrapped content stream with BMC...EMC\r\n */\r\nexport function wrapSpan(content: string, actualText: string, mcid: number): string {\r\n const escaped = escapePdfUtf16(actualText);\r\n return `/Span << /MCID ${mcid} /ActualText ${escaped} >> BDC\\n${content}\\nEMC`;\r\n}\r\n\r\n/**\r\n * Wrap content in a generic marked content sequence (no ActualText).\r\n *\r\n * @param content - PDF content stream operators to wrap\r\n * @param tag - Structure tag name (e.g. 'P', 'Table')\r\n * @param mcid - Marked content identifier\r\n * @returns Wrapped content stream with BDC/EMC\r\n */\r\nexport function wrapMarkedContent(content: string, tag: string, mcid: number): string {\r\n return `/${tag} << /MCID ${mcid} >> BDC\\n${content}\\nEMC`;\r\n}\r\n\r\n/**\r\n * Escape a Unicode string as a PDF UTF-16BE hex string with BOM.\r\n * ISO 32000-1 §7.9.2.2: text strings may use UTF-16BE with 0xFEFF BOM.\r\n *\r\n * @param str - Input Unicode string\r\n * @returns PDF hex string with FEFF BOM prefix, e.g. '<FEFF0048006F>'\r\n */\r\nexport function escapePdfUtf16(str: string): string {\r\n if (!str) return '<FEFF>';\r\n let hex = 'FEFF'; // BOM\r\n for (let i = 0; i < str.length; i++) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) {\r\n // Surrogate pair for supplementary planes\r\n const hi = 0xD800 + ((cp - 0x10000) >> 10);\r\n const lo = 0xDC00 + ((cp - 0x10000) & 0x3FF);\r\n hex += hi.toString(16).padStart(4, '0').toUpperCase();\r\n hex += lo.toString(16).padStart(4, '0').toUpperCase();\r\n i++; // skip low surrogate in JS string\r\n } else {\r\n hex += cp.toString(16).padStart(4, '0').toUpperCase();\r\n }\r\n }\r\n return `<${hex}>`;\r\n}\r\n\r\n// ── Structure Tree ───────────────────────────────────────────────────\r\n\r\n/**\r\n * A structure element node in the tagged PDF structure tree.\r\n */\r\nexport interface StructElement {\r\n readonly type: string; // /Document, /Table, /TR, /TH, /TD, /P, /Span, /Figure\r\n readonly children: (StructElement | MCRef)[];\r\n objNum?: number;\r\n}\r\n\r\n/**\r\n * A marked content reference — links a structure element to a\r\n * marked content sequence in a page's content stream.\r\n */\r\nexport interface MCRef {\r\n readonly mcid: number;\r\n readonly pageObjNum: number;\r\n}\r\n\r\n/**\r\n * MCID allocator — assigns sequential IDs per page for marked content.\r\n * MCIDs restart at 0 for each page (ISO 32000-1 §14.7.4.4).\r\n *\r\n * @returns Allocator with next(pageObjNum) and getPageMCIDs() methods\r\n */\r\nexport function createMCIDAllocator(): {\r\n next(pageObjNum: number): number;\r\n getPageMCIDs(): Map<number, number[]>;\r\n} {\r\n const pageCounters = new Map<number, number>();\r\n const pageMCIDs = new Map<number, number[]>();\r\n\r\n return {\r\n next(pageObjNum: number): number {\r\n const counter = pageCounters.get(pageObjNum) ?? 0;\r\n pageCounters.set(pageObjNum, counter + 1);\r\n const list = pageMCIDs.get(pageObjNum);\r\n if (list) list.push(counter);\r\n else pageMCIDs.set(pageObjNum, [counter]);\r\n return counter;\r\n },\r\n getPageMCIDs() { return pageMCIDs; },\r\n };\r\n}\r\n\r\n/**\r\n * Build the PDF objects for a structure tree.\r\n * Returns an array of [objNum, content] pairs to emit.\r\n *\r\n * Structure (ISO 32000-1 §14.7.2):\r\n * StructTreeRoot → Document → [Table → TR → [TH|TD] ...] + [P] ...\r\n *\r\n * ParentTree (ISO 32000-1 §14.7.4.4):\r\n * NumberTree keyed by /StructParents value → array of struct element refs\r\n * indexed by MCID within that page.\r\n *\r\n * @param root - Root structure element (/Document)\r\n * @param startObjNum - First available object number\r\n * @param pageObjToStructParents - Map from page object number to /StructParents value\r\n * @returns { objects, structTreeRootObjNum, parentTreeObjNum }\r\n */\r\nexport function buildStructureTree(\r\n root: StructElement,\r\n startObjNum: number,\r\n pageObjToStructParents?: ReadonlyMap<number, number>,\r\n): { objects: [number, string][]; structTreeRootObjNum: number; parentTreeObjNum: number; totalObjects: number } {\r\n const objects: [number, string][] = [];\r\n let nextObj = startObjNum;\r\n\r\n // StructTreeRoot\r\n const structTreeRootObjNum = nextObj++;\r\n const parentTreeObjNum = nextObj++;\r\n\r\n // Assign object numbers recursively\r\n root.objNum = nextObj++;\r\n assignObjNums(root);\r\n\r\n function assignObjNums(el: StructElement): void {\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n (child as StructElement).objNum = nextObj++;\r\n assignObjNums(child as StructElement);\r\n }\r\n }\r\n }\r\n\r\n // Build ParentTree number tree (ISO 32000-1 §14.7.4.4)\r\n // Collect MCRef→parent struct element mapping, grouped by page\r\n const pageParentMap = new Map<number, Map<number, number>>(); // pageObjNum → (mcid → structElemObjNum)\r\n collectPageParents(root, pageParentMap);\r\n\r\n function collectPageParents(el: StructElement, map: Map<number, Map<number, number>>): void {\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n collectPageParents(child as StructElement, map);\r\n } else {\r\n const ref = child as MCRef;\r\n let pageMap = map.get(ref.pageObjNum);\r\n if (!pageMap) {\r\n pageMap = new Map();\r\n map.set(ref.pageObjNum, pageMap);\r\n }\r\n pageMap.set(ref.mcid, el.objNum ?? 0);\r\n }\r\n }\r\n }\r\n\r\n if (pageObjToStructParents && pageObjToStructParents.size > 0) {\r\n // Per-page arrays: /Nums [structParents0 [ref ref ...] structParents1 [ref ref ...] ...]\r\n const numsParts: string[] = [];\r\n const sorted = [...pageObjToStructParents.entries()].sort((a, b) => a[1] - b[1]);\r\n for (const [pageObjNum, structParents] of sorted) {\r\n const pageMap = pageParentMap.get(pageObjNum);\r\n if (pageMap) {\r\n const maxMcid = Math.max(...pageMap.keys());\r\n const refs: string[] = [];\r\n for (let i = 0; i <= maxMcid; i++) {\r\n refs.push(`${pageMap.get(i) ?? 0} 0 R`);\r\n }\r\n numsParts.push(`${structParents} [${refs.join(' ')}]`);\r\n }\r\n }\r\n objects.push([parentTreeObjNum,\r\n `<< /Type /NumberTree /Nums [${numsParts.join(' ')}] >>`]);\r\n } else {\r\n // Flat fallback for backward compatibility\r\n const parentEntries: [number, number][] = [];\r\n for (const [, pageMap] of pageParentMap) {\r\n for (const [mcid, objNum] of pageMap) {\r\n parentEntries.push([mcid, objNum]);\r\n }\r\n }\r\n parentEntries.sort((a, b) => a[0] - b[0]);\r\n const numsArray = parentEntries.map(([mcid, objNum]) => `${mcid} ${objNum} 0 R`).join(' ');\r\n objects.push([parentTreeObjNum,\r\n `<< /Type /NumberTree /Nums [${numsArray}] >>`]);\r\n }\r\n\r\n // StructTreeRoot object\r\n objects.push([structTreeRootObjNum,\r\n `<< /Type /StructTreeRoot /K ${root.objNum} 0 R /ParentTree ${parentTreeObjNum} 0 R >>`]);\r\n\r\n // Emit all structure elements\r\n emitElement(root, structTreeRootObjNum);\r\n\r\n function emitElement(el: StructElement, parentObjNum: number): void {\r\n const kids: string[] = [];\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n kids.push(`${(child as StructElement).objNum} 0 R`);\r\n } else {\r\n const ref = child as MCRef;\r\n kids.push(`<< /Type /MCR /MCID ${ref.mcid} /Pg ${ref.pageObjNum} 0 R >>`);\r\n }\r\n }\r\n const kArray = kids.length === 1 ? kids[0] : `[${kids.join(' ')}]`;\r\n const elObj = el.objNum ?? 0;\r\n objects.push([elObj,\r\n `<< /Type /StructElem /S /${el.type} /P ${parentObjNum} 0 R /K ${kArray} >>`]);\r\n\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n emitElement(child as StructElement, elObj);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n objects,\r\n structTreeRootObjNum,\r\n parentTreeObjNum,\r\n totalObjects: nextObj - startObjNum,\r\n };\r\n}\r\n\r\n// ── XMP Metadata ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Build an XMP metadata packet for PDF/A compliance.\r\n * ISO 19005-1 (PDF/A-1b): pdfaid:part=1, conformance=B\r\n * ISO 19005-2 (PDF/A-2b): pdfaid:part=2, conformance=B\r\n * ISO 19005-2 (PDF/A-2u): pdfaid:part=2, conformance=U\r\n * ISO 19005-3 (PDF/A-3b): pdfaid:part=3, conformance=B\r\n *\r\n * @param title - Document title\r\n * @param createDate - ISO 8601 formatted creation date\r\n * @param pdfaPart - PDF/A part number (1, 2, or 3). Default: 2\r\n * @param pdfaConformance - PDF/A conformance level ('B' or 'U'). Default: 'B'\r\n * @returns XMP metadata XML string\r\n */\r\nexport function buildXMPMetadata(title: string, createDate: string, pdfaPart: number = 2, pdfaConformance: string = 'B'): string {\r\n const escapedTitle = escapeXml(title);\r\n return [\r\n '<?xpacket begin=\"\\xEF\\xBB\\xBF\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>',\r\n '<x:xmpmeta xmlns:x=\"adobe:ns:meta/\">',\r\n ' <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">',\r\n ' <rdf:Description rdf:about=\"\"',\r\n ' xmlns:dc=\"http://purl.org/dc/elements/1.1/\"',\r\n ' xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\"',\r\n ' xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"',\r\n ' xmlns:pdfaid=\"http://www.aiim.org/pdfa/ns/id/\">',\r\n ` <dc:title><rdf:Alt><rdf:li xml:lang=\"x-default\">${escapedTitle}</rdf:li></rdf:Alt></dc:title>`,\r\n ' <dc:creator><rdf:Seq><rdf:li>pdfnative</rdf:li></rdf:Seq></dc:creator>',\r\n ' <pdf:Producer>pdfnative</pdf:Producer>',\r\n ` <xmp:CreateDate>${createDate}</xmp:CreateDate>`,\r\n ` <pdfaid:part>${pdfaPart}</pdfaid:part>`,\r\n ` <pdfaid:conformance>${pdfaConformance}</pdfaid:conformance>`,\r\n ' </rdf:Description>',\r\n ' </rdf:RDF>',\r\n '</x:xmpmeta>',\r\n '<?xpacket end=\"w\"?>',\r\n ].join('\\n');\r\n}\r\n\r\n/**\r\n * Build the sRGB OutputIntent dictionary content for PDF/A.\r\n * ISO 19005-1 §6.2.2: at least one OutputIntent required.\r\n *\r\n * @param iccStreamObjNum - Object number of the ICC profile stream\r\n * @param subtype - OutputIntent subtype (default: 'GTS_PDFA1')\r\n * @returns OutputIntent dictionary string\r\n */\r\nexport function buildOutputIntentDict(iccStreamObjNum: number, subtype: string = 'GTS_PDFA1'): string {\r\n return `<< /Type /OutputIntent /S /${subtype} ` +\r\n `/OutputConditionIdentifier (sRGB IEC61966-2.1) ` +\r\n `/RegistryName (http://www.color.org) ` +\r\n `/DestOutputProfile ${iccStreamObjNum} 0 R >>`;\r\n}\r\n\r\n/**\r\n * Build a minimal sRGB ICC profile stream for PDF/A compliance.\r\n * This is the smallest valid sRGB profile that satisfies PDF/A validators.\r\n * Per ISO 19005-1 §6.2.2, the ICC profile must be embedded.\r\n *\r\n * Returns a minimal sRGB ICC v2 profile with all 9 required tags for a\r\n * monitor class RGB profile:\r\n * desc, wtpt, cprt, rXYZ, gXYZ, bXYZ, rTRC, gTRC, bTRC\r\n *\r\n * sRGB colorant values are D50-adapted per ICC PCS specification.\r\n *\r\n * @returns ICC profile as a binary string\r\n */\r\nexport function buildMinimalSRGBProfile(): string {\r\n // ── Tag layout ───────────────────────────────────────────────────\r\n // 9 tags, but rTRC/gTRC/bTRC share the same data → 7 unique data blocks\r\n const tagCount = 9;\r\n const tagTableSize = 4 + tagCount * 12; // 4 (count) + 9 × 12 = 112 bytes\r\n const dataStart = 128 + tagTableSize; // 240\r\n\r\n const descSize = 36; // 'desc' + reserved + len + \"sRGB\" + padding\r\n const wtptSize = 20; // 'XYZ ' + reserved + X/Y/Z\r\n const cprtSize = 20; // 'text' + reserved + \"No CP\" + 3 padding (4-byte aligned)\r\n const xyzSize = 20; // 'XYZ ' + reserved + X/Y/Z (per colorant)\r\n const trcSize = 14; // 'curv' + reserved + count(1) + gamma(u8.8) + 2 padding\r\n\r\n const descOffset = dataStart; // 240\r\n const wtptOffset = descOffset + descSize; // 276\r\n const cprtOffset = wtptOffset + wtptSize; // 296\r\n const rXYZOffset = cprtOffset + cprtSize; // 316\r\n const gXYZOffset = rXYZOffset + xyzSize; // 336\r\n const bXYZOffset = gXYZOffset + xyzSize; // 356\r\n const trcOffset = bXYZOffset + xyzSize; // 376\r\n const totalSize = trcOffset + trcSize; // 390\r\n\r\n // ── Header (128 bytes) ───────────────────────────────────────────\r\n const header = new Uint8Array(128);\r\n const hv = new DataView(header.buffer);\r\n hv.setUint32(0, totalSize); // Profile size\r\n hv.setUint8(8, 2); hv.setUint8(9, 0x10); // ICC version 2.1.0\r\n hv.setUint32(12, 0x6D6E7472); // 'mntr' (monitor)\r\n hv.setUint32(16, 0x52474220); // 'RGB '\r\n hv.setUint32(20, 0x58595A20); // 'XYZ ' (PCS)\r\n hv.setUint16(24, 2025); hv.setUint16(26, 1); hv.setUint16(28, 1); // Date\r\n hv.setUint32(36, 0x61637370); // 'acsp'\r\n hv.setUint32(40, 0x4D534654); // 'MSFT' (primary platform)\r\n hv.setUint32(64, 0); // Rendering intent: perceptual\r\n // PCS illuminant D50: X=0.9505, Y=1.0000, Z=1.0890\r\n hv.setUint32(68, 0x0000F6D6); // X\r\n hv.setUint32(72, 0x00010000); // Y\r\n hv.setUint32(76, 0x0000D32D); // Z\r\n\r\n // ── Tag table (112 bytes) ────────────────────────────────────────\r\n const tagTable = new Uint8Array(tagTableSize);\r\n const tv = new DataView(tagTable.buffer);\r\n tv.setUint32(0, tagCount);\r\n\r\n // Helper: write tag entry at index i\r\n const writeTag = (i: number, sig: number, off: number, sz: number) => {\r\n const base = 4 + i * 12;\r\n tv.setUint32(base, sig);\r\n tv.setUint32(base + 4, off);\r\n tv.setUint32(base + 8, sz);\r\n };\r\n\r\n writeTag(0, 0x64657363, descOffset, descSize); // 'desc'\r\n writeTag(1, 0x77747074, wtptOffset, wtptSize); // 'wtpt'\r\n writeTag(2, 0x63707274, cprtOffset, cprtSize); // 'cprt'\r\n writeTag(3, 0x7258595A, rXYZOffset, xyzSize); // 'rXYZ'\r\n writeTag(4, 0x6758595A, gXYZOffset, xyzSize); // 'gXYZ'\r\n writeTag(5, 0x6258595A, bXYZOffset, xyzSize); // 'bXYZ'\r\n writeTag(6, 0x72545243, trcOffset, trcSize); // 'rTRC'\r\n writeTag(7, 0x67545243, trcOffset, trcSize); // 'gTRC' (shared data)\r\n writeTag(8, 0x62545243, trcOffset, trcSize); // 'bTRC' (shared data)\r\n\r\n // ── desc data ────────────────────────────────────────────────────\r\n const desc = new Uint8Array(descSize);\r\n const dv = new DataView(desc.buffer);\r\n dv.setUint32(0, 0x64657363); // 'desc'\r\n dv.setUint32(8, 5); // string length including null\r\n desc[12] = 0x73; desc[13] = 0x52; desc[14] = 0x47; desc[15] = 0x42; // \"sRGB\"\r\n\r\n // ── wtpt data: D50 white point ───────────────────────────────────\r\n const wtpt = new Uint8Array(wtptSize);\r\n const wv = new DataView(wtpt.buffer);\r\n wv.setUint32(0, 0x58595A20); // 'XYZ '\r\n wv.setUint32(8, 0x0000F6D6); // X (0.9505 in s15Fixed16)\r\n wv.setUint32(12, 0x00010000); // Y (1.0000)\r\n wv.setUint32(16, 0x0000D32D); // Z (1.0890)\r\n\r\n // ── cprt data ────────────────────────────────────────────────────\r\n const cprt = new Uint8Array(cprtSize);\r\n const cv = new DataView(cprt.buffer);\r\n cv.setUint32(0, 0x74657874); // 'text'\r\n cprt[8] = 0x4E; cprt[9] = 0x6F; cprt[10] = 0x20; cprt[11] = 0x43; cprt[12] = 0x50; // \"No CP\"\r\n\r\n // ── rXYZ: Red colorant (D50-adapted sRGB) ───────────────────────\r\n // X=0.4361, Y=0.2225, Z=0.0139\r\n const rXYZ = new Uint8Array(xyzSize);\r\n const rv = new DataView(rXYZ.buffer);\r\n rv.setUint32(0, 0x58595A20); // 'XYZ '\r\n rv.setUint32(8, 0x00006FA2); // X (0.4361 → 28578)\r\n rv.setUint32(12, 0x000038F5); // Y (0.2225 → 14581)\r\n rv.setUint32(16, 0x00000391); // Z (0.0139 → 913)\r\n\r\n // ── gXYZ: Green colorant (D50-adapted sRGB) ─────────────────────\r\n // X=0.3851, Y=0.7169, Z=0.0971\r\n const gXYZ = new Uint8Array(xyzSize);\r\n const gv = new DataView(gXYZ.buffer);\r\n gv.setUint32(0, 0x58595A20); // 'XYZ '\r\n gv.setUint32(8, 0x00006299); // X (0.3851 → 25241)\r\n gv.setUint32(12, 0x0000B785); // Y (0.7169 → 46981)\r\n gv.setUint32(16, 0x000018DA); // Z (0.0971 → 6362)\r\n\r\n // ── bXYZ: Blue colorant (D50-adapted sRGB) ──────────────────────\r\n // X=0.1431, Y=0.0606, Z=0.7141\r\n const bXYZ = new Uint8Array(xyzSize);\r\n const bv = new DataView(bXYZ.buffer);\r\n bv.setUint32(0, 0x58595A20); // 'XYZ '\r\n bv.setUint32(8, 0x000024A0); // X (0.1431 → 9376)\r\n bv.setUint32(12, 0x00000F84); // Y (0.0606 → 3972)\r\n bv.setUint32(16, 0x0000B6CF); // Z (0.7141 → 46799)\r\n\r\n // ── TRC: sRGB gamma ≈2.2 (shared by r/g/b) ─────────────────────\r\n // curveType with count=1, gamma=2.2 as u8Fixed8 (0x0233)\r\n const trc = new Uint8Array(trcSize);\r\n const tcv = new DataView(trc.buffer);\r\n tcv.setUint32(0, 0x63757276); // 'curv'\r\n tcv.setUint32(8, 1); // count = 1 (gamma mode)\r\n tcv.setUint16(12, 0x0233); // gamma 2.2 (u8Fixed8: 2 + 51/256)\r\n\r\n // ── Concatenate all parts ────────────────────────────────────────\r\n const parts = [header, tagTable, desc, wtpt, cprt, rXYZ, gXYZ, bXYZ, trc];\r\n let result = '';\r\n for (const part of parts) {\r\n for (let i = 0; i < part.length; i++) result += String.fromCharCode(part[i]);\r\n }\r\n return result;\r\n}\r\n\r\n// ── Helpers ──────────────────────────────────────────────────────────\r\n\r\nfunction escapeXml(str: string): string {\r\n return str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n}\r\n\r\n// ── PDF/A Configuration ──────────────────────────────────────────────\r\n\r\n/**\r\n * Resolved PDF/A configuration from the `tagged` layout option.\r\n */\r\nexport interface PdfAConfig {\r\n /** Whether tagged mode is enabled. */\r\n readonly enabled: boolean;\r\n /** PDF version string for header. */\r\n readonly pdfVersion: string;\r\n /** PDF/A part (1, 2, or 3). */\r\n readonly pdfaPart: number;\r\n /** PDF/A conformance ('B' or 'U'). */\r\n readonly pdfaConformance: string;\r\n /** OutputIntent /S name. */\r\n readonly outputIntentSubtype: string;\r\n}\r\n\r\n/**\r\n * Parse the `tagged` layout option into a resolved PDF/A configuration.\r\n *\r\n * @param tagged - The tagged option value (boolean, string, or undefined)\r\n * @returns Resolved configuration\r\n */\r\nexport function resolvePdfAConfig(tagged: boolean | string | undefined): PdfAConfig {\r\n if (!tagged) {\r\n return { enabled: false, pdfVersion: '1.4', pdfaPart: 1, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n if (tagged === 'pdfa1b') {\r\n return { enabled: true, pdfVersion: '1.4', pdfaPart: 1, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n if (tagged === 'pdfa2u') {\r\n return { enabled: true, pdfVersion: '1.7', pdfaPart: 2, pdfaConformance: 'U', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n if (tagged === 'pdfa3b') {\r\n return { enabled: true, pdfVersion: '1.7', pdfaPart: 3, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n // true or 'pdfa2b' → PDF/A-2b (default tagged mode)\r\n return { enabled: true, pdfVersion: '1.7', pdfaPart: 2, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n}\r\n\r\n// ── PDF/A-3 Embedded Files (ISO 19005-3) ─────────────────────────────\r\n\r\n/**\r\n * Result of building embedded file objects for PDF/A-3.\r\n */\r\nexport interface EmbeddedFilesResult {\r\n /** PDF objects as [objNum, content] pairs (EmbeddedFile streams + Filespec dicts). */\r\n readonly objects: ReadonlyArray<readonly [number, string]>;\r\n /** Binary stream data keyed by object number (for EmbeddedFile streams). */\r\n readonly streams: ReadonlyMap<number, string>;\r\n /** Filespec object numbers (for /AF array in catalog). */\r\n readonly filespecObjNums: readonly number[];\r\n /** Total number of objects created. */\r\n readonly totalObjects: number;\r\n /** /Names << /EmbeddedFiles << /Names [...] >> >> dictionary content for catalog. */\r\n readonly namesDict: string;\r\n}\r\n\r\n/**\r\n * Build PDF objects for embedded file attachments (PDF/A-3).\r\n *\r\n * For each attachment, creates:\r\n * 1. An /EmbeddedFile stream object (the file data)\r\n * 2. A /Filespec dictionary referencing the stream\r\n *\r\n * @param attachments - Array of file attachments\r\n * @param startObjNum - First available object number\r\n * @returns Objects, references, and catalog fragments\r\n */\r\nexport function buildEmbeddedFiles(attachments: readonly PdfAttachment[], startObjNum: number): EmbeddedFilesResult {\r\n const objects: Array<readonly [number, string]> = [];\r\n const streams = new Map<number, string>();\r\n const filespecObjNums: number[] = [];\r\n const namesEntries: string[] = [];\r\n let nextObj = startObjNum;\r\n\r\n for (const att of attachments) {\r\n const efObjNum = nextObj++;\r\n const fsObjNum = nextObj++;\r\n\r\n // Convert Uint8Array to binary string for stream\r\n let binaryStr = '';\r\n for (let i = 0; i < att.data.length; i++) binaryStr += String.fromCharCode(att.data[i]);\r\n\r\n // EmbeddedFile stream dictionary (content emitted via emitStreamObj)\r\n const efDict =\r\n `<< /Type /EmbeddedFile /Subtype /${escapePdfName(att.mimeType)} ` +\r\n `/Params << /Size ${att.data.length} >> ` +\r\n `/Length ${binaryStr.length}`;\r\n objects.push([efObjNum, efDict]);\r\n streams.set(efObjNum, binaryStr);\r\n\r\n // Filespec dictionary\r\n const relationship = att.relationship ?? 'Unspecified';\r\n const escapedFilename = escapePdfString(att.filename);\r\n const desc = att.description ? ` /Desc (${escapePdfString(att.description)})` : '';\r\n const fsDict =\r\n `<< /Type /Filespec /F (${escapedFilename}) /UF (${escapedFilename})` +\r\n ` /EF << /F ${efObjNum} 0 R /UF ${efObjNum} 0 R >>` +\r\n ` /AFRelationship /${relationship}${desc} >>`;\r\n objects.push([fsObjNum, fsDict]);\r\n filespecObjNums.push(fsObjNum);\r\n\r\n // Names dict entry: (filename) ref\r\n namesEntries.push(`(${escapedFilename}) ${fsObjNum} 0 R`);\r\n }\r\n\r\n const namesDict = `/Names << /EmbeddedFiles << /Names [${namesEntries.join(' ')}] >> >>`;\r\n\r\n return {\r\n objects,\r\n streams,\r\n filespecObjNums,\r\n totalObjects: nextObj - startObjNum,\r\n namesDict,\r\n };\r\n}\r\n\r\n/**\r\n * Validate attachments against PDF/A configuration.\r\n * Attachments are only allowed with PDF/A-3 (pdfaPart === 3).\r\n *\r\n * @param attachments - Attachments to validate\r\n * @param tagged - The tagged option value\r\n */\r\nexport function validateAttachments(attachments: readonly PdfAttachment[] | undefined, tagged: boolean | string | undefined): void {\r\n if (!attachments || attachments.length === 0) return;\r\n if (tagged !== 'pdfa3b') {\r\n throw new Error('File attachments require tagged: \\'pdfa3b\\' (PDF/A-3, ISO 19005-3)');\r\n }\r\n for (const att of attachments) {\r\n if (!att.filename || att.filename.length === 0) {\r\n throw new Error('Attachment filename must not be empty');\r\n }\r\n if (!att.mimeType || att.mimeType.length === 0) {\r\n throw new Error(`Attachment '${att.filename}' must have a mimeType`);\r\n }\r\n if (!att.data || att.data.length === 0) {\r\n throw new Error(`Attachment '${att.filename}' must have non-empty data`);\r\n }\r\n }\r\n}\r\n\r\n// ── PDF Name/String Escaping ─────────────────────────────────────────\r\n\r\n/**\r\n * Escape a MIME type for use as a PDF name (replace / with #2F).\r\n */\r\nfunction escapePdfName(mimeType: string): string {\r\n return mimeType.replace(/\\//g, '#2F');\r\n}\r\n\r\n/**\r\n * Escape a string for use in PDF literal strings.\r\n */\r\nfunction escapePdfString(str: string): string {\r\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\r\n}\r\n","/**\r\n * pdfnative — PDF Text Primitives\r\n * =================================\r\n * Low-level PDF content stream operators for text rendering.\r\n * Supports both Latin (WinAnsi) and Unicode (CIDFont) modes.\r\n */\r\n\r\nimport type { FontData, ShapedGlyph, EncodingContext } from '../types/pdf-types.js';\r\nimport { toWinAnsi, helveticaWidth } from '../fonts/encoding.js';\r\nimport { wrapSpan } from './pdf-tags.js';\r\n\r\n/** Format a number as PDF operator value (2 decimal places). */\r\nexport const fmtNum = (v: number): string => v.toFixed(2);\r\n\r\n/**\r\n * Render pre-shaped glyphs with GPOS offsets.\r\n * Each glyph emits its own BT…ET block with absolute coordinates.\r\n */\r\nexport function txtShaped(\r\n shaped: ShapedGlyph[],\r\n x: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n fontData: FontData\r\n): string {\r\n const { metrics, widths: glyphWidths, defaultWidth } = fontData;\r\n const upm = metrics.unitsPerEm;\r\n const scale = sz / upm;\r\n const parts: string[] = [];\r\n let penX = x;\r\n\r\n for (const g of shaped) {\r\n const hexGid = g.gid.toString(16).padStart(4, '0').toUpperCase();\r\n const adv = (glyphWidths[g.gid] !== undefined ? glyphWidths[g.gid] : defaultWidth) * scale;\r\n const gx = fmtNum(penX + g.dx * scale);\r\n const gy = fmtNum(y + g.dy * scale);\r\n parts.push(`BT ${font} ${sz} Tf ${gx} ${gy} Td <${hexGid}> Tj ET`);\r\n if (!g.isZeroAdvance) penX += adv;\r\n }\r\n\r\n return parts.join('\\n');\r\n}\r\n\r\n/**\r\n * Text at absolute position (x, y) with font.\r\n * Multi-font: splits text into runs by cmap coverage.\r\n */\r\nexport function txt(\r\n str: string,\r\n x: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext\r\n): string {\r\n if (!enc.isUnicode) {\r\n return `BT ${font} ${sz} Tf ${fmtNum(x)} ${fmtNum(y)} Td ${enc.ps(str)} Tj ET`;\r\n }\r\n\r\n const runs = enc.textRuns(str, sz);\r\n if (runs.length === 0) return '';\r\n\r\n if (runs.length === 1) {\r\n const run = runs[0];\r\n if (run.shaped) return txtShaped(run.shaped, x, y, run.fontRef, sz, run.fontData);\r\n return `BT ${run.fontRef} ${sz} Tf ${fmtNum(x)} ${fmtNum(y)} Td ${run.hexStr} Tj ET`;\r\n }\r\n\r\n const parts: string[] = [];\r\n let penX = x;\r\n for (const run of runs) {\r\n if (run.shaped) {\r\n parts.push(txtShaped(run.shaped, penX, y, run.fontRef, sz, run.fontData));\r\n } else {\r\n parts.push(`BT ${run.fontRef} ${sz} Tf ${fmtNum(penX)} ${fmtNum(y)} Td ${run.hexStr} Tj ET`);\r\n }\r\n penX += run.widthPt;\r\n }\r\n return parts.join('\\n');\r\n}\r\n\r\n/** Right-aligned text: rightX is the right boundary. */\r\nexport function txtR(\r\n str: string,\r\n rightX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext\r\n): string {\r\n const width = enc.isUnicode ? enc.tw(str, sz) : helveticaWidth(toWinAnsi(str), sz);\r\n return txt(str, rightX - width, y, font, sz, enc);\r\n}\r\n\r\n/** Center-aligned text within a column. */\r\nexport function txtC(\r\n str: string,\r\n leftX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n colW: number,\r\n enc: EncodingContext\r\n): string {\r\n const width = enc.isUnicode ? enc.tw(str, sz) : helveticaWidth(toWinAnsi(str), sz);\r\n return txt(str, leftX + (colW - width) / 2, y, font, sz, enc);\r\n}\r\n\r\n/** Tagged text at absolute position — wraps in /Span BDC…EMC with /ActualText. */\r\nexport function txtTagged(\r\n str: string,\r\n x: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext,\r\n mcid: number,\r\n): string {\r\n return wrapSpan(txt(str, x, y, font, sz, enc), str, mcid);\r\n}\r\n\r\n/** Tagged right-aligned text — wraps in /Span BDC…EMC with /ActualText. */\r\nexport function txtRTagged(\r\n str: string,\r\n rightX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext,\r\n mcid: number,\r\n): string {\r\n return wrapSpan(txtR(str, rightX, y, font, sz, enc), str, mcid);\r\n}\r\n\r\n/** Tagged center-aligned text — wraps in /Span BDC…EMC with /ActualText. */\r\nexport function txtCTagged(\r\n str: string,\r\n leftX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n colW: number,\r\n enc: EncodingContext,\r\n mcid: number,\r\n): string {\r\n return wrapSpan(txtC(str, leftX, y, font, sz, colW, enc), str, mcid);\r\n}\r\n\r\n/**\r\n * Encode a string for the PDF /Info dictionary (ISO 32000-1 §7.9.2).\r\n * ASCII-only → PDFDocEncoding literal `(str)`.\r\n * Non-ASCII → UTF-16BE hex string `<FEFF...>`.\r\n */\r\nexport function encodePdfTextString(str: string): string {\r\n // Check if all codepoints are in the printable ASCII range\r\n let ascii = true;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c > 126 || c < 32) { ascii = false; break; }\r\n }\r\n if (ascii) {\r\n // PDFDocEncoding literal — escape special chars\r\n const escaped = str.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\r\n return `(${escaped})`;\r\n }\r\n // UTF-16BE hex string with BOM\r\n let hex = 'FEFF';\r\n for (let i = 0; i < str.length; i++) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) {\r\n const hi = 0xD800 + ((cp - 0x10000) >> 10);\r\n const lo = 0xDC00 + ((cp - 0x10000) & 0x3FF);\r\n hex += hi.toString(16).padStart(4, '0').toUpperCase();\r\n hex += lo.toString(16).padStart(4, '0').toUpperCase();\r\n i++;\r\n } else {\r\n hex += cp.toString(16).padStart(4, '0').toUpperCase();\r\n }\r\n }\r\n return `<${hex}>`;\r\n}\r\n","/**\r\n * pdfnative — PDF Stream Utilities\r\n * ==================================\r\n * Binary conversion and PDF byte-level helpers.\r\n */\r\n\r\n/**\r\n * Convert a single-byte string to Uint8Array.\r\n * Each character is masked to 0xFF (WinAnsi = 1 byte per char).\r\n */\r\nexport function toBytes(str: string): Uint8Array {\r\n const bytes = new Uint8Array(str.length);\r\n for (let i = 0; i < str.length; i++) {\r\n bytes[i] = str.charCodeAt(i) & 0xFF;\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Sanitize string for use in filename (filesystem-safe).\r\n */\r\nexport function slugify(str: string): string {\r\n if (!str) return '';\r\n return String(str)\r\n .replace(/[\\\\/:*?\"<>|]/g, '')\r\n .replace(/\\s+/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n .slice(0, 60);\r\n}\r\n\r\n/**\r\n * Trigger a file download in the browser via a temporary <a> element.\r\n *\r\n * @param bytes - PDF file content\r\n * @param filename - Filename with extension\r\n */\r\nexport function downloadBlob(bytes: Uint8Array, filename: string): void {\r\n const blob = new Blob([bytes as unknown as BlobPart], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.style.display = 'none';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(() => URL.revokeObjectURL(url), 5000);\r\n}\r\n","/**\r\n * pdfnative — PDF Layout Constants\r\n * ==================================\r\n * A4 page dimensions and default layout settings.\r\n * All values in PDF points (1pt = 1/72 inch).\r\n */\r\n\r\nimport type { PdfLayoutOptions, ColumnDef, PdfColors } from '../types/pdf-types.js';\r\n\r\n// ── A4 Dimensions ────────────────────────────────────────────────────\r\nexport const PG_W = 595.28; // A4 width (210mm)\r\nexport const PG_H = 841.89; // A4 height (297mm)\r\n\r\n// ── Default Margins ──────────────────────────────────────────────────\r\nexport const DEFAULT_MARGINS = { t: 45, r: 36, b: 35, l: 36 };\r\n\r\n// ── Computed Content Width ───────────────────────────────────────────\r\nexport const DEFAULT_CW = PG_W - DEFAULT_MARGINS.l - DEFAULT_MARGINS.r;\r\n\r\n// ── Row Heights ──────────────────────────────────────────────────────\r\nexport const ROW_H = 12;\r\nexport const TH_H = 15;\r\nexport const INFO_LN = 13;\r\nexport const BAL_H = 32;\r\nexport const TITLE_LN = 22;\r\nexport const FT_H = 15;\r\nexport const HEADER_H = 15;\r\n\r\n// ── Page Size Presets ────────────────────────────────────────────────\r\nexport const PAGE_SIZES = {\r\n A4: { width: 595.28, height: 841.89 },\r\n Letter: { width: 612, height: 792 },\r\n Legal: { width: 612, height: 1008 },\r\n A3: { width: 841.89, height: 1190.55 },\r\n Tabloid: { width: 792, height: 1224 },\r\n} as const;\r\n\r\n// ── Default Font Sizes ───────────────────────────────────────────────\r\nexport const DEFAULT_FONT_SIZES = { title: 16, info: 9, th: 8, td: 7.5, ft: 7 };\r\n\r\n// ── Default Colors (RGB as PDF operator strings) ─────────────────────\r\nexport const DEFAULT_COLORS: PdfColors = {\r\n title: '0.145 0.388 0.922',\r\n credit: '0.086 0.639 0.247',\r\n debit: '0.863 0.149 0.149',\r\n text: '0.216 0.255 0.318',\r\n thBg: '0.976 0.980 0.988',\r\n thBrd: '0.820 0.835 0.859',\r\n rowBrd: '0.898 0.906 0.922',\r\n ptdBg: '0.937 0.965 1.000',\r\n balBg: '0.937 0.965 1.000',\r\n balBrd: '0.145 0.388 0.922',\r\n label: '0.294 0.333 0.388',\r\n footer: '0.612 0.639 0.682',\r\n};\r\n\r\n// ── Default Columns ──────────────────────────────────────────────────\r\nexport const DEFAULT_COLUMNS: ColumnDef[] = [\r\n { f: 0.12, a: 'l', mx: 12, mxH: 12 },\r\n { f: 0.32, a: 'l', mx: 42, mxH: 42 },\r\n { f: 0.18, a: 'l', mx: 24, mxH: 24 },\r\n { f: 0.20, a: 'r', mx: 26, mxH: 26 },\r\n { f: 0.18, a: 'c', mx: 20, mxH: 20 },\r\n];\r\n\r\n/**\r\n * Compute column X positions and widths given columns and content width.\r\n */\r\nexport function computeColumnPositions(\r\n columns: readonly ColumnDef[],\r\n marginLeft: number,\r\n contentWidth: number\r\n): { cx: number[]; cwi: number[] } {\r\n const cx: number[] = [];\r\n const cwi: number[] = [];\r\n let x = marginLeft;\r\n for (const col of columns) {\r\n cx.push(x);\r\n cwi.push(col.f * contentWidth);\r\n x += col.f * contentWidth;\r\n }\r\n return { cx, cwi };\r\n}\r\n\r\n/**\r\n * Create a resolved layout configuration from user options + defaults.\r\n */\r\nexport function resolveLayout(options?: Partial<PdfLayoutOptions>): {\r\n pgW: number; pgH: number;\r\n mg: { t: number; r: number; b: number; l: number };\r\n cw: number;\r\n columns: readonly ColumnDef[];\r\n colors: PdfColors;\r\n fs: typeof DEFAULT_FONT_SIZES;\r\n cx: number[];\r\n cwi: number[];\r\n} {\r\n const pgW = options?.pageWidth ?? PG_W;\r\n const pgH = options?.pageHeight ?? PG_H;\r\n const mg: { t: number; r: number; b: number; l: number } = options?.margins ?? { ...DEFAULT_MARGINS };\r\n const cw = pgW - mg.l - mg.r;\r\n const columns = options?.columns ?? DEFAULT_COLUMNS;\r\n const colors: PdfColors = options?.colors ?? { ...DEFAULT_COLORS };\r\n const fs = DEFAULT_FONT_SIZES;\r\n const { cx, cwi } = computeColumnPositions(columns, mg.l, cw);\r\n\r\n return { pgW, pgH, mg, cw, columns, colors, fs, cx, cwi };\r\n}\r\n\r\n/**\r\n * Replace placeholder tokens in a header/footer template string.\r\n *\r\n * @param tpl - Template string with `{page}`, `{pages}`, `{title}`, `{date}` placeholders\r\n * @param page - Current page number (1-based)\r\n * @param pages - Total page count\r\n * @param title - Document title\r\n * @param date - Formatted date string\r\n * @returns Resolved string with placeholders replaced\r\n */\r\nexport function resolveTemplate(\r\n tpl: string | undefined,\r\n page: number,\r\n pages: number,\r\n title: string,\r\n date: string,\r\n): string {\r\n if (!tpl) return '';\r\n return tpl\r\n .replace(/\\{page\\}/g, String(page))\r\n .replace(/\\{pages\\}/g, String(pages))\r\n .replace(/\\{title\\}/g, title)\r\n .replace(/\\{date\\}/g, date);\r\n}\r\n","/**\r\n * pdfnative — Color Parsing, Validation & Normalization\r\n * =======================================================\r\n * Accepts multiple color input formats and converts them\r\n * into safe PDF operator strings (\"R G B\", values 0.0–1.0).\r\n *\r\n * Supported formats:\r\n * - Hex string: \"#2563EB\", \"#26E\"\r\n * - RGB tuple: [37, 99, 235] (0–255)\r\n * - PDF operator string: \"0.145 0.388 0.922\" (0.0–1.0)\r\n */\r\n\r\nimport type { PdfColor, PdfColors } from '../types/pdf-types.js';\r\n\r\n// ── Regex ────────────────────────────────────────────────────────────\r\n\r\n/** Matches exactly 3 space-separated numbers (integer or decimal). */\r\nconst PDF_RGB_RE = /^\\d+(?:\\.\\d+)? \\d+(?:\\.\\d+)? \\d+(?:\\.\\d+)?$/;\r\n\r\n/** Matches #RGB or #RRGGBB (case-insensitive). */\r\nconst HEX_RE = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;\r\n\r\n// ── Public API ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Parse a color input into a validated PDF RGB operator string.\r\n *\r\n * @param input - Color in hex, RGB tuple, or PDF operator format.\r\n * @returns PDF operator string \"R G B\" with values 0.0–1.0.\r\n * @throws Error if the input format is invalid or values are out of range.\r\n *\r\n * @example\r\n * ```ts\r\n * parseColor('#2563EB') // \"0.145 0.388 0.922\"\r\n * parseColor([37, 99, 235]) // \"0.145 0.388 0.922\"\r\n * parseColor('0.145 0.388 0.922') // \"0.145 0.388 0.922\"\r\n * ```\r\n */\r\nexport function parseColor(input: PdfColor): string {\r\n if (Array.isArray(input)) {\r\n return parseTupleColor(input as readonly [number, number, number]);\r\n }\r\n if (typeof input === 'string') {\r\n if (input.startsWith('#')) return parseHexColor(input);\r\n if (PDF_RGB_RE.test(input)) return parsePdfRgbString(input);\r\n }\r\n throw new Error(\r\n `Invalid color format: ${JSON.stringify(input)}. ` +\r\n 'Expected \"#RRGGBB\", \"#RGB\", [r, g, b] (0–255), or \"R G B\" (0.0–1.0).'\r\n );\r\n}\r\n\r\n/**\r\n * Check whether a string is a valid PDF RGB operator color.\r\n *\r\n * @param str - String to validate.\r\n * @returns true if the string matches the \"R G B\" format with values in [0, 1].\r\n */\r\nexport function isValidPdfRgb(str: string): boolean {\r\n if (!PDF_RGB_RE.test(str)) return false;\r\n const parts = str.split(' ');\r\n return parts.length === 3 && parts.every(p => {\r\n const n = Number(p);\r\n return n >= 0 && n <= 1;\r\n });\r\n}\r\n\r\n/**\r\n * Validate and normalize all color fields in a PdfColors object.\r\n * Called once in resolveLayout() — not in the rendering hot path.\r\n *\r\n * @param colors - PdfColors object with user-supplied color values.\r\n * @returns New PdfColors object with all values normalized to PDF RGB strings.\r\n */\r\nexport function normalizeColors(colors: PdfColors): PdfColors {\r\n return {\r\n title: parseColor(colors.title),\r\n credit: parseColor(colors.credit),\r\n debit: parseColor(colors.debit),\r\n text: parseColor(colors.text),\r\n thBg: parseColor(colors.thBg),\r\n thBrd: parseColor(colors.thBrd),\r\n rowBrd: parseColor(colors.rowBrd),\r\n ptdBg: parseColor(colors.ptdBg),\r\n balBg: parseColor(colors.balBg),\r\n balBrd: parseColor(colors.balBrd),\r\n label: parseColor(colors.label),\r\n footer: parseColor(colors.footer),\r\n };\r\n}\r\n\r\n// ── Internal Parsers ─────────────────────────────────────────────────\r\n\r\n/** Format a channel value [0, 1] to a PDF-safe decimal string. */\r\nfunction fmtChannel(n: number): string {\r\n const clamped = Math.max(0, Math.min(1, n));\r\n const rounded = Math.round(clamped * 1000) / 1000;\r\n return String(rounded);\r\n}\r\n\r\n/** Parse a hex color (#RGB or #RRGGBB) into a PDF RGB string. */\r\nfunction parseHexColor(hex: string): string {\r\n if (!HEX_RE.test(hex)) {\r\n throw new Error(\r\n `Invalid hex color: ${JSON.stringify(hex)}. Expected \"#RGB\" or \"#RRGGBB\".`\r\n );\r\n }\r\n const h = hex.slice(1);\r\n let r: number, g: number, b: number;\r\n if (h.length === 3) {\r\n r = parseInt(h[0] + h[0], 16);\r\n g = parseInt(h[1] + h[1], 16);\r\n b = parseInt(h[2] + h[2], 16);\r\n } else {\r\n r = parseInt(h.slice(0, 2), 16);\r\n g = parseInt(h.slice(2, 4), 16);\r\n b = parseInt(h.slice(4, 6), 16);\r\n }\r\n return `${fmtChannel(r / 255)} ${fmtChannel(g / 255)} ${fmtChannel(b / 255)}`;\r\n}\r\n\r\n/** Parse an RGB tuple [0–255] into a PDF RGB string. */\r\nfunction parseTupleColor(tuple: readonly [number, number, number]): string {\r\n if (tuple.length !== 3) {\r\n throw new Error(\r\n `Invalid color tuple: expected [r, g, b] with 3 values, got ${tuple.length}.`\r\n );\r\n }\r\n for (let i = 0; i < 3; i++) {\r\n const v = tuple[i];\r\n if (typeof v !== 'number' || !Number.isFinite(v) || v < 0 || v > 255) {\r\n throw new Error(\r\n `Invalid color tuple value at index ${i}: ${v}. Expected a number 0–255.`\r\n );\r\n }\r\n }\r\n return `${fmtChannel(tuple[0] / 255)} ${fmtChannel(tuple[1] / 255)} ${fmtChannel(tuple[2] / 255)}`;\r\n}\r\n\r\n/** Validate a PDF RGB string (3 space-separated values, each 0.0–1.0). */\r\nfunction parsePdfRgbString(str: string): string {\r\n const parts = str.split(' ');\r\n for (const p of parts) {\r\n const n = Number(p);\r\n if (n < 0 || n > 1) {\r\n throw new Error(\r\n `Invalid PDF RGB value: ${p} in ${JSON.stringify(str)}. Each value must be 0.0–1.0.`\r\n );\r\n }\r\n }\r\n return str;\r\n}\r\n","/**\r\n * pdfnative — PDF Binary Assembler\r\n * ===================================\r\n * Shared low-level PDF binary assembly primitives used by both\r\n * the table builder (pdf-builder.ts) and document builder (pdf-document.ts).\r\n *\r\n * Handles object emission, stream compression/encryption, xref table,\r\n * and trailer generation — the identical parts of PDF assembly.\r\n */\r\n\r\nimport { compressStream } from './pdf-compress.js';\r\nimport { encryptStream, buildEncryptDict, buildIdArray, type EncryptionState } from './pdf-encrypt.js';\r\n\r\n// ── PDF Writer ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Low-level PDF binary writer with offset tracking.\r\n * Created via `createPdfWriter()`. Provides `emit`, `emitObj`, and `emitStreamObj`.\r\n */\r\nexport interface PdfWriter {\r\n /** Append raw string to PDF output and advance byte offset. */\r\n readonly emit: (str: string) => void;\r\n /** Emit a PDF indirect object (`num 0 obj ... endobj`). */\r\n readonly emitObj: (num: number, content: string) => void;\r\n /** Emit a stream object with optional compression and encryption. */\r\n readonly emitStreamObj: (num: number, dictEntries: string, streamData: string, skipCompress?: boolean) => void;\r\n /** Current byte offset in the output. */\r\n readonly offset: () => number;\r\n /** Adjust the tracked byte offset by a delta (for in-place catalog rewrites). */\r\n readonly adjustOffset: (delta: number) => void;\r\n /** Per-object byte offsets for xref table. */\r\n readonly objOffsets: number[];\r\n /** Accumulated output parts. Join with '' for final PDF string. */\r\n readonly parts: string[];\r\n}\r\n\r\n/**\r\n * Create a PDF binary writer with offset-tracked emission.\r\n *\r\n * @param compress - Whether to FlateDecode-compress streams\r\n * @param encState - Encryption state (null if no encryption)\r\n * @returns PdfWriter with emit/emitObj/emitStreamObj\r\n */\r\nexport function createPdfWriter(compress: boolean, encState: EncryptionState | null): PdfWriter {\r\n const parts: string[] = [];\r\n let _offset = 0;\r\n const objOffsets: number[] = [];\r\n\r\n function emit(str: string): void {\r\n parts.push(str);\r\n _offset += str.length;\r\n }\r\n\r\n function emitObj(num: number, content: string): void {\r\n objOffsets[num] = _offset;\r\n emit(`${num} 0 obj\\n${content}\\nendobj\\n\\n`);\r\n }\r\n\r\n /**\r\n * Emit a stream object with optional compression and encryption.\r\n * Order: compress → encrypt (ISO 32000-1 §7.3.8).\r\n */\r\n function emitStreamObj(num: number, dictEntries: string, streamData: string, skipCompress?: boolean): void {\r\n let data = streamData;\r\n let dict = dictEntries;\r\n\r\n // Step 1: Compress (before encryption)\r\n if (compress && !skipCompress) {\r\n const compressed = compressStream(data);\r\n dict = dict.replace(/\\/Length \\d+/, `/Filter /FlateDecode /Length ${compressed.length}`);\r\n data = compressed;\r\n }\r\n\r\n // Step 2: Encrypt (after compression)\r\n if (encState) {\r\n const encrypted = encryptStream(data, encState, num, 0);\r\n emitObj(num, `${dict.replace(/\\/Length \\d+/, `/Length ${encrypted.length}`)} >>\\nstream\\n${encrypted}\\nendstream`);\r\n } else {\r\n emitObj(num, `${dict} >>\\nstream\\n${data}\\nendstream`);\r\n }\r\n }\r\n\r\n return { emit, emitObj, emitStreamObj, offset: () => _offset, adjustOffset: (d: number) => { _offset += d; }, objOffsets, parts };\r\n}\r\n\r\n// ── Xref & Trailer ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Write the xref table, trailer, startxref, and %%EOF to finalize a PDF.\r\n * If encryption is active, the encryption dict object is emitted first.\r\n *\r\n * @param w - PDF writer\r\n * @param totalObjs - Total number of objects emitted so far\r\n * @param infoObjNum - Object number of the /Info dictionary\r\n * @param encState - Encryption state (null if no encryption)\r\n * @returns Final totalObjs count (may increase if encryption dict was added)\r\n */\r\nexport function writeXrefTrailer(\r\n w: PdfWriter,\r\n totalObjs: number,\r\n infoObjNum: number,\r\n encState: EncryptionState | null,\r\n): number {\r\n let encryptObjNum = 0;\r\n if (encState) {\r\n encryptObjNum = totalObjs + 1;\r\n w.emitObj(encryptObjNum, buildEncryptDict(encState));\r\n totalObjs = encryptObjNum;\r\n }\r\n\r\n const xrefOffset = w.offset();\r\n w.emit('xref\\n');\r\n w.emit(`0 ${totalObjs + 1}\\n`);\r\n w.emit('0000000000 65535 f \\n');\r\n for (let i = 1; i <= totalObjs; i++) {\r\n if (w.objOffsets[i] >= 10_000_000_000) throw new Error('PDF exceeds maximum xref offset (10 GB)');\r\n w.emit(`${String(w.objOffsets[i]).padStart(10, '0')} 00000 n \\n`);\r\n }\r\n\r\n w.emit('trailer\\n');\r\n if (encState) {\r\n w.emit(`<< /Size ${totalObjs + 1} /Root 1 0 R /Info ${infoObjNum} 0 R /Encrypt ${encryptObjNum} 0 R /ID ${buildIdArray(encState.docId)} >>\\n`);\r\n } else {\r\n w.emit(`<< /Size ${totalObjs + 1} /Root 1 0 R /Info ${infoObjNum} 0 R >>\\n`);\r\n }\r\n w.emit('startxref\\n');\r\n w.emit(`${xrefOffset}\\n`);\r\n w.emit('%%EOF');\r\n\r\n return totalObjs;\r\n}\r\n","/**\r\n * pdfnative — PDF Document Builder\r\n * ===================================\r\n * Main entry point: builds a complete PDF 1.4 document as a byte string.\r\n *\r\n * Supports:\r\n * - Latin mode (Helvetica built-in, WinAnsi encoding)\r\n * - Unicode mode (CIDFont Type2/Identity-H, embedded TTF subset)\r\n * - Multi-font (cross-script fallback with automatic font switching)\r\n * - Pagination (auto-calculated page breaks)\r\n * - Table rendering with header/data rows\r\n * - Title, info section, balance box, footer\r\n *\r\n * ISO 32000-1 (PDF 1.4) compliant output.\r\n */\r\n\r\nimport type {\r\n PdfParams,\r\n FontEntry,\r\n EncodingContext,\r\n PdfLayoutOptions,\r\n ColumnDef,\r\n PageTemplate,\r\n PdfColor,\r\n} from '../types/pdf-types.js';\r\nimport { createEncodingContext } from './encoding-context.js';\r\nimport { truncate } from '../fonts/encoding.js';\r\nimport { buildToUnicodeCMap, buildSubsetWidthArray } from '../fonts/font-embedder.js';\r\nimport { getDecodedFontBytes } from '../fonts/font-loader.js';\r\nimport { subsetTTF, uint8ToBinaryString } from '../fonts/font-subsetter.js';\r\nimport { txt, txtR, txtC, txtTagged, txtRTagged, txtCTagged, fmtNum, encodePdfTextString } from './pdf-text.js';\r\nimport { toBytes } from './pdf-stream.js';\r\nimport {\r\n PG_W, PG_H, DEFAULT_MARGINS,\r\n ROW_H, TH_H, INFO_LN, BAL_H, TITLE_LN, FT_H, HEADER_H,\r\n DEFAULT_FONT_SIZES, DEFAULT_COLORS, DEFAULT_COLUMNS,\r\n computeColumnPositions,\r\n resolveTemplate,\r\n} from './pdf-layout.js';\r\nimport { normalizeColors, parseColor } from './pdf-color.js';\r\nimport type { StructElement, MCRef } from './pdf-tags.js';\r\nimport {\r\n createMCIDAllocator,\r\n buildStructureTree,\r\n buildXMPMetadata,\r\n buildOutputIntentDict,\r\n buildMinimalSRGBProfile,\r\n resolvePdfAConfig,\r\n buildEmbeddedFiles,\r\n validateAttachments,\r\n} from './pdf-tags.js';\r\nimport type { EncryptionState } from './pdf-encrypt.js';\r\nimport { initEncryption } from './pdf-encrypt.js';\r\nimport { createPdfWriter, writeXrefTrailer } from './pdf-assembler.js';\r\nimport type { WatermarkState } from './pdf-watermark.js';\r\nimport { validateWatermark, buildWatermarkState } from './pdf-watermark.js';\r\n\r\n// ── Tagged Mode Helper Types ─────────────────────────────────────────\r\n\r\ninterface TagContext {\r\n tagged: boolean;\r\n mcidAlloc: ReturnType<typeof createMCIDAllocator>;\r\n pageObjNum: number;\r\n structChildren: (StructElement | MCRef)[];\r\n}\r\n\r\n// ── Table Builder Helpers ────────────────────────────────────────────\r\n\r\nfunction _buildTableHeader(\r\n y: number,\r\n headers: readonly string[],\r\n enc: EncodingContext,\r\n cx: number[],\r\n cwi: number[],\r\n columns: readonly ColumnDef[],\r\n cw: number,\r\n mgL: number,\r\n mgR: number,\r\n pgW: number,\r\n colors: typeof DEFAULT_COLORS,\r\n fs: typeof DEFAULT_FONT_SIZES,\r\n tagCtx?: TagContext,\r\n): { ops: string[]; y: number; structRow?: StructElement } {\r\n const ops: string[] = [];\r\n ops.push(`${colors.thBg} rg`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - TH_H)} ${fmtNum(cw)} ${fmtNum(TH_H)} re f`);\r\n ops.push(`0.75 w ${colors.thBrd} RG`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - TH_H)} m ${fmtNum(pgW - mgR)} ${fmtNum(y - TH_H)} l S`);\r\n ops.push(`${colors.text} rg`);\r\n\r\n const thChildren: (StructElement | MCRef)[] = [];\r\n\r\n for (let i = 0; i < headers.length; i++) {\r\n const t = truncate(headers[i], columns[i].mxH ?? columns[i].mx);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n const mcref: MCRef = { mcid, pageObjNum: tagCtx.pageObjNum };\r\n const thEl: StructElement = { type: 'TH', children: [mcref] };\r\n thChildren.push(thEl);\r\n if (columns[i].a === 'r') {\r\n ops.push(txtRTagged(t, cx[i] + cwi[i] - 3, y - TH_H + 4, enc.f2, fs.th, enc, mcid));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtCTagged(t, cx[i], y - TH_H + 4, enc.f2, fs.th, cwi[i], enc, mcid));\r\n } else {\r\n ops.push(txtTagged(t, cx[i] + 3, y - TH_H + 4, enc.f2, fs.th, enc, mcid));\r\n }\r\n } else {\r\n if (columns[i].a === 'r') {\r\n ops.push(txtR(t, cx[i] + cwi[i] - 3, y - TH_H + 4, enc.f2, fs.th, enc));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtC(t, cx[i], y - TH_H + 4, enc.f2, fs.th, cwi[i], enc));\r\n } else {\r\n ops.push(txt(t, cx[i] + 3, y - TH_H + 4, enc.f2, fs.th, enc));\r\n }\r\n }\r\n }\r\n\r\n const structRow = tagCtx?.tagged ? { type: 'TR', children: thChildren } as StructElement : undefined;\r\n return { ops, y: y - TH_H, structRow };\r\n}\r\n\r\nfunction _buildDataRow(\r\n y: number,\r\n cells: readonly string[],\r\n type: string,\r\n pointed: boolean,\r\n enc: EncodingContext,\r\n cx: number[],\r\n cwi: number[],\r\n columns: readonly ColumnDef[],\r\n cw: number,\r\n mgL: number,\r\n mgR: number,\r\n pgW: number,\r\n colors: typeof DEFAULT_COLORS,\r\n fs: typeof DEFAULT_FONT_SIZES,\r\n tagCtx?: TagContext,\r\n): { ops: string[]; y: number; structRow?: StructElement } {\r\n const ops: string[] = [];\r\n if (pointed) {\r\n ops.push(`${colors.ptdBg} rg`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - ROW_H)} ${fmtNum(cw)} ${fmtNum(ROW_H)} re f`);\r\n }\r\n ops.push(`0.25 w ${colors.rowBrd} RG`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - ROW_H)} m ${fmtNum(pgW - mgR)} ${fmtNum(y - ROW_H)} l S`);\r\n\r\n const tdChildren: (StructElement | MCRef)[] = [];\r\n\r\n for (let i = 0; i < cells.length; i++) {\r\n const t = truncate(cells[i], columns[i].mx);\r\n const isAmount = (i === 3);\r\n const color = isAmount ? (type === 'credit' ? colors.credit : colors.debit) : colors.text;\r\n const font = isAmount ? enc.f2 : enc.f1;\r\n ops.push(`${color} rg`);\r\n\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n const mcref: MCRef = { mcid, pageObjNum: tagCtx.pageObjNum };\r\n const tdEl: StructElement = { type: 'TD', children: [mcref] };\r\n tdChildren.push(tdEl);\r\n if (columns[i].a === 'r') {\r\n ops.push(txtRTagged(t, cx[i] + cwi[i] - 3, y - ROW_H + 3, font, fs.td, enc, mcid));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtCTagged(t, cx[i], y - ROW_H + 3, font, fs.td, cwi[i], enc, mcid));\r\n } else {\r\n ops.push(txtTagged(t, cx[i] + 3, y - ROW_H + 3, font, fs.td, enc, mcid));\r\n }\r\n } else {\r\n if (columns[i].a === 'r') {\r\n ops.push(txtR(t, cx[i] + cwi[i] - 3, y - ROW_H + 3, font, fs.td, enc));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtC(t, cx[i], y - ROW_H + 3, font, fs.td, cwi[i], enc));\r\n } else {\r\n ops.push(txt(t, cx[i] + 3, y - ROW_H + 3, font, fs.td, enc));\r\n }\r\n }\r\n }\r\n\r\n const structRow = tagCtx?.tagged ? { type: 'TR', children: tdChildren } as StructElement : undefined;\r\n return { ops, y: y - ROW_H, structRow };\r\n}\r\n\r\nfunction _buildPageTemplate(\r\n template: PageTemplate,\r\n page: number,\r\n pages: number,\r\n title: string,\r\n date: string,\r\n y: number,\r\n enc: EncodingContext,\r\n mgL: number,\r\n mgR: number,\r\n pgW: number,\r\n cw: number,\r\n defaultColor: PdfColor,\r\n defaultFontSize: number,\r\n tagCtx?: TagContext,\r\n): { ops: string[]; structEls: StructElement[] } {\r\n const ops: string[] = [];\r\n const structEls: StructElement[] = [];\r\n const sz = template.fontSize ?? defaultFontSize;\r\n const color = parseColor(template.color ?? defaultColor);\r\n\r\n ops.push(`${color} rg`);\r\n\r\n if (template.left) {\r\n const text = resolveTemplate(template.left, page, pages, title, date);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n ops.push(txtTagged(text, mgL, y, enc.f1, sz, enc, mcid));\r\n structEls.push({ type: 'P', children: [{ mcid, pageObjNum: tagCtx.pageObjNum }] });\r\n } else {\r\n ops.push(txt(text, mgL, y, enc.f1, sz, enc));\r\n }\r\n }\r\n\r\n if (template.center) {\r\n const text = resolveTemplate(template.center, page, pages, title, date);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n ops.push(txtCTagged(text, mgL, y, enc.f1, sz, cw, enc, mcid));\r\n structEls.push({ type: 'P', children: [{ mcid, pageObjNum: tagCtx.pageObjNum }] });\r\n } else {\r\n ops.push(txtC(text, mgL, y, enc.f1, sz, cw, enc));\r\n }\r\n }\r\n\r\n if (template.right) {\r\n const text = resolveTemplate(template.right, page, pages, title, date);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n ops.push(txtRTagged(text, pgW - mgR, y, enc.f1, sz, enc, mcid));\r\n structEls.push({ type: 'P', children: [{ mcid, pageObjNum: tagCtx.pageObjNum }] });\r\n } else {\r\n ops.push(txtR(text, pgW - mgR, y, enc.f1, sz, enc));\r\n }\r\n }\r\n\r\n return { ops, structEls };\r\n}\r\n\r\n// ── Main Builder ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Build a complete PDF document as a single-byte string.\r\n *\r\n * @param params - Document content (title, info items, rows, etc.)\r\n * @param layoutOptions - Optional layout customization\r\n * @returns Complete PDF as a binary string\r\n */\r\nexport function buildPDF(params: PdfParams, layoutOptions?: Partial<PdfLayoutOptions>): string {\r\n // ── Input Validation (system boundary) ───────────────────────────\r\n if (!params || typeof params !== 'object') {\r\n throw new Error('buildPDF: params is required and must be an object');\r\n }\r\n if (!Array.isArray(params.rows)) {\r\n throw new Error('buildPDF: params.rows must be an array');\r\n }\r\n if (!Array.isArray(params.headers)) {\r\n throw new Error('buildPDF: params.headers must be an array');\r\n }\r\n if (params.rows.length > 100_000) {\r\n throw new Error(`buildPDF: row count (${params.rows.length}) exceeds safe limit (100,000)`);\r\n }\r\n\r\n const { title, infoItems, balanceText, countText, headers, rows, footerText, fontData } = params;\r\n\r\n // Resolve layout\r\n const pgW = layoutOptions?.pageWidth ?? PG_W;\r\n const pgH = layoutOptions?.pageHeight ?? PG_H;\r\n const mg = layoutOptions?.margins ?? DEFAULT_MARGINS;\r\n const cw = pgW - mg.l - mg.r;\r\n const columns = layoutOptions?.columns ?? DEFAULT_COLUMNS;\r\n const rawColors = layoutOptions?.colors ?? DEFAULT_COLORS;\r\n const colors = layoutOptions?.colors ? normalizeColors(rawColors) : rawColors;\r\n const fs = layoutOptions?.fontSizes\r\n ? { ...DEFAULT_FONT_SIZES, ...layoutOptions.fontSizes }\r\n : DEFAULT_FONT_SIZES;\r\n const { cx, cwi } = computeColumnPositions(columns, mg.l, cw);\r\n\r\n // Build fontEntries\r\n const fontEntries: FontEntry[] = params.fontEntries\r\n || (fontData ? [{ fontData, fontRef: '/F3', lang: 'unknown' }] : []);\r\n\r\n const enc = createEncodingContext(fontEntries);\r\n\r\n // ── Resolve header/footer templates ──────────────────────────────\r\n const footerTpl: PageTemplate = layoutOptions?.footerTemplate ?? {\r\n left: footerText || undefined,\r\n right: '{page}/{pages}',\r\n };\r\n const headerTpl: PageTemplate | undefined = layoutOptions?.headerTemplate;\r\n const headerH = headerTpl ? HEADER_H : 0;\r\n\r\n const dateNow = new Date();\r\n const pad2d = (n: number) => String(n).padStart(2, '0');\r\n const dateStr = `${dateNow.getFullYear()}-${pad2d(dateNow.getMonth() + 1)}-${pad2d(dateNow.getDate())}`;\r\n\r\n // ── Pagination ───────────────────────────────────────────────────\r\n const infoCount = infoItems.length;\r\n const page1Header = TITLE_LN + 16 + (infoCount * INFO_LN) + 8 + BAL_H + 10;\r\n const rowsPage1 = Math.max(0, Math.floor((pgH - mg.t - mg.b - page1Header - TH_H - FT_H - headerH) / ROW_H));\r\n const rowsPerPage = Math.max(1, Math.floor((pgH - mg.t - mg.b - TH_H - FT_H - headerH) / ROW_H));\r\n const totalRows = rows.length;\r\n\r\n let totalPages: number;\r\n if (totalRows <= rowsPage1) {\r\n totalPages = 1;\r\n } else {\r\n totalPages = 1 + Math.ceil((totalRows - rowsPage1) / rowsPerPage);\r\n }\r\n if (totalPages < 1) totalPages = 1;\r\n\r\n // ── Tagged mode setup ─────────────────────────────────────────────\r\n const pdfaConfig = resolvePdfAConfig(layoutOptions?.tagged);\r\n const tagged = pdfaConfig.enabled;\r\n\r\n // ── Encryption setup ──────────────────────────────────────────────\r\n const encryptionOpts = layoutOptions?.encryption;\r\n if (tagged && encryptionOpts) {\r\n throw new Error('PDF/A and encryption are mutually exclusive (ISO 19005-1 §6.3.2)');\r\n }\r\n const encState: EncryptionState | null = encryptionOpts ? initEncryption(encryptionOpts) : null;\r\n\r\n // ── Compression setup ─────────────────────────────────────────────\r\n const compress = layoutOptions?.compress === true;\r\n\r\n // ── Watermark setup ──────────────────────────────────────────────\r\n const watermarkOpts = layoutOptions?.watermark;\r\n if (watermarkOpts) {\r\n validateWatermark(watermarkOpts, layoutOptions?.tagged);\r\n }\r\n\r\n // ── Attachments setup (PDF/A-3 only) ─────────────────────────────\r\n const attachments = layoutOptions?.attachments;\r\n validateAttachments(attachments, layoutOptions?.tagged);\r\n\r\n const wmState: WatermarkState | null = watermarkOpts\r\n ? buildWatermarkState(watermarkOpts, pgW, pgH, enc)\r\n : null;\r\n const wmExtraObjs = wmState\r\n ? wmState.extGStates.size + (wmState.imageXObj ? 1 : 0)\r\n : 0;\r\n\r\n const mcidAlloc = tagged ? createMCIDAllocator() : undefined;\r\n\r\n // Structure elements collected during page building (only when tagged)\r\n // The document structure: /Document → [/P (title), /P (info)..., /P (balance), /Table, /P (footer)...]\r\n const documentChildren: (StructElement | MCRef)[] = [];\r\n const tableRows: StructElement[] = [];\r\n\r\n // ── Build page content streams ───────────────────────────────────\r\n const pageStreams: string[] = [];\r\n let rowIdx = 0;\r\n\r\n // We need page obj nums for MCRef, but they depend on font count which we already know.\r\n // Compute pageObjStart the same way the assembly section does.\r\n const prePageObjStart = (enc.isUnicode && fontEntries.length > 0)\r\n ? 5 + fontEntries.length * 5 + wmExtraObjs\r\n : 5 + wmExtraObjs;\r\n\r\n // Map page object numbers to /StructParents values for ParentTree (ISO 32000-1 §14.7.4.4)\r\n const pageObjToStructParents = new Map<number, number>();\r\n\r\n for (let p = 0; p < totalPages; p++) {\r\n const pageObjNum = prePageObjStart + p * 2;\r\n if (tagged) pageObjToStructParents.set(pageObjNum, p);\r\n const tagCtx: TagContext | undefined = tagged && mcidAlloc\r\n ? { tagged: true, mcidAlloc, pageObjNum, structChildren: [] }\r\n : undefined;\r\n\r\n const ops: string[] = [];\r\n let y = pgH - mg.t;\r\n\r\n // Render header template (if provided)\r\n if (headerTpl) {\r\n const ht = _buildPageTemplate(\r\n headerTpl, p + 1, totalPages, title, dateStr,\r\n y - (headerTpl.fontSize ?? fs.ft),\r\n enc, mg.l, mg.r, pgW, cw, colors.footer, fs.ft, tagCtx,\r\n );\r\n ops.push(...ht.ops);\r\n if (tagged) documentChildren.push(...ht.structEls);\r\n y -= HEADER_H;\r\n }\r\n\r\n // Background watermark (behind content)\r\n if (wmState?.backgroundOps) {\r\n ops.push(wmState.backgroundOps);\r\n }\r\n\r\n if (p === 0) {\r\n // Title\r\n ops.push(`${colors.title} rg`);\r\n if (tagCtx) {\r\n const mcid = tagCtx.mcidAlloc.next(pageObjNum);\r\n ops.push(txtTagged(title, mg.l, y - fs.title, enc.f2, fs.title, enc, mcid));\r\n documentChildren.push({ type: 'P', children: [{ mcid, pageObjNum }] });\r\n } else {\r\n ops.push(txt(title, mg.l, y - fs.title, enc.f2, fs.title, enc));\r\n }\r\n y -= TITLE_LN;\r\n\r\n // Title underline\r\n ops.push(`0.75 w ${colors.title} RG`);\r\n ops.push(`${fmtNum(mg.l)} ${fmtNum(y)} m ${fmtNum(pgW - mg.r)} ${fmtNum(y)} l S`);\r\n y -= 14;\r\n\r\n // Info section\r\n for (const item of infoItems) {\r\n ops.push(`${colors.label} rg`);\r\n if (tagCtx) {\r\n const mcidLabel = tagCtx.mcidAlloc.next(pageObjNum);\r\n const mcidValue = tagCtx.mcidAlloc.next(pageObjNum);\r\n ops.push(txtTagged(`${item.label} :`, mg.l, y, enc.f2, fs.info, enc, mcidLabel));\r\n ops.push(`${colors.text} rg`);\r\n ops.push(txtTagged(item.value, mg.l + 100, y, enc.f1, fs.info, enc, mcidValue));\r\n documentChildren.push({\r\n type: 'P',\r\n children: [\r\n { mcid: mcidLabel, pageObjNum },\r\n { mcid: mcidValue, pageObjNum },\r\n ],\r\n });\r\n } else {\r\n ops.push(txt(`${item.label} :`, mg.l, y, enc.f2, fs.info, enc));\r\n ops.push(`${colors.text} rg`);\r\n ops.push(txt(item.value, mg.l + 100, y, enc.f1, fs.info, enc));\r\n }\r\n y -= INFO_LN;\r\n }\r\n y -= 6;\r\n\r\n // Balance box\r\n ops.push(`${colors.balBg} rg`);\r\n ops.push(`${fmtNum(mg.l)} ${fmtNum(y - BAL_H)} ${fmtNum(cw)} ${fmtNum(BAL_H)} re f`);\r\n ops.push(`0.5 w ${colors.balBrd} RG`);\r\n ops.push(`${fmtNum(mg.l)} ${fmtNum(y - BAL_H)} ${fmtNum(cw)} ${fmtNum(BAL_H)} re S`);\r\n ops.push(`${colors.title} rg`);\r\n if (tagCtx) {\r\n const mcidBal = tagCtx.mcidAlloc.next(pageObjNum);\r\n const mcidCnt = tagCtx.mcidAlloc.next(pageObjNum);\r\n ops.push(txtTagged(balanceText, mg.l + 8, y - 14, enc.f2, 12, enc, mcidBal));\r\n ops.push(`${colors.footer} rg`);\r\n ops.push(txtTagged(countText, mg.l + 8, y - 26, enc.f1, 7, enc, mcidCnt));\r\n documentChildren.push({\r\n type: 'P',\r\n children: [\r\n { mcid: mcidBal, pageObjNum },\r\n { mcid: mcidCnt, pageObjNum },\r\n ],\r\n });\r\n } else {\r\n ops.push(txt(balanceText, mg.l + 8, y - 14, enc.f2, 12, enc));\r\n ops.push(`${colors.footer} rg`);\r\n ops.push(txt(countText, mg.l + 8, y - 26, enc.f1, 7, enc));\r\n }\r\n y -= BAL_H + 8;\r\n }\r\n\r\n // Table header\r\n const th = _buildTableHeader(y, headers, enc, cx, cwi, columns, cw, mg.l, mg.r, pgW, colors, fs, tagCtx);\r\n ops.push(...th.ops);\r\n y = th.y;\r\n if (th.structRow) tableRows.push(th.structRow);\r\n\r\n // Table rows\r\n const maxRows = (p === 0) ? rowsPage1 : rowsPerPage;\r\n const endIdx = Math.min(rowIdx + maxRows, totalRows);\r\n while (rowIdx < endIdx) {\r\n const row = rows[rowIdx];\r\n const dr = _buildDataRow(y, row.cells, row.type, row.pointed, enc, cx, cwi, columns, cw, mg.l, mg.r, pgW, colors, fs, tagCtx);\r\n ops.push(...dr.ops);\r\n y = dr.y;\r\n if (dr.structRow) tableRows.push(dr.structRow);\r\n rowIdx++;\r\n }\r\n\r\n // Foreground watermark (above content)\r\n if (wmState?.foregroundOps) {\r\n ops.push(wmState.foregroundOps);\r\n }\r\n\r\n // Footer\r\n const ft = _buildPageTemplate(\r\n footerTpl, p + 1, totalPages, title, dateStr,\r\n mg.b - 5, enc, mg.l, mg.r, pgW, cw, colors.footer, fs.ft, tagCtx,\r\n );\r\n ops.push(...ft.ops);\r\n if (tagged) documentChildren.push(...ft.structEls);\r\n\r\n pageStreams.push(ops.join('\\n'));\r\n }\r\n\r\n // Build the table structure element (inserted before footer /P elements)\r\n if (tagged && tableRows.length > 0) {\r\n const tableEl: StructElement = { type: 'Table', children: tableRows };\r\n // Insert table after header P elements and before footer P elements\r\n // Header P elements: 1 (title) + infoItems.length + 1 (balance) = infoItems.length + 2\r\n const headerPCount = infoItems.length + 2;\r\n documentChildren.splice(headerPCount, 0, tableEl);\r\n }\r\n\r\n // ── Assemble PDF binary ──────────────────────────────────────────\r\n const { emit, emitObj, emitStreamObj, offset: getOffset, adjustOffset, objOffsets, parts } = createPdfWriter(compress, encState);\r\n\r\n // PDF Header\r\n emit(`%PDF-${pdfaConfig.pdfVersion}\\n`);\r\n emit('%\\xE2\\xE3\\xCF\\xD3\\n\\n');\r\n\r\n // Catalog — placeholder, will be rewritten after we know tagged obj nums\r\n emitObj(1, '<< /Type /Catalog /Pages 2 0 R >>');\r\n\r\n let pageObjStart: number;\r\n let structTreeRootObjNum = 0;\r\n\r\n if (enc.isUnicode && fontEntries.length > 0) {\r\n // Unicode mode: 5 objects per CIDFont group\r\n pageObjStart = 5 + fontEntries.length * 5 + wmExtraObjs;\r\n\r\n const kids: string[] = [];\r\n for (let p = 0; p < totalPages; p++) {\r\n kids.push(`${pageObjStart + p * 2} 0 R`);\r\n }\r\n emitObj(2, `<< /Type /Pages /Kids [${kids.join(' ')}] /Count ${totalPages} >>`);\r\n\r\n // Helvetica fonts (kept for mixed-content fallback)\r\n emitObj(3, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>');\r\n emitObj(4, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>');\r\n\r\n // CIDFont Type2 objects — one group of 5 per fontEntry\r\n for (let fi = 0; fi < fontEntries.length; fi++) {\r\n const fe = fontEntries[fi];\r\n const fd = fe.fontData;\r\n const base = 5 + fi * 5;\r\n\r\n const fontBytes = getDecodedFontBytes(fd);\r\n const usedGids = enc.getUsedGids ? enc.getUsedGids().get(fe.fontRef) : null;\r\n const ttfBinary = usedGids && usedGids.size > 0\r\n ? subsetTTF(fontBytes, usedGids)\r\n : uint8ToBinaryString(fontBytes);\r\n\r\n const fm = fd.metrics;\r\n const bfName = `/${fd.fontName.replace(/[^A-Za-z0-9-]/g, '')}`;\r\n const toUnicodeCMap = usedGids && usedGids.size > 0\r\n ? buildToUnicodeCMap(fd.cmap, usedGids)\r\n : buildToUnicodeCMap(fd.cmap, new Set());\r\n\r\n const subsetW = buildSubsetWidthArray(fd.widths, usedGids ?? new Set());\r\n const wArray = subsetW || fd.pdfWidthArray;\r\n\r\n // Type0 (Composite Font)\r\n emitObj(base,\r\n `<< /Type /Font /Subtype /Type0 /BaseFont ${bfName} ` +\r\n `/Encoding /Identity-H /DescendantFonts [${base + 1} 0 R] /ToUnicode ${base + 4} 0 R >>`);\r\n\r\n // CIDFont\r\n emitObj(base + 1,\r\n `<< /Type /Font /Subtype /CIDFontType2 /BaseFont ${bfName} ` +\r\n `/CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> ` +\r\n `/FontDescriptor ${base + 2} 0 R ` +\r\n `/DW ${fm.defaultWidth} ` +\r\n `/W [${wArray}] ` +\r\n `/CIDToGIDMap /Identity >>`);\r\n\r\n // FontDescriptor\r\n emitObj(base + 2,\r\n `<< /Type /FontDescriptor /FontName ${bfName} ` +\r\n `/Flags 4 ` +\r\n `/FontBBox [${fm.bbox.join(' ')}] ` +\r\n `/ItalicAngle 0 ` +\r\n `/Ascent ${fm.ascent} ` +\r\n `/Descent ${fm.descent} ` +\r\n `/CapHeight ${fm.capHeight} ` +\r\n `/StemV ${fm.stemV} ` +\r\n `/FontFile2 ${base + 3} 0 R >>`);\r\n\r\n // FontFile2 (raw TTF binary stream)\r\n emitStreamObj(base + 3,\r\n `<< /Length ${ttfBinary.length} /Length1 ${ttfBinary.length}`, ttfBinary);\r\n\r\n // ToUnicode CMap stream\r\n emitStreamObj(base + 4, `<< /Length ${toUnicodeCMap.length}`, toUnicodeCMap);\r\n }\r\n\r\n // Watermark objects (ExtGState + optional image)\r\n const wmObjStart = 5 + fontEntries.length * 5;\r\n let wmGsRes = '';\r\n let wmImgRes = '';\r\n if (wmState) {\r\n let wmObjIdx = 0;\r\n const gsRefs: string[] = [];\r\n for (const [gsName, gsDict] of wmState.extGStates) {\r\n emitObj(wmObjStart + wmObjIdx, gsDict);\r\n gsRefs.push(`${gsName} ${wmObjStart + wmObjIdx} 0 R`);\r\n wmObjIdx++;\r\n }\r\n wmGsRes = gsRefs.length > 0 ? ` /ExtGState << ${gsRefs.join(' ')} >>` : '';\r\n if (wmState.imageXObj) {\r\n emitObj(wmObjStart + wmObjIdx, wmState.imageXObj);\r\n wmImgRes = ` /XObject << /ImW1 ${wmObjStart + wmObjIdx} 0 R >>`;\r\n }\r\n }\r\n\r\n // Build font resources\r\n let fontRes = '/F1 3 0 R /F2 4 0 R';\r\n for (let fi = 0; fi < fontEntries.length; fi++) {\r\n fontRes += ` ${fontEntries[fi].fontRef} ${5 + fi * 5} 0 R`;\r\n }\r\n\r\n // Pages\r\n for (let p = 0; p < totalPages; p++) {\r\n const pageObjNum = pageObjStart + p * 2;\r\n const streamObjNum = pageObjStart + 1 + p * 2;\r\n const stream = pageStreams[p];\r\n\r\n const structParents = tagged ? ` /StructParents ${p}` : '';\r\n emitObj(pageObjNum,\r\n `<< /Type /Page /Parent 2 0 R ` +\r\n `/MediaBox [0 0 ${fmtNum(pgW)} ${fmtNum(pgH)}] ` +\r\n `/Contents ${streamObjNum} 0 R ` +\r\n `/Resources << /Font << ${fontRes} >>${wmImgRes}${wmGsRes} >>${structParents} >>`\r\n );\r\n emitStreamObj(streamObjNum, `<< /Length ${stream.length}`, stream);\r\n }\r\n } else {\r\n // Latin mode\r\n pageObjStart = 5 + wmExtraObjs;\r\n\r\n const kids: string[] = [];\r\n for (let p = 0; p < totalPages; p++) {\r\n kids.push(`${pageObjStart + p * 2} 0 R`);\r\n }\r\n emitObj(2, `<< /Type /Pages /Kids [${kids.join(' ')}] /Count ${totalPages} >>`);\r\n emitObj(3, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>');\r\n emitObj(4, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>');\r\n\r\n // Watermark objects (Latin mode)\r\n const wmObjStartLatin = 5;\r\n let wmGsResLatin = '';\r\n let wmImgResLatin = '';\r\n if (wmState) {\r\n let wmObjIdx = 0;\r\n const gsRefs: string[] = [];\r\n for (const [gsName, gsDict] of wmState.extGStates) {\r\n emitObj(wmObjStartLatin + wmObjIdx, gsDict);\r\n gsRefs.push(`${gsName} ${wmObjStartLatin + wmObjIdx} 0 R`);\r\n wmObjIdx++;\r\n }\r\n wmGsResLatin = gsRefs.length > 0 ? ` /ExtGState << ${gsRefs.join(' ')} >>` : '';\r\n if (wmState.imageXObj) {\r\n emitObj(wmObjStartLatin + wmObjIdx, wmState.imageXObj);\r\n wmImgResLatin = ` /XObject << /ImW1 ${wmObjStartLatin + wmObjIdx} 0 R >>`;\r\n }\r\n }\r\n\r\n for (let p = 0; p < totalPages; p++) {\r\n const pageObjNum = pageObjStart + p * 2;\r\n const streamObjNum = pageObjStart + 1 + p * 2;\r\n const stream = pageStreams[p];\r\n\r\n const structParents = tagged ? ` /StructParents ${p}` : '';\r\n emitObj(pageObjNum,\r\n `<< /Type /Page /Parent 2 0 R ` +\r\n `/MediaBox [0 0 ${fmtNum(pgW)} ${fmtNum(pgH)}] ` +\r\n `/Contents ${streamObjNum} 0 R ` +\r\n `/Resources << /Font << /F1 3 0 R /F2 4 0 R >>${wmImgResLatin}${wmGsResLatin} >>${structParents} >>`\r\n );\r\n emitStreamObj(streamObjNum, `<< /Length ${stream.length}`, stream);\r\n }\r\n }\r\n\r\n // /Info dictionary (ISO 32000-1 §14.3.3)\r\n const baseObjCount = enc.isUnicode\r\n ? 4 + fontEntries.length * 5 + wmExtraObjs + totalPages * 2\r\n : 4 + wmExtraObjs + totalPages * 2;\r\n const infoObjNum = baseObjCount + 1;\r\n\r\n const now = new Date();\r\n const pad2 = (n: number) => String(n).padStart(2, '0');\r\n const pdfDate = `D:${now.getFullYear()}${pad2(now.getMonth() + 1)}${pad2(now.getDate())}` +\r\n `${pad2(now.getHours())}${pad2(now.getMinutes())}${pad2(now.getSeconds())}`;\r\n const isoDate = `${now.getFullYear()}-${pad2(now.getMonth() + 1)}-${pad2(now.getDate())}` +\r\n `T${pad2(now.getHours())}:${pad2(now.getMinutes())}:${pad2(now.getSeconds())}`;\r\n const infoTitle = params.docTitle || title || '';\r\n emitObj(infoObjNum,\r\n `<< /Title ${encodePdfTextString(infoTitle)} /Producer (pdfnative) /CreationDate (${pdfDate}) >>`);\r\n\r\n let totalObjs = infoObjNum;\r\n\r\n // ── Tagged PDF objects (StructTreeRoot, XMP, ICC, OutputIntent) ──\r\n let xmpObjNum = 0;\r\n let outputIntentObjNum = 0;\r\n let afArrayStr = '';\r\n let embeddedFilesNamesDict = '';\r\n\r\n if (tagged) {\r\n // Build document structure tree\r\n const documentEl: StructElement = { type: 'Document', children: documentChildren };\r\n const treeStart = totalObjs + 1;\r\n const tree = buildStructureTree(documentEl, treeStart, pageObjToStructParents);\r\n\r\n for (const [objNum, content] of tree.objects) {\r\n emitObj(objNum, content);\r\n }\r\n structTreeRootObjNum = tree.structTreeRootObjNum;\r\n totalObjs = treeStart + tree.totalObjects - 1;\r\n\r\n // XMP metadata stream (skip compression for PDF/A validator compatibility)\r\n xmpObjNum = totalObjs + 1;\r\n const xmpContent = buildXMPMetadata(infoTitle, isoDate, pdfaConfig.pdfaPart, pdfaConfig.pdfaConformance);\r\n emitStreamObj(xmpObjNum,\r\n `<< /Type /Metadata /Subtype /XML /Length ${xmpContent.length}`, xmpContent, true);\r\n totalObjs = xmpObjNum;\r\n\r\n // ICC profile stream\r\n const iccObjNum = totalObjs + 1;\r\n const iccProfile = buildMinimalSRGBProfile();\r\n emitStreamObj(iccObjNum,\r\n `<< /N 3 /Length ${iccProfile.length}`, iccProfile);\r\n totalObjs = iccObjNum;\r\n\r\n // OutputIntent\r\n outputIntentObjNum = totalObjs + 1;\r\n emitObj(outputIntentObjNum, buildOutputIntentDict(iccObjNum, pdfaConfig.outputIntentSubtype));\r\n totalObjs = outputIntentObjNum;\r\n\r\n // Embedded file attachments (PDF/A-3 only)\r\n if (attachments && attachments.length > 0) {\r\n const efResult = buildEmbeddedFiles(attachments, totalObjs + 1);\r\n for (const [objNum, content] of efResult.objects) {\r\n const streamData = efResult.streams.get(objNum);\r\n if (streamData !== undefined) {\r\n emitStreamObj(objNum, content, streamData);\r\n } else {\r\n emitObj(objNum, content);\r\n }\r\n }\r\n afArrayStr = efResult.filespecObjNums.map(n => `${n} 0 R`).join(' ');\r\n embeddedFilesNamesDict = efResult.namesDict;\r\n totalObjs += efResult.totalObjects;\r\n }\r\n }\r\n\r\n // ── Rewrite Catalog with tagged attributes ──────────────────────\r\n if (tagged) {\r\n // Overwrite the catalog object in-place by rebuilding parts[catalogIdx]\r\n // We need to find and replace the catalog entry\r\n let catalogContent =\r\n `<< /Type /Catalog /Pages 2 0 R ` +\r\n `/MarkInfo << /Marked true >> ` +\r\n `/StructTreeRoot ${structTreeRootObjNum} 0 R ` +\r\n `/Metadata ${xmpObjNum} 0 R ` +\r\n `/OutputIntents [${outputIntentObjNum} 0 R]`;\r\n if (afArrayStr) {\r\n catalogContent += ` /AF [${afArrayStr}] ${embeddedFilesNamesDict}`;\r\n }\r\n catalogContent += ` >>`;\r\n\r\n // Rebuild: find the catalog object string and replace it\r\n const oldCatalog = '1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n\\n';\r\n const newCatalog = `1 0 obj\\n${catalogContent}\\nendobj\\n\\n`;\r\n const idx = parts.indexOf(oldCatalog);\r\n if (idx !== -1) {\r\n const sizeDiff = newCatalog.length - oldCatalog.length;\r\n parts[idx] = newCatalog;\r\n // Adjust all offsets after the catalog\r\n adjustOffset(sizeDiff);\r\n for (let i = 2; i <= totalObjs; i++) {\r\n if (objOffsets[i] !== undefined) {\r\n objOffsets[i] += sizeDiff;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Xref, Trailer, %%EOF ────────────────────────────────────────\r\n const writer = { emit, emitObj, emitStreamObj, offset: getOffset, adjustOffset, objOffsets, parts };\r\n writeXrefTrailer(writer, totalObjs, infoObjNum, encState);\r\n\r\n return parts.join('');\r\n}\r\n\r\n/**\r\n * Build a PDF and return it as a Uint8Array (ready for download or Blob).\r\n *\r\n * @param params - PDF content parameters (title, rows, info items, fonts)\r\n * @param layoutOptions - Optional layout customization (page size, margins, tagged mode)\r\n * @returns PDF as Uint8Array ready for download or Blob\r\n */\r\nexport function buildPDFBytes(params: PdfParams, layoutOptions?: Partial<PdfLayoutOptions>): Uint8Array {\r\n return toBytes(buildPDF(params, layoutOptions));\r\n}\r\n","/**\r\n * pdfnative — PDF Worker Entry Point\r\n * =====================================\r\n * Self-contained Web Worker that generates PDFs off the main thread.\r\n * This file is bundled separately by tsup as a standalone worker script.\r\n *\r\n * Protocol:\r\n * Main → Worker: { type: 'GENERATE_PDF', params: PdfParams }\r\n * Worker → Main: { type: 'progress', percent: number }\r\n * Worker → Main: { type: 'complete', pdfBytes: Uint8Array } (Transferable)\r\n * Worker → Main: { type: 'error', message: string }\r\n */\r\n\r\nimport type { PdfParams, WorkerInputMessage } from '../types/pdf-types.js';\r\nimport { buildPDF } from '../core/pdf-builder.js';\r\nimport { toBytes } from '../core/pdf-stream.js';\r\n\r\ndeclare const self: DedicatedWorkerGlobalScope;\r\n\r\nself.onmessage = (e: MessageEvent<WorkerInputMessage>) => {\r\n const msg = e.data;\r\n\r\n if (msg.type !== 'GENERATE_PDF') return;\r\n\r\n try {\r\n const params: PdfParams = msg.params;\r\n\r\n // Report start\r\n self.postMessage({ type: 'progress', percent: 10 });\r\n\r\n // Build PDF string\r\n const pdfString = buildPDF(params);\r\n self.postMessage({ type: 'progress', percent: 80 });\r\n\r\n // Convert to bytes\r\n const pdfBytes = toBytes(pdfString);\r\n self.postMessage({ type: 'progress', percent: 95 });\r\n\r\n // Send back via Transferable (zero-copy)\r\n self.postMessage(\r\n { type: 'complete', pdfBytes },\r\n { transfer: [pdfBytes.buffer] }\r\n );\r\n } catch (err) {\r\n self.postMessage({\r\n type: 'error',\r\n message: err instanceof Error ? err.message : String(err)\r\n });\r\n }\r\n};\r\n\r\n// Announce capabilities\r\nself.postMessage({ type: 'ready', version: '0.1.0' });\r\n"]}
1
+ {"version":3,"sources":["../../src/shaping/thai-shaper.ts","../../src/shaping/script-detect.ts","../../src/shaping/multi-font.ts","../../src/fonts/encoding.ts","../../src/shaping/script-registry.ts","../../src/shaping/bengali-shaper.ts","../../src/shaping/tamil-shaper.ts","../../src/shaping/devanagari-shaper.ts","../../src/shaping/arabic-shaper.ts","../../src/shaping/bidi.ts","../../src/core/encoding-context.ts","../../src/fonts/font-embedder.ts","../../src/fonts/font-loader.ts","../../src/fonts/font-subsetter.ts","../../src/core/pdf-tags.ts","../../src/core/pdf-text.ts","../../src/core/pdf-stream.ts","../../src/core/pdf-layout.ts","../../src/core/pdf-color.ts","../../src/core/pdf-encrypt.ts","../../src/core/pdf-assembler.ts","../../src/core/pdf-builder.ts","../../src/worker/pdf-worker.ts"],"names":["i","isConsonant","HALANT","NUKTA","RA","hex","shaped","pos","pdfString"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * pdfnative — Thai Mini-Shaper\r\n * =============================\r\n * Pure JS OpenType GSUB + GPOS shaping for Thai script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - GSUB SingleSubst: tall consonant → short variant (ป ฝ ฟ ฬ)\r\n * - GPOS MarkToBase: above/below vowels + tone marks anchoring\r\n * - GPOS MarkToMark: stacking marks (tone above vowel)\r\n * - Sara Am (U+0E33) decomposition → nikhahit + sara aa\r\n *\r\n * References:\r\n * - Unicode Standard §16.4 Thai\r\n * - OpenType spec §6.2 GSUB LookupType 1, §7.4 GPOS LookupType 4\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\n\r\n// ── Thai Unicode Constants ───────────────────────────────────────────\r\n\r\n/** Thai Unicode block range */\r\nexport const THAI_START = 0x0E00;\r\nexport const THAI_END = 0x0E7F;\r\n\r\n/**\r\n * Thai character classification by combining class.\r\n * 0 = consonant / base\r\n * 1 = above vowel / tone (renders above base)\r\n * 2 = below vowel (renders below base)\r\n * 3 = leading vowel (renders before base, zero-width)\r\n * 4 = following vowel (renders after base at x-advance)\r\n */\r\nconst THAI_CLASS: Record<number, number> = {\r\n // Leading vowels\r\n 0x0E40: 3, 0x0E41: 3, 0x0E42: 3, 0x0E43: 3, 0x0E44: 3,\r\n // Above-base marks: above vowels\r\n 0x0E31: 1, 0x0E34: 1, 0x0E35: 1, 0x0E36: 1, 0x0E37: 1,\r\n 0x0E47: 1, 0x0E4D: 1, 0x0E4E: 1,\r\n // Above-base marks: tone marks\r\n 0x0E48: 1, 0x0E49: 1, 0x0E4A: 1, 0x0E4B: 1,\r\n // Below-base marks: below vowels\r\n 0x0E38: 2, 0x0E39: 2, 0x0E3A: 2,\r\n // Thanthakhat (cancellation mark) — above\r\n 0x0E4C: 1,\r\n};\r\n\r\n/**\r\n * Tall consonants whose ascender may clash with above marks.\r\n * ป (U+0E1B), ฝ (U+0E1D), ฟ (U+0E1F), ฬ (U+0E2C)\r\n */\r\nconst TALL_CONSONANTS = new Set([0x0E1B, 0x0E1D, 0x0E1F, 0x0E2C]);\r\n\r\n// ── Interface for cluster ────────────────────────────────────────────\r\n\r\ninterface ThaiCluster {\r\n base: number;\r\n aboves: number[];\r\n belows: number[];\r\n leadings: number[];\r\n}\r\n\r\n// ── Cluster Builder ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Build text clusters: each cluster = { base, aboves, belows, leadings }.\r\n * Sara Am (U+0E33) is decomposed into Nikhahit (U+0E4D) + Sara Aa (U+0E32).\r\n */\r\nexport function buildThaiClusters(str: string): ThaiCluster[] {\r\n const clusters: ThaiCluster[] = [];\r\n let i = 0;\r\n while (i < str.length) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n const step = cp > 0xFFFF ? 2 : 1;\r\n\r\n // Sara Am decomposition — U+0E33 → U+0E4D (nikhahit) + U+0E32 (sara aa)\r\n if (cp === 0x0E33) {\r\n if (clusters.length > 0) {\r\n clusters[clusters.length - 1].aboves.push(0x0E4D);\r\n } else {\r\n clusters.push({ base: 0x0E4D, aboves: [], belows: [], leadings: [] });\r\n }\r\n clusters.push({ base: 0x0E32, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n continue;\r\n }\r\n\r\n const cls = THAI_CLASS[cp];\r\n\r\n if (cls === 3) {\r\n // Leading vowel — belongs to the NEXT base consonant\r\n const nextI = i + step;\r\n const nextCp = nextI < str.length ? (str.codePointAt(nextI) ?? 0) : 0;\r\n const nextStep = nextCp > 0xFFFF ? 2 : 1;\r\n if (nextCp && !THAI_CLASS[nextCp]) {\r\n clusters.push({ base: nextCp, aboves: [], belows: [], leadings: [cp] });\r\n i += step + nextStep;\r\n } else {\r\n clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n }\r\n } else if (!cls || cls === 4) {\r\n clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n } else if (cls === 1) {\r\n if (clusters.length > 0) clusters[clusters.length - 1].aboves.push(cp);\r\n else clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n } else if (cls === 2) {\r\n if (clusters.length > 0) clusters[clusters.length - 1].belows.push(cp);\r\n else clusters.push({ base: cp, aboves: [], belows: [], leadings: [] });\r\n i += step;\r\n } else {\r\n i += step;\r\n }\r\n }\r\n return clusters;\r\n}\r\n\r\n// ── Thai Shaper ──────────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Thai text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Thai string\r\n * @param fontData - Font data with cmap, gsub, markAnchors, mark2mark, metrics, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeThaiText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, gsub, markAnchors, widths, defaultWidth } = fontData;\r\n const m2m = fontData.mark2mark || { mark1Anchors: {}, mark2Classes: {} };\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function normCp(cp: number): number {\r\n return (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n }\r\n\r\n function resolveGid(cp: number, applyGsub = false): number {\r\n const baseGid = cmap[normCp(cp)] || 0;\r\n if (applyGsub && gsub[baseGid] !== undefined) return gsub[baseGid];\r\n return baseGid;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function getMark2MarkOffset(mark1Gid: number, mark2Gid: number): { dx: number; dy: number } | null {\r\n const m1Anchor = m2m.mark1Anchors && m2m.mark1Anchors[mark1Gid];\r\n const m2Class = m2m.mark2Classes && m2m.mark2Classes[mark2Gid];\r\n if (!m1Anchor || !m2Class) return null;\r\n const classIdx = m2Class[0];\r\n const m1Pt = m1Anchor[classIdx];\r\n if (!m1Pt) return null;\r\n return { dx: m1Pt[0] - m2Class[1], dy: m1Pt[1] - m2Class[2] };\r\n }\r\n\r\n function resolveMarkGid(markCp: number, applyGsub: boolean): number {\r\n const gid = cmap[markCp] || 0;\r\n if (applyGsub && gsub[gid] !== undefined) return gsub[gid];\r\n return gid;\r\n }\r\n\r\n const clusters = buildThaiClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const hasAbove = cluster.aboves.length > 0;\r\n const hasBelow = cluster.belows.length > 0;\r\n\r\n const baseGid = resolveGid(cluster.base, hasAbove || hasBelow);\r\n const baseAdv = getAdv(baseGid);\r\n const isTallBase = TALL_CONSONANTS.has(cluster.base);\r\n\r\n // Leading vowels\r\n for (const lvCp of cluster.leadings) {\r\n const lvGid = cmap[lvCp] || 0;\r\n shaped.push({ gid: lvGid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n\r\n // Base glyph\r\n shaped.push({ gid: baseGid, dx: 0, dy: 0, isZeroAdvance: false });\r\n\r\n // Above marks with Mark-to-Mark stacking\r\n let prevAboveMarkGid: number | null = null;\r\n let prevAboveMarkDx = 0;\r\n let prevAboveMarkDy = 0;\r\n for (let ai = 0; ai < cluster.aboves.length; ai++) {\r\n const abvCp = cluster.aboves[ai];\r\n const markGid = resolveMarkGid(abvCp, isTallBase);\r\n const markAnchor = getMarkAnchor(markGid);\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n if (ai > 0 && prevAboveMarkGid !== null) {\r\n const m2mOffset = getMark2MarkOffset(prevAboveMarkGid, markGid);\r\n if (m2mOffset) {\r\n dx = prevAboveMarkDx + m2mOffset.dx;\r\n dy = prevAboveMarkDy + m2mOffset.dy;\r\n } else if (markAnchor) {\r\n const baseAnchor = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchor) {\r\n dx = baseAnchor[0] - markAnchor.x - baseAdv;\r\n dy = baseAnchor[1] - markAnchor.y;\r\n }\r\n }\r\n } else {\r\n if (markAnchor) {\r\n const baseAnchor = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchor) {\r\n dx = baseAnchor[0] - markAnchor.x - baseAdv;\r\n dy = baseAnchor[1] - markAnchor.y;\r\n }\r\n }\r\n }\r\n\r\n shaped.push({ gid: markGid, dx, dy, isZeroAdvance: true });\r\n prevAboveMarkGid = markGid;\r\n prevAboveMarkDx = dx;\r\n prevAboveMarkDy = dy;\r\n }\r\n\r\n // Below marks\r\n for (const blwCp of cluster.belows) {\r\n const markGid = cmap[blwCp] || 0;\r\n const markAnchor = getMarkAnchor(markGid);\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n if (markAnchor) {\r\n const baseAnchor = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchor) {\r\n dx = baseAnchor[0] - markAnchor.x - baseAdv;\r\n dy = baseAnchor[1] - markAnchor.y;\r\n }\r\n }\r\n\r\n shaped.push({ gid: markGid, dx, dy, isZeroAdvance: true });\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n\r\n/**\r\n * Check whether a string contains any Thai characters.\r\n */\r\nexport function containsThai(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c >= THAI_START && c <= THAI_END) return true;\r\n }\r\n return false;\r\n}\r\n","/**\r\n * pdfnative — Script Detection\r\n * =============================\r\n * Detects Unicode script ranges in text to determine which fonts are needed.\r\n */\r\n\r\n/**\r\n * Languages requiring Unicode font embedding (non-WinAnsi scripts).\r\n * Latin-script languages using Helvetica built-in don't need embedding.\r\n */\r\nexport function needsUnicodeFont(lang: string): boolean {\r\n return ['th', 'ja', 'zh', 'ko', 'el', 'hi', 'tr', 'vi', 'pl', 'ar', 'he', 'ru', 'ka', 'hy'].includes(lang);\r\n}\r\n\r\n/**\r\n * Detect which additional font languages are needed to render user text\r\n * containing scripts foreign to the primary language.\r\n *\r\n * @param texts - User-visible strings (labels, categories, account names)\r\n * @param primaryLang - Current language code\r\n * @returns Language codes needing fallback fonts (excluding primaryLang)\r\n */\r\nexport function detectFallbackLangs(texts: string[], primaryLang: string): Set<string> {\r\n const needed = new Set<string>();\r\n for (const text of texts) {\r\n if (!text) continue;\r\n for (let i = 0; i < text.length; i++) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) i++;\r\n // Greek and Coptic + Greek Extended → 'el'\r\n if ((cp >= 0x0370 && cp <= 0x03FF) || (cp >= 0x1F00 && cp <= 0x1FFF)) { needed.add('el'); continue; }\r\n // Devanagari + Devanagari Extended → 'hi'\r\n if ((cp >= 0x0900 && cp <= 0x097F) || (cp >= 0xA8E0 && cp <= 0xA8FF)) { needed.add('hi'); continue; }\r\n // Thai script → 'th'\r\n if (cp >= 0x0E00 && cp <= 0x0E7F) { needed.add('th'); continue; }\r\n // Hiragana / Katakana → 'ja'\r\n if (cp >= 0x3040 && cp <= 0x30FF) { needed.add('ja'); continue; }\r\n // Hangul Syllables + Jamo + Compat Jamo → 'ko'\r\n if ((cp >= 0xAC00 && cp <= 0xD7AF) || (cp >= 0x1100 && cp <= 0x11FF) ||\r\n (cp >= 0x3130 && cp <= 0x318F)) { needed.add('ko'); continue; }\r\n // CJK Unified Ideographs → default to 'zh' (SC has broadest coverage)\r\n if ((cp >= 0x4E00 && cp <= 0x9FFF) || (cp >= 0x3400 && cp <= 0x4DBF) ||\r\n (cp >= 0xF900 && cp <= 0xFAFF)) {\r\n if (!['ja', 'zh', 'ko'].includes(primaryLang)) needed.add('zh');\r\n continue;\r\n }\r\n // Currency symbols\r\n if (cp === 0x20A9 || cp === 0xFFE6) { needed.add('ko'); continue; }\r\n if (cp === 0x20B9) { needed.add('hi'); continue; }\r\n if (cp === 0xFFE5) { needed.add('ja'); continue; }\r\n // Latin Extended Additional → Vietnamese\r\n if ((cp >= 0x1E00 && cp <= 0x1EFF) || cp === 0x20AB || cp === 0x0110 || cp === 0x0111 || cp === 0x0103 || cp === 0x0102) { needed.add('vi'); continue; }\r\n // Polish-specific Latin Extended-A chars\r\n if (cp === 0x0104 || cp === 0x0105 || cp === 0x0106 || cp === 0x0107 ||\r\n cp === 0x0118 || cp === 0x0119 || cp === 0x0141 || cp === 0x0142 ||\r\n cp === 0x0143 || cp === 0x0144 || cp === 0x015A || cp === 0x015B ||\r\n cp === 0x0179 || cp === 0x017A || cp === 0x017B || cp === 0x017C) { needed.add('pl'); continue; }\r\n // Latin Extended-A → Turkish special chars + Turkish Lira\r\n if ((cp >= 0x0100 && cp <= 0x017F) || cp === 0x20BA) { needed.add('tr'); continue; }\r\n // Hebrew → 'he'\r\n if (cp >= 0x0590 && cp <= 0x05FF) { needed.add('he'); continue; }\r\n // Arabic → 'ar'\r\n if ((cp >= 0x0600 && cp <= 0x06FF) || (cp >= 0x0750 && cp <= 0x077F) || (cp >= 0xFB50 && cp <= 0xFDFF) || (cp >= 0xFE70 && cp <= 0xFEFF)) { needed.add('ar'); continue; }\r\n // Cyrillic + Cyrillic Supplement → 'ru'\r\n if ((cp >= 0x0400 && cp <= 0x04FF) || (cp >= 0x0500 && cp <= 0x052F)) { needed.add('ru'); continue; }\r\n // Georgian + Georgian Supplement → 'ka'\r\n if ((cp >= 0x10A0 && cp <= 0x10FF) || (cp >= 0x2D00 && cp <= 0x2D2F)) { needed.add('ka'); continue; }\r\n // Armenian + Armenian Ligatures → 'hy'\r\n if ((cp >= 0x0530 && cp <= 0x058F) || (cp >= 0xFB13 && cp <= 0xFB17)) { needed.add('hy'); continue; }\r\n }\r\n }\r\n needed.delete(primaryLang);\r\n return needed;\r\n}\r\n\r\n/**\r\n * Detect the preferred font language for a single Unicode codepoint.\r\n * Returns the language code of the font most appropriate for rendering.\r\n *\r\n * @param cp - Unicode codepoint\r\n * @returns Language code ('el', 'hi', 'th', 'ja', 'ko', 'zh', 'vi', 'pl', 'tr', 'he', 'ar', 'ru', 'ka', 'hy') or null for Latin/common\r\n */\r\nexport function detectCharLang(cp: number): string | null {\r\n if ((cp >= 0x0370 && cp <= 0x03FF) || (cp >= 0x1F00 && cp <= 0x1FFF)) return 'el';\r\n if ((cp >= 0x0900 && cp <= 0x097F) || (cp >= 0xA8E0 && cp <= 0xA8FF)) return 'hi';\r\n if (cp >= 0x0E00 && cp <= 0x0E7F) return 'th';\r\n if (cp >= 0x3040 && cp <= 0x30FF) return 'ja';\r\n if ((cp >= 0xAC00 && cp <= 0xD7AF) || (cp >= 0x1100 && cp <= 0x11FF) || (cp >= 0x3130 && cp <= 0x318F)) return 'ko';\r\n if ((cp >= 0x4E00 && cp <= 0x9FFF) || (cp >= 0x3400 && cp <= 0x4DBF) || (cp >= 0xF900 && cp <= 0xFAFF)) return 'zh';\r\n if ((cp >= 0x1E00 && cp <= 0x1EFF) || cp === 0x20AB || cp === 0x0110 || cp === 0x0111 || cp === 0x0103 || cp === 0x0102) return 'vi';\r\n if (cp === 0x0104 || cp === 0x0105 || cp === 0x0106 || cp === 0x0107 ||\r\n cp === 0x0118 || cp === 0x0119 || cp === 0x0141 || cp === 0x0142 ||\r\n cp === 0x0143 || cp === 0x0144 || cp === 0x015A || cp === 0x015B ||\r\n cp === 0x0179 || cp === 0x017A || cp === 0x017B || cp === 0x017C) return 'pl';\r\n if ((cp >= 0x0100 && cp <= 0x017F) || cp === 0x20BA) return 'tr';\r\n // Hebrew\r\n if (cp >= 0x0590 && cp <= 0x05FF) return 'he';\r\n // Arabic + Arabic Supplement + Arabic Presentation Forms\r\n if ((cp >= 0x0600 && cp <= 0x06FF) || (cp >= 0x0750 && cp <= 0x077F) || (cp >= 0xFB50 && cp <= 0xFDFF) || (cp >= 0xFE70 && cp <= 0xFEFF)) return 'ar';\r\n // Cyrillic + Cyrillic Supplement\r\n if ((cp >= 0x0400 && cp <= 0x04FF) || (cp >= 0x0500 && cp <= 0x052F)) return 'ru';\r\n // Georgian + Georgian Supplement\r\n if ((cp >= 0x10A0 && cp <= 0x10FF) || (cp >= 0x2D00 && cp <= 0x2D2F)) return 'ka';\r\n // Armenian + Armenian Ligatures\r\n if ((cp >= 0x0530 && cp <= 0x058F) || (cp >= 0xFB13 && cp <= 0xFB17)) return 'hy';\r\n return null;\r\n}\r\n","/**\r\n * pdfnative — Multi-Font Text Run Splitter\r\n * ==========================================\r\n * Split text into runs, each assigned to the font whose cmap covers it.\r\n * Uses \"continuation bias\": if the current font covers the next codepoint,\r\n * it stays in the same run (minimizes font switches on shared Latin/space chars).\r\n */\r\n\r\nimport type { FontEntry } from '../types/pdf-types.js';\r\nimport { detectCharLang } from './script-detect.js';\r\n\r\n/** A text run with its assigned font entry */\r\nexport interface FontRun {\r\n text: string;\r\n entry: FontEntry;\r\n}\r\n\r\n/**\r\n * Split a string into text runs, each assigned to the font whose cmap covers it.\r\n *\r\n * @param str - Input text\r\n * @param fontEntries - Font list (primary first)\r\n * @returns Runs with assigned font entry\r\n */\r\nexport function splitTextByFont(str: string, fontEntries: FontEntry[]): FontRun[] {\r\n if (!str || fontEntries.length === 0) return [];\r\n if (fontEntries.length === 1) return [{ text: str, entry: fontEntries[0] }];\r\n\r\n const runs: FontRun[] = [];\r\n let currentEntry: FontEntry | null = null;\r\n let currentText = '';\r\n\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n const charLen = cp > 0xFFFF ? 2 : 1;\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n const char = str.substring(i, i + charLen);\r\n\r\n // Continuation bias: if current font covers this cp, keep going\r\n if (currentEntry && currentEntry.fontData.cmap[normCp]) {\r\n currentText += char;\r\n i += charLen;\r\n continue;\r\n }\r\n\r\n // Find best font entry whose cmap covers this codepoint.\r\n // Prefer font whose lang matches the codepoint's script.\r\n let newEntry: FontEntry | null = null;\r\n const charLang = detectCharLang(normCp);\r\n if (charLang) {\r\n for (const fe of fontEntries) {\r\n if (fe.lang === charLang && fe.fontData.cmap[normCp]) { newEntry = fe; break; }\r\n }\r\n }\r\n if (!newEntry) {\r\n for (const fe of fontEntries) {\r\n if (fe.fontData.cmap[normCp]) { newEntry = fe; break; }\r\n }\r\n }\r\n // If no font covers it, fall back to primary (will render .notdef)\r\n if (!newEntry) newEntry = fontEntries[0];\r\n\r\n // Font switch → flush current run\r\n if (newEntry !== currentEntry) {\r\n if (currentText && currentEntry) runs.push({ text: currentText, entry: currentEntry });\r\n currentEntry = newEntry;\r\n currentText = char;\r\n } else {\r\n currentText += char;\r\n }\r\n i += charLen;\r\n }\r\n if (currentText && currentEntry) runs.push({ text: currentText, entry: currentEntry });\r\n return runs;\r\n}\r\n","/**\r\n * pdfnative — WinAnsi Encoding\r\n * ==============================\r\n * Text encoding and font reference logic for Latin (WinAnsi/Helvetica)\r\n * and Unicode (CIDFont/Identity-H) modes.\r\n */\r\n\r\nimport type { FontEntry, TextRun, EncodingContext } from '../types/pdf-types.js';\r\nimport { shapeThaiText, containsThai } from '../shaping/thai-shaper.js';\r\nimport { splitTextByFont } from '../shaping/multi-font.js';\r\n\r\n// ── WinAnsi Encoding ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Encode a JavaScript string to WinAnsiEncoding (ISO-8859-1 superset).\r\n * Characters outside this encoding are replaced with '?'.\r\n */\r\nexport function toWinAnsi(str: string): string {\r\n if (!str) return '';\r\n let r = '';\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c >= 0x20 && c <= 0x7E) r += str[i];\r\n else if (c >= 0xA0 && c <= 0xFF) r += str[i];\r\n // CP1252 0x80–0x9F — punctuation & symbols absent from ISO-8859-1\r\n else if (c === 0x20AC) r += '\\x80'; // € euro sign\r\n else if (c === 0x201A) r += '\\x82'; // ‚ single low-9 quote\r\n else if (c === 0x0192) r += '\\x83'; // ƒ latin small f with hook\r\n else if (c === 0x201E) r += '\\x84'; // „ double low-9 quote\r\n else if (c === 0x2026) r += '\\x85'; // … horizontal ellipsis\r\n else if (c === 0x2020) r += '\\x86'; // † dagger\r\n else if (c === 0x2021) r += '\\x87'; // ‡ double dagger\r\n else if (c === 0x02C6) r += '\\x88'; // ˆ modifier circumflex\r\n else if (c === 0x2030) r += '\\x89'; // ‰ per mille\r\n else if (c === 0x0160) r += '\\x8A'; // Š S with caron\r\n else if (c === 0x2039) r += '\\x8B'; // ‹ single left-pointing angle quote\r\n else if (c === 0x0152) r += '\\x8C'; // Œ ligature OE\r\n else if (c === 0x017D) r += '\\x8E'; // Ž Z with caron\r\n else if (c === 0x2018) r += '\\x91'; // ' left single quote\r\n else if (c === 0x2019) r += '\\x92'; // ' right single quote\r\n else if (c === 0x201C) r += '\\x93'; // \" left double quote\r\n else if (c === 0x201D) r += '\\x94'; // \" right double quote\r\n else if (c === 0x2022) r += '\\x95'; // • bullet\r\n else if (c === 0x2013) r += '\\x96'; // – en-dash\r\n else if (c === 0x2014) r += '\\x97'; // — em-dash\r\n else if (c === 0x02DC) r += '\\x98'; // ˜ small tilde\r\n else if (c === 0x2122) r += '\\x99'; // ™ trademark\r\n else if (c === 0x0161) r += '\\x9A'; // š s with caron\r\n else if (c === 0x203A) r += '\\x9B'; // › single right-pointing angle quote\r\n else if (c === 0x0153) r += '\\x9C'; // œ ligature oe\r\n else if (c === 0x017E) r += '\\x9E'; // ž z with caron\r\n else if (c === 0x0178) r += '\\x9F'; // Ÿ Y with diaeresis\r\n else if (c === 0xA0 || c === 0x202F) r += ' ';\r\n else if (c === 0x09 || c === 0x0A || c === 0x0D) r += ' ';\r\n else if (c < 0x20) { /* skip control chars */ }\r\n else r += '?';\r\n }\r\n return r;\r\n}\r\n\r\n/**\r\n * Create a PDF string literal: encode to WinAnsi and escape (, ), \\.\r\n */\r\nexport function pdfString(str: string): string {\r\n const s = toWinAnsi(str);\r\n return '(' + s.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)') + ')';\r\n}\r\n\r\n/** Truncate string to max characters, appending '..' if needed. */\r\nexport function truncate(str: string, max: number): string {\r\n if (!str || str.length <= max) return str || '';\r\n if (max <= 2) return '..';\r\n return str.slice(0, max - 2) + '..';\r\n}\r\n\r\n/**\r\n * Approximate text width in points using Helvetica character metrics.\r\n */\r\nexport function helveticaWidth(str: string, sz: number): number {\r\n let w = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) i++; // skip surrogate pair\r\n if (cp >= 48 && cp <= 57) w += 556;\r\n else if (cp >= 65 && cp <= 90) w += 680;\r\n else if (cp >= 97 && cp <= 122) w += 500;\r\n else if (cp === 32) w += 278;\r\n else if (cp === 46 || cp === 44) w += 278;\r\n else if (cp === 43) w += 584;\r\n else if (cp === 45) w += 333;\r\n else if (cp === 47 || cp === 58) w += 278;\r\n // Unicode typographic characters\r\n else if (cp === 0x2014) w += 1000; // em-dash\r\n else if (cp === 0x2013) w += 556; // en-dash\r\n else if (cp === 0x2026) w += 1000; // ellipsis\r\n else if (cp === 0x2018 || cp === 0x2019) w += 222; // single curly quotes\r\n else if (cp === 0x201C || cp === 0x201D) w += 333; // double curly quotes\r\n else if (cp === 0x20AC) w += 556; // Euro sign\r\n else w += 556;\r\n }\r\n return w * sz / 1000;\r\n}\r\n\r\n// ── Encoding Context Factory ─────────────────────────────────────────\r\n\r\n/**\r\n * Create an encoding context that encapsulates text encoding and font reference logic.\r\n * Latin mode uses WinAnsi/Helvetica, Unicode mode uses CIDFont/Identity-H.\r\n *\r\n * @param fontEntries - Array of font entries (primary first). Empty = Latin mode.\r\n */\r\nexport function createEncodingContext(fontEntries: FontEntry[]): EncodingContext {\r\n if (!fontEntries || fontEntries.length === 0) {\r\n return {\r\n isUnicode: false,\r\n fontEntries: [],\r\n ps: pdfString,\r\n tw: helveticaWidth,\r\n textRuns: () => [],\r\n f1: '/F1',\r\n f2: '/F2'\r\n };\r\n }\r\n\r\n const primary = fontEntries[0];\r\n\r\n // Track used glyph IDs per font for subsetting\r\n const _usedGids = new Map<string, Set<number>>();\r\n for (const fe of fontEntries) _usedGids.set(fe.fontRef, new Set());\r\n\r\n function _trackGid(fontRef: string, gid: number): void {\r\n const s = _usedGids.get(fontRef);\r\n if (s) s.add(gid);\r\n }\r\n\r\n return {\r\n isUnicode: true,\r\n fontEntries,\r\n fontData: primary.fontData,\r\n f1: primary.fontRef,\r\n f2: primary.fontRef,\r\n getUsedGids() { return _usedGids; },\r\n\r\n textRuns(str: string, sz: number): TextRun[] {\r\n if (!str) return [];\r\n const rawRuns = splitTextByFont(str, fontEntries);\r\n return rawRuns.map(run => {\r\n const fd = run.entry.fontData;\r\n const upm = fd.metrics.unitsPerEm;\r\n const fontRef = run.entry.fontRef;\r\n\r\n if (containsThai(run.text)) {\r\n const shaped = shapeThaiText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return { text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm };\r\n }\r\n\r\n let hex = '';\r\n let designW = 0;\r\n for (let i = 0; i < run.text.length; i++) {\r\n const rawCp = run.text.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = fd.cmap[cp] || 0;\r\n _trackGid(fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n const gw = fd.widths[gid];\r\n designW += gw !== undefined ? gw : fd.defaultWidth;\r\n }\r\n return { text: run.text, fontRef, fontData: fd, shaped: null, hexStr: '<' + hex.toUpperCase() + '>', widthPt: designW * sz / upm };\r\n });\r\n },\r\n\r\n ps(str: string): string {\r\n if (!str) return '<>';\r\n const { cmap } = primary.fontData;\r\n if (!containsThai(str)) {\r\n let hex = '';\r\n for (let i = 0; i < str.length; i++) {\r\n const rawCp = str.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = cmap[cp] || 0;\r\n _trackGid(primary.fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n }\r\n return '<' + hex.toUpperCase() + '>';\r\n }\r\n const shaped = shapeThaiText(str, primary.fontData);\r\n let hex = '';\r\n for (const g of shaped) { _trackGid(primary.fontRef, g.gid); hex += g.gid.toString(16).padStart(4, '0'); }\r\n return '<' + hex.toUpperCase() + '>';\r\n },\r\n\r\n tw(str: string, sz: number): number {\r\n if (!str) return 0;\r\n const runs = this.textRuns(str, sz);\r\n let total = 0;\r\n for (const run of runs) total += run.widthPt;\r\n return total;\r\n },\r\n };\r\n}\r\n","/**\r\n * pdfnative — Script Registry\r\n * ============================\r\n * Centralised Unicode range constants and script detection predicates.\r\n * Single source of truth for all script identification logic.\r\n */\r\n\r\n// ── Arabic ───────────────────────────────────────────────────────────\r\n\r\n/** Arabic Unicode block start. */\r\nexport const ARABIC_START = 0x0600;\r\n/** Arabic Unicode block end. */\r\nexport const ARABIC_END = 0x06FF;\r\n/** Arabic Supplement block. */\r\nexport const ARABIC_SUPPLEMENT_START = 0x0750;\r\nexport const ARABIC_SUPPLEMENT_END = 0x077F;\r\n/** Arabic Extended-A block. */\r\nexport const ARABIC_EXTENDED_A_START = 0x08A0;\r\nexport const ARABIC_EXTENDED_A_END = 0x08FF;\r\n/** Arabic Presentation Forms-A. */\r\nexport const ARABIC_PRES_A_START = 0xFB50;\r\nexport const ARABIC_PRES_A_END = 0xFDFF;\r\n/** Arabic Presentation Forms-B. */\r\nexport const ARABIC_PRES_B_START = 0xFE70;\r\nexport const ARABIC_PRES_B_END = 0xFEFF;\r\n\r\n// ── Hebrew ───────────────────────────────────────────────────────────\r\n\r\n/** Hebrew Unicode block. */\r\nexport const HEBREW_START = 0x0590;\r\nexport const HEBREW_END = 0x05FF;\r\n/** Hebrew Presentation Forms. */\r\nexport const HEBREW_PRES_START = 0xFB1D;\r\nexport const HEBREW_PRES_END = 0xFB4F;\r\n\r\n// ── Thai ─────────────────────────────────────────────────────────────\r\n\r\n/** Thai Unicode block. */\r\nexport const THAI_START = 0x0E00;\r\nexport const THAI_END = 0x0E7F;\r\n\r\n// ── Greek ────────────────────────────────────────────────────────────\r\n\r\nexport const GREEK_START = 0x0370;\r\nexport const GREEK_END = 0x03FF;\r\nexport const GREEK_EXT_START = 0x1F00;\r\nexport const GREEK_EXT_END = 0x1FFF;\r\n\r\n// ── Devanagari ───────────────────────────────────────────────────────\r\n\r\nexport const DEVANAGARI_START = 0x0900;\r\nexport const DEVANAGARI_END = 0x097F;\r\nexport const DEVANAGARI_EXT_START = 0xA8E0;\r\nexport const DEVANAGARI_EXT_END = 0xA8FF;\r\n\r\n// ── CJK / Kana / Hangul ─────────────────────────────────────────────\r\n\r\nexport const HIRAGANA_START = 0x3040;\r\nexport const KATAKANA_END = 0x30FF;\r\nexport const HANGUL_START = 0xAC00;\r\nexport const HANGUL_END = 0xD7AF;\r\nexport const JAMO_START = 0x1100;\r\nexport const JAMO_END = 0x11FF;\r\nexport const COMPAT_JAMO_START = 0x3130;\r\nexport const COMPAT_JAMO_END = 0x318F;\r\nexport const CJK_UNIFIED_START = 0x4E00;\r\nexport const CJK_UNIFIED_END = 0x9FFF;\r\nexport const CJK_EXT_A_START = 0x3400;\r\nexport const CJK_EXT_A_END = 0x4DBF;\r\nexport const CJK_COMPAT_START = 0xF900;\r\nexport const CJK_COMPAT_END = 0xFAFF;\r\n\r\n// ── Cyrillic ─────────────────────────────────────────────────────────\r\n\r\nexport const CYRILLIC_START = 0x0400;\r\nexport const CYRILLIC_END = 0x04FF;\r\nexport const CYRILLIC_SUPPLEMENT_START = 0x0500;\r\nexport const CYRILLIC_SUPPLEMENT_END = 0x052F;\r\nexport const CYRILLIC_EXT_A_START = 0x2DE0;\r\nexport const CYRILLIC_EXT_A_END = 0x2DFF;\r\nexport const CYRILLIC_EXT_B_START = 0xA640;\r\nexport const CYRILLIC_EXT_B_END = 0xA69F;\r\n\r\n// ── Georgian ─────────────────────────────────────────────────────────\r\n\r\nexport const GEORGIAN_START = 0x10A0;\r\nexport const GEORGIAN_END = 0x10FF;\r\nexport const GEORGIAN_SUPPLEMENT_START = 0x2D00;\r\nexport const GEORGIAN_SUPPLEMENT_END = 0x2D2F;\r\n\r\n// ── Armenian ─────────────────────────────────────────────────────────\r\n\r\nexport const ARMENIAN_START = 0x0530;\r\nexport const ARMENIAN_END = 0x058F;\r\nexport const ARMENIAN_LIGATURES_START = 0xFB13;\r\nexport const ARMENIAN_LIGATURES_END = 0xFB17;\r\n\r\n// ── Bengali ──────────────────────────────────────────────────────────\r\n\r\n/** Bengali Unicode block. */\r\nexport const BENGALI_START = 0x0980;\r\nexport const BENGALI_END = 0x09FF;\r\n\r\n// ── Tamil ────────────────────────────────────────────────────────────\r\n\r\n/** Tamil Unicode block. */\r\nexport const TAMIL_START = 0x0B80;\r\nexport const TAMIL_END = 0x0BFF;\r\n\r\n// ── Script Predicates ────────────────────────────────────────────────\r\n\r\n/** Check if a codepoint falls in any Arabic Unicode block. */\r\nexport function isArabicCodepoint(cp: number): boolean {\r\n return (cp >= ARABIC_START && cp <= ARABIC_END) ||\r\n (cp >= ARABIC_SUPPLEMENT_START && cp <= ARABIC_SUPPLEMENT_END) ||\r\n (cp >= ARABIC_EXTENDED_A_START && cp <= ARABIC_EXTENDED_A_END) ||\r\n (cp >= ARABIC_PRES_A_START && cp <= ARABIC_PRES_A_END) ||\r\n (cp >= ARABIC_PRES_B_START && cp <= ARABIC_PRES_B_END);\r\n}\r\n\r\n/** Check if a codepoint falls in any Hebrew Unicode block. */\r\nexport function isHebrewCodepoint(cp: number): boolean {\r\n return (cp >= HEBREW_START && cp <= HEBREW_END) ||\r\n (cp >= HEBREW_PRES_START && cp <= HEBREW_PRES_END);\r\n}\r\n\r\n/** Check if a codepoint falls in the Thai Unicode block. */\r\nexport function isThaiCodepoint(cp: number): boolean {\r\n return cp >= THAI_START && cp <= THAI_END;\r\n}\r\n\r\n/** Check if a codepoint falls in any Cyrillic Unicode block. */\r\nexport function isCyrillicCodepoint(cp: number): boolean {\r\n return (cp >= CYRILLIC_START && cp <= CYRILLIC_END) ||\r\n (cp >= CYRILLIC_SUPPLEMENT_START && cp <= CYRILLIC_SUPPLEMENT_END) ||\r\n (cp >= CYRILLIC_EXT_A_START && cp <= CYRILLIC_EXT_A_END) ||\r\n (cp >= CYRILLIC_EXT_B_START && cp <= CYRILLIC_EXT_B_END);\r\n}\r\n\r\n/** Check if a codepoint falls in any Georgian Unicode block. */\r\nexport function isGeorgianCodepoint(cp: number): boolean {\r\n return (cp >= GEORGIAN_START && cp <= GEORGIAN_END) ||\r\n (cp >= GEORGIAN_SUPPLEMENT_START && cp <= GEORGIAN_SUPPLEMENT_END);\r\n}\r\n\r\n/** Check if a codepoint falls in any Armenian Unicode block. */\r\nexport function isArmenianCodepoint(cp: number): boolean {\r\n return (cp >= ARMENIAN_START && cp <= ARMENIAN_END) ||\r\n (cp >= ARMENIAN_LIGATURES_START && cp <= ARMENIAN_LIGATURES_END);\r\n}\r\n\r\n/** Check if a codepoint falls in the Bengali Unicode block. */\r\nexport function isBengaliCodepoint(cp: number): boolean {\r\n return cp >= BENGALI_START && cp <= BENGALI_END;\r\n}\r\n\r\n/** Check if a codepoint falls in the Tamil Unicode block. */\r\nexport function isTamilCodepoint(cp: number): boolean {\r\n return cp >= TAMIL_START && cp <= TAMIL_END;\r\n}\r\n\r\n/** Check if a codepoint falls in any Devanagari Unicode block. */\r\nexport function isDevanagariCodepoint(cp: number): boolean {\r\n return (cp >= DEVANAGARI_START && cp <= DEVANAGARI_END) ||\r\n (cp >= DEVANAGARI_EXT_START && cp <= DEVANAGARI_EXT_END);\r\n}\r\n\r\n// ── Text-Level Detection ─────────────────────────────────────────────\r\n\r\n/** Check if text contains Arabic characters requiring shaping. */\r\nexport function containsArabic(text: string): boolean {\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n if (isArabicCodepoint(cp)) return true;\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check if text contains Hebrew characters. */\r\nexport function containsHebrew(text: string): boolean {\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n if (isHebrewCodepoint(cp)) return true;\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Thai characters. */\r\nexport function containsThai(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isThaiCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Bengali characters. */\r\nexport function containsBengali(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isBengaliCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Tamil characters. */\r\nexport function containsTamil(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isTamilCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Check whether a string contains any Devanagari characters. */\r\nexport function containsDevanagari(str: string): boolean {\r\n for (let i = 0; i < str.length; i++) {\r\n if (isDevanagariCodepoint(str.charCodeAt(i))) return true;\r\n }\r\n return false;\r\n}\r\n","/**\r\n * pdfnative — Bengali Mini-Shaper\r\n * =================================\r\n * Pure JS OpenType GSUB + GPOS shaping for Bengali script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - Syllable cluster building (base + halant-mediated conjuncts)\r\n * - Reph detection and reordering (Ra + Halant at start → reph above last base)\r\n * - Vowel sign reordering (pre-base matras like ি move before visual base)\r\n * - Nukta (U+09BC) attachment to preceding consonant\r\n * - GSUB SingleSubst: contextual glyph substitution\r\n * - GPOS MarkToBase: combining mark positioning (vowel signs, chandrabindu)\r\n * - GPOS MarkToMark: stacked marks\r\n *\r\n * References:\r\n * - Unicode Standard §12.2 Bengali\r\n * - OpenType spec: Script-specific shaping for Bengali (Indic2)\r\n * - ISO 15924 script code: Beng\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport { BENGALI_START, BENGALI_END, containsBengali } from './script-registry.js';\r\n\r\n// Re-export range constants\r\nexport { BENGALI_START, BENGALI_END, containsBengali };\r\n\r\n// ── Bengali character classification ─────────────────────────────────\r\n\r\n/** Halant / Virama — joins consonants into conjuncts. */\r\nconst HALANT = 0x09CD;\r\n/** Nukta — modifies preceding consonant. */\r\nconst NUKTA = 0x09BC;\r\n/** Ra — used for reph formation when followed by halant at syllable start. */\r\nconst RA = 0x09B0;\r\n\r\n/**\r\n * Bengali character type classification.\r\n * 0 = consonant (Ka–Ha, Ya, Ra etc.)\r\n * 1 = independent vowel (base character)\r\n * 2 = dependent vowel sign (matra) — above\r\n * 3 = dependent vowel sign (matra) — below\r\n * 4 = dependent vowel sign (matra) — pre-base (reordered left of base)\r\n * 5 = dependent vowel sign (matra) — post-base (right of base)\r\n * 6 = modifier (chandrabindu, anusvara, visarga)\r\n * 7 = halant/virama\r\n * 8 = nukta\r\n * 9 = number/digit\r\n */\r\nfunction bengaliCharType(cp: number): number {\r\n if (cp === HALANT) return 7;\r\n if (cp === NUKTA) return 8;\r\n // Modifiers\r\n if (cp >= 0x0981 && cp <= 0x0983) return 6;\r\n // Independent vowels U+0985–U+0994\r\n if (cp >= 0x0985 && cp <= 0x0994) return 1;\r\n // Consonants U+0995–U+09B9 (Ka to Ha)\r\n if (cp >= 0x0995 && cp <= 0x09B9) return 0;\r\n // Dependent vowel signs — classify by position\r\n // Pre-base matras (render left of base)\r\n if (cp === 0x09BF) return 4; // ি (i)\r\n if (cp === 0x09C7) return 4; // ে (e)\r\n if (cp === 0x09C8) return 4; // ৈ (ai)\r\n // Below-base matras\r\n if (cp === 0x09C1 || cp === 0x09C2 || cp === 0x09C3 || cp === 0x09C4) return 3;\r\n // Above-base matras\r\n if (cp === 0x09BE) return 5; // া (aa) — post-base\r\n if (cp === 0x09C0) return 5; // ী (ii) — post-base\r\n // Split vowel signs: ো (o) = ে + া, ৌ (au) = ে + ৌ\r\n if (cp === 0x09CB) return 4; // ো — pre-base component\r\n if (cp === 0x09CC) return 4; // ৌ — pre-base component\r\n // Other dependent vowel signs\r\n if (cp >= 0x09BE && cp <= 0x09CC) return 2;\r\n // Au length mark\r\n if (cp === 0x09D7) return 5;\r\n // Bengali digits\r\n if (cp >= 0x09E6 && cp <= 0x09EF) return 9;\r\n // Ya-phalaa, Ra-phalaa (secondary forms are consonants)\r\n if (cp === 0x09DF) return 0; // YYA\r\n // Avagraha U+09BD\r\n if (cp === 0x09BD) return 1;\r\n // Khanda Ta U+09CE\r\n if (cp === 0x09CE) return 0;\r\n return -1;\r\n}\r\n\r\n/** Check if a codepoint is a Bengali consonant. */\r\nfunction isConsonant(cp: number): boolean {\r\n return bengaliCharType(cp) === 0;\r\n}\r\n\r\n// ── Cluster building ─────────────────────────────────────────────────\r\n\r\ninterface BengaliCluster {\r\n /** Codepoints in logical order. */\r\n codepoints: number[];\r\n /** Index of the base consonant within codepoints. */\r\n baseIndex: number;\r\n /** Whether this syllable starts with Ra + Halant (reph). */\r\n hasReph: boolean;\r\n /** Indices of pre-base matra codepoints. */\r\n preBaseMatras: number[];\r\n}\r\n\r\n/**\r\n * Build syllable clusters from Bengali text.\r\n * A Bengali syllable: [Reph] [C + H]* C [nukta] [matras] [modifiers]\r\n */\r\nexport function buildBengaliClusters(str: string): BengaliCluster[] {\r\n const clusters: BengaliCluster[] = [];\r\n const cps: number[] = [];\r\n\r\n // Collect codepoints\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n let i = 0;\r\n while (i < cps.length) {\r\n const cp = cps[i];\r\n const type = bengaliCharType(cp);\r\n\r\n // Not a Bengali character — emit as standalone\r\n if (type < 0 || cp < BENGALI_START || cp > BENGALI_END) {\r\n clusters.push({ codepoints: [cp], baseIndex: 0, hasReph: false, preBaseMatras: [] });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Start of a syllable\r\n const syllable: number[] = [];\r\n let baseIdx = 0;\r\n let hasReph = false;\r\n const preMatras: number[] = [];\r\n\r\n // Check for reph: Ra + Halant at start followed by a consonant\r\n if (isConsonant(cp) && cp === RA && i + 2 < cps.length &&\r\n cps[i + 1] === HALANT && isConsonant(cps[i + 2])) {\r\n hasReph = true;\r\n syllable.push(cp, cps[i + 1]); // Ra + Halant\r\n i += 2;\r\n }\r\n\r\n // Consume consonant + halant sequences (C + H + C + H + ... + C)\r\n let lastConsonantIdx = -1;\r\n while (i < cps.length) {\r\n const cc = cps[i];\r\n const ct = bengaliCharType(cc);\r\n\r\n if (ct === 0) { // consonant\r\n lastConsonantIdx = syllable.length;\r\n syllable.push(cc);\r\n i++;\r\n\r\n // Nukta after consonant\r\n if (i < cps.length && cps[i] === NUKTA) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // Halant after consonant — check if followed by another consonant\r\n if (i < cps.length && cps[i] === HALANT) {\r\n if (i + 1 < cps.length && isConsonant(cps[i + 1])) {\r\n syllable.push(cps[i]); // halant\r\n i++;\r\n continue; // consume next consonant\r\n } else {\r\n // Explicit halant (visible virama) — end of consonant sequence\r\n syllable.push(cps[i]);\r\n i++;\r\n break;\r\n }\r\n }\r\n break; // no halant → end of consonant sequence\r\n } else {\r\n break; // not a consonant\r\n }\r\n }\r\n\r\n baseIdx = lastConsonantIdx >= 0 ? lastConsonantIdx : 0;\r\n\r\n // Consume dependent vowel signs (matras)\r\n while (i < cps.length) {\r\n const ct = bengaliCharType(cps[i]);\r\n if (ct >= 2 && ct <= 5) {\r\n if (ct === 4) {\r\n preMatras.push(syllable.length);\r\n }\r\n syllable.push(cps[i]);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Consume modifiers (chandrabindu, anusvara, visarga)\r\n while (i < cps.length && bengaliCharType(cps[i]) === 6) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // If syllable is empty (standalone vowel, digit, etc.)\r\n if (syllable.length === 0) {\r\n syllable.push(cps[i] ?? 0x20);\r\n i++;\r\n }\r\n\r\n clusters.push({\r\n codepoints: syllable,\r\n baseIndex: hasReph ? baseIdx + 2 : baseIdx, // Adjust for reph prefix\r\n hasReph,\r\n preBaseMatras: preMatras,\r\n });\r\n }\r\n\r\n return clusters;\r\n}\r\n\r\n// ── Bengali Shaper ───────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Bengali text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Bengali string\r\n * @param fontData - Font data with cmap, gsub, markAnchors, mark2mark, metrics, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeBengaliText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, gsub, ligatures, markAnchors, widths, defaultWidth } = fontData;\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function resolveGid(cp: number): number {\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n return cmap[normCp] || 0;\r\n }\r\n\r\n function resolveGidGsub(cp: number): number {\r\n const gid = resolveGid(cp);\r\n if (gsub[gid] !== undefined) return gsub[gid];\r\n return gid;\r\n }\r\n\r\n /**\r\n * Try to match a GID sequence against the GSUB ligature table.\r\n * Returns the ligature result GID and the number of GIDs consumed,\r\n * or null if no ligature matches.\r\n *\r\n * Ligature entries are sorted longest-first for greedy matching.\r\n */\r\n function tryLigature(gids: number[]): { resultGid: number; consumed: number } | null {\r\n if (!ligatures || gids.length < 2) return null;\r\n const firstGid = gids[0];\r\n const entries = ligatures[firstGid];\r\n if (!entries) return null;\r\n\r\n for (const entry of entries) {\r\n // entry = [resultGid, comp1, comp2, ...]\r\n const compCount = entry.length - 1;\r\n if (compCount > gids.length - 1) continue;\r\n let match = true;\r\n for (let ci = 0; ci < compCount; ci++) {\r\n if (gids[1 + ci] !== entry[1 + ci]) { match = false; break; }\r\n }\r\n if (match) return { resultGid: entry[0], consumed: compCount + 1 };\r\n }\r\n return null;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function emitGlyph(gid: number, isZero: boolean, baseGid?: number): void {\r\n if (isZero && baseGid !== undefined) {\r\n const markAnchor = getMarkAnchor(gid);\r\n if (markAnchor) {\r\n const baseAnchorPt = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchorPt) {\r\n const baseAdv = getAdv(baseGid);\r\n shaped.push({\r\n gid, dx: baseAnchorPt[0] - markAnchor.x - baseAdv,\r\n dy: baseAnchorPt[1] - markAnchor.y, isZeroAdvance: true,\r\n });\r\n return;\r\n }\r\n }\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: true });\r\n } else {\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n }\r\n\r\n const clusters = buildBengaliClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const { codepoints, hasReph, preBaseMatras } = cluster;\r\n\r\n // Determine base glyph index (adjusted for reph)\r\n const baseStart = hasReph ? 2 : 0;\r\n let baseGid = 0;\r\n\r\n // Find the effective base consonant GID\r\n // The base is the last consonant before matras/modifiers\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = bengaliCharType(codepoints[ci]);\r\n if (ct === 0) {\r\n baseGid = resolveGid(codepoints[ci]);\r\n } else if (ct >= 2) {\r\n break; // hit matras/modifiers\r\n }\r\n }\r\n\r\n // Track split vowel post-base components\r\n const splitPostComponents: number[] = [];\r\n\r\n // Emit pre-base matras first (before the consonant cluster)\r\n for (const mIdx of preBaseMatras) {\r\n if (mIdx < codepoints.length) {\r\n const mCp = codepoints[mIdx];\r\n // Split vowel signs: ো (U+09CB) = ে (U+09C7) + া (U+09BE)\r\n // ৌ (U+09CC) = ে (U+09C7) + ৌ-component (U+09D7)\r\n if (mCp === 0x09CB) {\r\n emitGlyph(resolveGid(0x09C7), false);\r\n splitPostComponents.push(0x09BE);\r\n } else if (mCp === 0x09CC) {\r\n emitGlyph(resolveGid(0x09C7), false);\r\n splitPostComponents.push(0x09D7);\r\n } else {\r\n emitGlyph(resolveGid(mCp), false);\r\n }\r\n }\r\n }\r\n\r\n // Emit consonant cluster — try ligature matching first\r\n // Collect the consonant+halant sequence as GIDs for ligature lookup\r\n const clusterGids: number[] = [];\r\n const clusterEndIdx: number[] = []; // maps each GID position back to codepoint index\r\n let matraStart = codepoints.length;\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = bengaliCharType(codepoints[ci]);\r\n if (ct === 0 || ct === 7 || ct === 8) {\r\n clusterGids.push(resolveGid(codepoints[ci]));\r\n clusterEndIdx.push(ci);\r\n } else if (ct < 0 || ct === 1 || ct === 9) {\r\n // Non-Bengali char, independent vowel, or digit — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n } else {\r\n matraStart = ci;\r\n break;\r\n }\r\n }\r\n\r\n // Try ligature substitution on the full consonant+halant GID sequence\r\n let ligConsumed = 0;\r\n const ligResult = tryLigature(clusterGids);\r\n if (ligResult) {\r\n // Ligature matched — emit single glyph for the entire matched sequence\r\n emitGlyph(ligResult.resultGid, false);\r\n baseGid = ligResult.resultGid;\r\n ligConsumed = ligResult.consumed;\r\n\r\n // Emit any remaining consonant+halant glyphs not consumed by the ligature\r\n let gi = ligConsumed;\r\n while (gi < clusterGids.length) {\r\n const subSeq = clusterGids.slice(gi);\r\n const subLig = tryLigature(subSeq);\r\n if (subLig) {\r\n emitGlyph(subLig.resultGid, false);\r\n gi += subLig.consumed;\r\n } else {\r\n // No further ligature — emit individual glyph\r\n const origCi = clusterEndIdx[gi];\r\n const ct = bengaliCharType(codepoints[origCi]);\r\n if (ct === 7) {\r\n emitGlyph(clusterGids[gi], true, baseGid);\r\n } else {\r\n emitGlyph(clusterGids[gi], false);\r\n }\r\n gi++;\r\n }\r\n }\r\n } else {\r\n // No ligature match — emit individual consonant+halant glyphs\r\n for (let ci = baseStart; ci < matraStart; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = bengaliCharType(cp);\r\n if (ct === 0) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 7) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 8) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n }\r\n }\r\n }\r\n\r\n // Emit matras and modifiers\r\n for (let ci = matraStart; ci < codepoints.length; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = bengaliCharType(cp);\r\n\r\n // Skip pre-base matras (already emitted above)\r\n if (ct === 4) continue;\r\n\r\n if (ct === 2 || ct === 3) {\r\n // Above/below mark — GPOS positioned\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 5) {\r\n // Post-base matra — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 6) {\r\n // Modifiers — zero-advance marks\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 9) {\r\n // Digit — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else {\r\n emitGlyph(resolveGid(cp), false);\r\n }\r\n }\r\n\r\n // Emit split vowel post-base components\r\n for (const postCp of splitPostComponents) {\r\n emitGlyph(resolveGid(postCp), false);\r\n }\r\n\r\n // Emit reph (Ra + Halant) as above mark on base — placed after base cluster\r\n if (hasReph) {\r\n const raGid = resolveGidGsub(RA);\r\n const halantGid = resolveGid(HALANT);\r\n // Reph rendered as combining mark above the base\r\n emitGlyph(raGid, true, baseGid);\r\n emitGlyph(halantGid, true, baseGid);\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n","/**\r\n * pdfnative — Tamil Mini-Shaper\r\n * ===============================\r\n * Pure JS OpenType GSUB + GPOS shaping for Tamil script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - Syllable cluster building (base + pulli-mediated conjuncts)\r\n * - Vowel sign reordering (pre-base matras like ெ, ே, ை move before visual base)\r\n * - Split vowel signs: ொ = ெ + ா, ோ = ே + ா, ௌ = ெ + ௗ\r\n * - GSUB SingleSubst: contextual glyph substitution\r\n * - GPOS MarkToBase: combining mark positioning\r\n * - GPOS MarkToMark: stacked marks\r\n *\r\n * Tamil is simpler than Bengali: no reph, no nukta, no below-base conjuncts.\r\n * Only has pulli (virama) for consonant joining and pre-base matra reordering.\r\n *\r\n * References:\r\n * - Unicode Standard §12.6 Tamil\r\n * - OpenType spec: Script-specific shaping for Tamil (Indic2)\r\n * - ISO 15924 script code: Taml\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport { TAMIL_START, TAMIL_END, containsTamil } from './script-registry.js';\r\n\r\n// Re-export range constants\r\nexport { TAMIL_START, TAMIL_END, containsTamil };\r\n\r\n// ── Tamil character constants ────────────────────────────────────────\r\n\r\n/** Pulli / Virama — suppresses inherent vowel, joins consonants. */\r\nconst PULLI = 0x0BCD;\r\n\r\n/**\r\n * Tamil character type classification.\r\n * 0 = consonant (Ka–Ha)\r\n * 1 = independent vowel (base character)\r\n * 2 = dependent vowel sign (matra) — above\r\n * 3 = dependent vowel sign (matra) — below (none in Tamil standard but reserved)\r\n * 4 = dependent vowel sign (matra) — pre-base (reordered left of base)\r\n * 5 = dependent vowel sign (matra) — post-base (right of base)\r\n * 6 = modifier (anusvara, visarga, OM)\r\n * 7 = pulli/virama\r\n * 9 = number/digit\r\n */\r\nfunction tamilCharType(cp: number): number {\r\n if (cp === PULLI) return 7;\r\n // Anusvara (U+0B82), Visarga (U+0B83)\r\n if (cp === 0x0B82 || cp === 0x0B83) return 6;\r\n // Independent vowels U+0B85–U+0B94\r\n if (cp >= 0x0B85 && cp <= 0x0B94) return 1;\r\n // Consonants U+0B95–U+0BB9\r\n if (cp >= 0x0B95 && cp <= 0x0BB9) return 0;\r\n // Dependent vowel signs — classify by position\r\n // Pre-base matras (render left of base)\r\n if (cp === 0x0BBF) return 4; // ி (i)\r\n if (cp === 0x0BC6) return 4; // ெ (e)\r\n if (cp === 0x0BC7) return 4; // ே (ee)\r\n if (cp === 0x0BC8) return 4; // ை (ai)\r\n // Split vowel signs — pre-base component\r\n if (cp === 0x0BCA) return 4; // ொ (o) = ெ + ா\r\n if (cp === 0x0BCB) return 4; // ோ (oo) = ே + ா\r\n if (cp === 0x0BCC) return 4; // ௌ (au) = ெ + ௗ\r\n // Post-base matras\r\n if (cp === 0x0BBE) return 5; // ா (aa)\r\n if (cp === 0x0BC0) return 5; // ீ (ii)\r\n // Above-base marks\r\n if (cp === 0x0BC1 || cp === 0x0BC2) return 2; // ு (u), ூ (uu)\r\n // Au length mark\r\n if (cp === 0x0BD7) return 5;\r\n // Other matras\r\n if (cp >= 0x0BBE && cp <= 0x0BCC) return 2;\r\n // Tamil digits\r\n if (cp >= 0x0BE6 && cp <= 0x0BEF) return 9;\r\n // Tamil special chars (day, month, etc.)\r\n if (cp >= 0x0BF0 && cp <= 0x0BFA) return 9;\r\n // OM U+0BD0\r\n if (cp === 0x0BD0) return 6;\r\n return -1;\r\n}\r\n\r\n/** Check if a codepoint is a Tamil consonant. */\r\nfunction isConsonant(cp: number): boolean {\r\n return tamilCharType(cp) === 0;\r\n}\r\n\r\n// ── Cluster building ─────────────────────────────────────────────────\r\n\r\ninterface TamilCluster {\r\n /** Codepoints in logical order. */\r\n codepoints: number[];\r\n /** Index of the base consonant within codepoints. */\r\n baseIndex: number;\r\n /** Indices of pre-base matra codepoints. */\r\n preBaseMatras: number[];\r\n}\r\n\r\n/**\r\n * Build syllable clusters from Tamil text.\r\n * A Tamil syllable: [C + Pulli]* C [matras] [modifiers]\r\n */\r\nexport function buildTamilClusters(str: string): TamilCluster[] {\r\n const clusters: TamilCluster[] = [];\r\n const cps: number[] = [];\r\n\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n let i = 0;\r\n while (i < cps.length) {\r\n const cp = cps[i];\r\n const type = tamilCharType(cp);\r\n\r\n // Not a Tamil character — emit as standalone\r\n if (type < 0 || cp < TAMIL_START || cp > TAMIL_END) {\r\n clusters.push({ codepoints: [cp], baseIndex: 0, preBaseMatras: [] });\r\n i++;\r\n continue;\r\n }\r\n\r\n const syllable: number[] = [];\r\n let lastConsonantIdx = -1;\r\n const preMatras: number[] = [];\r\n\r\n // Consume consonant + pulli sequences\r\n while (i < cps.length) {\r\n const cc = cps[i];\r\n const ct = tamilCharType(cc);\r\n\r\n if (ct === 0) { // consonant\r\n lastConsonantIdx = syllable.length;\r\n syllable.push(cc);\r\n i++;\r\n\r\n // Pulli after consonant — check if followed by another consonant\r\n if (i < cps.length && cps[i] === PULLI) {\r\n if (i + 1 < cps.length && isConsonant(cps[i + 1])) {\r\n syllable.push(cps[i]); // pulli\r\n i++;\r\n continue; // consume next consonant\r\n } else {\r\n // Explicit pulli (visible virama)\r\n syllable.push(cps[i]);\r\n i++;\r\n break;\r\n }\r\n }\r\n break;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n const baseIdx = lastConsonantIdx >= 0 ? lastConsonantIdx : 0;\r\n\r\n // Consume dependent vowel signs (matras)\r\n while (i < cps.length) {\r\n const ct = tamilCharType(cps[i]);\r\n if (ct >= 2 && ct <= 5) {\r\n if (ct === 4) {\r\n preMatras.push(syllable.length);\r\n }\r\n syllable.push(cps[i]);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Consume modifiers\r\n while (i < cps.length && tamilCharType(cps[i]) === 6) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n if (syllable.length === 0) {\r\n syllable.push(cps[i] ?? 0x20);\r\n i++;\r\n }\r\n\r\n clusters.push({\r\n codepoints: syllable,\r\n baseIndex: baseIdx,\r\n preBaseMatras: preMatras,\r\n });\r\n }\r\n\r\n return clusters;\r\n}\r\n\r\n// ── Tamil Shaper ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Tamil text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Tamil string\r\n * @param fontData - Font data with cmap, gsub, markAnchors, mark2mark, metrics, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeTamilText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, ligatures, markAnchors, widths, defaultWidth } = fontData;\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function resolveGid(cp: number): number {\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n return cmap[normCp] || 0;\r\n }\r\n\r\n /**\r\n * Try to match a GID sequence against the GSUB ligature table.\r\n * Returns the ligature result GID and the number of GIDs consumed,\r\n * or null if no ligature matches.\r\n */\r\n function tryLigature(gids: number[]): { resultGid: number; consumed: number } | null {\r\n if (!ligatures || gids.length < 2) return null;\r\n const firstGid = gids[0];\r\n const entries = ligatures[firstGid];\r\n if (!entries) return null;\r\n\r\n for (const entry of entries) {\r\n const compCount = entry.length - 1;\r\n if (compCount > gids.length - 1) continue;\r\n let match = true;\r\n for (let ci = 0; ci < compCount; ci++) {\r\n if (gids[1 + ci] !== entry[1 + ci]) { match = false; break; }\r\n }\r\n if (match) return { resultGid: entry[0], consumed: compCount + 1 };\r\n }\r\n return null;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function emitGlyph(gid: number, isZero: boolean, baseGid?: number): void {\r\n if (isZero && baseGid !== undefined) {\r\n const markAnchor = getMarkAnchor(gid);\r\n if (markAnchor) {\r\n const baseAnchorPt = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchorPt) {\r\n const baseAdv = getAdv(baseGid);\r\n shaped.push({\r\n gid, dx: baseAnchorPt[0] - markAnchor.x - baseAdv,\r\n dy: baseAnchorPt[1] - markAnchor.y, isZeroAdvance: true,\r\n });\r\n return;\r\n }\r\n }\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: true });\r\n } else {\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n }\r\n\r\n const clusters = buildTamilClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const { codepoints, preBaseMatras } = cluster;\r\n\r\n // Find the effective base consonant GID\r\n let baseGid = 0;\r\n for (let ci = 0; ci < codepoints.length; ci++) {\r\n const ct = tamilCharType(codepoints[ci]);\r\n if (ct === 0) {\r\n baseGid = resolveGid(codepoints[ci]);\r\n } else if (ct >= 2) {\r\n break;\r\n }\r\n }\r\n\r\n // Track split vowel post-base components that need emitting after base\r\n const splitPostComponents: number[] = [];\r\n\r\n // Emit pre-base matras first\r\n for (const mIdx of preBaseMatras) {\r\n if (mIdx < codepoints.length) {\r\n const mCp = codepoints[mIdx];\r\n // Split vowel signs: ொ (U+0BCA) = ெ (U+0BC6) + ா (U+0BBE)\r\n // ோ (U+0BCB) = ே (U+0BC7) + ா (U+0BBE)\r\n // ௌ (U+0BCC) = ெ (U+0BC6) + ௗ (U+0BD7)\r\n if (mCp === 0x0BCA) {\r\n emitGlyph(resolveGid(0x0BC6), false);\r\n splitPostComponents.push(0x0BBE);\r\n } else if (mCp === 0x0BCB) {\r\n emitGlyph(resolveGid(0x0BC7), false);\r\n splitPostComponents.push(0x0BBE);\r\n } else if (mCp === 0x0BCC) {\r\n emitGlyph(resolveGid(0x0BC6), false);\r\n splitPostComponents.push(0x0BD7);\r\n } else {\r\n emitGlyph(resolveGid(mCp), false);\r\n }\r\n }\r\n }\r\n\r\n // Emit consonant cluster — try ligature matching first\r\n // Collect the consonant+pulli sequence as GIDs for ligature lookup\r\n const clusterGids: number[] = [];\r\n const clusterEndIdx: number[] = [];\r\n let matraStart = codepoints.length;\r\n for (let ci = 0; ci < codepoints.length; ci++) {\r\n const ct = tamilCharType(codepoints[ci]);\r\n if (ct === 0 || ct === 7) {\r\n clusterGids.push(resolveGid(codepoints[ci]));\r\n clusterEndIdx.push(ci);\r\n } else if (ct >= 2) {\r\n matraStart = ci;\r\n break;\r\n } else if (ct < 0) {\r\n // Non-Tamil character (space, punctuation) — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n } else if (ct === 1) {\r\n // Independent vowel — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n }\r\n }\r\n\r\n // Try ligature substitution on the full consonant+pulli GID sequence\r\n let ligConsumed = 0;\r\n const ligResult = tryLigature(clusterGids);\r\n if (ligResult) {\r\n emitGlyph(ligResult.resultGid, false);\r\n baseGid = ligResult.resultGid;\r\n ligConsumed = ligResult.consumed;\r\n\r\n // Emit remaining unconsumed glyphs\r\n let gi = ligConsumed;\r\n while (gi < clusterGids.length) {\r\n const subSeq = clusterGids.slice(gi);\r\n const subLig = tryLigature(subSeq);\r\n if (subLig) {\r\n emitGlyph(subLig.resultGid, false);\r\n gi += subLig.consumed;\r\n } else {\r\n const origCi = clusterEndIdx[gi];\r\n const ct = tamilCharType(codepoints[origCi]);\r\n if (ct === 7) {\r\n emitGlyph(clusterGids[gi], true, baseGid);\r\n } else {\r\n emitGlyph(clusterGids[gi], false);\r\n }\r\n gi++;\r\n }\r\n }\r\n } else {\r\n // No ligature match — emit individual glyphs\r\n for (let ci = 0; ci < matraStart; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = tamilCharType(cp);\r\n if (ct === 0) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 7) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n }\r\n }\r\n }\r\n\r\n // Emit matras and modifiers\r\n for (let ci = matraStart; ci < codepoints.length; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = tamilCharType(cp);\r\n\r\n // Skip pre-base matras (already emitted)\r\n if (ct === 4) continue;\r\n\r\n if (ct === 2 || ct === 3) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 5) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 6) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 9) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else {\r\n emitGlyph(resolveGid(cp), false);\r\n }\r\n }\r\n\r\n // Emit split vowel post-base components\r\n for (const postCp of splitPostComponents) {\r\n emitGlyph(resolveGid(postCp), false);\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n","/**\r\n * pdfnative — Devanagari Mini-Shaper\r\n * ====================================\r\n * Pure JS OpenType GSUB + GPOS shaping for Devanagari script.\r\n * Zero external dependency.\r\n *\r\n * Handles:\r\n * - Syllable cluster building (base + halant-mediated conjuncts)\r\n * - Reph detection and reordering (Ra + Halant at start → reph above last base)\r\n * - Vowel sign reordering (pre-base matra ि moves before visual base)\r\n * - Nukta (U+093C) attachment to preceding consonant\r\n * - GSUB LigatureSubst: conjunct formation (C + Halant + C → ligature glyph)\r\n * - GSUB SingleSubst: contextual glyph substitution\r\n * - GPOS MarkToBase: combining mark positioning (matras, chandrabindu)\r\n *\r\n * References:\r\n * - Unicode Standard §12.1 Devanagari\r\n * - OpenType spec: Script-specific shaping for Devanagari (dev2)\r\n * - ISO 15924 script code: Deva\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport { DEVANAGARI_START, DEVANAGARI_END, containsDevanagari } from './script-registry.js';\r\n\r\n// Re-export range constants\r\nexport { DEVANAGARI_START, DEVANAGARI_END, containsDevanagari };\r\n\r\n// ── Devanagari character classification ──────────────────────────────\r\n\r\n/** Halant / Virama — joins consonants into conjuncts. */\r\nconst HALANT = 0x094D;\r\n/** Nukta — modifies preceding consonant. */\r\nconst NUKTA = 0x093C;\r\n/** Ra — used for reph formation when followed by halant at syllable start. */\r\nconst RA = 0x0930;\r\n\r\n/**\r\n * Devanagari character type classification.\r\n * 0 = consonant (Ka–Ha)\r\n * 1 = independent vowel (base character)\r\n * 2 = dependent vowel sign (matra) — above\r\n * 3 = dependent vowel sign (matra) — below\r\n * 4 = dependent vowel sign (matra) — pre-base (reordered left of base)\r\n * 5 = dependent vowel sign (matra) — post-base (right of base)\r\n * 6 = modifier (chandrabindu, anusvara, visarga)\r\n * 7 = halant/virama\r\n * 8 = nukta\r\n * 9 = number/digit\r\n */\r\nfunction devanagariCharType(cp: number): number {\r\n if (cp === HALANT) return 7;\r\n if (cp === NUKTA) return 8;\r\n // Modifiers: Chandrabindu (U+0901), Anusvara (U+0902), Visarga (U+0903)\r\n if (cp >= 0x0901 && cp <= 0x0903) return 6;\r\n // Independent vowels U+0904–U+0914\r\n if (cp >= 0x0904 && cp <= 0x0914) return 1;\r\n // Consonants U+0915–U+0939 (Ka to Ha)\r\n if (cp >= 0x0915 && cp <= 0x0939) return 0;\r\n // Pre-base matra: ि (short i) U+093F\r\n if (cp === 0x093F) return 4;\r\n // Below-base matras: ु (U+0941), ू (U+0942), ृ (U+0943), ॄ (U+0944)\r\n if (cp >= 0x0941 && cp <= 0x0944) return 3;\r\n // Post-base matras: ा (U+093E), ी (U+0940)\r\n if (cp === 0x093E || cp === 0x0940) return 5;\r\n // Above-base matras: े (U+0947), ै (U+0948)\r\n if (cp === 0x0947 || cp === 0x0948) return 2;\r\n // Split vowel matras: ो (U+094B) = े + ा, ौ (U+094C) = े + ौ\r\n if (cp === 0x094B || cp === 0x094C) return 4;\r\n // Other dependent vowel signs\r\n if (cp >= 0x0945 && cp <= 0x094C) return 2;\r\n // Devanagari digits\r\n if (cp >= 0x0966 && cp <= 0x096F) return 9;\r\n // Additional consonants (QA, KHHA, GHHA, ZA, DDDHA, RHA, FA, YYA)\r\n if (cp >= 0x0958 && cp <= 0x095F) return 0;\r\n // Avagraha U+093D\r\n if (cp === 0x093D) return 1;\r\n // OM U+0950\r\n if (cp === 0x0950) return 1;\r\n return -1;\r\n}\r\n\r\n/** Check if a codepoint is a Devanagari consonant. */\r\nfunction isConsonant(cp: number): boolean {\r\n return devanagariCharType(cp) === 0;\r\n}\r\n\r\n// ── Cluster building ─────────────────────────────────────────────────\r\n\r\ninterface DevanagariCluster {\r\n /** Codepoints in logical order. */\r\n codepoints: number[];\r\n /** Index of the base consonant within codepoints. */\r\n baseIndex: number;\r\n /** Whether this syllable starts with Ra + Halant (reph). */\r\n hasReph: boolean;\r\n /** Indices of pre-base matra codepoints. */\r\n preBaseMatras: number[];\r\n}\r\n\r\n/**\r\n * Build syllable clusters from Devanagari text.\r\n * A Devanagari syllable: [Reph] [C + H]* C [nukta] [matras] [modifiers]\r\n */\r\nexport function buildDevanagariClusters(str: string): DevanagariCluster[] {\r\n const clusters: DevanagariCluster[] = [];\r\n const cps: number[] = [];\r\n\r\n // Collect codepoints\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n let i = 0;\r\n while (i < cps.length) {\r\n const cp = cps[i];\r\n const type = devanagariCharType(cp);\r\n\r\n // Not a Devanagari character — emit as standalone\r\n if (type < 0 || cp < DEVANAGARI_START || cp > DEVANAGARI_END) {\r\n clusters.push({ codepoints: [cp], baseIndex: 0, hasReph: false, preBaseMatras: [] });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Start of a syllable\r\n const syllable: number[] = [];\r\n let hasReph = false;\r\n const preMatras: number[] = [];\r\n\r\n // Check for reph: Ra + Halant at start followed by a consonant\r\n if (isConsonant(cp) && cp === RA && i + 2 < cps.length &&\r\n cps[i + 1] === HALANT && isConsonant(cps[i + 2])) {\r\n hasReph = true;\r\n syllable.push(cp, cps[i + 1]); // Ra + Halant\r\n i += 2;\r\n }\r\n\r\n // Consume consonant + halant sequences (C + H + C + H + ... + C)\r\n let lastConsonantIdx = -1;\r\n while (i < cps.length) {\r\n const cc = cps[i];\r\n const ct = devanagariCharType(cc);\r\n\r\n if (ct === 0) { // consonant\r\n lastConsonantIdx = syllable.length;\r\n syllable.push(cc);\r\n i++;\r\n\r\n // Nukta after consonant\r\n if (i < cps.length && cps[i] === NUKTA) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // Halant after consonant — check if followed by another consonant\r\n if (i < cps.length && cps[i] === HALANT) {\r\n if (i + 1 < cps.length && isConsonant(cps[i + 1])) {\r\n syllable.push(cps[i]); // halant\r\n i++;\r\n continue; // consume next consonant\r\n } else {\r\n // Explicit halant (visible virama) — end of consonant sequence\r\n syllable.push(cps[i]);\r\n i++;\r\n break;\r\n }\r\n }\r\n break; // no halant → end of consonant sequence\r\n } else {\r\n break; // not a consonant\r\n }\r\n }\r\n\r\n const baseIdx = lastConsonantIdx >= 0 ? lastConsonantIdx : 0;\r\n\r\n // Consume dependent vowel signs (matras)\r\n while (i < cps.length) {\r\n const ct = devanagariCharType(cps[i]);\r\n if (ct >= 2 && ct <= 5) {\r\n if (ct === 4) {\r\n preMatras.push(syllable.length);\r\n }\r\n syllable.push(cps[i]);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Consume modifiers (chandrabindu, anusvara, visarga)\r\n while (i < cps.length && devanagariCharType(cps[i]) === 6) {\r\n syllable.push(cps[i]);\r\n i++;\r\n }\r\n\r\n // If syllable is empty (standalone vowel, digit, etc.)\r\n if (syllable.length === 0) {\r\n syllable.push(cps[i] ?? 0x20);\r\n i++;\r\n }\r\n\r\n clusters.push({\r\n codepoints: syllable,\r\n baseIndex: hasReph ? baseIdx + 2 : baseIdx,\r\n hasReph,\r\n preBaseMatras: preMatras,\r\n });\r\n }\r\n\r\n return clusters;\r\n}\r\n\r\n// ── Devanagari Shaper ────────────────────────────────────────────────\r\n\r\n/**\r\n * Shape a string of Devanagari text into an array of positioned glyphs.\r\n *\r\n * @param str - Raw Devanagari string\r\n * @param fontData - Font data with cmap, gsub, ligatures, markAnchors, widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeDevanagariText(str: string, fontData: FontData): ShapedGlyph[] {\r\n const { cmap, gsub, ligatures, markAnchors, widths, defaultWidth } = fontData;\r\n const shaped: ShapedGlyph[] = [];\r\n\r\n function resolveGid(cp: number): number {\r\n const normCp = (cp === 0x202F || cp === 0xA0) ? 0x20 : cp;\r\n return cmap[normCp] || 0;\r\n }\r\n\r\n /**\r\n * Try to match a GID sequence against the GSUB ligature table.\r\n * Returns the ligature result GID and the number of GIDs consumed,\r\n * or null if no ligature matches.\r\n *\r\n * Ligature entries are sorted longest-first for greedy matching.\r\n */\r\n function tryLigature(gids: number[]): { resultGid: number; consumed: number } | null {\r\n if (!ligatures || gids.length < 2) return null;\r\n const firstGid = gids[0];\r\n const entries = ligatures[firstGid];\r\n if (!entries) return null;\r\n\r\n for (const entry of entries) {\r\n // entry = [resultGid, comp1, comp2, ...]\r\n const compCount = entry.length - 1;\r\n if (compCount > gids.length - 1) continue;\r\n let match = true;\r\n for (let ci = 0; ci < compCount; ci++) {\r\n if (gids[1 + ci] !== entry[1 + ci]) { match = false; break; }\r\n }\r\n if (match) return { resultGid: entry[0], consumed: compCount + 1 };\r\n }\r\n return null;\r\n }\r\n\r\n function getAdv(gid: number): number {\r\n return widths[gid] !== undefined ? widths[gid] : defaultWidth;\r\n }\r\n\r\n function getBaseAnchor(baseGid: number, markClass: number): [number, number] | null {\r\n const base = markAnchors && markAnchors.bases && markAnchors.bases[baseGid];\r\n if (!base) return null;\r\n return base[markClass] ?? null;\r\n }\r\n\r\n function getMarkAnchor(markGid: number): { classIdx: number; x: number; y: number } | null {\r\n const mark = markAnchors && markAnchors.marks && markAnchors.marks[markGid];\r\n if (!mark) return null;\r\n return { classIdx: mark[0], x: mark[1], y: mark[2] };\r\n }\r\n\r\n function emitGlyph(gid: number, isZero: boolean, baseGid?: number): void {\r\n if (isZero && baseGid !== undefined) {\r\n const markAnchor = getMarkAnchor(gid);\r\n if (markAnchor) {\r\n const baseAnchorPt = getBaseAnchor(baseGid, markAnchor.classIdx);\r\n if (baseAnchorPt) {\r\n const baseAdv = getAdv(baseGid);\r\n shaped.push({\r\n gid, dx: baseAnchorPt[0] - markAnchor.x - baseAdv,\r\n dy: baseAnchorPt[1] - markAnchor.y, isZeroAdvance: true,\r\n });\r\n return;\r\n }\r\n }\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: true });\r\n } else {\r\n shaped.push({ gid, dx: 0, dy: 0, isZeroAdvance: false });\r\n }\r\n }\r\n\r\n const clusters = buildDevanagariClusters(str);\r\n\r\n for (const cluster of clusters) {\r\n const { codepoints, hasReph, preBaseMatras } = cluster;\r\n\r\n // Determine base glyph index (adjusted for reph)\r\n const baseStart = hasReph ? 2 : 0;\r\n let baseGid = 0;\r\n\r\n // Find the effective base consonant GID\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = devanagariCharType(codepoints[ci]);\r\n if (ct === 0) {\r\n baseGid = resolveGid(codepoints[ci]);\r\n } else if (ct >= 2) {\r\n break;\r\n }\r\n }\r\n\r\n // Track split vowel post-base components\r\n const splitPostComponents: number[] = [];\r\n\r\n // Emit pre-base matras first (before the consonant cluster)\r\n for (const mIdx of preBaseMatras) {\r\n if (mIdx < codepoints.length) {\r\n const mCp = codepoints[mIdx];\r\n // Split vowel signs: ो (U+094B) = े (U+0947) + ा (U+093E)\r\n // ौ (U+094C) = े (U+0947) + ौ-component\r\n if (mCp === 0x094B) {\r\n emitGlyph(resolveGid(0x0947), false);\r\n splitPostComponents.push(0x093E);\r\n } else if (mCp === 0x094C) {\r\n emitGlyph(resolveGid(0x0947), false);\r\n splitPostComponents.push(0x094C);\r\n } else {\r\n emitGlyph(resolveGid(mCp), false);\r\n }\r\n }\r\n }\r\n\r\n // Emit reph (Ra + Halant) — positioned as zero-advance mark above base\r\n if (hasReph) {\r\n // Reph pair: try GSUB for reph form\r\n const raGid = resolveGid(RA);\r\n const halantGid = resolveGid(HALANT);\r\n const rephLig = tryLigature([raGid, halantGid]);\r\n if (rephLig) {\r\n emitGlyph(rephLig.resultGid, true, baseGid);\r\n } else {\r\n const raGsubbed = gsub[raGid] !== undefined ? gsub[raGid] : raGid;\r\n emitGlyph(raGsubbed, true, baseGid);\r\n }\r\n }\r\n\r\n // Emit consonant cluster — try ligature matching first\r\n const clusterGids: number[] = [];\r\n const clusterEndIdx: number[] = [];\r\n let matraStart = codepoints.length;\r\n for (let ci = baseStart; ci < codepoints.length; ci++) {\r\n const ct = devanagariCharType(codepoints[ci]);\r\n if (ct === 0 || ct === 7 || ct === 8) {\r\n clusterGids.push(resolveGid(codepoints[ci]));\r\n clusterEndIdx.push(ci);\r\n } else if (ct < 0 || ct === 1 || ct === 9) {\r\n // Non-Devanagari char, independent vowel, or digit — emit directly\r\n emitGlyph(resolveGid(codepoints[ci]), false);\r\n } else {\r\n matraStart = ci;\r\n break;\r\n }\r\n }\r\n\r\n // Try ligature substitution on the full consonant+halant GID sequence\r\n const ligResult = tryLigature(clusterGids);\r\n if (ligResult) {\r\n emitGlyph(ligResult.resultGid, false);\r\n baseGid = ligResult.resultGid;\r\n\r\n // Emit remaining unconsumed glyphs\r\n let gi = ligResult.consumed;\r\n while (gi < clusterGids.length) {\r\n const subSeq = clusterGids.slice(gi);\r\n const subLig = tryLigature(subSeq);\r\n if (subLig) {\r\n emitGlyph(subLig.resultGid, false);\r\n gi += subLig.consumed;\r\n } else {\r\n const origCi = clusterEndIdx[gi];\r\n const ct = devanagariCharType(codepoints[origCi]);\r\n if (ct === 7) {\r\n emitGlyph(clusterGids[gi], true, baseGid);\r\n } else {\r\n emitGlyph(clusterGids[gi], false);\r\n }\r\n gi++;\r\n }\r\n }\r\n } else {\r\n // No ligature match — emit individual consonant+halant glyphs\r\n for (let ci = baseStart; ci < matraStart; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = devanagariCharType(cp);\r\n if (ct === 0) {\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 7) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 8) {\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n }\r\n }\r\n }\r\n\r\n // Emit matras and modifiers\r\n for (let ci = matraStart; ci < codepoints.length; ci++) {\r\n const cp = codepoints[ci];\r\n const ct = devanagariCharType(cp);\r\n\r\n // Skip pre-base matras (already emitted above)\r\n if (ct === 4) continue;\r\n\r\n if (ct === 2 || ct === 3) {\r\n // Above/below mark — GPOS positioned\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 5) {\r\n // Post-base matra — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else if (ct === 6) {\r\n // Modifiers — zero-advance marks\r\n emitGlyph(resolveGid(cp), true, baseGid);\r\n } else if (ct === 9) {\r\n // Digit — normal advance\r\n emitGlyph(resolveGid(cp), false);\r\n } else {\r\n emitGlyph(resolveGid(cp), false);\r\n }\r\n }\r\n\r\n // Emit split vowel post-base components\r\n for (const postCp of splitPostComponents) {\r\n emitGlyph(resolveGid(postCp), false);\r\n }\r\n }\r\n\r\n return shaped;\r\n}\r\n","/**\r\n * pdfnative — Arabic Text Shaper\r\n * ================================\r\n * Unicode Presentation Forms-based positional shaping for Arabic script.\r\n * Handles the four positional forms (isolated, initial, medial, final)\r\n * and common ligatures (lam-alef).\r\n *\r\n * Arabic letters change shape based on their position in a word:\r\n * - Isolated: standalone letter (no joining)\r\n * - Initial: beginning of a connected sequence\r\n * - Medial: middle of a connected sequence\r\n * - Final: end of a connected sequence\r\n *\r\n * Uses Unicode Arabic Presentation Forms B (U+FE70-U+FEFF) to look up\r\n * positional glyph IDs directly from the font's cmap, instead of relying\r\n * on complex GSUB table parsing. This works reliably with all fonts that\r\n * include Arabic Presentation Forms in their cmap (standard for Noto, etc.).\r\n *\r\n * References:\r\n * - Unicode Standard §9.2 Arabic\r\n * - Unicode Arabic Presentation Forms B (U+FE70-U+FEFF)\r\n * - ISO 32000-1 §9 (text rendering)\r\n */\r\n\r\nimport type { FontData, ShapedGlyph } from '../types/pdf-types.js';\r\nimport {\r\n ARABIC_START, ARABIC_END, HEBREW_START, HEBREW_END,\r\n containsArabic, containsHebrew,\r\n} from './script-registry.js';\r\n\r\n// Re-export range constants for backward compatibility\r\nexport { ARABIC_START, ARABIC_END, HEBREW_START, HEBREW_END, containsArabic, containsHebrew };\r\n\r\n/**\r\n * Arabic joining type classification.\r\n * D = Dual joining (joins on both sides)\r\n * R = Right joining (joins to the right only)\r\n * C = Join causing (e.g., TATWEEL)\r\n * U = Non-joining\r\n * T = Transparent (non-spacing marks)\r\n */\r\ntype JoiningType = 'D' | 'R' | 'C' | 'U' | 'T';\r\n\r\n/**\r\n * Determine the joining type of an Arabic character.\r\n */\r\nfunction getJoiningType(cp: number): JoiningType {\r\n // Non-spacing marks (transparent)\r\n if ((cp >= 0x064B && cp <= 0x065F) || // Harakat (vowel marks)\r\n cp === 0x0670 || // Superscript alef\r\n (cp >= 0x06D6 && cp <= 0x06DC) ||\r\n (cp >= 0x06DF && cp <= 0x06E4) ||\r\n (cp >= 0x06E7 && cp <= 0x06E8) ||\r\n (cp >= 0x06EA && cp <= 0x06ED) ||\r\n (cp >= 0x0610 && cp <= 0x061A)) return 'T';\r\n\r\n // TATWEEL (kashida) - join causing\r\n if (cp === 0x0640) return 'C';\r\n\r\n // Dual-joining letters (most Arabic letters)\r\n // Note: This is a simplified classification. Full UCD has per-character data.\r\n if ((cp >= 0x0626 && cp <= 0x0628) || // YEH HAMZA, BA series\r\n (cp >= 0x062A && cp <= 0x062E) || // TA through KHA \r\n (cp >= 0x0633 && cp <= 0x063A) || // SEEN through GHAIN\r\n (cp >= 0x0641 && cp <= 0x0647) || // FA through HA\r\n cp === 0x0649 || // ALEF MAKSURA\r\n cp === 0x064A || // YA\r\n cp === 0x0678 || // HIGH HAMZA YEH\r\n (cp >= 0x069A && cp <= 0x06BF) || // Extended Arabic\r\n (cp >= 0x06C1 && cp <= 0x06C3) ||\r\n (cp >= 0x06CC && cp <= 0x06CE) ||\r\n (cp >= 0x06D0 && cp <= 0x06D3) ||\r\n cp === 0x06D5 ||\r\n cp === 0x06FA ||\r\n cp === 0x06FB ||\r\n cp === 0x06FC) return 'D';\r\n\r\n // Right-joining letters (ALEF, DAL, THAL, RA, ZAI, WAW, etc.)\r\n if (cp === 0x0622 || cp === 0x0623 || cp === 0x0624 || cp === 0x0625 ||\r\n cp === 0x0627 || // ALEF\r\n cp === 0x0629 || // TEH MARBUTA\r\n cp === 0x062F || cp === 0x0630 || // DAL, THAL\r\n cp === 0x0631 || cp === 0x0632 || // RA, ZAIN\r\n cp === 0x0648 || // WAW\r\n (cp >= 0x0671 && cp <= 0x0673) ||\r\n cp === 0x0675 || cp === 0x0676 || cp === 0x0677 ||\r\n (cp >= 0x0688 && cp <= 0x0699) || // Extended DAL/RA series\r\n cp === 0x06C0 ||\r\n (cp >= 0x06C4 && cp <= 0x06CB) ||\r\n cp === 0x06CF ||\r\n cp === 0x06EE || cp === 0x06EF) return 'R';\r\n\r\n // Everything else in Arabic block is non-joining\r\n if (cp >= ARABIC_START && cp <= ARABIC_END) return 'U';\r\n\r\n // Non-Arabic → non-joining\r\n return 'U';\r\n}\r\n\r\n// ── Arabic Presentation Forms B (U+FE70-U+FEFF) ─────────────────────\r\n\r\n/**\r\n * Unicode Arabic Presentation Forms B mapping.\r\n * Maps base Arabic codepoints to their positional form codepoints.\r\n * These are standard Unicode codepoints that fonts include in their cmap,\r\n * providing direct glyph access without GSUB table parsing.\r\n */\r\ninterface ArabicPresForm {\r\n readonly isol: number;\r\n readonly fina?: number;\r\n readonly init?: number;\r\n readonly medi?: number;\r\n}\r\n\r\nconst ARABIC_PRES_FORMS: ReadonlyMap<number, ArabicPresForm> = new Map([\r\n [0x0621, { isol: 0xFE80 }],\r\n [0x0622, { isol: 0xFE81, fina: 0xFE82 }],\r\n [0x0623, { isol: 0xFE83, fina: 0xFE84 }],\r\n [0x0624, { isol: 0xFE85, fina: 0xFE86 }],\r\n [0x0625, { isol: 0xFE87, fina: 0xFE88 }],\r\n [0x0626, { isol: 0xFE89, fina: 0xFE8A, init: 0xFE8B, medi: 0xFE8C }],\r\n [0x0627, { isol: 0xFE8D, fina: 0xFE8E }],\r\n [0x0628, { isol: 0xFE8F, fina: 0xFE90, init: 0xFE91, medi: 0xFE92 }],\r\n [0x0629, { isol: 0xFE93, fina: 0xFE94 }],\r\n [0x062A, { isol: 0xFE95, fina: 0xFE96, init: 0xFE97, medi: 0xFE98 }],\r\n [0x062B, { isol: 0xFE99, fina: 0xFE9A, init: 0xFE9B, medi: 0xFE9C }],\r\n [0x062C, { isol: 0xFE9D, fina: 0xFE9E, init: 0xFE9F, medi: 0xFEA0 }],\r\n [0x062D, { isol: 0xFEA1, fina: 0xFEA2, init: 0xFEA3, medi: 0xFEA4 }],\r\n [0x062E, { isol: 0xFEA5, fina: 0xFEA6, init: 0xFEA7, medi: 0xFEA8 }],\r\n [0x062F, { isol: 0xFEA9, fina: 0xFEAA }],\r\n [0x0630, { isol: 0xFEAB, fina: 0xFEAC }],\r\n [0x0631, { isol: 0xFEAD, fina: 0xFEAE }],\r\n [0x0632, { isol: 0xFEAF, fina: 0xFEB0 }],\r\n [0x0633, { isol: 0xFEB1, fina: 0xFEB2, init: 0xFEB3, medi: 0xFEB4 }],\r\n [0x0634, { isol: 0xFEB5, fina: 0xFEB6, init: 0xFEB7, medi: 0xFEB8 }],\r\n [0x0635, { isol: 0xFEB9, fina: 0xFEBA, init: 0xFEBB, medi: 0xFEBC }],\r\n [0x0636, { isol: 0xFEBD, fina: 0xFEBE, init: 0xFEBF, medi: 0xFEC0 }],\r\n [0x0637, { isol: 0xFEC1, fina: 0xFEC2, init: 0xFEC3, medi: 0xFEC4 }],\r\n [0x0638, { isol: 0xFEC5, fina: 0xFEC6, init: 0xFEC7, medi: 0xFEC8 }],\r\n [0x0639, { isol: 0xFEC9, fina: 0xFECA, init: 0xFECB, medi: 0xFECC }],\r\n [0x063A, { isol: 0xFECD, fina: 0xFECE, init: 0xFECF, medi: 0xFED0 }],\r\n [0x0641, { isol: 0xFED1, fina: 0xFED2, init: 0xFED3, medi: 0xFED4 }],\r\n [0x0642, { isol: 0xFED5, fina: 0xFED6, init: 0xFED7, medi: 0xFED8 }],\r\n [0x0643, { isol: 0xFED9, fina: 0xFEDA, init: 0xFEDB, medi: 0xFEDC }],\r\n [0x0644, { isol: 0xFEDD, fina: 0xFEDE, init: 0xFEDF, medi: 0xFEE0 }],\r\n [0x0645, { isol: 0xFEE1, fina: 0xFEE2, init: 0xFEE3, medi: 0xFEE4 }],\r\n [0x0646, { isol: 0xFEE5, fina: 0xFEE6, init: 0xFEE7, medi: 0xFEE8 }],\r\n [0x0647, { isol: 0xFEE9, fina: 0xFEEA, init: 0xFEEB, medi: 0xFEEC }],\r\n [0x0648, { isol: 0xFEED, fina: 0xFEEE }],\r\n [0x0649, { isol: 0xFEEF, fina: 0xFEF0 }],\r\n [0x064A, { isol: 0xFEF1, fina: 0xFEF2, init: 0xFEF3, medi: 0xFEF4 }],\r\n]);\r\n\r\n/** Lam-Alef ligature presentation forms: [isolatedCP, finalCP]. */\r\nconst LAM_ALEF_PRES: ReadonlyMap<number, readonly [number, number]> = new Map([\r\n [0x0622, [0xFEF5, 0xFEF6]], // LAM + ALEF WITH MADDA ABOVE\r\n [0x0623, [0xFEF7, 0xFEF8]], // LAM + ALEF WITH HAMZA ABOVE\r\n [0x0625, [0xFEF9, 0xFEFA]], // LAM + ALEF WITH HAMZA BELOW\r\n [0x0627, [0xFEFB, 0xFEFC]], // LAM + ALEF\r\n]);\r\n\r\n// ── Positional Form Selection ────────────────────────────────────────\r\n\r\n/** Positional form tags matching OpenType GSUB features. */\r\ntype PositionalForm = 'isol' | 'init' | 'medi' | 'fina';\r\n\r\n/**\r\n * Determine the positional form for each character in an Arabic word.\r\n * Uses joining type analysis to decide isolated/initial/medial/final forms.\r\n *\r\n * @param codePoints - Array of code points (logical order)\r\n * @returns Array of positional form tags\r\n */\r\nfunction resolvePositionalForms(codePoints: number[]): PositionalForm[] {\r\n const len = codePoints.length;\r\n const forms: PositionalForm[] = new Array(len).fill('isol');\r\n const joining = codePoints.map(getJoiningType);\r\n\r\n for (let i = 0; i < len; i++) {\r\n if (joining[i] === 'T' || joining[i] === 'U') continue;\r\n\r\n // Find previous non-transparent joining character\r\n let prevJoin: JoiningType = 'U';\r\n for (let j = i - 1; j >= 0; j--) {\r\n if (joining[j] !== 'T') { prevJoin = joining[j]; break; }\r\n }\r\n\r\n // Find next non-transparent joining character\r\n let nextJoin: JoiningType = 'U';\r\n for (let j = i + 1; j < len; j++) {\r\n if (joining[j] !== 'T') { nextJoin = joining[j]; break; }\r\n }\r\n\r\n const joinsToPrev = prevJoin === 'D' || prevJoin === 'C';\r\n const joinsToNext = (nextJoin === 'D' || nextJoin === 'R' || nextJoin === 'C') &&\r\n (joining[i] === 'D' || joining[i] === 'C');\r\n\r\n if (joinsToPrev && joinsToNext) {\r\n forms[i] = 'medi';\r\n } else if (joinsToPrev) {\r\n forms[i] = 'fina';\r\n } else if (joinsToNext) {\r\n forms[i] = 'init';\r\n } else {\r\n forms[i] = 'isol';\r\n }\r\n }\r\n\r\n return forms;\r\n}\r\n\r\n// ── Lam-Alef Ligature ────────────────────────────────────────────────\r\n\r\n/** Alef variants that form ligatures with Lam. */\r\nconst LAM = 0x0644;\r\nconst ALEF_VARIANTS = new Set([0x0622, 0x0623, 0x0625, 0x0627]);\r\n\r\n/**\r\n * Check if a codepoint pair should form a Lam-Alef ligature.\r\n *\r\n * @param cp1 - First code point (expected Lam U+0644)\r\n * @param cp2 - Second code point (expected Alef variant)\r\n * @returns True if the pair forms a Lam-Alef ligature\r\n */\r\nexport function isLamAlef(cp1: number, cp2: number): boolean {\r\n return cp1 === LAM && ALEF_VARIANTS.has(cp2);\r\n}\r\n\r\n// ── Main Shaping API ─────────────────────────────────────────────────\r\n\r\n// containsArabic and containsHebrew are re-exported from script-registry above\r\n\r\n/**\r\n * Shape Arabic text using Unicode Presentation Forms.\r\n * Applies isolated/initial/medial/final forms by looking up the\r\n * positional presentation form codepoint in the font's cmap,\r\n * and handles Lam-Alef ligatures.\r\n *\r\n * @param str - Input Arabic text (logical order)\r\n * @param fontData - Font data with cmap and widths\r\n * @returns Array of positioned glyphs\r\n */\r\nexport function shapeArabicText(str: string, fontData: FontData): ShapedGlyph[] {\r\n if (!str) return [];\r\n\r\n // Extract code points\r\n const codePoints: number[] = [];\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n codePoints.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n // Resolve positional forms\r\n const forms = resolvePositionalForms(codePoints);\r\n\r\n // Apply presentation form substitutions and build glyph array\r\n const glyphs: ShapedGlyph[] = [];\r\n const cmap = fontData.cmap;\r\n\r\n for (let i = 0; i < codePoints.length; i++) {\r\n const cp = codePoints[i];\r\n\r\n // Check for Lam-Alef ligature\r\n if (i < codePoints.length - 1 && isLamAlef(cp, codePoints[i + 1])) {\r\n const ligForms = LAM_ALEF_PRES.get(codePoints[i + 1]);\r\n if (ligForms) {\r\n // Determine if the ligature is in final form (Lam joins to previous)\r\n const isFinal = forms[i] === 'medi' || forms[i] === 'fina';\r\n const ligCP = isFinal ? ligForms[1] : ligForms[0];\r\n const ligGid = cmap[ligCP];\r\n if (ligGid) {\r\n glyphs.push({ gid: ligGid, dx: 0, dy: 0, isZeroAdvance: false });\r\n i++; // Skip the Alef\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n // Get base glyph ID from cmap\r\n let gid = cmap[cp] ?? 0;\r\n\r\n // Apply positional form via Unicode Presentation Forms\r\n const presForm = ARABIC_PRES_FORMS.get(cp);\r\n if (presForm) {\r\n const form = forms[i];\r\n let presCP: number | undefined;\r\n if (form === 'init') presCP = presForm.init;\r\n else if (form === 'medi') presCP = presForm.medi;\r\n else if (form === 'fina') presCP = presForm.fina;\r\n else presCP = presForm.isol;\r\n\r\n if (presCP) {\r\n const presGid = cmap[presCP];\r\n if (presGid) gid = presGid;\r\n }\r\n }\r\n\r\n // Transparent marks get zero advance\r\n const joining = getJoiningType(cp);\r\n const isZeroAdvance = joining === 'T';\r\n\r\n glyphs.push({ gid, dx: 0, dy: 0, isZeroAdvance });\r\n }\r\n\r\n return glyphs;\r\n}\r\n","/**\r\n * pdfnative — Simplified Unicode Bidirectional Algorithm\r\n * =======================================================\r\n * Pure JS implementation of a subset of UAX #9 (Unicode Bidirectional Algorithm).\r\n * Sufficient for real-world Arabic/Hebrew + Latin mixed text in PDF documents.\r\n *\r\n * Supported:\r\n * - Embedding levels 0 (LTR) and 1 (RTL)\r\n * - Character types: L, R, AL, EN, AN, ES, ET, CS, WS, ON, NSM, BN\r\n * - Weak type resolution (W1-W7)\r\n * - Neutral type resolution (N1-N2)\r\n * - Reordering (L2 — reverse RTL runs)\r\n * - Paragraph level detection (P2-P3)\r\n *\r\n * Not supported (rare/unnecessary for PDF):\r\n * - Explicit embeddings (LRE/RLE), overrides (LRO/RLO), isolates (LRI/RLI/FSI)\r\n * - Levels > 2\r\n *\r\n * References:\r\n * - Unicode Standard Annex #9: https://unicode.org/reports/tr9/\r\n * - ISO 32000-1 §14.8.2.3 (logical structure and reading order)\r\n */\r\n\r\n// ── Bidi Character Types ─────────────────────────────────────────────\r\n\r\n/** Bidirectional character type classification. */\r\nexport type BidiType = 'L' | 'R' | 'AL' | 'EN' | 'AN' | 'ES' | 'ET' | 'CS' | 'WS' | 'ON' | 'NSM' | 'BN';\r\n\r\n/** A run of text with a resolved embedding level. */\r\nexport interface BidiRun {\r\n readonly text: string;\r\n readonly level: number; // 0 = LTR, 1 = RTL\r\n readonly start: number; // Offset in the source text\r\n}\r\n\r\n// ── Character Type Classification ────────────────────────────────────\r\n\r\n/**\r\n * Classify a Unicode code point into its bidi character type.\r\n * Based on Unicode Character Database BidiClass property.\r\n *\r\n * @param cp - Unicode code point\r\n * @returns Bidi character type classification\r\n */\r\nexport function classifyBidiType(cp: number): BidiType {\r\n // ── Specific types BEFORE broad block ranges ─────────────────────\r\n\r\n // Non-spacing marks (must be before Arabic block check)\r\n if ((cp >= 0x0300 && cp <= 0x036F) || // Combining Diacritical Marks\r\n (cp >= 0x0591 && cp <= 0x05BD) || // Hebrew marks\r\n (cp >= 0x05BF && cp <= 0x05BF) ||\r\n (cp >= 0x05C1 && cp <= 0x05C2) ||\r\n (cp >= 0x05C4 && cp <= 0x05C5) ||\r\n (cp >= 0x05C7 && cp <= 0x05C7) ||\r\n (cp >= 0x0610 && cp <= 0x061A) || // Arabic marks\r\n (cp >= 0x064B && cp <= 0x065F) || // Arabic harakat\r\n (cp >= 0x0670 && cp <= 0x0670) || // Arabic superscript alef\r\n (cp >= 0x06D6 && cp <= 0x06DC) ||\r\n (cp >= 0x06DF && cp <= 0x06E4) ||\r\n (cp >= 0x06E7 && cp <= 0x06E8) ||\r\n (cp >= 0x06EA && cp <= 0x06ED) ||\r\n (cp >= 0xFE20 && cp <= 0xFE2F)) return 'NSM';\r\n\r\n // Boundary neutrals (must be before Arabic Presentation Forms-B)\r\n if (cp === 0x200B || cp === 0x200C || cp === 0x200D ||\r\n cp === 0x200E || cp === 0x200F || cp === 0xFEFF) return 'BN';\r\n\r\n // Arabic-Indic digits (must be before Arabic block)\r\n if (cp >= 0x0660 && cp <= 0x0669) return 'AN';\r\n // Extended Arabic-Indic digits\r\n if (cp >= 0x06F0 && cp <= 0x06F9) return 'AN';\r\n\r\n // European digits 0-9\r\n if (cp >= 0x0030 && cp <= 0x0039) return 'EN';\r\n\r\n // European separators\r\n if (cp === 0x002B || cp === 0x002D) return 'ES'; // + -\r\n // European terminators\r\n if (cp === 0x0023 || cp === 0x0024 || cp === 0x0025 ||\r\n cp === 0x00A2 || cp === 0x00A3 || cp === 0x00A4 || cp === 0x00A5 ||\r\n cp === 0x20AC || cp === 0x20B9 || cp === 0x20BA) return 'ET';\r\n\r\n // Common separators\r\n if (cp === 0x002C || cp === 0x002E || cp === 0x002F || cp === 0x003A || cp === 0x00A0) return 'CS';\r\n\r\n // Whitespace\r\n if (cp === 0x0020 || cp === 0x0009 || cp === 0x000A || cp === 0x000D ||\r\n cp === 0x000C || cp === 0x2000 || cp === 0x200A ||\r\n cp === 0x2028 || cp === 0x2029 || cp === 0x202F || cp === 0x205F || cp === 0x3000) return 'WS';\r\n\r\n // ── Broad block ranges ───────────────────────────────────────────\r\n\r\n // Arabic block U+0600-06FF → AL\r\n if (cp >= 0x0600 && cp <= 0x06FF) return 'AL';\r\n // Arabic Supplement U+0750-077F → AL\r\n if (cp >= 0x0750 && cp <= 0x077F) return 'AL';\r\n // Arabic Extended-A U+08A0-08FF → AL\r\n if (cp >= 0x08A0 && cp <= 0x08FF) return 'AL';\r\n // Arabic Presentation Forms-A U+FB50-FDFF → AL\r\n if (cp >= 0xFB50 && cp <= 0xFDFF) return 'AL';\r\n // Arabic Presentation Forms-B U+FE70-FEFE → AL (FEFF is BN, handled above)\r\n if (cp >= 0xFE70 && cp <= 0xFEFE) return 'AL';\r\n\r\n // Hebrew U+0590-05FF → R (marks already handled above as NSM)\r\n if (cp >= 0x05D0 && cp <= 0x05EA) return 'R'; // Hebrew letters\r\n if (cp >= 0x05F0 && cp <= 0x05F4) return 'R'; // Hebrew yod/punctuation\r\n // Misc Hebrew/RTL: Syriac, Thaana\r\n if (cp >= 0x0700 && cp <= 0x074F) return 'R'; // Syriac\r\n if (cp >= 0x0780 && cp <= 0x07BF) return 'R'; // Thaana\r\n if (cp >= 0xFB1D && cp <= 0xFB4F) return 'R'; // Hebrew Presentation Forms\r\n\r\n // Latin, CJK, etc. → L (default)\r\n if (cp >= 0x0041 && cp <= 0x005A) return 'L'; // A-Z\r\n if (cp >= 0x0061 && cp <= 0x007A) return 'L'; // a-z\r\n if (cp >= 0x00C0 && cp <= 0x024F) return 'L'; // Latin Extended\r\n if (cp >= 0x0370 && cp <= 0x03FF) return 'L'; // Greek\r\n if (cp >= 0x0400 && cp <= 0x04FF) return 'L'; // Cyrillic\r\n if (cp >= 0x0E00 && cp <= 0x0E7F) return 'L'; // Thai\r\n if (cp >= 0x0900 && cp <= 0x097F) return 'L'; // Devanagari\r\n if (cp >= 0x3040 && cp <= 0x30FF) return 'L'; // Japanese Kana\r\n if (cp >= 0x4E00 && cp <= 0x9FFF) return 'L'; // CJK\r\n if (cp >= 0xAC00 && cp <= 0xD7AF) return 'L'; // Hangul\r\n\r\n // Punctuation → ON (Other Neutral)\r\n if (cp >= 0x0021 && cp <= 0x002F) return 'ON';\r\n if (cp >= 0x003A && cp <= 0x0040) return 'ON';\r\n if (cp >= 0x005B && cp <= 0x0060) return 'ON';\r\n if (cp >= 0x007B && cp <= 0x007E) return 'ON';\r\n if (cp >= 0x00A1 && cp <= 0x00BF) return 'ON';\r\n // General Punctuation: dashes, quotes, leaders, etc. (U+2010–U+205E)\r\n if (cp >= 0x2010 && cp <= 0x2027) return 'ON';\r\n if (cp >= 0x2030 && cp <= 0x205E) return 'ON';\r\n\r\n // Default: Left-to-right for unclassified\r\n return 'L';\r\n}\r\n\r\n// ── Paragraph Level Detection (P2-P3) ────────────────────────────────\r\n\r\n/**\r\n * Determine the paragraph embedding level.\r\n * P2: Find first strong character (L, R, AL).\r\n * P3: If R or AL → level 1, else level 0.\r\n *\r\n * @param types - Array of bidi character types for the paragraph\r\n * @returns 0 for LTR, 1 for RTL\r\n */\r\nexport function detectParagraphLevel(types: BidiType[]): number {\r\n for (const t of types) {\r\n if (t === 'L') return 0;\r\n if (t === 'R' || t === 'AL') return 1;\r\n }\r\n return 0; // default LTR\r\n}\r\n\r\n// ── Weak Type Resolution (W1-W7) ────────────────────────────────────\r\n\r\n/**\r\n * Apply weak type resolution rules W1-W7 from UAX #9.\r\n * Modifies types array in place.\r\n */\r\nfunction resolveWeakTypes(types: BidiType[], paraLevel: number): void {\r\n const len = types.length;\r\n\r\n // W1: NSM → type of previous character (or paragraph embedding direction)\r\n let prevType: BidiType = paraLevel === 0 ? 'L' : 'R';\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'NSM') {\r\n types[i] = prevType;\r\n }\r\n prevType = types[i];\r\n }\r\n\r\n // W2: EN after AL → AN\r\n let lastStrong: BidiType = paraLevel === 0 ? 'L' : 'R';\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'R' || types[i] === 'L' || types[i] === 'AL') {\r\n lastStrong = types[i];\r\n } else if (types[i] === 'EN' && lastStrong === 'AL') {\r\n types[i] = 'AN';\r\n }\r\n }\r\n\r\n // W3: AL → R\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'AL') types[i] = 'R';\r\n }\r\n\r\n // W4: ES between EN → EN; CS between EN → EN; CS between AN → AN\r\n for (let i = 1; i < len - 1; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {\r\n types[i] = 'EN';\r\n } else if (types[i] === 'CS') {\r\n if (types[i - 1] === 'EN' && types[i + 1] === 'EN') types[i] = 'EN';\r\n else if (types[i - 1] === 'AN' && types[i + 1] === 'AN') types[i] = 'AN';\r\n }\r\n }\r\n\r\n // W5: ET adjacent to EN → EN\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'ET') {\r\n // Check backward\r\n let found = false;\r\n for (let j = i - 1; j >= 0; j--) {\r\n if (types[j] === 'EN') { found = true; break; }\r\n if (types[j] !== 'ET' && types[j] !== 'BN') break;\r\n }\r\n if (!found) {\r\n // Check forward\r\n for (let j = i + 1; j < len; j++) {\r\n if (types[j] === 'EN') { found = true; break; }\r\n if (types[j] !== 'ET' && types[j] !== 'BN') break;\r\n }\r\n }\r\n if (found) types[i] = 'EN';\r\n }\r\n }\r\n\r\n // W6: remaining ES, ET, CS → ON\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'ES' || types[i] === 'ET' || types[i] === 'CS') {\r\n types[i] = 'ON';\r\n }\r\n }\r\n\r\n // W7: EN preceded by L (in run direction) → L\r\n lastStrong = paraLevel === 0 ? 'L' : 'R';\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] === 'BN') continue;\r\n if (types[i] === 'L' || types[i] === 'R') {\r\n lastStrong = types[i];\r\n } else if (types[i] === 'EN' && lastStrong === 'L') {\r\n types[i] = 'L';\r\n }\r\n }\r\n}\r\n\r\n// ── Neutral Type Resolution (N1-N2) ─────────────────────────────────\r\n\r\n/**\r\n * Apply neutral type resolution rules N1-N2 from UAX #9.\r\n * Modifies types array in place.\r\n */\r\nfunction resolveNeutralTypes(types: BidiType[], paraLevel: number): void {\r\n const len = types.length;\r\n const paraDir: BidiType = paraLevel === 0 ? 'L' : 'R';\r\n\r\n for (let i = 0; i < len; i++) {\r\n if (types[i] !== 'ON' && types[i] !== 'WS' && types[i] !== 'BN') continue;\r\n\r\n // Find start of neutral run\r\n const start = i;\r\n while (i < len && (types[i] === 'ON' || types[i] === 'WS' || types[i] === 'BN')) i++;\r\n const end = i; // exclusive\r\n\r\n // Find surrounding strong types\r\n let prevStrong: BidiType = paraDir;\r\n for (let j = start - 1; j >= 0; j--) {\r\n if (types[j] === 'L' || types[j] === 'R' || types[j] === 'EN' || types[j] === 'AN') {\r\n prevStrong = (types[j] === 'EN' || types[j] === 'AN') ? 'R' : types[j];\r\n break;\r\n }\r\n }\r\n\r\n let nextStrong: BidiType = paraDir;\r\n for (let j = end; j < len; j++) {\r\n if (types[j] === 'L' || types[j] === 'R' || types[j] === 'EN' || types[j] === 'AN') {\r\n nextStrong = (types[j] === 'EN' || types[j] === 'AN') ? 'R' : types[j];\r\n break;\r\n }\r\n }\r\n\r\n // N1: If same direction, neutrals inherit that direction\r\n // N2: Otherwise, inherit paragraph embedding level direction\r\n const resolved: BidiType = (prevStrong === nextStrong) ? prevStrong : paraDir;\r\n for (let j = start; j < end; j++) {\r\n types[j] = resolved;\r\n }\r\n }\r\n}\r\n\r\n// ── Level Assignment ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Assign embedding levels based on resolved types and paragraph level.\r\n */\r\nfunction assignLevels(types: BidiType[], paraLevel: number): number[] {\r\n const levels: number[] = [];\r\n for (const t of types) {\r\n if (paraLevel === 0) {\r\n // LTR paragraph: R/AL/AN → level 1, EN → level 2 (but we simplify to 1)\r\n levels.push((t === 'R' || t === 'AN') ? 1 : 0);\r\n } else {\r\n // RTL paragraph: L/EN → level 2 (but we simplify to 0 for L)\r\n levels.push((t === 'L') ? 2 : 1);\r\n }\r\n }\r\n return levels;\r\n}\r\n\r\n// ── Glyph Mirroring ──────────────────────────────────────────────────\r\n\r\n/** Mirroring pairs for bidirectional text. ~40 common pairs. */\r\nconst MIRROR_MAP: Record<number, number> = {\r\n 0x0028: 0x0029, // ( → )\r\n 0x0029: 0x0028, // ) → (\r\n 0x003C: 0x003E, // < → >\r\n 0x003E: 0x003C, // > → <\r\n 0x005B: 0x005D, // [ → ]\r\n 0x005D: 0x005B, // ] → [\r\n 0x007B: 0x007D, // { → }\r\n 0x007D: 0x007B, // } → {\r\n 0x00AB: 0x00BB, // « → »\r\n 0x00BB: 0x00AB, // » → «\r\n 0x2039: 0x203A, // ‹ → ›\r\n 0x203A: 0x2039, // › → ‹\r\n 0x2045: 0x2046, // ⁅ → ⁆\r\n 0x2046: 0x2045, // ⁆ → ⁅\r\n 0x207D: 0x207E, // ⁽ → ⁾\r\n 0x207E: 0x207D, // ⁾ → ⁽\r\n 0x208D: 0x208E, // ₍ → ₎\r\n 0x208E: 0x208D, // ₎ → ₍\r\n 0x2329: 0x232A, // 〈 → 〉\r\n 0x232A: 0x2329, // 〉 → 〈\r\n 0x27E6: 0x27E7, // ⟦ → ⟧\r\n 0x27E7: 0x27E6, // ⟧ → ⟦\r\n 0x27E8: 0x27E9, // ⟨ → ⟩\r\n 0x27E9: 0x27E8, // ⟩ → ⟨\r\n 0x27EA: 0x27EB, // ⟪ → ⟫\r\n 0x27EB: 0x27EA, // ⟫ → ⟪\r\n 0x2983: 0x2984, // ⦃ → ⦄\r\n 0x2984: 0x2983, // ⦄ → ⦃\r\n 0x2985: 0x2986, // ⦅ → ⦆\r\n 0x2986: 0x2985, // ⦆ → ⦅\r\n 0x2987: 0x2988, // ⦇ → ⦈\r\n 0x2988: 0x2987, // ⦈ → ⦇\r\n 0x2989: 0x298A, // ⦉ → ⦊\r\n 0x298A: 0x2989, // ⦊ → ⦉\r\n 0x298B: 0x298C, // ⦋ → ⦌\r\n 0x298C: 0x298B, // ⦌ → ⦋\r\n 0x3008: 0x3009, // 〈 → 〉\r\n 0x3009: 0x3008, // 〉 → 〈\r\n 0x300A: 0x300B, // 《 → 》\r\n 0x300B: 0x300A, // 》 → 《\r\n};\r\n\r\n/**\r\n * Apply glyph mirroring for a code point in RTL context.\r\n * Returns the mirrored code point, or the original if no mirror exists.\r\n *\r\n * @param cp - Unicode code point to mirror\r\n * @returns Mirrored code point (e.g. '(' → ')') or the original\r\n */\r\nexport function mirrorCodePoint(cp: number): number {\r\n return MIRROR_MAP[cp] ?? cp;\r\n}\r\n\r\n// ── Practical Fixups ─────────────────────────────────────────────────\r\n\r\n/** Sentence-terminating punctuation codepoints. */\r\nconst SENTENCE_PUNCT = new Set([\r\n 0x002E, // .\r\n 0x002C, // ,\r\n 0x003B, // ;\r\n 0x003A, // :\r\n 0x0021, // !\r\n 0x003F, // ?\r\n]);\r\n\r\n/**\r\n * In RTL paragraphs, keep sentence punctuation (. , ; : ! ?) attached to\r\n * the preceding LTR word. Standard N2 assigns paragraph direction (R) when\r\n * neighbors disagree, causing \"pdfnative.\" to split into \"pdfnative\" + \".\".\r\n * We reassign the punctuation to L so it stays in the same LTR run.\r\n */\r\nfunction fixPunctuationAffinity(types: BidiType[], codePoints: number[], len: number): void {\r\n for (let i = 1; i < len; i++) {\r\n if (types[i] === 'R' && SENTENCE_PUNCT.has(codePoints[i])) {\r\n // Check if preceding non-WS character is L\r\n let prevIdx = i - 1;\r\n while (prevIdx >= 0 && (types[prevIdx] === 'WS' || types[prevIdx] === 'BN')) prevIdx--;\r\n if (prevIdx >= 0 && types[prevIdx] === 'L') {\r\n types[i] = 'L';\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Simplified bracket pairing for parentheses, square brackets, and curly braces.\r\n * When brackets enclose LTR content in an RTL paragraph, the opener and closer\r\n * should share the LTR level so they visually surround the content.\r\n * Handles: ( ), [ ], { }\r\n */\r\nfunction fixBracketPairing(types: BidiType[], codePoints: number[], len: number): void {\r\n const OPEN_BRACKETS: Record<number, number> = {\r\n 0x0028: 0x0029, // ( → )\r\n 0x005B: 0x005D, // [ → ]\r\n 0x007B: 0x007D, // { → }\r\n };\r\n\r\n for (let i = 0; i < len; i++) {\r\n const closer = OPEN_BRACKETS[codePoints[i]];\r\n if (closer === undefined) continue;\r\n // Found an opening bracket — find the matching closer\r\n let depth = 1;\r\n let closeIdx = -1;\r\n for (let j = i + 1; j < len; j++) {\r\n if (codePoints[j] === codePoints[i]) depth++;\r\n else if (codePoints[j] === closer) {\r\n depth--;\r\n if (depth === 0) { closeIdx = j; break; }\r\n }\r\n }\r\n if (closeIdx === -1) continue;\r\n // Check if the content between brackets contains any L\r\n let hasL = false;\r\n for (let j = i + 1; j < closeIdx; j++) {\r\n if (types[j] === 'L') { hasL = true; break; }\r\n }\r\n if (hasL) {\r\n // Assign opener and closer to L so they stay with the LTR content\r\n types[i] = 'L';\r\n types[closeIdx] = 'L';\r\n }\r\n }\r\n}\r\n\r\n// ── Main API ─────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Resolve bidirectional text into ordered runs with embedding levels.\r\n *\r\n * @param text - Input text in logical order\r\n * @returns Array of BidiRun objects in visual order\r\n */\r\nexport function resolveBidiRuns(text: string): BidiRun[] {\r\n if (!text) return [];\r\n\r\n // Extract code points\r\n const codePoints: number[] = [];\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n codePoints.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n\r\n const len = codePoints.length;\r\n if (len === 0) return [];\r\n\r\n // Step 1: Classify\r\n const types: BidiType[] = codePoints.map(classifyBidiType);\r\n\r\n // Step 2: Detect paragraph level (P2-P3)\r\n const paraLevel = detectParagraphLevel(types);\r\n\r\n // Step 3: Resolve weak types (W1-W7)\r\n resolveWeakTypes(types, paraLevel);\r\n\r\n // Step 4: Resolve neutral types (N1-N2)\r\n resolveNeutralTypes(types, paraLevel);\r\n\r\n // Step 4b: Practical fixups for common mixed RTL/LTR patterns.\r\n // Standard N2 assigns paragraph direction to neutrals between opposing strong\r\n // types. This causes periods after LTR words to drift into RTL runs and\r\n // bracket pairs around LTR content to split across runs. We fix these by\r\n // keeping sentence punctuation with the preceding LTR text and by pairing\r\n // brackets with their enclosed content.\r\n if (paraLevel === 1) {\r\n fixPunctuationAffinity(types, codePoints, len);\r\n fixBracketPairing(types, codePoints, len);\r\n }\r\n\r\n // Step 5: Assign levels\r\n const levels = assignLevels(types, paraLevel);\r\n\r\n // Step 6: Build runs of same level\r\n const runs: BidiRun[] = [];\r\n let runStart = 0;\r\n let runLevel = levels[0];\r\n // Map from codepoint index to string index\r\n const cpToStr: number[] = [];\r\n let strIdx = 0;\r\n for (let i = 0; i < len; i++) {\r\n cpToStr.push(strIdx);\r\n strIdx += codePoints[i] > 0xFFFF ? 2 : 1;\r\n }\r\n cpToStr.push(strIdx); // sentinel\r\n\r\n for (let i = 1; i <= len; i++) {\r\n if (i === len || levels[i] !== runLevel) {\r\n const start = cpToStr[runStart];\r\n const end = cpToStr[i];\r\n let runText = text.substring(start, end);\r\n // Reverse RTL runs for visual order.\r\n // Note: do NOT apply glyph mirroring (UAX #9 L4) here — our rendering\r\n // model pre-reverses text for a left-to-right PDF engine. The reversal\r\n // itself swaps bracket/paren positions correctly: logical \"(X)\" becomes\r\n // visual \")X(\" → PDF renders L→R as \")X(\" → reader reads R→L as \"(X)\".\r\n // Applying mirrorCodePoint would double-swap and produce wrong output.\r\n if (runLevel % 2 === 1) {\r\n runText = reverseString(runText);\r\n }\r\n runs.push({ text: runText, level: runLevel, start });\r\n if (i < len) {\r\n runStart = i;\r\n runLevel = levels[i];\r\n }\r\n }\r\n }\r\n\r\n // L2 reordering: for RTL paragraphs, reverse run order so that\r\n // the first logical run (rightmost visually) appears last in the\r\n // array — txt() renders runs left-to-right, so English text must\r\n // come first and Hebrew/Arabic text last.\r\n if (paraLevel === 1 && runs.length > 1) {\r\n runs.reverse();\r\n }\r\n\r\n return runs;\r\n}\r\n\r\n/**\r\n * Check if text contains any RTL characters (Arabic or Hebrew).\r\n *\r\n * @param text - Input text string\r\n * @returns True if text contains R or AL bidi types\r\n */\r\nexport function containsRTL(text: string): boolean {\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n const t = classifyBidiType(cp);\r\n if (t === 'R' || t === 'AL') return true;\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n return false;\r\n}\r\n\r\n// ── Internal Helpers ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Reverse a string while keeping surrogate pairs intact.\r\n *\r\n * @param str - Input string to reverse\r\n * @returns Reversed string with valid surrogate pair ordering\r\n */\r\nexport function reverseString(str: string): string {\r\n const cps: number[] = [];\r\n for (let i = 0; i < str.length;) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n cps.push(cp);\r\n i += cp > 0xFFFF ? 2 : 1;\r\n }\r\n cps.reverse();\r\n return String.fromCodePoint(...cps);\r\n}\r\n","/**\r\n * pdfnative — Encoding Context Factory\r\n * ======================================\r\n * Creates encoding contexts that bridge font encoding (WinAnsi/CIDFont)\r\n * with text shaping (Thai, Arabic, BiDi, multi-font fallback).\r\n *\r\n * Separated from encoding.ts to maintain unidirectional dependency flow:\r\n * core/ can import from both fonts/ and shaping/, while fonts/ stays\r\n * independent of shaping/.\r\n */\r\n\r\nimport type { FontEntry, FontData, TextRun, EncodingContext } from '../types/pdf-types.js';\r\nimport { pdfString, helveticaWidth } from '../fonts/encoding.js';\r\nimport { shapeThaiText } from '../shaping/thai-shaper.js';\r\nimport { shapeBengaliText } from '../shaping/bengali-shaper.js';\r\nimport { shapeTamilText } from '../shaping/tamil-shaper.js';\r\nimport { shapeDevanagariText } from '../shaping/devanagari-shaper.js';\r\nimport { shapeArabicText } from '../shaping/arabic-shaper.js';\r\nimport { splitTextByFont } from '../shaping/multi-font.js';\r\nimport { resolveBidiRuns, containsRTL, reverseString } from '../shaping/bidi.js';\r\nimport { isArabicCodepoint, containsThai, containsArabic, containsBengali, containsTamil, containsDevanagari } from '../shaping/script-registry.js';\r\n\r\n// ── Helvetica Fallback Helpers ───────────────────────────────────────\r\n\r\n/** Check if a codepoint is WinAnsi-encodable (basic Latin + Latin-1 Supplement + extras). */\r\nfunction isWinAnsi(cp: number): boolean {\r\n if ((cp >= 0x20 && cp <= 0x7E) || (cp >= 0xA0 && cp <= 0xFF)) return true;\r\n // Extended WinAnsi: full Windows-1252 range 0x80–0x9F\r\n if (cp === 0x20AC || cp === 0x201A || cp === 0x0192 || cp === 0x201E) return true;\r\n if (cp === 0x2026 || cp === 0x2020 || cp === 0x2021 || cp === 0x02C6) return true;\r\n if (cp === 0x2030 || cp === 0x0160 || cp === 0x2039 || cp === 0x0152) return true;\r\n if (cp === 0x017D || cp === 0x2018 || cp === 0x2019 || cp === 0x201C) return true;\r\n if (cp === 0x201D || cp === 0x2022 || cp === 0x2013 || cp === 0x2014) return true;\r\n if (cp === 0x02DC || cp === 0x2122 || cp === 0x0161 || cp === 0x203A) return true;\r\n if (cp === 0x0153 || cp === 0x017E || cp === 0x0178) return true;\r\n if (cp === 0x202F || cp === 0x09 || cp === 0x0A || cp === 0x0D) return true;\r\n return false;\r\n}\r\n\r\ninterface ArabicSegment { text: string; arabic: boolean; }\r\n\r\n/**\r\n * Split text into Arabic-shapeable and non-Arabic segments.\r\n * Spaces adjacent to Arabic chars stay in the Arabic segment;\r\n * non-Arabic chars without a CIDFont glyph form their own segments.\r\n */\r\nfunction splitArabicNonArabic(text: string, fd: FontData): ArabicSegment[] {\r\n const segments: ArabicSegment[] = [];\r\n let cur = '';\r\n let curArabic = false;\r\n\r\n for (let i = 0; i < text.length;) {\r\n const cp = text.codePointAt(i) ?? 0;\r\n const charLen = cp > 0xFFFF ? 2 : 1;\r\n const char = text.substring(i, i + charLen);\r\n const isAr = isArabicCodepoint(cp);\r\n // Space is Arabic-adjacent if the CIDFont has a glyph for it\r\n const isArSpace = cp === 0x20 && (fd.cmap[0x20] ?? 0) > 0;\r\n\r\n if (isAr || isArSpace) {\r\n if (cur && !curArabic) { segments.push({ text: cur, arabic: false }); cur = ''; }\r\n curArabic = true;\r\n cur += char;\r\n } else {\r\n if (cur && curArabic) { segments.push({ text: cur, arabic: true }); cur = ''; }\r\n curArabic = false;\r\n cur += char;\r\n }\r\n i += charLen;\r\n }\r\n if (cur) segments.push({ text: cur, arabic: curArabic });\r\n return segments;\r\n}\r\n\r\n/**\r\n * Build TextRuns for a non-shaped text segment, splitting into CIDFont and\r\n * Helvetica sub-runs based on cmap coverage. Characters with no CIDFont glyph\r\n * that are WinAnsi-encodable fall back to Helvetica (/F1).\r\n */\r\nfunction buildTextRunsWithFallback(\r\n text: string,\r\n fontRef: string,\r\n fd: FontData,\r\n sz: number,\r\n trackGid: (ref: string, gid: number) => void,\r\n): TextRun[] {\r\n const upm = fd.metrics.unitsPerEm;\r\n const result: TextRun[] = [];\r\n let mode: 'cid' | 'hel' | null = null;\r\n let cidChars = '';\r\n let cidHex = '';\r\n let cidDesignW = 0;\r\n let helChars = '';\r\n\r\n function flushCid(): void {\r\n if (!cidChars) return;\r\n result.push({\r\n text: cidChars, fontRef, fontData: fd, shaped: null,\r\n hexStr: `<${cidHex.toUpperCase()}>`,\r\n widthPt: cidDesignW * sz / upm,\r\n });\r\n cidChars = '';\r\n cidHex = '';\r\n cidDesignW = 0;\r\n }\r\n\r\n function flushHel(): void {\r\n if (!helChars) return;\r\n result.push({\r\n text: helChars, fontRef: '/F1', fontData: fd, shaped: null,\r\n hexStr: pdfString(helChars),\r\n widthPt: helveticaWidth(helChars, sz),\r\n });\r\n helChars = '';\r\n }\r\n\r\n for (let i = 0; i < text.length;) {\r\n const rawCp = text.codePointAt(i) ?? 0;\r\n const charLen = rawCp > 0xFFFF ? 2 : 1;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const char = text.substring(i, i + charLen);\r\n const gid = fd.cmap[cp] ?? 0;\r\n\r\n if (gid === 0 && isWinAnsi(cp)) {\r\n // No CIDFont glyph, but WinAnsi-encodable → Helvetica\r\n if (mode === 'cid') flushCid();\r\n mode = 'hel';\r\n helChars += char;\r\n } else if (mode === 'hel' && isWinAnsi(cp)) {\r\n // Stay in Helvetica for WinAnsi chars (avoids font-switching on spaces\r\n // between Latin words when the CIDFont happens to cover space)\r\n helChars += char;\r\n } else {\r\n if (mode === 'hel') flushHel();\r\n mode = 'cid';\r\n cidChars += char;\r\n trackGid(fontRef, gid);\r\n cidHex += gid.toString(16).padStart(4, '0');\r\n const gw = fd.widths[gid];\r\n cidDesignW += gw !== undefined ? gw : fd.defaultWidth;\r\n }\r\n i += charLen;\r\n }\r\n if (mode === 'cid') flushCid();\r\n if (mode === 'hel') flushHel();\r\n\r\n return result;\r\n}\r\n\r\n// ── Encoding Context Factory ─────────────────────────────────────────\r\n\r\n/**\r\n * Create an encoding context that encapsulates text encoding and font reference logic.\r\n * Latin mode uses WinAnsi/Helvetica, Unicode mode uses CIDFont/Identity-H.\r\n *\r\n * @param fontEntries - Array of font entries (primary first). Empty = Latin mode.\r\n */\r\nexport function createEncodingContext(fontEntries: FontEntry[]): EncodingContext {\r\n if (!fontEntries || fontEntries.length === 0) {\r\n return {\r\n isUnicode: false,\r\n fontEntries: [],\r\n ps: pdfString,\r\n tw: helveticaWidth,\r\n textRuns: () => [],\r\n f1: '/F1',\r\n f2: '/F2'\r\n };\r\n }\r\n\r\n const primary = fontEntries[0];\r\n\r\n // Track used glyph IDs per font for subsetting\r\n const _usedGids = new Map<string, Set<number>>();\r\n for (const fe of fontEntries) _usedGids.set(fe.fontRef, new Set());\r\n\r\n function _trackGid(fontRef: string, gid: number): void {\r\n const s = _usedGids.get(fontRef);\r\n if (s) s.add(gid);\r\n }\r\n\r\n return {\r\n isUnicode: true,\r\n fontEntries,\r\n fontData: primary.fontData,\r\n f1: primary.fontRef,\r\n f2: primary.fontRef,\r\n getUsedGids() { return _usedGids; },\r\n\r\n textRuns(str: string, sz: number): TextRun[] {\r\n if (!str) return [];\r\n\r\n // ── RTL path: BiDi reordering ────────────────────────────\r\n if (containsRTL(str)) {\r\n const bidiRuns = resolveBidiRuns(str);\r\n const result: TextRun[] = [];\r\n\r\n for (const bRun of bidiRuns) {\r\n const isRTL = bRun.level % 2 === 1;\r\n const fontRuns = splitTextByFont(bRun.text, fontEntries);\r\n\r\n for (const fRun of fontRuns) {\r\n const fd = fRun.entry.fontData;\r\n const upm = fd.metrics.unitsPerEm;\r\n const fontRef = fRun.entry.fontRef;\r\n\r\n if (isRTL && containsArabic(fRun.text)) {\r\n // Split into Arabic-shapeable segments and non-Arabic segments.\r\n // Non-Arabic chars (e.g. em-dash) without a CIDFont glyph must\r\n // fall back to Helvetica, not pass through shapeArabicText()\r\n // where they would produce .notdef (gid 0).\r\n const segments = splitArabicNonArabic(fRun.text, fd);\r\n for (const seg of segments) {\r\n if (seg.arabic) {\r\n const logical = reverseString(seg.text);\r\n const shaped = shapeArabicText(logical, fd);\r\n const visual = shaped.slice().reverse();\r\n let designW = 0;\r\n for (const g of visual) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: seg.text, fontRef, fontData: fd, shaped: visual, hexStr: null, widthPt: designW * sz / upm });\r\n } else {\r\n // Non-Arabic segment: use Helvetica fallback\r\n const subRuns = buildTextRunsWithFallback(seg.text, fontRef, fd, sz, _trackGid);\r\n result.push(...subRuns);\r\n }\r\n }\r\n } else if (isRTL) {\r\n // RTL non-Arabic (Hebrew etc.): text already reversed by BiDi\r\n // Use fallback helper to handle Latin chars not covered by CIDFont\r\n const subRuns = buildTextRunsWithFallback(fRun.text, fontRef, fd, sz, _trackGid);\r\n result.push(...subRuns);\r\n } else {\r\n // LTR run: standard path\r\n if (containsThai(fRun.text)) {\r\n const shaped = shapeThaiText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else if (containsBengali(fRun.text)) {\r\n const shaped = shapeBengaliText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else if (containsTamil(fRun.text)) {\r\n const shaped = shapeTamilText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else if (containsDevanagari(fRun.text)) {\r\n const shaped = shapeDevanagariText(fRun.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n result.push({ text: fRun.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm });\r\n } else {\r\n // LTR non-shaped: use fallback helper\r\n const subRuns = buildTextRunsWithFallback(fRun.text, fontRef, fd, sz, _trackGid);\r\n result.push(...subRuns);\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // ── LTR path: existing logic ─────────────────────────────\r\n const rawRuns = splitTextByFont(str, fontEntries);\r\n return rawRuns.flatMap(run => {\r\n const fd = run.entry.fontData;\r\n const fontRef = run.entry.fontRef;\r\n const upm = fd.metrics.unitsPerEm;\r\n\r\n if (containsThai(run.text)) {\r\n const shaped = shapeThaiText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n if (containsBengali(run.text)) {\r\n const shaped = shapeBengaliText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n if (containsTamil(run.text)) {\r\n const shaped = shapeTamilText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n if (containsDevanagari(run.text)) {\r\n const shaped = shapeDevanagariText(run.text, fd);\r\n let designW = 0;\r\n for (const g of shaped) {\r\n _trackGid(fontRef, g.gid);\r\n if (!g.isZeroAdvance) {\r\n designW += fd.widths[g.gid] !== undefined ? fd.widths[g.gid] : fd.defaultWidth;\r\n }\r\n }\r\n return [{ text: run.text, fontRef, fontData: fd, shaped, hexStr: null, widthPt: designW * sz / upm }];\r\n }\r\n\r\n return buildTextRunsWithFallback(run.text, fontRef, fd, sz, _trackGid);\r\n });\r\n },\r\n\r\n ps(str: string): string {\r\n if (!str) return '<>';\r\n const { cmap } = primary.fontData;\r\n\r\n // BiDi path for RTL text\r\n if (containsRTL(str)) {\r\n const bidiRuns = resolveBidiRuns(str);\r\n let hex = '';\r\n for (const bRun of bidiRuns) {\r\n const isRTL = bRun.level % 2 === 1;\r\n if (isRTL && containsArabic(bRun.text)) {\r\n const logical = reverseString(bRun.text);\r\n const shaped = shapeArabicText(logical, primary.fontData);\r\n for (let i = shaped.length - 1; i >= 0; i--) {\r\n _trackGid(primary.fontRef, shaped[i].gid);\r\n hex += shaped[i].gid.toString(16).padStart(4, '0');\r\n }\r\n } else {\r\n for (let i = 0; i < bRun.text.length; i++) {\r\n const rawCp = bRun.text.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = cmap[cp] || 0;\r\n _trackGid(primary.fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n }\r\n }\r\n }\r\n return `<${hex.toUpperCase()}>`;\r\n }\r\n\r\n if (!containsThai(str) && !containsBengali(str) && !containsTamil(str) && !containsDevanagari(str)) {\r\n let hex = '';\r\n for (let i = 0; i < str.length; i++) {\r\n const rawCp = str.codePointAt(i) ?? 0;\r\n if (rawCp > 0xFFFF) i++;\r\n const cp = (rawCp === 0x202F || rawCp === 0xA0) ? 0x20 : rawCp;\r\n const gid = cmap[cp] || 0;\r\n _trackGid(primary.fontRef, gid);\r\n hex += gid.toString(16).padStart(4, '0');\r\n }\r\n return `<${hex.toUpperCase()}>`;\r\n }\r\n // Shaped text path (Thai, Bengali, Tamil, Devanagari)\r\n const shapeFn = containsThai(str) ? shapeThaiText\r\n : containsBengali(str) ? shapeBengaliText\r\n : containsTamil(str) ? shapeTamilText\r\n : shapeDevanagariText;\r\n const shaped = shapeFn(str, primary.fontData);\r\n let hex = '';\r\n for (const g of shaped) { _trackGid(primary.fontRef, g.gid); hex += g.gid.toString(16).padStart(4, '0'); }\r\n return `<${hex.toUpperCase()}>`;\r\n },\r\n\r\n tw(str: string, sz: number): number {\r\n if (!str) return 0;\r\n const runs = this.textRuns(str, sz);\r\n let total = 0;\r\n for (const run of runs) total += run.widthPt;\r\n return total;\r\n },\r\n };\r\n}\r\n","/**\r\n * pdfnative — Font Embedder\r\n * ===========================\r\n * Helpers for embedding CIDFont Type2 fonts in PDF:\r\n * - Base64 → binary string decoder\r\n * - ToUnicode CMap builder\r\n * - Compact /W width array builder\r\n */\r\n\r\n/**\r\n * Decode a base64 string to a single-byte binary string.\r\n * Each character maps to exactly one byte (charCode ≤ 0xFF).\r\n */\r\nexport function base64ToByteString(b64: string): string {\r\n if (typeof atob === 'function') {\r\n return atob(b64);\r\n }\r\n // Node.js fallback\r\n const buf = (globalThis as Record<string, unknown>)['Buffer'] as { from(s: string, e: string): Uint8Array };\r\n const bytes = buf.from(b64, 'base64');\r\n let result = '';\r\n for (let i = 0; i < bytes.length; i++) {\r\n result += String.fromCharCode(bytes[i]);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Build a PDF ToUnicode CMap stream for CIDFont.\r\n * Maps glyph IDs back to Unicode code points for text selection/search.\r\n *\r\n * @param cmap - Unicode codepoint → glyph ID mapping\r\n * @param usedGids - Only include these glyph IDs (subset optimization)\r\n */\r\nexport function buildToUnicodeCMap(cmap: Record<number, number>, usedGids: Set<number>): string {\r\n // Invert cmap: glyphId → unicode codepoint (keep lowest codepoint)\r\n const glyphToUnicode: Record<number, number> = {};\r\n for (const [cp, gid] of Object.entries(cmap)) {\r\n const cpNum = Number(cp);\r\n if (!glyphToUnicode[gid] || cpNum < glyphToUnicode[gid]) {\r\n glyphToUnicode[gid] = cpNum;\r\n }\r\n }\r\n\r\n // Build bfchar entries (max 100 per block per PDF spec)\r\n const entries: [number, number][] = Object.entries(glyphToUnicode)\r\n .map(([gid, cp]) => [Number(gid), cp] as [number, number])\r\n .filter(([gid]) => !usedGids || usedGids.has(gid))\r\n .sort((a, b) => a[0] - b[0]);\r\n\r\n const chunks: string[] = [];\r\n for (let i = 0; i < entries.length; i += 100) {\r\n const batch = entries.slice(i, i + 100);\r\n const lines = batch.map(([gid, cp]) => {\r\n const gidHex = gid.toString(16).padStart(4, '0').toUpperCase();\r\n if (cp > 0xFFFF) {\r\n const hi = 0xD800 + ((cp - 0x10000) >> 10);\r\n const lo = 0xDC00 + ((cp - 0x10000) & 0x3FF);\r\n return `<${gidHex}> <${hi.toString(16).toUpperCase()}${lo.toString(16).toUpperCase()}>`;\r\n }\r\n return `<${gidHex}> <${cp.toString(16).padStart(4, '0').toUpperCase()}>`;\r\n });\r\n chunks.push(`${batch.length} beginbfchar\\n${lines.join('\\n')}\\nendbfchar`);\r\n }\r\n\r\n return [\r\n '/CIDInit /ProcSet findresource begin',\r\n '12 dict begin',\r\n 'begincmap',\r\n '/CIDSystemInfo',\r\n '<< /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def',\r\n '/CMapName /Adobe-Identity-UCS def',\r\n '/CMapType 2 def',\r\n '1 begincodespacerange',\r\n '<0000> <FFFF>',\r\n 'endcodespacerange',\r\n ...chunks,\r\n 'endcmap',\r\n 'CMapName currentdict /CMap defineresource pop',\r\n 'end',\r\n 'end'\r\n ].join('\\n');\r\n}\r\n\r\n/**\r\n * Build a compact /W array string for the CIDFont dictionary using only used GIDs.\r\n * Groups consecutive GIDs into ranges.\r\n *\r\n * @param widths - Full glyph widths table\r\n * @param usedGids - Set of used glyph IDs\r\n * @returns Compact /W array string, or null if no valid entries\r\n */\r\nexport function buildSubsetWidthArray(widths: Record<number, number>, usedGids: Set<number>): string | null {\r\n if (!usedGids || usedGids.size === 0) return null;\r\n const sorted = [...usedGids].filter(g => widths[g] !== undefined).sort((a, b) => a - b);\r\n if (sorted.length === 0) return null;\r\n\r\n const parts: string[] = [];\r\n let i = 0;\r\n while (i < sorted.length) {\r\n const start = sorted[i];\r\n const run = [widths[start]];\r\n while (i + 1 < sorted.length && sorted[i + 1] === sorted[i] + 1) {\r\n i++;\r\n run.push(widths[sorted[i]]);\r\n }\r\n parts.push(`${start} [${run.join(' ')}]`);\r\n i++;\r\n }\r\n return parts.join(' ');\r\n}\r\n","/**\r\n * pdfnative — Font Loader\r\n * =========================\r\n * Configurable font registry and lazy-loading.\r\n * Users register font data loaders, which are invoked on demand and cached.\r\n */\r\n\r\nimport type { FontData } from '../types/pdf-types.js';\r\n\r\n/** Font loader function type — returns a FontData or module with default export */\r\nexport type FontLoader = () => Promise<FontData | { default: FontData }>;\r\n\r\n/** Global font registry: language code → loader function */\r\nconst _fontRegistry = new Map<string, FontLoader>();\r\n\r\n/** Cache for loaded font data */\r\nconst _fontDataCache = new Map<string, FontData>();\r\n\r\n/**\r\n * Per-FontData decoded binary cache. WeakMap ensures entries are GC'd when FontData\r\n * is no longer referenced (e.g., after clearFontCache / resetFontRegistry).\r\n * Avoids re-running base64 decode + charCodeAt loop on every buildPDF() call.\r\n */\r\nconst _fontBinaryCache = new WeakMap<FontData, Uint8Array>();\r\n\r\n/**\r\n * Decode the TTF binary for a FontData object and return a cached Uint8Array.\r\n * Subsequent calls for the same FontData instance are zero-cost (WeakMap lookup).\r\n *\r\n * This is an internal helper used by pdf-builder and pdf-document to feed\r\n * subsetTTF() the Uint8Array path, skipping the charCodeAt decode loop.\r\n */\r\nexport function getDecodedFontBytes(fontData: FontData): Uint8Array {\r\n const cached = _fontBinaryCache.get(fontData);\r\n if (cached) return cached;\r\n\r\n // Decode base64 → Uint8Array (runs once per FontData instance)\r\n let bytes: Uint8Array;\r\n if (typeof atob === 'function') {\r\n const binaryStr = atob(fontData.ttfBase64);\r\n bytes = new Uint8Array(binaryStr.length);\r\n for (let i = 0; i < binaryStr.length; i++) bytes[i] = binaryStr.charCodeAt(i);\r\n } else {\r\n const buf = (globalThis as Record<string, unknown>)['Buffer'] as { from(s: string, e: string): Uint8Array };\r\n bytes = buf.from(fontData.ttfBase64, 'base64');\r\n }\r\n\r\n _fontBinaryCache.set(fontData, bytes);\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Register a font data loader for a language.\r\n *\r\n * @example\r\n * ```ts\r\n * registerFont('th', () => import('./fonts/noto-thai-data.js'));\r\n * registerFont('ja', () => import('./fonts/noto-jp-data.js'));\r\n * ```\r\n */\r\nexport function registerFont(lang: string, loader: FontLoader): void {\r\n _fontRegistry.set(lang, loader);\r\n}\r\n\r\n/**\r\n * Register multiple font loaders at once.\r\n *\r\n * @example\r\n * ```ts\r\n * registerFonts({\r\n * th: () => import('./fonts/noto-thai-data.js'),\r\n * ja: () => import('./fonts/noto-jp-data.js'),\r\n * });\r\n * ```\r\n */\r\nexport function registerFonts(fonts: Record<string, FontLoader>): void {\r\n for (const [lang, loader] of Object.entries(fonts)) {\r\n _fontRegistry.set(lang, loader);\r\n }\r\n}\r\n\r\n/**\r\n * Lazy-load pre-built font data for a language.\r\n * Returns cached data if already loaded. Retries once on failure.\r\n *\r\n * @param lang - Language code (e.g. 'th', 'ja', 'zh')\r\n * @returns Font data or null if unavailable\r\n */\r\nexport async function loadFontData(lang: string): Promise<FontData | null> {\r\n const cached = _fontDataCache.get(lang);\r\n if (cached) return cached;\r\n\r\n const loader = _fontRegistry.get(lang);\r\n if (!loader) return null;\r\n\r\n // Retry once after 500ms to handle cache race on fresh install\r\n for (let attempt = 0; attempt < 2; attempt++) {\r\n try {\r\n const mod = await loader();\r\n // Support both direct FontData and ES module default export\r\n const fontData = ('default' in mod) ? mod.default : mod;\r\n _fontDataCache.set(lang, fontData as FontData);\r\n return fontData as FontData;\r\n } catch {\r\n if (attempt === 0) {\r\n await new Promise(r => setTimeout(r, 500));\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Check if a font loader is registered for the given language.\r\n */\r\nexport function hasFontLoader(lang: string): boolean {\r\n return _fontRegistry.has(lang);\r\n}\r\n\r\n/**\r\n * Get all registered language codes.\r\n */\r\nexport function getRegisteredLangs(): string[] {\r\n return [..._fontRegistry.keys()];\r\n}\r\n\r\n/**\r\n * Clear font cache (useful for testing).\r\n */\r\nexport function clearFontCache(): void {\r\n _fontDataCache.clear();\r\n}\r\n\r\n/**\r\n * Clear all registered fonts and cache (useful for testing).\r\n */\r\nexport function resetFontRegistry(): void {\r\n _fontRegistry.clear();\r\n _fontDataCache.clear();\r\n}\r\n","/**\r\n * pdfnative — TTF Font Subsetter\r\n * ================================\r\n * Subset a TrueType font binary to contain only used glyphs.\r\n * Retains original GID numbering (Identity-H compatible).\r\n * Resolves compound glyph component dependencies recursively.\r\n */\r\n\r\n/**\r\n * Subset a TTF binary to contain only used glyphs.\r\n * Returns the subset TTF as a binary string (for PDF stream embedding).\r\n *\r\n * Accepts either a pre-decoded `Uint8Array` (zero-copy, preferred for cached font data)\r\n * or a binary string (legacy path, used when the font was loaded via `atob`).\r\n *\r\n * @param ttfInput - Full TTF as Uint8Array (preferred) or binary string\r\n * @param usedGids - Set of glyph IDs used in the document\r\n * @returns Subset TTF as binary string\r\n */\r\nexport function subsetTTF(ttfInput: Uint8Array | string, usedGids: Set<number>): string {\r\n try {\r\n let u8: Uint8Array;\r\n let len: number;\r\n\r\n if (ttfInput instanceof Uint8Array) {\r\n // Zero-copy path: use the buffer directly, no charCodeAt loop\r\n u8 = ttfInput;\r\n len = u8.length;\r\n } else {\r\n // Legacy string path: decode binary string to Uint8Array\r\n len = ttfInput.length;\r\n const buf = new ArrayBuffer(len);\r\n u8 = new Uint8Array(buf);\r\n for (let i = 0; i < len; i++) u8[i] = ttfInput.charCodeAt(i);\r\n }\r\n\r\n if (len < 12) return ttfInput instanceof Uint8Array ? uint8ToBinaryString(u8) : ttfInput; // Too small for a valid TTF offset table\r\n const view = new DataView(u8.buffer, u8.byteOffset, u8.byteLength);\r\n\r\n // Parse offset table & table directory\r\n const numTables = view.getUint16(4);\r\n const dirEnd = 12 + numTables * 16;\r\n if (dirEnd > len) return ttfInput instanceof Uint8Array ? uint8ToBinaryString(u8) : ttfInput; // Table directory exceeds buffer\r\n const tables: Record<string, { offset: number; length: number }> = {};\r\n for (let i = 0; i < numTables; i++) {\r\n const off = 12 + i * 16;\r\n const tag = String.fromCharCode(u8[off], u8[off + 1], u8[off + 2], u8[off + 3]);\r\n tables[tag] = {\r\n offset: view.getUint32(off + 8),\r\n length: view.getUint32(off + 12)\r\n };\r\n }\r\n\r\n const head = tables['head'];\r\n const maxp = tables['maxp'];\r\n const loca = tables['loca'];\r\n const glyf = tables['glyf'];\r\n if (!head || !maxp || !loca || !glyf) return ttfInput instanceof Uint8Array ? uint8ToBinaryString(u8) : ttfInput;\r\n\r\n const numGlyphs = view.getUint16(maxp.offset + 4);\r\n const locaFormat = view.getInt16(head.offset + 50);\r\n\r\n // Read original loca offsets\r\n const origOffsets = new Uint32Array(numGlyphs + 1);\r\n for (let i = 0; i <= numGlyphs; i++) {\r\n origOffsets[i] = locaFormat === 0\r\n ? view.getUint16(loca.offset + i * 2) * 2\r\n : view.getUint32(loca.offset + i * 4);\r\n }\r\n\r\n // Always include GID 0 (.notdef — required by PDF spec)\r\n const allGids = new Set(usedGids);\r\n allGids.add(0);\r\n\r\n // Resolve compound glyph component references recursively.\r\n // Iteration limit prevents excessive processing on deeply nested or malicious fonts.\r\n const MAX_COMPOUND_ITERATIONS = 10_000;\r\n let iterations = 0;\r\n const queue = [...allGids];\r\n while (queue.length > 0) {\r\n if (++iterations > MAX_COMPOUND_ITERATIONS) break;\r\n const gid = queue.pop();\r\n if (gid === undefined || gid >= numGlyphs) continue;\r\n const off = origOffsets[gid];\r\n const next = origOffsets[gid + 1];\r\n if (off >= next) continue;\r\n const glyfOff = glyf.offset + off;\r\n if (glyfOff + 10 > len) continue; // Not enough room for glyph header\r\n if (view.getInt16(glyfOff) >= 0) continue; // simple glyph\r\n // Compound glyph — extract component GIDs\r\n let pos = glyfOff + 10;\r\n let flags;\r\n do {\r\n if (pos + 4 > len) break; // Bounds check for flags + GID\r\n flags = view.getUint16(pos);\r\n const componentGid = view.getUint16(pos + 2);\r\n if (!allGids.has(componentGid)) {\r\n allGids.add(componentGid);\r\n queue.push(componentGid);\r\n }\r\n pos += 4;\r\n if (flags & 0x0001) pos += 4; else pos += 2;\r\n if (flags & 0x0008) pos += 2;\r\n else if (flags & 0x0040) pos += 4;\r\n else if (flags & 0x0080) pos += 8;\r\n } while (flags & 0x0020);\r\n }\r\n\r\n // Build new glyf table (only used glyph outlines)\r\n const glyfChunks: Uint8Array[] = [];\r\n const newOffsets = new Uint32Array(numGlyphs + 1);\r\n let curOff = 0;\r\n for (let gid = 0; gid < numGlyphs; gid++) {\r\n newOffsets[gid] = curOff;\r\n if (allGids.has(gid)) {\r\n const off = origOffsets[gid];\r\n const next = origOffsets[gid + 1];\r\n const glyphLen = next - off;\r\n if (glyphLen > 0) {\r\n glyfChunks.push(u8.slice(glyf.offset + off, glyf.offset + next));\r\n curOff += glyphLen;\r\n if (glyphLen & 1) { glyfChunks.push(new Uint8Array(1)); curOff += 1; }\r\n }\r\n }\r\n }\r\n newOffsets[numGlyphs] = curOff;\r\n\r\n // Assemble new glyf\r\n const newGlyf = new Uint8Array(curOff);\r\n let pos = 0;\r\n for (const chunk of glyfChunks) { newGlyf.set(chunk, pos); pos += chunk.length; }\r\n\r\n // Build new loca (always long format)\r\n const newLocaBuf = new ArrayBuffer((numGlyphs + 1) * 4);\r\n const newLocaView = new DataView(newLocaBuf);\r\n for (let i = 0; i <= numGlyphs; i++) newLocaView.setUint32(i * 4, newOffsets[i]);\r\n const newLoca = new Uint8Array(newLocaBuf);\r\n\r\n // Tables required for PDF CIDFontType2\r\n const PDF_TABLES = new Set(['head', 'hhea', 'maxp', 'OS/2', 'cmap', 'hmtx', 'loca', 'glyf', 'name', 'post']);\r\n const tableTags = Object.keys(tables).filter(t => PDF_TABLES.has(t)).sort();\r\n const newTableData: Record<string, Uint8Array> = {};\r\n for (const tag of tableTags) {\r\n const t = tables[tag];\r\n newTableData[tag] = u8.slice(t.offset, t.offset + t.length);\r\n }\r\n newTableData['glyf'] = newGlyf;\r\n newTableData['loca'] = newLoca;\r\n\r\n // Update head: indexToLocFormat = 1 (long), zero checkSumAdjustment\r\n const headCopy = new Uint8Array(newTableData['head']);\r\n new DataView(headCopy.buffer, headCopy.byteOffset, headCopy.byteLength).setInt16(50, 1);\r\n new DataView(headCopy.buffer, headCopy.byteOffset, headCopy.byteLength).setUint32(8, 0);\r\n newTableData['head'] = headCopy;\r\n\r\n // Assemble new TTF binary\r\n const numNewTables = tableTags.length;\r\n const headerSize = 12 + numNewTables * 16;\r\n let totalSize = headerSize;\r\n const tableFileOffsets: Record<string, number> = {};\r\n for (const tag of tableTags) {\r\n tableFileOffsets[tag] = totalSize;\r\n totalSize += newTableData[tag].length;\r\n if (totalSize & 3) totalSize += 4 - (totalSize & 3);\r\n }\r\n\r\n const output = new Uint8Array(totalSize);\r\n const outView = new DataView(output.buffer);\r\n\r\n // Offset table header\r\n outView.setUint32(0, 0x00010000);\r\n outView.setUint16(4, numNewTables);\r\n let entrySelector = 0, searchRange = 1;\r\n while (searchRange * 2 <= numNewTables) { searchRange *= 2; entrySelector++; }\r\n searchRange *= 16;\r\n outView.setUint16(6, searchRange);\r\n outView.setUint16(8, entrySelector);\r\n outView.setUint16(10, numNewTables * 16 - searchRange);\r\n\r\n // Table directory entries\r\n for (let i = 0; i < tableTags.length; i++) {\r\n const tag = tableTags[i];\r\n const off = 12 + i * 16;\r\n for (let j = 0; j < 4; j++) output[off + j] = tag.charCodeAt(j);\r\n outView.setUint32(off + 4, ttfChecksum(newTableData[tag]));\r\n outView.setUint32(off + 8, tableFileOffsets[tag]);\r\n outView.setUint32(off + 12, newTableData[tag].length);\r\n }\r\n\r\n // Write table data\r\n for (const tag of tableTags) output.set(newTableData[tag], tableFileOffsets[tag]);\r\n\r\n // Convert Uint8Array back to binary string\r\n let result = '';\r\n for (let i = 0; i < output.length; i += 8192) {\r\n const end = Math.min(i + 8192, output.length);\r\n result += String.fromCharCode.apply(null, Array.from(output.subarray(i, end)));\r\n }\r\n return result;\r\n } catch {\r\n return ttfInput instanceof Uint8Array ? uint8ToBinaryString(ttfInput) : ttfInput;\r\n }\r\n}\r\n\r\n/**\r\n * Convert a Uint8Array to a binary string (for PDF stream embedding).\r\n * Uses chunked String.fromCharCode.apply to avoid call-stack overflow on large arrays.\r\n */\r\nexport function uint8ToBinaryString(u8: Uint8Array): string {\r\n let result = '';\r\n for (let i = 0; i < u8.length; i += 8192) {\r\n const end = Math.min(i + 8192, u8.length);\r\n result += String.fromCharCode.apply(null, Array.from(u8.subarray(i, end)));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Compute TTF table checksum (sum of 32-bit big-endian words).\r\n */\r\nexport function ttfChecksum(data: Uint8Array): number {\r\n const len = data.length;\r\n const padded = len & 3 ? new Uint8Array([...data, ...new Uint8Array(4 - (len & 3))]) : data;\r\n const view = new DataView(padded.buffer, padded.byteOffset, padded.byteLength);\r\n let sum = 0;\r\n for (let i = 0; i < padded.length; i += 4) sum = (sum + view.getUint32(i)) >>> 0;\r\n return sum;\r\n}\r\n","/**\r\n * pdfnative — Tagged PDF & PDF/A Support\r\n * ========================================\r\n * Structure tree, marked content operators, XMP metadata, and OutputIntent\r\n * for PDF/UA accessibility and PDF/A archival compliance.\r\n *\r\n * ISO 14289-1 (PDF/UA-1): logical reading order via structure tree\r\n * ISO 19005-1 (PDF/A-1b): archival with mandatory embedded fonts + XMP\r\n * ISO 32000-1 §14.7: structure tree and marked content\r\n * ISO 32000-1 §14.8: tagged PDF conventions\r\n */\r\n\r\nimport type { PdfAttachment } from '../types/pdf-types.js';\r\n\r\n// ── Marked Content Operators ─────────────────────────────────────────\r\n\r\n/**\r\n * Wrap content stream operators in a /Span marked content sequence\r\n * with /ActualText for text extraction fidelity.\r\n *\r\n * @param content - PDF content stream operators to wrap\r\n * @param actualText - Original Unicode text for extraction\r\n * @param mcid - Marked content identifier (links to structure tree)\r\n * @returns Wrapped content stream with BMC...EMC\r\n */\r\nexport function wrapSpan(content: string, actualText: string, mcid: number): string {\r\n const escaped = escapePdfUtf16(actualText);\r\n return `/Span << /MCID ${mcid} /ActualText ${escaped} >> BDC\\n${content}\\nEMC`;\r\n}\r\n\r\n/**\r\n * Wrap content in a generic marked content sequence (no ActualText).\r\n *\r\n * @param content - PDF content stream operators to wrap\r\n * @param tag - Structure tag name (e.g. 'P', 'Table')\r\n * @param mcid - Marked content identifier\r\n * @returns Wrapped content stream with BDC/EMC\r\n */\r\nexport function wrapMarkedContent(content: string, tag: string, mcid: number): string {\r\n return `/${tag} << /MCID ${mcid} >> BDC\\n${content}\\nEMC`;\r\n}\r\n\r\n/**\r\n * Escape a Unicode string as a PDF UTF-16BE hex string with BOM.\r\n * ISO 32000-1 §7.9.2.2: text strings may use UTF-16BE with 0xFEFF BOM.\r\n *\r\n * @param str - Input Unicode string\r\n * @returns PDF hex string with FEFF BOM prefix, e.g. '<FEFF0048006F>'\r\n */\r\nexport function escapePdfUtf16(str: string): string {\r\n if (!str) return '<FEFF>';\r\n let hex = 'FEFF'; // BOM\r\n for (let i = 0; i < str.length; i++) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) {\r\n // Surrogate pair for supplementary planes\r\n const hi = 0xD800 + ((cp - 0x10000) >> 10);\r\n const lo = 0xDC00 + ((cp - 0x10000) & 0x3FF);\r\n hex += hi.toString(16).padStart(4, '0').toUpperCase();\r\n hex += lo.toString(16).padStart(4, '0').toUpperCase();\r\n i++; // skip low surrogate in JS string\r\n } else {\r\n hex += cp.toString(16).padStart(4, '0').toUpperCase();\r\n }\r\n }\r\n return `<${hex}>`;\r\n}\r\n\r\n// ── Structure Tree ───────────────────────────────────────────────────\r\n\r\n/**\r\n * A structure element node in the tagged PDF structure tree.\r\n */\r\nexport interface StructElement {\r\n readonly type: string; // /Document, /Table, /TR, /TH, /TD, /P, /Span, /Figure\r\n readonly children: (StructElement | MCRef)[];\r\n objNum?: number;\r\n}\r\n\r\n/**\r\n * A marked content reference — links a structure element to a\r\n * marked content sequence in a page's content stream.\r\n */\r\nexport interface MCRef {\r\n readonly mcid: number;\r\n readonly pageObjNum: number;\r\n}\r\n\r\n/**\r\n * MCID allocator — assigns sequential IDs per page for marked content.\r\n * MCIDs restart at 0 for each page (ISO 32000-1 §14.7.4.4).\r\n *\r\n * @returns Allocator with next(pageObjNum) and getPageMCIDs() methods\r\n */\r\nexport function createMCIDAllocator(): {\r\n next(pageObjNum: number): number;\r\n getPageMCIDs(): Map<number, number[]>;\r\n} {\r\n const pageCounters = new Map<number, number>();\r\n const pageMCIDs = new Map<number, number[]>();\r\n\r\n return {\r\n next(pageObjNum: number): number {\r\n const counter = pageCounters.get(pageObjNum) ?? 0;\r\n pageCounters.set(pageObjNum, counter + 1);\r\n const list = pageMCIDs.get(pageObjNum);\r\n if (list) list.push(counter);\r\n else pageMCIDs.set(pageObjNum, [counter]);\r\n return counter;\r\n },\r\n getPageMCIDs() { return pageMCIDs; },\r\n };\r\n}\r\n\r\n/**\r\n * Build the PDF objects for a structure tree.\r\n * Returns an array of [objNum, content] pairs to emit.\r\n *\r\n * Structure (ISO 32000-1 §14.7.2):\r\n * StructTreeRoot → Document → [Table → TR → [TH|TD] ...] + [P] ...\r\n *\r\n * ParentTree (ISO 32000-1 §14.7.4.4):\r\n * NumberTree keyed by /StructParents value → array of struct element refs\r\n * indexed by MCID within that page.\r\n *\r\n * @param root - Root structure element (/Document)\r\n * @param startObjNum - First available object number\r\n * @param pageObjToStructParents - Map from page object number to /StructParents value\r\n * @returns { objects, structTreeRootObjNum, parentTreeObjNum }\r\n */\r\nexport function buildStructureTree(\r\n root: StructElement,\r\n startObjNum: number,\r\n pageObjToStructParents?: ReadonlyMap<number, number>,\r\n): { objects: [number, string][]; structTreeRootObjNum: number; parentTreeObjNum: number; totalObjects: number } {\r\n const objects: [number, string][] = [];\r\n let nextObj = startObjNum;\r\n\r\n // StructTreeRoot\r\n const structTreeRootObjNum = nextObj++;\r\n const parentTreeObjNum = nextObj++;\r\n\r\n // Assign object numbers recursively\r\n root.objNum = nextObj++;\r\n assignObjNums(root);\r\n\r\n function assignObjNums(el: StructElement): void {\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n (child as StructElement).objNum = nextObj++;\r\n assignObjNums(child as StructElement);\r\n }\r\n }\r\n }\r\n\r\n // Build ParentTree number tree (ISO 32000-1 §14.7.4.4)\r\n // Collect MCRef→parent struct element mapping, grouped by page\r\n const pageParentMap = new Map<number, Map<number, number>>(); // pageObjNum → (mcid → structElemObjNum)\r\n collectPageParents(root, pageParentMap);\r\n\r\n function collectPageParents(el: StructElement, map: Map<number, Map<number, number>>): void {\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n collectPageParents(child as StructElement, map);\r\n } else {\r\n const ref = child as MCRef;\r\n let pageMap = map.get(ref.pageObjNum);\r\n if (!pageMap) {\r\n pageMap = new Map();\r\n map.set(ref.pageObjNum, pageMap);\r\n }\r\n pageMap.set(ref.mcid, el.objNum ?? 0);\r\n }\r\n }\r\n }\r\n\r\n if (pageObjToStructParents && pageObjToStructParents.size > 0) {\r\n // Per-page arrays: /Nums [structParents0 [ref ref ...] structParents1 [ref ref ...] ...]\r\n const numsParts: string[] = [];\r\n const sorted = [...pageObjToStructParents.entries()].sort((a, b) => a[1] - b[1]);\r\n for (const [pageObjNum, structParents] of sorted) {\r\n const pageMap = pageParentMap.get(pageObjNum);\r\n if (pageMap) {\r\n const maxMcid = Math.max(...pageMap.keys());\r\n const refs: string[] = [];\r\n for (let i = 0; i <= maxMcid; i++) {\r\n refs.push(`${pageMap.get(i) ?? 0} 0 R`);\r\n }\r\n numsParts.push(`${structParents} [${refs.join(' ')}]`);\r\n }\r\n }\r\n objects.push([parentTreeObjNum,\r\n `<< /Type /NumberTree /Nums [${numsParts.join(' ')}] >>`]);\r\n } else {\r\n // Flat fallback for backward compatibility\r\n const parentEntries: [number, number][] = [];\r\n for (const [, pageMap] of pageParentMap) {\r\n for (const [mcid, objNum] of pageMap) {\r\n parentEntries.push([mcid, objNum]);\r\n }\r\n }\r\n parentEntries.sort((a, b) => a[0] - b[0]);\r\n const numsArray = parentEntries.map(([mcid, objNum]) => `${mcid} ${objNum} 0 R`).join(' ');\r\n objects.push([parentTreeObjNum,\r\n `<< /Type /NumberTree /Nums [${numsArray}] >>`]);\r\n }\r\n\r\n // StructTreeRoot object\r\n objects.push([structTreeRootObjNum,\r\n `<< /Type /StructTreeRoot /K ${root.objNum} 0 R /ParentTree ${parentTreeObjNum} 0 R >>`]);\r\n\r\n // Emit all structure elements\r\n emitElement(root, structTreeRootObjNum);\r\n\r\n function emitElement(el: StructElement, parentObjNum: number): void {\r\n const kids: string[] = [];\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n kids.push(`${(child as StructElement).objNum} 0 R`);\r\n } else {\r\n const ref = child as MCRef;\r\n kids.push(`<< /Type /MCR /MCID ${ref.mcid} /Pg ${ref.pageObjNum} 0 R >>`);\r\n }\r\n }\r\n const kArray = kids.length === 1 ? kids[0] : `[${kids.join(' ')}]`;\r\n const elObj = el.objNum ?? 0;\r\n objects.push([elObj,\r\n `<< /Type /StructElem /S /${el.type} /P ${parentObjNum} 0 R /K ${kArray} >>`]);\r\n\r\n for (const child of el.children) {\r\n if ('type' in child) {\r\n emitElement(child as StructElement, elObj);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n objects,\r\n structTreeRootObjNum,\r\n parentTreeObjNum,\r\n totalObjects: nextObj - startObjNum,\r\n };\r\n}\r\n\r\n// ── XMP Metadata ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Synchronized PDF + XMP metadata payload.\r\n *\r\n * Both `pdfDate` and `xmpDate` represent the same instant with the same\r\n * timezone offset. PDF/A validators (e.g. veraPDF rule 6.7.3 t1) require\r\n * `/Info CreationDate` and `xmp:CreateDate` to be byte-equivalent after\r\n * format-specific parsing — this helper guarantees that.\r\n */\r\nexport interface PdfMetadata {\r\n /** PDF date string per ISO 32000-1 §7.9.4: `D:YYYYMMDDHHmmSS+HH'mm'`. */\r\n readonly pdfDate: string;\r\n /** ISO 8601 date string: `YYYY-MM-DDTHH:mm:ss±HH:MM`. */\r\n readonly xmpDate: string;\r\n}\r\n\r\n/**\r\n * Build synchronized PDF + XMP date strings for a single instant.\r\n *\r\n * ISO 32000-1 §7.9.4 (PDF date format) and ISO 19005-1 §6.7.3 (PDF/A metadata\r\n * equivalence) require both formats to encode the same timezone offset.\r\n *\r\n * @param now - Date to format. Defaults to the current instant.\r\n * @returns `{ pdfDate, xmpDate }` representing the same moment.\r\n */\r\nexport function buildPdfMetadata(now: Date = new Date()): PdfMetadata {\r\n const pad2 = (n: number) => String(n).padStart(2, '0');\r\n const yyyy = now.getFullYear();\r\n const mm = pad2(now.getMonth() + 1);\r\n const dd = pad2(now.getDate());\r\n const hh = pad2(now.getHours());\r\n const mi = pad2(now.getMinutes());\r\n const ss = pad2(now.getSeconds());\r\n\r\n // Timezone offset in minutes, west of UTC is positive in JS — invert sign for output.\r\n const tzMinutes = -now.getTimezoneOffset();\r\n const tzSign = tzMinutes >= 0 ? '+' : '-';\r\n const tzAbs = Math.abs(tzMinutes);\r\n const tzH = pad2(Math.floor(tzAbs / 60));\r\n const tzM = pad2(tzAbs % 60);\r\n\r\n const pdfDate = `D:${yyyy}${mm}${dd}${hh}${mi}${ss}${tzSign}${tzH}'${tzM}'`;\r\n const xmpDate = `${yyyy}-${mm}-${dd}T${hh}:${mi}:${ss}${tzSign}${tzH}:${tzM}`;\r\n\r\n return { pdfDate, xmpDate };\r\n}\r\n\r\n/**\r\n * Build an XMP metadata packet for PDF/A compliance.\r\n * ISO 19005-1 (PDF/A-1b): pdfaid:part=1, conformance=B\r\n * ISO 19005-2 (PDF/A-2b): pdfaid:part=2, conformance=B\r\n * ISO 19005-2 (PDF/A-2u): pdfaid:part=2, conformance=U\r\n * ISO 19005-3 (PDF/A-3b): pdfaid:part=3, conformance=B\r\n *\r\n * @param title - Document title (must equal /Info /Title source string verbatim)\r\n * @param createDate - ISO 8601 formatted creation date (must equal /Info /CreationDate same instant)\r\n * @param pdfaPart - PDF/A part number (1, 2, or 3). Default: 2\r\n * @param pdfaConformance - PDF/A conformance level ('B' or 'U'). Default: 'B'\r\n * @param author - Optional document author (matches /Info /Author).\r\n * @returns XMP metadata XML string\r\n */\r\nexport function buildXMPMetadata(\r\n title: string,\r\n createDate: string,\r\n pdfaPart: number = 2,\r\n pdfaConformance: string = 'B',\r\n author?: string,\r\n): string {\r\n const escapedTitle = escapeXml(title);\r\n // dc:creator describes the document author (per Dublin Core),\r\n // independent of pdf:Producer (the software). When no author is given,\r\n // omit dc:creator entirely so the validator does not try to compare it\r\n // against a missing /Info /Author entry.\r\n const lines: string[] = [\r\n '<?xpacket begin=\"\\xEF\\xBB\\xBF\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>',\r\n '<x:xmpmeta xmlns:x=\"adobe:ns:meta/\">',\r\n ' <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">',\r\n ' <rdf:Description rdf:about=\"\"',\r\n ' xmlns:dc=\"http://purl.org/dc/elements/1.1/\"',\r\n ' xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\"',\r\n ' xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"',\r\n ' xmlns:pdfaid=\"http://www.aiim.org/pdfa/ns/id/\">',\r\n ` <dc:title><rdf:Alt><rdf:li xml:lang=\"x-default\">${escapedTitle}</rdf:li></rdf:Alt></dc:title>`,\r\n ];\r\n if (author !== undefined && author !== '') {\r\n lines.push(` <dc:creator><rdf:Seq><rdf:li>${escapeXml(author)}</rdf:li></rdf:Seq></dc:creator>`);\r\n }\r\n lines.push(\r\n ' <pdf:Producer>pdfnative</pdf:Producer>',\r\n ` <xmp:CreateDate>${createDate}</xmp:CreateDate>`,\r\n ` <xmp:ModifyDate>${createDate}</xmp:ModifyDate>`,\r\n ` <xmp:MetadataDate>${createDate}</xmp:MetadataDate>`,\r\n ` <pdfaid:part>${pdfaPart}</pdfaid:part>`,\r\n ` <pdfaid:conformance>${pdfaConformance}</pdfaid:conformance>`,\r\n ' </rdf:Description>',\r\n ' </rdf:RDF>',\r\n '</x:xmpmeta>',\r\n '<?xpacket end=\"w\"?>',\r\n );\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Build the sRGB OutputIntent dictionary content for PDF/A.\r\n * ISO 19005-1 §6.2.2: at least one OutputIntent required.\r\n *\r\n * @param iccStreamObjNum - Object number of the ICC profile stream\r\n * @param subtype - OutputIntent subtype (default: 'GTS_PDFA1')\r\n * @returns OutputIntent dictionary string\r\n */\r\nexport function buildOutputIntentDict(iccStreamObjNum: number, subtype: string = 'GTS_PDFA1'): string {\r\n return `<< /Type /OutputIntent /S /${subtype} ` +\r\n `/OutputConditionIdentifier (sRGB IEC61966-2.1) ` +\r\n `/RegistryName (http://www.color.org) ` +\r\n `/DestOutputProfile ${iccStreamObjNum} 0 R >>`;\r\n}\r\n\r\n/**\r\n * Build a minimal sRGB ICC profile stream for PDF/A compliance.\r\n * This is the smallest valid sRGB profile that satisfies PDF/A validators.\r\n * Per ISO 19005-1 §6.2.2, the ICC profile must be embedded.\r\n *\r\n * Returns a minimal sRGB ICC v2 profile with all 9 required tags for a\r\n * monitor class RGB profile:\r\n * desc, wtpt, cprt, rXYZ, gXYZ, bXYZ, rTRC, gTRC, bTRC\r\n *\r\n * sRGB colorant values are D50-adapted per ICC PCS specification.\r\n *\r\n * @returns ICC profile as a binary string\r\n */\r\nexport function buildMinimalSRGBProfile(): string {\r\n // ── Tag layout ───────────────────────────────────────────────────\r\n // 9 tags, but rTRC/gTRC/bTRC share the same data → 7 unique data blocks\r\n const tagCount = 9;\r\n const tagTableSize = 4 + tagCount * 12; // 4 (count) + 9 × 12 = 112 bytes\r\n const dataStart = 128 + tagTableSize; // 240\r\n\r\n const descSize = 36; // 'desc' + reserved + len + \"sRGB\" + padding\r\n const wtptSize = 20; // 'XYZ ' + reserved + X/Y/Z\r\n const cprtSize = 20; // 'text' + reserved + \"No CP\" + 3 padding (4-byte aligned)\r\n const xyzSize = 20; // 'XYZ ' + reserved + X/Y/Z (per colorant)\r\n const trcSize = 14; // 'curv' + reserved + count(1) + gamma(u8.8) + 2 padding\r\n\r\n const descOffset = dataStart; // 240\r\n const wtptOffset = descOffset + descSize; // 276\r\n const cprtOffset = wtptOffset + wtptSize; // 296\r\n const rXYZOffset = cprtOffset + cprtSize; // 316\r\n const gXYZOffset = rXYZOffset + xyzSize; // 336\r\n const bXYZOffset = gXYZOffset + xyzSize; // 356\r\n const trcOffset = bXYZOffset + xyzSize; // 376\r\n const totalSize = trcOffset + trcSize; // 390\r\n\r\n // ── Header (128 bytes) ───────────────────────────────────────────\r\n const header = new Uint8Array(128);\r\n const hv = new DataView(header.buffer);\r\n hv.setUint32(0, totalSize); // Profile size\r\n hv.setUint8(8, 2); hv.setUint8(9, 0x10); // ICC version 2.1.0\r\n hv.setUint32(12, 0x6D6E7472); // 'mntr' (monitor)\r\n hv.setUint32(16, 0x52474220); // 'RGB '\r\n hv.setUint32(20, 0x58595A20); // 'XYZ ' (PCS)\r\n hv.setUint16(24, 2025); hv.setUint16(26, 1); hv.setUint16(28, 1); // Date\r\n hv.setUint32(36, 0x61637370); // 'acsp'\r\n hv.setUint32(40, 0x4D534654); // 'MSFT' (primary platform)\r\n hv.setUint32(64, 0); // Rendering intent: perceptual\r\n // PCS illuminant D50: X=0.9505, Y=1.0000, Z=1.0890\r\n hv.setUint32(68, 0x0000F6D6); // X\r\n hv.setUint32(72, 0x00010000); // Y\r\n hv.setUint32(76, 0x0000D32D); // Z\r\n\r\n // ── Tag table (112 bytes) ────────────────────────────────────────\r\n const tagTable = new Uint8Array(tagTableSize);\r\n const tv = new DataView(tagTable.buffer);\r\n tv.setUint32(0, tagCount);\r\n\r\n // Helper: write tag entry at index i\r\n const writeTag = (i: number, sig: number, off: number, sz: number) => {\r\n const base = 4 + i * 12;\r\n tv.setUint32(base, sig);\r\n tv.setUint32(base + 4, off);\r\n tv.setUint32(base + 8, sz);\r\n };\r\n\r\n writeTag(0, 0x64657363, descOffset, descSize); // 'desc'\r\n writeTag(1, 0x77747074, wtptOffset, wtptSize); // 'wtpt'\r\n writeTag(2, 0x63707274, cprtOffset, cprtSize); // 'cprt'\r\n writeTag(3, 0x7258595A, rXYZOffset, xyzSize); // 'rXYZ'\r\n writeTag(4, 0x6758595A, gXYZOffset, xyzSize); // 'gXYZ'\r\n writeTag(5, 0x6258595A, bXYZOffset, xyzSize); // 'bXYZ'\r\n writeTag(6, 0x72545243, trcOffset, trcSize); // 'rTRC'\r\n writeTag(7, 0x67545243, trcOffset, trcSize); // 'gTRC' (shared data)\r\n writeTag(8, 0x62545243, trcOffset, trcSize); // 'bTRC' (shared data)\r\n\r\n // ── desc data ────────────────────────────────────────────────────\r\n const desc = new Uint8Array(descSize);\r\n const dv = new DataView(desc.buffer);\r\n dv.setUint32(0, 0x64657363); // 'desc'\r\n dv.setUint32(8, 5); // string length including null\r\n desc[12] = 0x73; desc[13] = 0x52; desc[14] = 0x47; desc[15] = 0x42; // \"sRGB\"\r\n\r\n // ── wtpt data: D50 white point ───────────────────────────────────\r\n const wtpt = new Uint8Array(wtptSize);\r\n const wv = new DataView(wtpt.buffer);\r\n wv.setUint32(0, 0x58595A20); // 'XYZ '\r\n wv.setUint32(8, 0x0000F6D6); // X (0.9505 in s15Fixed16)\r\n wv.setUint32(12, 0x00010000); // Y (1.0000)\r\n wv.setUint32(16, 0x0000D32D); // Z (1.0890)\r\n\r\n // ── cprt data ────────────────────────────────────────────────────\r\n const cprt = new Uint8Array(cprtSize);\r\n const cv = new DataView(cprt.buffer);\r\n cv.setUint32(0, 0x74657874); // 'text'\r\n cprt[8] = 0x4E; cprt[9] = 0x6F; cprt[10] = 0x20; cprt[11] = 0x43; cprt[12] = 0x50; // \"No CP\"\r\n\r\n // ── rXYZ: Red colorant (D50-adapted sRGB) ───────────────────────\r\n // X=0.4361, Y=0.2225, Z=0.0139\r\n const rXYZ = new Uint8Array(xyzSize);\r\n const rv = new DataView(rXYZ.buffer);\r\n rv.setUint32(0, 0x58595A20); // 'XYZ '\r\n rv.setUint32(8, 0x00006FA2); // X (0.4361 → 28578)\r\n rv.setUint32(12, 0x000038F5); // Y (0.2225 → 14581)\r\n rv.setUint32(16, 0x00000391); // Z (0.0139 → 913)\r\n\r\n // ── gXYZ: Green colorant (D50-adapted sRGB) ─────────────────────\r\n // X=0.3851, Y=0.7169, Z=0.0971\r\n const gXYZ = new Uint8Array(xyzSize);\r\n const gv = new DataView(gXYZ.buffer);\r\n gv.setUint32(0, 0x58595A20); // 'XYZ '\r\n gv.setUint32(8, 0x00006299); // X (0.3851 → 25241)\r\n gv.setUint32(12, 0x0000B785); // Y (0.7169 → 46981)\r\n gv.setUint32(16, 0x000018DA); // Z (0.0971 → 6362)\r\n\r\n // ── bXYZ: Blue colorant (D50-adapted sRGB) ──────────────────────\r\n // X=0.1431, Y=0.0606, Z=0.7141\r\n const bXYZ = new Uint8Array(xyzSize);\r\n const bv = new DataView(bXYZ.buffer);\r\n bv.setUint32(0, 0x58595A20); // 'XYZ '\r\n bv.setUint32(8, 0x000024A0); // X (0.1431 → 9376)\r\n bv.setUint32(12, 0x00000F84); // Y (0.0606 → 3972)\r\n bv.setUint32(16, 0x0000B6CF); // Z (0.7141 → 46799)\r\n\r\n // ── TRC: sRGB gamma ≈2.2 (shared by r/g/b) ─────────────────────\r\n // curveType with count=1, gamma=2.2 as u8Fixed8 (0x0233)\r\n const trc = new Uint8Array(trcSize);\r\n const tcv = new DataView(trc.buffer);\r\n tcv.setUint32(0, 0x63757276); // 'curv'\r\n tcv.setUint32(8, 1); // count = 1 (gamma mode)\r\n tcv.setUint16(12, 0x0233); // gamma 2.2 (u8Fixed8: 2 + 51/256)\r\n\r\n // ── Concatenate all parts ────────────────────────────────────────\r\n const parts = [header, tagTable, desc, wtpt, cprt, rXYZ, gXYZ, bXYZ, trc];\r\n let result = '';\r\n for (const part of parts) {\r\n for (let i = 0; i < part.length; i++) result += String.fromCharCode(part[i]);\r\n }\r\n return result;\r\n}\r\n\r\n// ── Helpers ──────────────────────────────────────────────────────────\r\n\r\nfunction escapeXml(str: string): string {\r\n return str\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n}\r\n\r\n// ── PDF/A Configuration ──────────────────────────────────────────────\r\n\r\n/**\r\n * Resolved PDF/A configuration from the `tagged` layout option.\r\n */\r\nexport interface PdfAConfig {\r\n /** Whether tagged mode is enabled. */\r\n readonly enabled: boolean;\r\n /** PDF version string for header. */\r\n readonly pdfVersion: string;\r\n /** PDF/A part (1, 2, or 3). */\r\n readonly pdfaPart: number;\r\n /** PDF/A conformance ('B' or 'U'). */\r\n readonly pdfaConformance: string;\r\n /** OutputIntent /S name. */\r\n readonly outputIntentSubtype: string;\r\n}\r\n\r\n/**\r\n * Parse the `tagged` layout option into a resolved PDF/A configuration.\r\n *\r\n * @param tagged - The tagged option value (boolean, string, or undefined)\r\n * @returns Resolved configuration\r\n */\r\nexport function resolvePdfAConfig(tagged: boolean | string | undefined): PdfAConfig {\r\n if (!tagged) {\r\n return { enabled: false, pdfVersion: '1.4', pdfaPart: 1, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n if (tagged === 'pdfa1b') {\r\n return { enabled: true, pdfVersion: '1.4', pdfaPart: 1, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n if (tagged === 'pdfa2u') {\r\n return { enabled: true, pdfVersion: '1.7', pdfaPart: 2, pdfaConformance: 'U', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n if (tagged === 'pdfa3b') {\r\n return { enabled: true, pdfVersion: '1.7', pdfaPart: 3, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n }\r\n // true or 'pdfa2b' → PDF/A-2b (default tagged mode)\r\n return { enabled: true, pdfVersion: '1.7', pdfaPart: 2, pdfaConformance: 'B', outputIntentSubtype: 'GTS_PDFA1' };\r\n}\r\n\r\n// ── PDF/A-3 Embedded Files (ISO 19005-3) ─────────────────────────────\r\n\r\n/**\r\n * Result of building embedded file objects for PDF/A-3.\r\n */\r\nexport interface EmbeddedFilesResult {\r\n /** PDF objects as [objNum, content] pairs (EmbeddedFile streams + Filespec dicts). */\r\n readonly objects: ReadonlyArray<readonly [number, string]>;\r\n /** Binary stream data keyed by object number (for EmbeddedFile streams). */\r\n readonly streams: ReadonlyMap<number, string>;\r\n /** Filespec object numbers (for /AF array in catalog). */\r\n readonly filespecObjNums: readonly number[];\r\n /** Total number of objects created. */\r\n readonly totalObjects: number;\r\n /** /Names << /EmbeddedFiles << /Names [...] >> >> dictionary content for catalog. */\r\n readonly namesDict: string;\r\n}\r\n\r\n/**\r\n * Build PDF objects for embedded file attachments (PDF/A-3).\r\n *\r\n * For each attachment, creates:\r\n * 1. An /EmbeddedFile stream object (the file data)\r\n * 2. A /Filespec dictionary referencing the stream\r\n *\r\n * @param attachments - Array of file attachments\r\n * @param startObjNum - First available object number\r\n * @returns Objects, references, and catalog fragments\r\n */\r\nexport function buildEmbeddedFiles(attachments: readonly PdfAttachment[], startObjNum: number): EmbeddedFilesResult {\r\n const objects: Array<readonly [number, string]> = [];\r\n const streams = new Map<number, string>();\r\n const filespecObjNums: number[] = [];\r\n const namesEntries: string[] = [];\r\n let nextObj = startObjNum;\r\n\r\n for (const att of attachments) {\r\n const efObjNum = nextObj++;\r\n const fsObjNum = nextObj++;\r\n\r\n // Convert Uint8Array to binary string for stream\r\n let binaryStr = '';\r\n for (let i = 0; i < att.data.length; i++) binaryStr += String.fromCharCode(att.data[i]);\r\n\r\n // EmbeddedFile stream dictionary (content emitted via emitStreamObj)\r\n const efDict =\r\n `<< /Type /EmbeddedFile /Subtype /${escapePdfName(att.mimeType)} ` +\r\n `/Params << /Size ${att.data.length} >> ` +\r\n `/Length ${binaryStr.length}`;\r\n objects.push([efObjNum, efDict]);\r\n streams.set(efObjNum, binaryStr);\r\n\r\n // Filespec dictionary\r\n const relationship = att.relationship ?? 'Unspecified';\r\n const escapedFilename = escapePdfString(att.filename);\r\n const desc = att.description ? ` /Desc (${escapePdfString(att.description)})` : '';\r\n const fsDict =\r\n `<< /Type /Filespec /F (${escapedFilename}) /UF (${escapedFilename})` +\r\n ` /EF << /F ${efObjNum} 0 R /UF ${efObjNum} 0 R >>` +\r\n ` /AFRelationship /${relationship}${desc} >>`;\r\n objects.push([fsObjNum, fsDict]);\r\n filespecObjNums.push(fsObjNum);\r\n\r\n // Names dict entry: (filename) ref\r\n namesEntries.push(`(${escapedFilename}) ${fsObjNum} 0 R`);\r\n }\r\n\r\n const namesDict = `/Names << /EmbeddedFiles << /Names [${namesEntries.join(' ')}] >> >>`;\r\n\r\n return {\r\n objects,\r\n streams,\r\n filespecObjNums,\r\n totalObjects: nextObj - startObjNum,\r\n namesDict,\r\n };\r\n}\r\n\r\n/**\r\n * Validate attachments against PDF/A configuration.\r\n * Attachments are only allowed with PDF/A-3 (pdfaPart === 3).\r\n *\r\n * @param attachments - Attachments to validate\r\n * @param tagged - The tagged option value\r\n */\r\nexport function validateAttachments(attachments: readonly PdfAttachment[] | undefined, tagged: boolean | string | undefined): void {\r\n if (!attachments || attachments.length === 0) return;\r\n if (tagged !== 'pdfa3b') {\r\n throw new Error('File attachments require tagged: \\'pdfa3b\\' (PDF/A-3, ISO 19005-3)');\r\n }\r\n for (const att of attachments) {\r\n if (!att.filename || att.filename.length === 0) {\r\n throw new Error('Attachment filename must not be empty');\r\n }\r\n if (!att.mimeType || att.mimeType.length === 0) {\r\n throw new Error(`Attachment '${att.filename}' must have a mimeType`);\r\n }\r\n if (!att.data || att.data.length === 0) {\r\n throw new Error(`Attachment '${att.filename}' must have non-empty data`);\r\n }\r\n }\r\n}\r\n\r\n// ── PDF Name/String Escaping ─────────────────────────────────────────\r\n\r\n/**\r\n * Escape a MIME type for use as a PDF name (replace / with #2F).\r\n */\r\nfunction escapePdfName(mimeType: string): string {\r\n return mimeType.replace(/\\//g, '#2F');\r\n}\r\n\r\n/**\r\n * Escape a string for use in PDF literal strings.\r\n */\r\nfunction escapePdfString(str: string): string {\r\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\r\n}\r\n","/**\r\n * pdfnative — PDF Text Primitives\r\n * =================================\r\n * Low-level PDF content stream operators for text rendering.\r\n * Supports both Latin (WinAnsi) and Unicode (CIDFont) modes.\r\n */\r\n\r\nimport type { FontData, ShapedGlyph, EncodingContext } from '../types/pdf-types.js';\r\nimport { toWinAnsi, helveticaWidth } from '../fonts/encoding.js';\r\nimport { wrapSpan } from './pdf-tags.js';\r\n\r\n/** Format a number as PDF operator value (2 decimal places). */\r\nexport const fmtNum = (v: number): string => v.toFixed(2);\r\n\r\n/**\r\n * Render pre-shaped glyphs with GPOS offsets.\r\n * Each glyph emits its own BT…ET block with absolute coordinates.\r\n */\r\nexport function txtShaped(\r\n shaped: ShapedGlyph[],\r\n x: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n fontData: FontData\r\n): string {\r\n const { metrics, widths: glyphWidths, defaultWidth } = fontData;\r\n const upm = metrics.unitsPerEm;\r\n const scale = sz / upm;\r\n const parts: string[] = [];\r\n let penX = x;\r\n\r\n for (const g of shaped) {\r\n const hexGid = g.gid.toString(16).padStart(4, '0').toUpperCase();\r\n const adv = (glyphWidths[g.gid] !== undefined ? glyphWidths[g.gid] : defaultWidth) * scale;\r\n const gx = fmtNum(penX + g.dx * scale);\r\n const gy = fmtNum(y + g.dy * scale);\r\n parts.push(`BT ${font} ${sz} Tf ${gx} ${gy} Td <${hexGid}> Tj ET`);\r\n if (!g.isZeroAdvance) penX += adv;\r\n }\r\n\r\n return parts.join('\\n');\r\n}\r\n\r\n/**\r\n * Text at absolute position (x, y) with font.\r\n * Multi-font: splits text into runs by cmap coverage.\r\n */\r\nexport function txt(\r\n str: string,\r\n x: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext\r\n): string {\r\n if (!enc.isUnicode) {\r\n return `BT ${font} ${sz} Tf ${fmtNum(x)} ${fmtNum(y)} Td ${enc.ps(str)} Tj ET`;\r\n }\r\n\r\n const runs = enc.textRuns(str, sz);\r\n if (runs.length === 0) return '';\r\n\r\n if (runs.length === 1) {\r\n const run = runs[0];\r\n if (run.shaped) return txtShaped(run.shaped, x, y, run.fontRef, sz, run.fontData);\r\n return `BT ${run.fontRef} ${sz} Tf ${fmtNum(x)} ${fmtNum(y)} Td ${run.hexStr} Tj ET`;\r\n }\r\n\r\n const parts: string[] = [];\r\n let penX = x;\r\n for (const run of runs) {\r\n if (run.shaped) {\r\n parts.push(txtShaped(run.shaped, penX, y, run.fontRef, sz, run.fontData));\r\n } else {\r\n parts.push(`BT ${run.fontRef} ${sz} Tf ${fmtNum(penX)} ${fmtNum(y)} Td ${run.hexStr} Tj ET`);\r\n }\r\n penX += run.widthPt;\r\n }\r\n return parts.join('\\n');\r\n}\r\n\r\n/** Right-aligned text: rightX is the right boundary. */\r\nexport function txtR(\r\n str: string,\r\n rightX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext\r\n): string {\r\n const width = enc.isUnicode ? enc.tw(str, sz) : helveticaWidth(toWinAnsi(str), sz);\r\n return txt(str, rightX - width, y, font, sz, enc);\r\n}\r\n\r\n/** Center-aligned text within a column. */\r\nexport function txtC(\r\n str: string,\r\n leftX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n colW: number,\r\n enc: EncodingContext\r\n): string {\r\n const width = enc.isUnicode ? enc.tw(str, sz) : helveticaWidth(toWinAnsi(str), sz);\r\n return txt(str, leftX + (colW - width) / 2, y, font, sz, enc);\r\n}\r\n\r\n/** Tagged text at absolute position — wraps in /Span BDC…EMC with /ActualText. */\r\nexport function txtTagged(\r\n str: string,\r\n x: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext,\r\n mcid: number,\r\n): string {\r\n return wrapSpan(txt(str, x, y, font, sz, enc), str, mcid);\r\n}\r\n\r\n/** Tagged right-aligned text — wraps in /Span BDC…EMC with /ActualText. */\r\nexport function txtRTagged(\r\n str: string,\r\n rightX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n enc: EncodingContext,\r\n mcid: number,\r\n): string {\r\n return wrapSpan(txtR(str, rightX, y, font, sz, enc), str, mcid);\r\n}\r\n\r\n/** Tagged center-aligned text — wraps in /Span BDC…EMC with /ActualText. */\r\nexport function txtCTagged(\r\n str: string,\r\n leftX: number,\r\n y: number,\r\n font: string,\r\n sz: number,\r\n colW: number,\r\n enc: EncodingContext,\r\n mcid: number,\r\n): string {\r\n return wrapSpan(txtC(str, leftX, y, font, sz, colW, enc), str, mcid);\r\n}\r\n\r\n/**\r\n * Encode a string for the PDF /Info dictionary (ISO 32000-1 §7.9.2).\r\n * ASCII-only → PDFDocEncoding literal `(str)`.\r\n * Non-ASCII → UTF-16BE hex string `<FEFF...>`.\r\n */\r\nexport function encodePdfTextString(str: string): string {\r\n // Check if all codepoints are in the printable ASCII range\r\n let ascii = true;\r\n for (let i = 0; i < str.length; i++) {\r\n const c = str.charCodeAt(i);\r\n if (c > 126 || c < 32) { ascii = false; break; }\r\n }\r\n if (ascii) {\r\n // PDFDocEncoding literal — escape special chars\r\n const escaped = str.replace(/\\\\/g, '\\\\\\\\').replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\r\n return `(${escaped})`;\r\n }\r\n // UTF-16BE hex string with BOM\r\n let hex = 'FEFF';\r\n for (let i = 0; i < str.length; i++) {\r\n const cp = str.codePointAt(i) ?? 0;\r\n if (cp > 0xFFFF) {\r\n const hi = 0xD800 + ((cp - 0x10000) >> 10);\r\n const lo = 0xDC00 + ((cp - 0x10000) & 0x3FF);\r\n hex += hi.toString(16).padStart(4, '0').toUpperCase();\r\n hex += lo.toString(16).padStart(4, '0').toUpperCase();\r\n i++;\r\n } else {\r\n hex += cp.toString(16).padStart(4, '0').toUpperCase();\r\n }\r\n }\r\n return `<${hex}>`;\r\n}\r\n","/**\r\n * pdfnative — PDF Stream Utilities\r\n * ==================================\r\n * Binary conversion and PDF byte-level helpers.\r\n */\r\n\r\n/**\r\n * Convert a single-byte string to Uint8Array.\r\n * Each character is masked to 0xFF (WinAnsi = 1 byte per char).\r\n */\r\nexport function toBytes(str: string): Uint8Array {\r\n const bytes = new Uint8Array(str.length);\r\n for (let i = 0; i < str.length; i++) {\r\n bytes[i] = str.charCodeAt(i) & 0xFF;\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Sanitize string for use in filename (filesystem-safe).\r\n */\r\nexport function slugify(str: string): string {\r\n if (!str) return '';\r\n return String(str)\r\n .replace(/[\\\\/:*?\"<>|]/g, '')\r\n .replace(/\\s+/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n .slice(0, 60);\r\n}\r\n\r\n/**\r\n * Trigger a file download in the browser via a temporary <a> element.\r\n *\r\n * @param bytes - PDF file content\r\n * @param filename - Filename with extension\r\n */\r\nexport function downloadBlob(bytes: Uint8Array, filename: string): void {\r\n const blob = new Blob([bytes as unknown as BlobPart], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.style.display = 'none';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(() => URL.revokeObjectURL(url), 5000);\r\n}\r\n","/**\r\n * pdfnative — PDF Layout Constants\r\n * ==================================\r\n * A4 page dimensions and default layout settings.\r\n * All values in PDF points (1pt = 1/72 inch).\r\n */\r\n\r\nimport type { PdfLayoutOptions, ColumnDef, PdfColors } from '../types/pdf-types.js';\r\n\r\n// ── A4 Dimensions ────────────────────────────────────────────────────\r\nexport const PG_W = 595.28; // A4 width (210mm)\r\nexport const PG_H = 841.89; // A4 height (297mm)\r\n\r\n// ── Default Margins ──────────────────────────────────────────────────\r\nexport const DEFAULT_MARGINS = { t: 45, r: 36, b: 35, l: 36 };\r\n\r\n// ── Computed Content Width ───────────────────────────────────────────\r\nexport const DEFAULT_CW = PG_W - DEFAULT_MARGINS.l - DEFAULT_MARGINS.r;\r\n\r\n// ── Row Heights ──────────────────────────────────────────────────────\r\nexport const ROW_H = 12;\r\nexport const TH_H = 15;\r\nexport const INFO_LN = 13;\r\nexport const BAL_H = 32;\r\nexport const TITLE_LN = 22;\r\nexport const FT_H = 15;\r\nexport const HEADER_H = 15;\r\n\r\n// ── Page Size Presets ────────────────────────────────────────────────\r\nexport const PAGE_SIZES = {\r\n A4: { width: 595.28, height: 841.89 },\r\n Letter: { width: 612, height: 792 },\r\n Legal: { width: 612, height: 1008 },\r\n A3: { width: 841.89, height: 1190.55 },\r\n Tabloid: { width: 792, height: 1224 },\r\n} as const;\r\n\r\n// ── Default Font Sizes ───────────────────────────────────────────────\r\nexport const DEFAULT_FONT_SIZES = { title: 16, info: 9, th: 8, td: 7.5, ft: 7 };\r\n\r\n// ── Default Colors (RGB as PDF operator strings) ─────────────────────\r\nexport const DEFAULT_COLORS: PdfColors = {\r\n title: '0.145 0.388 0.922',\r\n credit: '0.086 0.639 0.247',\r\n debit: '0.863 0.149 0.149',\r\n text: '0.216 0.255 0.318',\r\n thBg: '0.976 0.980 0.988',\r\n thBrd: '0.820 0.835 0.859',\r\n rowBrd: '0.898 0.906 0.922',\r\n ptdBg: '0.937 0.965 1.000',\r\n balBg: '0.937 0.965 1.000',\r\n balBrd: '0.145 0.388 0.922',\r\n label: '0.294 0.333 0.388',\r\n footer: '0.612 0.639 0.682',\r\n};\r\n\r\n// ── Default Columns ──────────────────────────────────────────────────\r\nexport const DEFAULT_COLUMNS: ColumnDef[] = [\r\n { f: 0.12, a: 'l', mx: 12, mxH: 12 },\r\n { f: 0.32, a: 'l', mx: 42, mxH: 42 },\r\n { f: 0.18, a: 'l', mx: 24, mxH: 24 },\r\n { f: 0.20, a: 'r', mx: 26, mxH: 26 },\r\n { f: 0.18, a: 'c', mx: 20, mxH: 20 },\r\n];\r\n\r\n/**\r\n * Compute column X positions and widths given columns and content width.\r\n */\r\nexport function computeColumnPositions(\r\n columns: readonly ColumnDef[],\r\n marginLeft: number,\r\n contentWidth: number\r\n): { cx: number[]; cwi: number[] } {\r\n const cx: number[] = [];\r\n const cwi: number[] = [];\r\n let x = marginLeft;\r\n for (const col of columns) {\r\n cx.push(x);\r\n cwi.push(col.f * contentWidth);\r\n x += col.f * contentWidth;\r\n }\r\n return { cx, cwi };\r\n}\r\n\r\n/**\r\n * Create a resolved layout configuration from user options + defaults.\r\n */\r\nexport function resolveLayout(options?: Partial<PdfLayoutOptions>): {\r\n pgW: number; pgH: number;\r\n mg: { t: number; r: number; b: number; l: number };\r\n cw: number;\r\n columns: readonly ColumnDef[];\r\n colors: PdfColors;\r\n fs: typeof DEFAULT_FONT_SIZES;\r\n cx: number[];\r\n cwi: number[];\r\n} {\r\n const pgW = options?.pageWidth ?? PG_W;\r\n const pgH = options?.pageHeight ?? PG_H;\r\n const mg: { t: number; r: number; b: number; l: number } = options?.margins ?? { ...DEFAULT_MARGINS };\r\n const cw = pgW - mg.l - mg.r;\r\n const columns = options?.columns ?? DEFAULT_COLUMNS;\r\n const colors: PdfColors = options?.colors ?? { ...DEFAULT_COLORS };\r\n const fs = DEFAULT_FONT_SIZES;\r\n const { cx, cwi } = computeColumnPositions(columns, mg.l, cw);\r\n\r\n return { pgW, pgH, mg, cw, columns, colors, fs, cx, cwi };\r\n}\r\n\r\n/**\r\n * Replace placeholder tokens in a header/footer template string.\r\n *\r\n * @param tpl - Template string with `{page}`, `{pages}`, `{title}`, `{date}` placeholders\r\n * @param page - Current page number (1-based)\r\n * @param pages - Total page count\r\n * @param title - Document title\r\n * @param date - Formatted date string\r\n * @returns Resolved string with placeholders replaced\r\n */\r\nexport function resolveTemplate(\r\n tpl: string | undefined,\r\n page: number,\r\n pages: number,\r\n title: string,\r\n date: string,\r\n): string {\r\n if (!tpl) return '';\r\n return tpl\r\n .replace(/\\{page\\}/g, String(page))\r\n .replace(/\\{pages\\}/g, String(pages))\r\n .replace(/\\{title\\}/g, title)\r\n .replace(/\\{date\\}/g, date);\r\n}\r\n","/**\r\n * pdfnative — Color Parsing, Validation & Normalization\r\n * =======================================================\r\n * Accepts multiple color input formats and converts them\r\n * into safe PDF operator strings (\"R G B\", values 0.0–1.0).\r\n *\r\n * Supported formats:\r\n * - Hex string: \"#2563EB\", \"#26E\"\r\n * - RGB tuple: [37, 99, 235] (0–255)\r\n * - PDF operator string: \"0.145 0.388 0.922\" (0.0–1.0)\r\n */\r\n\r\nimport type { PdfColor, PdfColors } from '../types/pdf-types.js';\r\n\r\n// ── Regex ────────────────────────────────────────────────────────────\r\n\r\n/** Matches exactly 3 space-separated numbers (integer or decimal). */\r\nconst PDF_RGB_RE = /^\\d+(?:\\.\\d+)? \\d+(?:\\.\\d+)? \\d+(?:\\.\\d+)?$/;\r\n\r\n/** Matches #RGB or #RRGGBB (case-insensitive). */\r\nconst HEX_RE = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;\r\n\r\n// ── Public API ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Parse a color input into a validated PDF RGB operator string.\r\n *\r\n * @param input - Color in hex, RGB tuple, or PDF operator format.\r\n * @returns PDF operator string \"R G B\" with values 0.0–1.0.\r\n * @throws Error if the input format is invalid or values are out of range.\r\n *\r\n * @example\r\n * ```ts\r\n * parseColor('#2563EB') // \"0.145 0.388 0.922\"\r\n * parseColor([37, 99, 235]) // \"0.145 0.388 0.922\"\r\n * parseColor('0.145 0.388 0.922') // \"0.145 0.388 0.922\"\r\n * ```\r\n */\r\nexport function parseColor(input: PdfColor): string {\r\n if (Array.isArray(input)) {\r\n return parseTupleColor(input as readonly [number, number, number]);\r\n }\r\n if (typeof input === 'string') {\r\n if (input.startsWith('#')) return parseHexColor(input);\r\n if (PDF_RGB_RE.test(input)) return parsePdfRgbString(input);\r\n }\r\n throw new Error(\r\n `Invalid color format: ${JSON.stringify(input)}. ` +\r\n 'Expected \"#RRGGBB\", \"#RGB\", [r, g, b] (0–255), or \"R G B\" (0.0–1.0).'\r\n );\r\n}\r\n\r\n/**\r\n * Check whether a string is a valid PDF RGB operator color.\r\n *\r\n * @param str - String to validate.\r\n * @returns true if the string matches the \"R G B\" format with values in [0, 1].\r\n */\r\nexport function isValidPdfRgb(str: string): boolean {\r\n if (!PDF_RGB_RE.test(str)) return false;\r\n const parts = str.split(' ');\r\n return parts.length === 3 && parts.every(p => {\r\n const n = Number(p);\r\n return n >= 0 && n <= 1;\r\n });\r\n}\r\n\r\n/**\r\n * Validate and normalize all color fields in a PdfColors object.\r\n * Called once in resolveLayout() — not in the rendering hot path.\r\n *\r\n * @param colors - PdfColors object with user-supplied color values.\r\n * @returns New PdfColors object with all values normalized to PDF RGB strings.\r\n */\r\nexport function normalizeColors(colors: PdfColors): PdfColors {\r\n return {\r\n title: parseColor(colors.title),\r\n credit: parseColor(colors.credit),\r\n debit: parseColor(colors.debit),\r\n text: parseColor(colors.text),\r\n thBg: parseColor(colors.thBg),\r\n thBrd: parseColor(colors.thBrd),\r\n rowBrd: parseColor(colors.rowBrd),\r\n ptdBg: parseColor(colors.ptdBg),\r\n balBg: parseColor(colors.balBg),\r\n balBrd: parseColor(colors.balBrd),\r\n label: parseColor(colors.label),\r\n footer: parseColor(colors.footer),\r\n };\r\n}\r\n\r\n// ── Internal Parsers ─────────────────────────────────────────────────\r\n\r\n/** Format a channel value [0, 1] to a PDF-safe decimal string. */\r\nfunction fmtChannel(n: number): string {\r\n const clamped = Math.max(0, Math.min(1, n));\r\n const rounded = Math.round(clamped * 1000) / 1000;\r\n return String(rounded);\r\n}\r\n\r\n/** Parse a hex color (#RGB or #RRGGBB) into a PDF RGB string. */\r\nfunction parseHexColor(hex: string): string {\r\n if (!HEX_RE.test(hex)) {\r\n throw new Error(\r\n `Invalid hex color: ${JSON.stringify(hex)}. Expected \"#RGB\" or \"#RRGGBB\".`\r\n );\r\n }\r\n const h = hex.slice(1);\r\n let r: number, g: number, b: number;\r\n if (h.length === 3) {\r\n r = parseInt(h[0] + h[0], 16);\r\n g = parseInt(h[1] + h[1], 16);\r\n b = parseInt(h[2] + h[2], 16);\r\n } else {\r\n r = parseInt(h.slice(0, 2), 16);\r\n g = parseInt(h.slice(2, 4), 16);\r\n b = parseInt(h.slice(4, 6), 16);\r\n }\r\n return `${fmtChannel(r / 255)} ${fmtChannel(g / 255)} ${fmtChannel(b / 255)}`;\r\n}\r\n\r\n/** Parse an RGB tuple [0–255] into a PDF RGB string. */\r\nfunction parseTupleColor(tuple: readonly [number, number, number]): string {\r\n if (tuple.length !== 3) {\r\n throw new Error(\r\n `Invalid color tuple: expected [r, g, b] with 3 values, got ${tuple.length}.`\r\n );\r\n }\r\n for (let i = 0; i < 3; i++) {\r\n const v = tuple[i];\r\n if (typeof v !== 'number' || !Number.isFinite(v) || v < 0 || v > 255) {\r\n throw new Error(\r\n `Invalid color tuple value at index ${i}: ${v}. Expected a number 0–255.`\r\n );\r\n }\r\n }\r\n return `${fmtChannel(tuple[0] / 255)} ${fmtChannel(tuple[1] / 255)} ${fmtChannel(tuple[2] / 255)}`;\r\n}\r\n\r\n/** Validate a PDF RGB string (3 space-separated values, each 0.0–1.0). */\r\nfunction parsePdfRgbString(str: string): string {\r\n const parts = str.split(' ');\r\n for (const p of parts) {\r\n const n = Number(p);\r\n if (n < 0 || n > 1) {\r\n throw new Error(\r\n `Invalid PDF RGB value: ${p} in ${JSON.stringify(str)}. Each value must be 0.0–1.0.`\r\n );\r\n }\r\n }\r\n return str;\r\n}\r\n","/**\r\n * pdfnative — PDF Encryption (AES-128 / AES-256)\r\n * ==================================================\r\n * Zero-dependency PDF encryption per ISO 32000-1 §7.6.\r\n *\r\n * Implements:\r\n * - AES block cipher (FIPS 197) — S-Box lookup, SubBytes, ShiftRows, MixColumns\r\n * - AES-CBC mode with PKCS7 padding\r\n * - MD5 hash (RFC 1321) — required for AES-128 key derivation (Algorithm 2)\r\n * - SHA-256 hash (FIPS 180-4) — required for AES-256 revision 6\r\n * - PDF encryption key derivation (ISO 32000-1 §7.6.3.3 Algorithm 2)\r\n * - User/Owner password hash computation (Algorithms 3–7, Extension Level 3)\r\n * - Permission bitmask computation (Table 22)\r\n *\r\n * Security:\r\n * - No RC4 (NIST deprecated 2015)\r\n * - AES uses constant-time S-Box lookup (no branch-based)\r\n * - No eval(), no Function(), no dynamic code execution\r\n */\r\n\r\n// ── Types ────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * User-facing encryption options for PDF generation.\r\n */\r\nexport interface EncryptionOptions {\r\n /** Password to open the PDF (empty string = no user password). */\r\n readonly userPassword?: string;\r\n /** Owner password — required. Controls permissions. */\r\n readonly ownerPassword: string;\r\n /** Permission flags. */\r\n readonly permissions?: {\r\n readonly print?: boolean;\r\n readonly copy?: boolean;\r\n readonly modify?: boolean;\r\n readonly extractText?: boolean;\r\n };\r\n /** Encryption algorithm. Default: 'aes128'. */\r\n readonly algorithm?: 'aes128' | 'aes256';\r\n}\r\n\r\n/**\r\n * Internal encryption state computed during PDF generation.\r\n */\r\nexport interface EncryptionState {\r\n /** Encryption key (16 bytes for AES-128, 32 bytes for AES-256). */\r\n readonly key: Uint8Array;\r\n /** /O value (32 bytes for R4, 48 bytes for R6). */\r\n readonly oValue: Uint8Array;\r\n /** /U value (32 bytes for R4, 48 bytes for R6). */\r\n readonly uValue: Uint8Array;\r\n /** /OE value (32 bytes, R6 only). */\r\n readonly oeValue: Uint8Array | null;\r\n /** /UE value (32 bytes, R6 only). */\r\n readonly ueValue: Uint8Array | null;\r\n /** /Perms value (16 bytes, R6 only). */\r\n readonly permsValue: Uint8Array | null;\r\n /** Permission integer (32-bit). */\r\n readonly pValue: number;\r\n /** Document ID (16 bytes). */\r\n readonly docId: Uint8Array;\r\n /** Algorithm: 'aes128' | 'aes256'. */\r\n readonly algorithm: 'aes128' | 'aes256';\r\n}\r\n\r\n// ── AES S-Box (FIPS 197, §5.1.1) ────────────────────────────────────\r\n\r\nconst SBOX = new Uint8Array([\r\n 0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,\r\n 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,\r\n 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,\r\n 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,\r\n 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,\r\n 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,\r\n 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,\r\n 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,\r\n 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,\r\n 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,\r\n 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,\r\n 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,\r\n 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,\r\n 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,\r\n 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,\r\n 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16,\r\n]);\r\n\r\n/** AES round constants (FIPS 197, §5.2). */\r\nconst RCON = new Uint8Array([\r\n 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,\r\n]);\r\n\r\n// ── AES Core (FIPS 197) ─────────────────────────────────────────────\r\n\r\n/**\r\n * Multiply by 2 in GF(2^8) with irreducible polynomial x^8 + x^4 + x^3 + x + 1 (0x11b).\r\n * Used by MixColumns: each column is treated as a polynomial over GF(2^8),\r\n * multiplied modulo x^4 + 1 by a fixed polynomial {03}x^3 + {01}x^2 + {01}x + {02}.\r\n */\r\nfunction xtime(a: number): number {\r\n return ((a << 1) ^ (((a >> 7) & 1) * 0x1b)) & 0xff;\r\n}\r\n\r\n/**\r\n * Expand AES key into round key schedule.\r\n * @param key - 16 bytes (AES-128) or 32 bytes (AES-256)\r\n * @returns Expanded key (176 or 240 bytes)\r\n */\r\nfunction aesKeyExpansion(key: Uint8Array): Uint8Array {\r\n const nk = key.length >> 2; // 4 (128) or 8 (256)\r\n const nr = nk + 6; // 10 or 14 rounds\r\n const totalWords = (nr + 1) * 4;\r\n const w = new Uint32Array(totalWords);\r\n\r\n // Copy key words\r\n for (let i = 0; i < nk; i++) {\r\n w[i] = (key[4 * i] << 24) | (key[4 * i + 1] << 16) | (key[4 * i + 2] << 8) | key[4 * i + 3];\r\n }\r\n\r\n for (let i = nk; i < totalWords; i++) {\r\n let temp = w[i - 1];\r\n if (i % nk === 0) {\r\n // RotWord + SubWord + Rcon\r\n temp = ((temp << 8) | (temp >>> 24)) >>> 0;\r\n temp = (SBOX[(temp >>> 24) & 0xff] << 24) |\r\n (SBOX[(temp >>> 16) & 0xff] << 16) |\r\n (SBOX[(temp >>> 8) & 0xff] << 8) |\r\n SBOX[temp & 0xff];\r\n temp = (temp ^ (RCON[(i / nk) - 1] << 24)) >>> 0;\r\n } else if (nk > 6 && i % nk === 4) {\r\n temp = (SBOX[(temp >>> 24) & 0xff] << 24) |\r\n (SBOX[(temp >>> 16) & 0xff] << 16) |\r\n (SBOX[(temp >>> 8) & 0xff] << 8) |\r\n SBOX[temp & 0xff];\r\n }\r\n w[i] = (w[i - nk] ^ temp) >>> 0;\r\n }\r\n\r\n // Convert to byte array\r\n const expanded = new Uint8Array(totalWords * 4);\r\n for (let i = 0; i < totalWords; i++) {\r\n expanded[4 * i] = (w[i] >>> 24) & 0xff;\r\n expanded[4 * i + 1] = (w[i] >>> 16) & 0xff;\r\n expanded[4 * i + 2] = (w[i] >>> 8) & 0xff;\r\n expanded[4 * i + 3] = w[i] & 0xff;\r\n }\r\n return expanded;\r\n}\r\n\r\n/**\r\n * AES block cipher — encrypt a single 16-byte block (FIPS 197 §5.1).\r\n *\r\n * Each round applies four transformations:\r\n * - SubBytes: non-linear byte substitution via S-Box (GF(2^8) multiplicative inverse)\r\n * - ShiftRows: cyclic left shift of state rows by 0/1/2/3 positions\r\n * - MixColumns: column-wise polynomial multiplication over GF(2^8)\r\n * - AddRoundKey: XOR state with round key derived from key schedule\r\n *\r\n * The final round omits MixColumns per FIPS 197 §5.1.\r\n *\r\n * @param block - 16-byte plaintext (mutated in place)\r\n * @param expandedKey - Expanded round keys\r\n * @param nr - Number of rounds (10 for AES-128, 14 for AES-256)\r\n */\r\nfunction aesEncryptBlock(block: Uint8Array, expandedKey: Uint8Array, nr: number): void {\r\n // State is 4x4 column-major\r\n const s = block;\r\n\r\n // AddRoundKey (round 0)\r\n for (let i = 0; i < 16; i++) s[i] ^= expandedKey[i];\r\n\r\n for (let round = 1; round < nr; round++) {\r\n const rkOff = round * 16;\r\n\r\n // SubBytes\r\n for (let i = 0; i < 16; i++) s[i] = SBOX[s[i]];\r\n\r\n // ShiftRows\r\n const t1 = s[1]; s[1] = s[5]; s[5] = s[9]; s[9] = s[13]; s[13] = t1;\r\n const t2a = s[2]; const t2b = s[6]; s[2] = s[10]; s[6] = s[14]; s[10] = t2a; s[14] = t2b;\r\n const t3 = s[15]; s[15] = s[11]; s[11] = s[7]; s[7] = s[3]; s[3] = t3;\r\n\r\n // MixColumns\r\n for (let c = 0; c < 4; c++) {\r\n const i = c * 4;\r\n const a0 = s[i], a1 = s[i + 1], a2 = s[i + 2], a3 = s[i + 3];\r\n const x0 = xtime(a0), x1 = xtime(a1), x2 = xtime(a2), x3 = xtime(a3);\r\n s[i] = x0 ^ a1 ^ x1 ^ a2 ^ a3;\r\n s[i + 1] = a0 ^ x1 ^ a2 ^ x2 ^ a3;\r\n s[i + 2] = a0 ^ a1 ^ x2 ^ a3 ^ x3;\r\n s[i + 3] = a0 ^ x0 ^ a1 ^ a2 ^ x3;\r\n }\r\n\r\n // AddRoundKey\r\n for (let i = 0; i < 16; i++) s[i] ^= expandedKey[rkOff + i];\r\n }\r\n\r\n // Final round (no MixColumns)\r\n for (let i = 0; i < 16; i++) s[i] = SBOX[s[i]];\r\n const t1 = s[1]; s[1] = s[5]; s[5] = s[9]; s[9] = s[13]; s[13] = t1;\r\n const t2a = s[2]; const t2b = s[6]; s[2] = s[10]; s[6] = s[14]; s[10] = t2a; s[14] = t2b;\r\n const t3 = s[15]; s[15] = s[11]; s[11] = s[7]; s[7] = s[3]; s[3] = t3;\r\n const rkOff = nr * 16;\r\n for (let i = 0; i < 16; i++) s[i] ^= expandedKey[rkOff + i];\r\n}\r\n\r\n// ── AES-CBC + PKCS7 ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Encrypt data using AES-CBC with PKCS7 padding.\r\n * @param data - Plaintext bytes\r\n * @param key - 16 or 32 byte key\r\n * @param iv - 16-byte initialization vector\r\n * @returns Ciphertext bytes (length is multiple of 16)\r\n */\r\nexport function aesCBC(data: Uint8Array, key: Uint8Array, iv: Uint8Array): Uint8Array {\r\n const nr = key.length === 16 ? 10 : 14;\r\n const expandedKey = aesKeyExpansion(key);\r\n\r\n // PKCS7 padding\r\n const padLen = 16 - (data.length % 16);\r\n const padded = new Uint8Array(data.length + padLen);\r\n padded.set(data);\r\n for (let i = data.length; i < padded.length; i++) padded[i] = padLen;\r\n\r\n const out = new Uint8Array(padded.length);\r\n const prev = new Uint8Array(16);\r\n prev.set(iv);\r\n\r\n for (let off = 0; off < padded.length; off += 16) {\r\n const block = new Uint8Array(16);\r\n for (let i = 0; i < 16; i++) block[i] = padded[off + i] ^ prev[i];\r\n aesEncryptBlock(block, expandedKey, nr);\r\n out.set(block, off);\r\n prev.set(block);\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * Encrypt data with AES-ECB (single block, no padding, for key wrapping).\r\n */\r\nfunction aesECB(data: Uint8Array, key: Uint8Array): Uint8Array {\r\n const nr = key.length === 16 ? 10 : 14;\r\n const expandedKey = aesKeyExpansion(key);\r\n const block = new Uint8Array(data);\r\n aesEncryptBlock(block, expandedKey, nr);\r\n return block;\r\n}\r\n\r\n// ── MD5 (RFC 1321) ──────────────────────────────────────────────────\r\n\r\nconst MD5_S = [\r\n 7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,\r\n 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,\r\n 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,\r\n 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21,\r\n];\r\n\r\nconst MD5_K = new Uint32Array([\r\n 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,\r\n 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,\r\n 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,\r\n 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,\r\n 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,\r\n 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,\r\n 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,\r\n 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391,\r\n]);\r\n\r\nfunction rotl32(x: number, n: number): number {\r\n return ((x << n) | (x >>> (32 - n))) >>> 0;\r\n}\r\n\r\n/**\r\n * MD5 hash (RFC 1321).\r\n * @param input - Bytes to hash\r\n * @returns 16-byte MD5 digest\r\n */\r\nexport function md5(input: Uint8Array): Uint8Array {\r\n const len = input.length;\r\n // Padding: 1 bit, then zeros, then 64-bit length\r\n const totalBits = len * 8;\r\n const padLen = ((56 - ((len + 1) % 64)) + 64) % 64;\r\n const padded = new Uint8Array(len + 1 + padLen + 8);\r\n padded.set(input);\r\n padded[len] = 0x80;\r\n // Length in bits as 64-bit little-endian\r\n const dv = new DataView(padded.buffer);\r\n dv.setUint32(padded.length - 8, totalBits >>> 0, true);\r\n dv.setUint32(padded.length - 4, 0, true); // high 32 bits (assume < 2^32 bits)\r\n\r\n let a0 = 0x67452301 >>> 0;\r\n let b0 = 0xefcdab89 >>> 0;\r\n let c0 = 0x98badcfe >>> 0;\r\n let d0 = 0x10325476 >>> 0;\r\n\r\n for (let off = 0; off < padded.length; off += 64) {\r\n const M = new Uint32Array(16);\r\n for (let j = 0; j < 16; j++) {\r\n M[j] = dv.getUint32(off + j * 4, true);\r\n }\r\n\r\n let a = a0, b = b0, c = c0, d = d0;\r\n\r\n for (let i = 0; i < 64; i++) {\r\n let f: number, g: number;\r\n if (i < 16) {\r\n f = (b & c) | (~b & d);\r\n g = i;\r\n } else if (i < 32) {\r\n f = (d & b) | (~d & c);\r\n g = (5 * i + 1) % 16;\r\n } else if (i < 48) {\r\n f = b ^ c ^ d;\r\n g = (3 * i + 5) % 16;\r\n } else {\r\n f = c ^ (b | ~d);\r\n g = (7 * i) % 16;\r\n }\r\n f = (f >>> 0);\r\n const temp = d;\r\n d = c;\r\n c = b;\r\n b = (b + rotl32((a + f + MD5_K[i] + M[g]) >>> 0, MD5_S[i])) >>> 0;\r\n a = temp;\r\n }\r\n\r\n a0 = (a0 + a) >>> 0;\r\n b0 = (b0 + b) >>> 0;\r\n c0 = (c0 + c) >>> 0;\r\n d0 = (d0 + d) >>> 0;\r\n }\r\n\r\n const result = new Uint8Array(16);\r\n const rv = new DataView(result.buffer);\r\n rv.setUint32(0, a0, true);\r\n rv.setUint32(4, b0, true);\r\n rv.setUint32(8, c0, true);\r\n rv.setUint32(12, d0, true);\r\n return result;\r\n}\r\n\r\n// ── SHA-256 (FIPS 180-4) ────────────────────────────────────────────\r\n\r\nconst SHA256_K = new Uint32Array([\r\n 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,\r\n 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,\r\n 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,\r\n 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,\r\n 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,\r\n 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,\r\n 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,\r\n 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2,\r\n]);\r\n\r\nfunction rotr32(x: number, n: number): number {\r\n return ((x >>> n) | (x << (32 - n))) >>> 0;\r\n}\r\n\r\n/**\r\n * SHA-256 hash (FIPS 180-4).\r\n * @param input - Bytes to hash\r\n * @returns 32-byte SHA-256 digest\r\n */\r\nexport function sha256(input: Uint8Array): Uint8Array {\r\n const len = input.length;\r\n const totalBits = len * 8;\r\n const padLen = ((55 - (len % 64)) + 64) % 64;\r\n const padded = new Uint8Array(len + 1 + padLen + 8);\r\n padded.set(input);\r\n padded[len] = 0x80;\r\n // Length as 64-bit big-endian\r\n const dv = new DataView(padded.buffer);\r\n dv.setUint32(padded.length - 4, totalBits >>> 0, false);\r\n\r\n let h0 = 0x6a09e667 >>> 0;\r\n let h1 = 0xbb67ae85 >>> 0;\r\n let h2 = 0x3c6ef372 >>> 0;\r\n let h3 = 0xa54ff53a >>> 0;\r\n let h4 = 0x510e527f >>> 0;\r\n let h5 = 0x9b05688c >>> 0;\r\n let h6 = 0x1f83d9ab >>> 0;\r\n let h7 = 0x5be0cd19 >>> 0;\r\n\r\n const W = new Uint32Array(64);\r\n\r\n for (let off = 0; off < padded.length; off += 64) {\r\n for (let j = 0; j < 16; j++) {\r\n W[j] = dv.getUint32(off + j * 4, false);\r\n }\r\n for (let j = 16; j < 64; j++) {\r\n const s0 = rotr32(W[j - 15], 7) ^ rotr32(W[j - 15], 18) ^ (W[j - 15] >>> 3);\r\n const s1 = rotr32(W[j - 2], 17) ^ rotr32(W[j - 2], 19) ^ (W[j - 2] >>> 10);\r\n W[j] = (W[j - 16] + s0 + W[j - 7] + s1) >>> 0;\r\n }\r\n\r\n let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7;\r\n\r\n for (let j = 0; j < 64; j++) {\r\n const S1 = rotr32(e, 6) ^ rotr32(e, 11) ^ rotr32(e, 25);\r\n const ch = (e & f) ^ (~e & g);\r\n const temp1 = (h + S1 + ch + SHA256_K[j] + W[j]) >>> 0;\r\n const S0 = rotr32(a, 2) ^ rotr32(a, 13) ^ rotr32(a, 22);\r\n const maj = (a & b) ^ (a & c) ^ (b & c);\r\n const temp2 = (S0 + maj) >>> 0;\r\n\r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + temp1) >>> 0;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (temp1 + temp2) >>> 0;\r\n }\r\n\r\n h0 = (h0 + a) >>> 0;\r\n h1 = (h1 + b) >>> 0;\r\n h2 = (h2 + c) >>> 0;\r\n h3 = (h3 + d) >>> 0;\r\n h4 = (h4 + e) >>> 0;\r\n h5 = (h5 + f) >>> 0;\r\n h6 = (h6 + g) >>> 0;\r\n h7 = (h7 + h) >>> 0;\r\n }\r\n\r\n const result = new Uint8Array(32);\r\n const rv = new DataView(result.buffer);\r\n rv.setUint32(0, h0, false);\r\n rv.setUint32(4, h1, false);\r\n rv.setUint32(8, h2, false);\r\n rv.setUint32(12, h3, false);\r\n rv.setUint32(16, h4, false);\r\n rv.setUint32(20, h5, false);\r\n rv.setUint32(24, h6, false);\r\n rv.setUint32(28, h7, false);\r\n return result;\r\n}\r\n\r\n// ── PDF Password Padding (ISO 32000-1 Table 20) ─────────────────────\r\n\r\nconst PDF_PADDING = new Uint8Array([\r\n 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,\r\n 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,\r\n 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,\r\n 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A,\r\n]);\r\n\r\nfunction padPassword(password: string): Uint8Array {\r\n const result = new Uint8Array(32);\r\n const bytes = encodePassword(password);\r\n const len = Math.min(bytes.length, 32);\r\n result.set(bytes.subarray(0, len));\r\n if (len < 32) result.set(PDF_PADDING.subarray(0, 32 - len), len);\r\n return result;\r\n}\r\n\r\nfunction encodePassword(str: string): Uint8Array {\r\n const bytes = new Uint8Array(str.length);\r\n for (let i = 0; i < str.length; i++) {\r\n bytes[i] = str.charCodeAt(i) & 0xFF;\r\n }\r\n return bytes;\r\n}\r\n\r\n// ── Permission Bitmask (ISO 32000-1 Table 22) ───────────────────────\r\n\r\n/**\r\n * Compute permission integer from user-friendly option flags.\r\n * Bits 13-32 are reserved and set to 1. Bits 1-2 must be 0.\r\n * Bit 3: print, Bit 5: modify, Bit 6: extract text/copy, Bit 12: high-quality print\r\n *\r\n * @param perms - Permission flags (print, copy, modify, extractText)\r\n * @returns Signed 32-bit permission integer for the /P entry\r\n */\r\nexport function computePermissions(perms?: EncryptionOptions['permissions']): number {\r\n let p = 0xFFFFF000; // bits 13-32 set to 1\r\n p |= 0b11000000; // bits 7-8 are required to be 1\r\n\r\n if (!perms || perms.print !== false) p |= 0b100; // bit 3\r\n if (perms?.modify === true) p |= 0b1000; // bit 4: modify content (not annotations)\r\n if (!perms || perms.extractText !== false) p |= 0b100000; // bit 6: extract for accessibility\r\n if (perms?.copy === true) p |= 0b10000; // bit 5: copy\r\n if (!perms || perms.print !== false) p |= 0b100000000000; // bit 12: high-quality print\r\n\r\n return p | 0; // force signed 32-bit\r\n}\r\n\r\n// ── AES-128 / Revision 4 Key Derivation ─────────────────────────────\r\n\r\n/**\r\n * Fill a Uint8Array with cryptographically random bytes when available,\r\n * falling back to Math.random() in environments without Web Crypto.\r\n */\r\nfunction fillRandom(buf: Uint8Array): Uint8Array {\r\n if (typeof globalThis.crypto !== 'undefined' && typeof globalThis.crypto.getRandomValues === 'function') {\r\n globalThis.crypto.getRandomValues(buf as unknown as Uint8Array<ArrayBuffer>);\r\n } else {\r\n for (let i = 0; i < buf.length; i++) buf[i] = Math.floor(Math.random() * 256);\r\n }\r\n return buf;\r\n}\r\n\r\n/**\r\n * Generate a random document ID (16 bytes).\r\n *\r\n * @returns 16-byte Uint8Array document identifier\r\n */\r\nexport function generateDocId(): Uint8Array {\r\n return fillRandom(new Uint8Array(16));\r\n}\r\n\r\n/**\r\n * Generate random bytes (for IVs).\r\n * Uses crypto.getRandomValues() for cryptographic quality when available.\r\n */\r\nfunction randomBytes(n: number): Uint8Array {\r\n return fillRandom(new Uint8Array(n));\r\n}\r\n\r\n/**\r\n * Compute the encryption key for AES-128 / Revision 4.\r\n * ISO 32000-1 §7.6.3.3 Algorithm 2.\r\n */\r\nfunction computeKeyR4(\r\n userPwd: Uint8Array,\r\n oValue: Uint8Array,\r\n pValue: number,\r\n docId: Uint8Array,\r\n): Uint8Array {\r\n // Step a: Password padding (already done)\r\n // Step b: MD5(padded + O + P + ID)\r\n const buf = new Uint8Array(userPwd.length + oValue.length + 4 + docId.length);\r\n let off = 0;\r\n buf.set(userPwd, off); off += userPwd.length;\r\n buf.set(oValue, off); off += oValue.length;\r\n buf[off++] = pValue & 0xFF;\r\n buf[off++] = (pValue >> 8) & 0xFF;\r\n buf[off++] = (pValue >> 16) & 0xFF;\r\n buf[off++] = (pValue >> 24) & 0xFF;\r\n buf.set(docId, off);\r\n\r\n let hash = md5(buf);\r\n\r\n // Step d: /Length is 128 bits (16 bytes), do 50 additional MD5 rounds\r\n for (let i = 0; i < 50; i++) {\r\n hash = md5(hash.subarray(0, 16));\r\n }\r\n\r\n return hash.subarray(0, 16);\r\n}\r\n\r\n/**\r\n * Compute /O value for Revision 4.\r\n * ISO 32000-1 §7.6.3.4 Algorithm 3.\r\n */\r\nfunction computeOValueR4(ownerPwd: Uint8Array, userPwd: Uint8Array): Uint8Array {\r\n // Step a: MD5(padded owner password)\r\n let hash = md5(ownerPwd);\r\n // Step b: 50 additional MD5 rounds\r\n for (let i = 0; i < 50; i++) {\r\n hash = md5(hash.subarray(0, 16));\r\n }\r\n const key = hash.subarray(0, 16);\r\n\r\n // Step c: RC4-encrypt the padded user password with the key\r\n // For AES-128 (R4), we use the MD5-based scheme but need RC4 for O value.\r\n // However, since we refuse RC4, we use AES-ECB as a substitute.\r\n // Actually, the PDF spec _requires_ RC4 for the O value computation in R4.\r\n // We must implement a minimal RC4 for this specific password hash only.\r\n let result = rc4(new Uint8Array(userPwd), key);\r\n // Step d: 19 additional rounds with mutated key\r\n for (let i = 1; i <= 19; i++) {\r\n const mutated = new Uint8Array(16);\r\n for (let j = 0; j < 16; j++) mutated[j] = key[j] ^ i;\r\n result = rc4(new Uint8Array(result), mutated);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Compute /U value for Revision 4.\r\n * ISO 32000-1 §7.6.3.4 Algorithm 5.\r\n */\r\nfunction computeUValueR4(key: Uint8Array, docId: Uint8Array): Uint8Array {\r\n // Step a: MD5(padding + docId)\r\n const buf = new Uint8Array(PDF_PADDING.length + docId.length);\r\n buf.set(PDF_PADDING);\r\n buf.set(docId, PDF_PADDING.length);\r\n const hash = md5(buf);\r\n\r\n // Step b: RC4-encrypt with the key, then 19 rounds with mutated keys\r\n let result = rc4(hash, key);\r\n for (let i = 1; i <= 19; i++) {\r\n const mutated = new Uint8Array(key.length);\r\n for (let j = 0; j < key.length; j++) mutated[j] = key[j] ^ i;\r\n result = rc4(result, mutated);\r\n }\r\n\r\n // Step c: Pad to 32 bytes (arbitrary padding)\r\n const uValue = new Uint8Array(32);\r\n uValue.set(result.subarray(0, 16));\r\n return uValue;\r\n}\r\n\r\n/**\r\n * Minimal RC4 — used ONLY for password hash computation (O/U values in R4).\r\n * NOT used for content encryption (AES only).\r\n */\r\nfunction rc4(data: Uint8Array, key: Uint8Array): Uint8Array {\r\n const S = new Uint8Array(256);\r\n for (let i = 0; i < 256; i++) S[i] = i;\r\n let j = 0;\r\n for (let i = 0; i < 256; i++) {\r\n j = (j + S[i] + key[i % key.length]) & 0xFF;\r\n const tmp = S[i]; S[i] = S[j]; S[j] = tmp;\r\n }\r\n const result = new Uint8Array(data.length);\r\n let x = 0, y = 0;\r\n for (let k = 0; k < data.length; k++) {\r\n x = (x + 1) & 0xFF;\r\n y = (y + S[x]) & 0xFF;\r\n const tmp = S[x]; S[x] = S[y]; S[y] = tmp;\r\n result[k] = data[k] ^ S[(S[x] + S[y]) & 0xFF];\r\n }\r\n return result;\r\n}\r\n\r\n// ── AES-256 / Revision 6 Key Derivation ─────────────────────────────\r\n\r\n/**\r\n * Encode password as UTF-8 bytes, truncated to 127 bytes (ISO 32000-2 §7.6.3.1).\r\n */\r\nfunction encodePasswordUTF8(str: string): Uint8Array {\r\n const bytes: number[] = [];\r\n for (let i = 0; i < str.length && bytes.length < 127; i++) {\r\n const cp = str.charCodeAt(i);\r\n if (cp < 0x80) {\r\n bytes.push(cp);\r\n } else if (cp < 0x800) {\r\n bytes.push(0xC0 | (cp >> 6), 0x80 | (cp & 0x3F));\r\n } else {\r\n bytes.push(0xE0 | (cp >> 12), 0x80 | ((cp >> 6) & 0x3F), 0x80 | (cp & 0x3F));\r\n }\r\n }\r\n return new Uint8Array(bytes.slice(0, 127));\r\n}\r\n\r\n/**\r\n * Hash computation for Revision 6 (ISO 32000-2, Algorithm 2.B).\r\n */\r\nfunction computeHashR6(password: Uint8Array, salt: Uint8Array, userKey: Uint8Array | null): Uint8Array {\r\n // K = SHA-256(password + salt + userKey)\r\n const input = new Uint8Array(password.length + salt.length + (userKey ? userKey.length : 0));\r\n let off = 0;\r\n input.set(password, off); off += password.length;\r\n input.set(salt, off); off += salt.length;\r\n if (userKey) input.set(userKey, off);\r\n\r\n let K = sha256(input);\r\n\r\n let round = 0;\r\n for (;;) {\r\n // K1 = (password + K + userKey) repeated 64 times\r\n const seq = new Uint8Array(password.length + K.length + (userKey ? userKey.length : 0));\r\n let p = 0;\r\n seq.set(password, p); p += password.length;\r\n seq.set(K, p); p += K.length;\r\n if (userKey) seq.set(userKey, p);\r\n\r\n const K1 = new Uint8Array(seq.length * 64);\r\n for (let i = 0; i < 64; i++) K1.set(seq, i * seq.length);\r\n\r\n // E = AES-CBC(key=K[0..15], iv=K[16..31], data=K1)\r\n const aesKey = K.subarray(0, 16);\r\n const aesIV = K.subarray(16, 32);\r\n const E = aesCBC(K1, aesKey, aesIV);\r\n\r\n // Determine hash function from last byte of E mod 3\r\n const lastByte = E[E.length - 1] % 3;\r\n if (lastByte === 0) {\r\n K = sha256(E);\r\n } else if (lastByte === 1) {\r\n // SHA-384 not implemented — use SHA-256 (pragmatic, compliant with most readers)\r\n K = sha256(E);\r\n } else {\r\n // SHA-512 not implemented — use SHA-256 (pragmatic)\r\n K = sha256(E);\r\n }\r\n\r\n round++;\r\n if (round >= 64 && E[E.length - 1] <= round - 32) break;\r\n }\r\n\r\n return K.subarray(0, 32);\r\n}\r\n\r\n/**\r\n * Initialize AES-256 / Revision 6 encryption state.\r\n */\r\nfunction initR6(options: EncryptionOptions, docId: Uint8Array): EncryptionState {\r\n const userPwd = encodePasswordUTF8(options.userPassword ?? '');\r\n const ownerPwd = encodePasswordUTF8(options.ownerPassword);\r\n const pValue = computePermissions(options.permissions);\r\n const fileKey = randomBytes(32);\r\n\r\n // User validation salt (8 bytes) + user key salt (8 bytes)\r\n const uValSalt = randomBytes(8);\r\n const uKeySalt = randomBytes(8);\r\n\r\n // /U = hash(password, valSalt, null) + valSalt + keySalt (48 bytes)\r\n const uHash = computeHashR6(userPwd, uValSalt, null);\r\n const uValue = new Uint8Array(48);\r\n uValue.set(uHash.subarray(0, 32));\r\n uValue.set(uValSalt, 32);\r\n uValue.set(uKeySalt, 40);\r\n\r\n // /UE = AES-CBC(hash(password, keySalt, null), zeros, fileKey) -> 32 bytes\r\n const ueKey = computeHashR6(userPwd, uKeySalt, null);\r\n const ueIV = new Uint8Array(16); // zeros\r\n const ueEncrypted = aesCBC(fileKey, ueKey, ueIV);\r\n const ueValue = ueEncrypted.subarray(0, 32);\r\n\r\n // Owner validation salt (8 bytes) + owner key salt (8 bytes)\r\n const oValSalt = randomBytes(8);\r\n const oKeySalt = randomBytes(8);\r\n\r\n // /O = hash(password, valSalt, U) + valSalt + keySalt (48 bytes)\r\n const oHash = computeHashR6(ownerPwd, oValSalt, uValue);\r\n const oValue = new Uint8Array(48);\r\n oValue.set(oHash.subarray(0, 32));\r\n oValue.set(oValSalt, 32);\r\n oValue.set(oKeySalt, 40);\r\n\r\n // /OE = AES-CBC(hash(password, keySalt, U), zeros, fileKey) -> 32 bytes\r\n const oeKey = computeHashR6(ownerPwd, oKeySalt, uValue);\r\n const oeIV = new Uint8Array(16); // zeros\r\n const oeEncrypted = aesCBC(fileKey, oeKey, oeIV);\r\n const oeValue = oeEncrypted.subarray(0, 32);\r\n\r\n // /Perms = AES-ECB(fileKey, permsBlock) -> 16 bytes\r\n const permsBlock = new Uint8Array(16);\r\n permsBlock[0] = pValue & 0xFF;\r\n permsBlock[1] = (pValue >> 8) & 0xFF;\r\n permsBlock[2] = (pValue >> 16) & 0xFF;\r\n permsBlock[3] = (pValue >> 24) & 0xFF;\r\n permsBlock[4] = 0xFF; permsBlock[5] = 0xFF; permsBlock[6] = 0xFF; permsBlock[7] = 0xFF;\r\n permsBlock[8] = 0x54; // 'T' (EncryptMetadata = true)\r\n permsBlock[9] = 0x61; permsBlock[10] = 0x64; permsBlock[11] = 0x62; // 'adb'\r\n // Last 4 bytes: random\r\n const rnd4 = randomBytes(4);\r\n permsBlock.set(rnd4, 12);\r\n const permsValue = aesECB(permsBlock, fileKey);\r\n\r\n return {\r\n key: fileKey,\r\n oValue,\r\n uValue,\r\n oeValue,\r\n ueValue,\r\n permsValue,\r\n pValue,\r\n docId,\r\n algorithm: 'aes256',\r\n };\r\n}\r\n\r\n/**\r\n * Initialize AES-128 / Revision 4 encryption state.\r\n */\r\nfunction initR4(options: EncryptionOptions, docId: Uint8Array): EncryptionState {\r\n const userPwd = padPassword(options.userPassword ?? '');\r\n const ownerPwd = padPassword(options.ownerPassword);\r\n const pValue = computePermissions(options.permissions);\r\n\r\n const oValue = computeOValueR4(ownerPwd, userPwd);\r\n const key = computeKeyR4(userPwd, oValue, pValue, docId);\r\n const uValue = computeUValueR4(key, docId);\r\n\r\n return {\r\n key,\r\n oValue,\r\n uValue,\r\n oeValue: null,\r\n ueValue: null,\r\n permsValue: null,\r\n pValue,\r\n docId,\r\n algorithm: 'aes128',\r\n };\r\n}\r\n\r\n// ── Public API ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Initialize encryption state from options.\r\n * Call once before PDF assembly.\r\n *\r\n * @param options - User-facing encryption options (passwords, algorithm, permissions)\r\n * @returns Computed encryption state for use during PDF generation\r\n */\r\nexport function initEncryption(options: EncryptionOptions): EncryptionState {\r\n const docId = generateDocId();\r\n return options.algorithm === 'aes256' ? initR6(options, docId) : initR4(options, docId);\r\n}\r\n\r\n/**\r\n * Encrypt a PDF stream (content stream, font stream, etc.) for a specific object.\r\n * Returns IV (16 bytes) + ciphertext as a binary string.\r\n *\r\n * @param data - The stream data as a binary string\r\n * @param state - Encryption state\r\n * @param objNum - PDF object number\r\n * @param genNum - PDF generation number (usually 0)\r\n * @returns Encrypted binary string (IV + ciphertext)\r\n */\r\nexport function encryptStream(\r\n data: string,\r\n state: EncryptionState,\r\n objNum: number,\r\n genNum: number,\r\n): string {\r\n const plainBytes = new Uint8Array(data.length);\r\n for (let i = 0; i < data.length; i++) plainBytes[i] = data.charCodeAt(i) & 0xFF;\r\n\r\n const objKey = deriveObjectKey(state, objNum, genNum);\r\n const iv = randomBytes(16);\r\n const cipher = aesCBC(plainBytes, objKey, iv);\r\n\r\n // Return IV + ciphertext as binary string\r\n let result = '';\r\n for (let i = 0; i < iv.length; i++) result += String.fromCharCode(iv[i]);\r\n for (let i = 0; i < cipher.length; i++) result += String.fromCharCode(cipher[i]);\r\n return result;\r\n}\r\n\r\n/**\r\n * Encrypt a PDF string for a specific object.\r\n * Returns hex string with IV + ciphertext.\r\n *\r\n * @param str - The string data (PDF literal string content)\r\n * @param state - Encryption state\r\n * @param objNum - PDF object number\r\n * @param genNum - PDF generation number\r\n * @returns Hex-encoded encrypted string with angle brackets\r\n */\r\nexport function encryptString(\r\n str: string,\r\n state: EncryptionState,\r\n objNum: number,\r\n genNum: number,\r\n): string {\r\n const plainBytes = new Uint8Array(str.length);\r\n for (let i = 0; i < str.length; i++) plainBytes[i] = str.charCodeAt(i) & 0xFF;\r\n\r\n const objKey = deriveObjectKey(state, objNum, genNum);\r\n const iv = randomBytes(16);\r\n const cipher = aesCBC(plainBytes, objKey, iv);\r\n\r\n // Return as hex string\r\n let hex = '';\r\n for (let i = 0; i < iv.length; i++) hex += iv[i].toString(16).padStart(2, '0');\r\n for (let i = 0; i < cipher.length; i++) hex += cipher[i].toString(16).padStart(2, '0');\r\n return `<${hex.toUpperCase()}>`;\r\n}\r\n\r\n/**\r\n * Derive per-object encryption key.\r\n * AES-128 (R4): MD5(key + objNum LE + genNum LE + \"sAlT\") truncated\r\n * AES-256 (R6): use file key directly\r\n */\r\nfunction deriveObjectKey(state: EncryptionState, objNum: number, genNum: number): Uint8Array {\r\n if (state.algorithm === 'aes256') {\r\n return state.key;\r\n }\r\n\r\n // R4: per-object key = MD5(key + objLE + genLE + \"sAlT\")\r\n const buf = new Uint8Array(state.key.length + 5 + 4);\r\n let off = 0;\r\n buf.set(state.key, off); off += state.key.length;\r\n buf[off++] = objNum & 0xFF;\r\n buf[off++] = (objNum >> 8) & 0xFF;\r\n buf[off++] = (objNum >> 16) & 0xFF;\r\n buf[off++] = genNum & 0xFF;\r\n buf[off++] = (genNum >> 8) & 0xFF;\r\n // AES \"sAlT\" marker\r\n buf[off++] = 0x73; // 's'\r\n buf[off++] = 0x41; // 'A'\r\n buf[off++] = 0x6C; // 'l'\r\n buf[off++] = 0x54; // 'T'\r\n\r\n const hash = md5(buf);\r\n // Key length = min(key.length + 5, 16) → always 16 for AES-128\r\n return hash.subarray(0, 16);\r\n}\r\n\r\n/**\r\n * Build the /Encrypt dictionary for the PDF trailer.\r\n *\r\n * @param state - Encryption state from initEncryption()\r\n * @returns PDF dictionary string for the /Encrypt entry\r\n */\r\nexport function buildEncryptDict(state: EncryptionState): string {\r\n if (state.algorithm === 'aes256') {\r\n return buildEncryptDictR6(state);\r\n }\r\n return buildEncryptDictR4(state);\r\n}\r\n\r\nfunction hexStr(bytes: Uint8Array): string {\r\n let h = '';\r\n for (let i = 0; i < bytes.length; i++) h += bytes[i].toString(16).padStart(2, '0');\r\n return h.toUpperCase();\r\n}\r\n\r\nfunction buildEncryptDictR4(state: EncryptionState): string {\r\n return `<< /Type /Encrypt /Filter /Standard /V 4 /R 4 /Length 128 ` +\r\n `/CF << /StdCF << /Type /CryptFilter /CFM /AESV2 /Length 16 >> >> ` +\r\n `/StmF /StdCF /StrF /StdCF ` +\r\n `/O <${hexStr(state.oValue)}> ` +\r\n `/U <${hexStr(state.uValue)}> ` +\r\n `/P ${state.pValue} >>`;\r\n}\r\n\r\nfunction buildEncryptDictR6(state: EncryptionState): string {\r\n const { oeValue, ueValue, permsValue } = state;\r\n if (!oeValue || !ueValue || !permsValue) throw new Error('R6 encryption requires OE, UE, and Perms values');\r\n return `<< /Type /Encrypt /Filter /Standard /V 5 /R 6 /Length 256 ` +\r\n `/CF << /StdCF << /Type /CryptFilter /CFM /AESV3 /Length 32 >> >> ` +\r\n `/StmF /StdCF /StrF /StdCF ` +\r\n `/O <${hexStr(state.oValue)}> ` +\r\n `/U <${hexStr(state.uValue)}> ` +\r\n `/OE <${hexStr(oeValue)}> ` +\r\n `/UE <${hexStr(ueValue)}> ` +\r\n `/Perms <${hexStr(permsValue)}> ` +\r\n `/P ${state.pValue} >>`;\r\n}\r\n\r\n/**\r\n * Build the /ID array for the trailer.\r\n *\r\n * @param docId - 16-byte document identifier\r\n * @returns PDF syntax for the /ID array (two identical hex strings)\r\n */\r\nexport function buildIdArray(docId: Uint8Array): string {\r\n const h = hexStr(docId);\r\n return `[<${h}> <${h}>]`;\r\n}\r\n","/**\r\n * pdfnative — PDF Binary Assembler\r\n * ===================================\r\n * Shared low-level PDF binary assembly primitives used by both\r\n * the table builder (pdf-builder.ts) and document builder (pdf-document.ts).\r\n *\r\n * Handles object emission, stream compression/encryption, xref table,\r\n * and trailer generation — the identical parts of PDF assembly.\r\n */\r\n\r\nimport { compressStream } from './pdf-compress.js';\r\nimport { encryptStream, buildEncryptDict, buildIdArray, md5, type EncryptionState } from './pdf-encrypt.js';\r\n\r\n// ── PDF Writer ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * Low-level PDF binary writer with offset tracking.\r\n * Created via `createPdfWriter()`. Provides `emit`, `emitObj`, and `emitStreamObj`.\r\n */\r\nexport interface PdfWriter {\r\n /** Append raw string to PDF output and advance byte offset. */\r\n readonly emit: (str: string) => void;\r\n /** Emit a PDF indirect object (`num 0 obj ... endobj`). */\r\n readonly emitObj: (num: number, content: string) => void;\r\n /** Emit a stream object with optional compression and encryption. */\r\n readonly emitStreamObj: (num: number, dictEntries: string, streamData: string, skipCompress?: boolean) => void;\r\n /** Current byte offset in the output. */\r\n readonly offset: () => number;\r\n /** Adjust the tracked byte offset by a delta (for in-place catalog rewrites). */\r\n readonly adjustOffset: (delta: number) => void;\r\n /** Per-object byte offsets for xref table. */\r\n readonly objOffsets: number[];\r\n /** Accumulated output parts. Join with '' for final PDF string. */\r\n readonly parts: string[];\r\n}\r\n\r\n/**\r\n * Create a PDF binary writer with offset-tracked emission.\r\n *\r\n * @param compress - Whether to FlateDecode-compress streams\r\n * @param encState - Encryption state (null if no encryption)\r\n * @returns PdfWriter with emit/emitObj/emitStreamObj\r\n */\r\nexport function createPdfWriter(compress: boolean, encState: EncryptionState | null): PdfWriter {\r\n const parts: string[] = [];\r\n let _offset = 0;\r\n const objOffsets: number[] = [];\r\n\r\n function emit(str: string): void {\r\n parts.push(str);\r\n _offset += str.length;\r\n }\r\n\r\n function emitObj(num: number, content: string): void {\r\n objOffsets[num] = _offset;\r\n emit(`${num} 0 obj\\n${content}\\nendobj\\n\\n`);\r\n }\r\n\r\n /**\r\n * Emit a stream object with optional compression and encryption.\r\n * Order: compress → encrypt (ISO 32000-1 §7.3.8).\r\n */\r\n function emitStreamObj(num: number, dictEntries: string, streamData: string, skipCompress?: boolean): void {\r\n let data = streamData;\r\n let dict = dictEntries;\r\n\r\n // Step 1: Compress (before encryption)\r\n if (compress && !skipCompress) {\r\n const compressed = compressStream(data);\r\n dict = dict.replace(/\\/Length \\d+/, `/Filter /FlateDecode /Length ${compressed.length}`);\r\n data = compressed;\r\n }\r\n\r\n // Step 2: Encrypt (after compression)\r\n if (encState) {\r\n const encrypted = encryptStream(data, encState, num, 0);\r\n emitObj(num, `${dict.replace(/\\/Length \\d+/, `/Length ${encrypted.length}`)} >>\\nstream\\n${encrypted}\\nendstream`);\r\n } else {\r\n emitObj(num, `${dict} >>\\nstream\\n${data}\\nendstream`);\r\n }\r\n }\r\n\r\n return { emit, emitObj, emitStreamObj, offset: () => _offset, adjustOffset: (d: number) => { _offset += d; }, objOffsets, parts };\r\n}\r\n\r\n// ── Xref & Trailer ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Write the xref table, trailer, startxref, and %%EOF to finalize a PDF.\r\n * If encryption is active, the encryption dict object is emitted first.\r\n *\r\n * @param w - PDF writer\r\n * @param totalObjs - Total number of objects emitted so far\r\n * @param infoObjNum - Object number of the /Info dictionary\r\n * @param encState - Encryption state (null if no encryption)\r\n * @param idSeed - Seed string used to derive a stable trailer `/ID` for\r\n * unencrypted PDFs. Typically `infoTitle + '|' + pdfDate`. Equal seeds\r\n * produce equal IDs (deterministic, ISO 32000-1 §14.4 friendly).\r\n * Required when `encState` is null.\r\n * @returns Final totalObjs count (may increase if encryption dict was added)\r\n */\r\nexport function writeXrefTrailer(\r\n w: PdfWriter,\r\n totalObjs: number,\r\n infoObjNum: number,\r\n encState: EncryptionState | null,\r\n idSeed: string = '',\r\n): number {\r\n let encryptObjNum = 0;\r\n if (encState) {\r\n encryptObjNum = totalObjs + 1;\r\n w.emitObj(encryptObjNum, buildEncryptDict(encState));\r\n totalObjs = encryptObjNum;\r\n }\r\n\r\n const xrefOffset = w.offset();\r\n w.emit('xref\\n');\r\n w.emit(`0 ${totalObjs + 1}\\n`);\r\n w.emit('0000000000 65535 f \\n');\r\n for (let i = 1; i <= totalObjs; i++) {\r\n if (w.objOffsets[i] >= 10_000_000_000) throw new Error('PDF exceeds maximum xref offset (10 GB)');\r\n w.emit(`${String(w.objOffsets[i]).padStart(10, '0')} 00000 n \\n`);\r\n }\r\n\r\n w.emit('trailer\\n');\r\n // ISO 19005-1 §6.1.3 / ISO 32000-1 §14.4: trailer /ID is required for PDF/A\r\n // and strongly recommended for all PDFs. For unencrypted PDFs we derive a\r\n // stable 16-byte ID from the seed string (MD5 of title + creation date)\r\n // so byte-equal inputs produce byte-equal outputs. Encrypted PDFs reuse\r\n // the random docId already generated for the encryption key.\r\n const docId = encState\r\n ? encState.docId\r\n : md5(new TextEncoder().encode(`pdfnative|${idSeed}|${totalObjs}`));\r\n const idArray = buildIdArray(docId);\r\n if (encState) {\r\n w.emit(`<< /Size ${totalObjs + 1} /Root 1 0 R /Info ${infoObjNum} 0 R /Encrypt ${encryptObjNum} 0 R /ID ${idArray} >>\\n`);\r\n } else {\r\n w.emit(`<< /Size ${totalObjs + 1} /Root 1 0 R /Info ${infoObjNum} 0 R /ID ${idArray} >>\\n`);\r\n }\r\n w.emit('startxref\\n');\r\n w.emit(`${xrefOffset}\\n`);\r\n w.emit('%%EOF');\r\n\r\n return totalObjs;\r\n}\r\n","/**\r\n * pdfnative — PDF Document Builder\r\n * ===================================\r\n * Main entry point: builds a complete PDF 1.4 document as a byte string.\r\n *\r\n * Supports:\r\n * - Latin mode (Helvetica built-in, WinAnsi encoding)\r\n * - Unicode mode (CIDFont Type2/Identity-H, embedded TTF subset)\r\n * - Multi-font (cross-script fallback with automatic font switching)\r\n * - Pagination (auto-calculated page breaks)\r\n * - Table rendering with header/data rows\r\n * - Title, info section, balance box, footer\r\n *\r\n * ISO 32000-1 (PDF 1.4) compliant output.\r\n */\r\n\r\nimport type {\r\n PdfParams,\r\n FontEntry,\r\n EncodingContext,\r\n PdfLayoutOptions,\r\n ColumnDef,\r\n PageTemplate,\r\n PdfColor,\r\n} from '../types/pdf-types.js';\r\nimport { createEncodingContext } from './encoding-context.js';\r\nimport { truncate } from '../fonts/encoding.js';\r\nimport { buildToUnicodeCMap, buildSubsetWidthArray } from '../fonts/font-embedder.js';\r\nimport { getDecodedFontBytes } from '../fonts/font-loader.js';\r\nimport { subsetTTF, uint8ToBinaryString } from '../fonts/font-subsetter.js';\r\nimport { txt, txtR, txtC, txtTagged, txtRTagged, txtCTagged, fmtNum, encodePdfTextString } from './pdf-text.js';\r\nimport { toBytes } from './pdf-stream.js';\r\nimport {\r\n PG_W, PG_H, DEFAULT_MARGINS,\r\n ROW_H, TH_H, INFO_LN, BAL_H, TITLE_LN, FT_H, HEADER_H,\r\n DEFAULT_FONT_SIZES, DEFAULT_COLORS, DEFAULT_COLUMNS,\r\n computeColumnPositions,\r\n resolveTemplate,\r\n} from './pdf-layout.js';\r\nimport { normalizeColors, parseColor } from './pdf-color.js';\r\nimport type { StructElement, MCRef } from './pdf-tags.js';\r\nimport {\r\n createMCIDAllocator,\r\n buildStructureTree,\r\n buildXMPMetadata,\r\n buildOutputIntentDict,\r\n buildMinimalSRGBProfile,\r\n buildPdfMetadata,\r\n resolvePdfAConfig,\r\n buildEmbeddedFiles,\r\n validateAttachments,\r\n} from './pdf-tags.js';\r\nimport type { EncryptionState } from './pdf-encrypt.js';\r\nimport { initEncryption } from './pdf-encrypt.js';\r\nimport { createPdfWriter, writeXrefTrailer } from './pdf-assembler.js';\r\nimport type { WatermarkState } from './pdf-watermark.js';\r\nimport { validateWatermark, buildWatermarkState } from './pdf-watermark.js';\r\n\r\n// ── Tagged Mode Helper Types ─────────────────────────────────────────\r\n\r\ninterface TagContext {\r\n tagged: boolean;\r\n mcidAlloc: ReturnType<typeof createMCIDAllocator>;\r\n pageObjNum: number;\r\n structChildren: (StructElement | MCRef)[];\r\n}\r\n\r\n// ── Table Builder Helpers ────────────────────────────────────────────\r\n\r\nfunction _buildTableHeader(\r\n y: number,\r\n headers: readonly string[],\r\n enc: EncodingContext,\r\n cx: number[],\r\n cwi: number[],\r\n columns: readonly ColumnDef[],\r\n cw: number,\r\n mgL: number,\r\n mgR: number,\r\n pgW: number,\r\n colors: typeof DEFAULT_COLORS,\r\n fs: typeof DEFAULT_FONT_SIZES,\r\n tagCtx?: TagContext,\r\n): { ops: string[]; y: number; structRow?: StructElement } {\r\n const ops: string[] = [];\r\n ops.push(`${colors.thBg} rg`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - TH_H)} ${fmtNum(cw)} ${fmtNum(TH_H)} re f`);\r\n ops.push(`0.75 w ${colors.thBrd} RG`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - TH_H)} m ${fmtNum(pgW - mgR)} ${fmtNum(y - TH_H)} l S`);\r\n ops.push(`${colors.text} rg`);\r\n\r\n const thChildren: (StructElement | MCRef)[] = [];\r\n\r\n for (let i = 0; i < headers.length; i++) {\r\n const t = truncate(headers[i], columns[i].mxH ?? columns[i].mx);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n const mcref: MCRef = { mcid, pageObjNum: tagCtx.pageObjNum };\r\n const thEl: StructElement = { type: 'TH', children: [mcref] };\r\n thChildren.push(thEl);\r\n if (columns[i].a === 'r') {\r\n ops.push(txtRTagged(t, cx[i] + cwi[i] - 3, y - TH_H + 4, enc.f2, fs.th, enc, mcid));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtCTagged(t, cx[i], y - TH_H + 4, enc.f2, fs.th, cwi[i], enc, mcid));\r\n } else {\r\n ops.push(txtTagged(t, cx[i] + 3, y - TH_H + 4, enc.f2, fs.th, enc, mcid));\r\n }\r\n } else {\r\n if (columns[i].a === 'r') {\r\n ops.push(txtR(t, cx[i] + cwi[i] - 3, y - TH_H + 4, enc.f2, fs.th, enc));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtC(t, cx[i], y - TH_H + 4, enc.f2, fs.th, cwi[i], enc));\r\n } else {\r\n ops.push(txt(t, cx[i] + 3, y - TH_H + 4, enc.f2, fs.th, enc));\r\n }\r\n }\r\n }\r\n\r\n const structRow = tagCtx?.tagged ? { type: 'TR', children: thChildren } as StructElement : undefined;\r\n return { ops, y: y - TH_H, structRow };\r\n}\r\n\r\nfunction _buildDataRow(\r\n y: number,\r\n cells: readonly string[],\r\n type: string,\r\n pointed: boolean,\r\n enc: EncodingContext,\r\n cx: number[],\r\n cwi: number[],\r\n columns: readonly ColumnDef[],\r\n cw: number,\r\n mgL: number,\r\n mgR: number,\r\n pgW: number,\r\n colors: typeof DEFAULT_COLORS,\r\n fs: typeof DEFAULT_FONT_SIZES,\r\n tagCtx?: TagContext,\r\n): { ops: string[]; y: number; structRow?: StructElement } {\r\n const ops: string[] = [];\r\n if (pointed) {\r\n ops.push(`${colors.ptdBg} rg`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - ROW_H)} ${fmtNum(cw)} ${fmtNum(ROW_H)} re f`);\r\n }\r\n ops.push(`0.25 w ${colors.rowBrd} RG`);\r\n ops.push(`${fmtNum(mgL)} ${fmtNum(y - ROW_H)} m ${fmtNum(pgW - mgR)} ${fmtNum(y - ROW_H)} l S`);\r\n\r\n const tdChildren: (StructElement | MCRef)[] = [];\r\n\r\n for (let i = 0; i < cells.length; i++) {\r\n const t = truncate(cells[i], columns[i].mx);\r\n const isAmount = (i === 3);\r\n const color = isAmount ? (type === 'credit' ? colors.credit : colors.debit) : colors.text;\r\n const font = isAmount ? enc.f2 : enc.f1;\r\n ops.push(`${color} rg`);\r\n\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n const mcref: MCRef = { mcid, pageObjNum: tagCtx.pageObjNum };\r\n const tdEl: StructElement = { type: 'TD', children: [mcref] };\r\n tdChildren.push(tdEl);\r\n if (columns[i].a === 'r') {\r\n ops.push(txtRTagged(t, cx[i] + cwi[i] - 3, y - ROW_H + 3, font, fs.td, enc, mcid));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtCTagged(t, cx[i], y - ROW_H + 3, font, fs.td, cwi[i], enc, mcid));\r\n } else {\r\n ops.push(txtTagged(t, cx[i] + 3, y - ROW_H + 3, font, fs.td, enc, mcid));\r\n }\r\n } else {\r\n if (columns[i].a === 'r') {\r\n ops.push(txtR(t, cx[i] + cwi[i] - 3, y - ROW_H + 3, font, fs.td, enc));\r\n } else if (columns[i].a === 'c') {\r\n ops.push(txtC(t, cx[i], y - ROW_H + 3, font, fs.td, cwi[i], enc));\r\n } else {\r\n ops.push(txt(t, cx[i] + 3, y - ROW_H + 3, font, fs.td, enc));\r\n }\r\n }\r\n }\r\n\r\n const structRow = tagCtx?.tagged ? { type: 'TR', children: tdChildren } as StructElement : undefined;\r\n return { ops, y: y - ROW_H, structRow };\r\n}\r\n\r\nfunction _buildPageTemplate(\r\n template: PageTemplate,\r\n page: number,\r\n pages: number,\r\n title: string,\r\n date: string,\r\n y: number,\r\n enc: EncodingContext,\r\n mgL: number,\r\n mgR: number,\r\n pgW: number,\r\n cw: number,\r\n defaultColor: PdfColor,\r\n defaultFontSize: number,\r\n tagCtx?: TagContext,\r\n): { ops: string[]; structEls: StructElement[] } {\r\n const ops: string[] = [];\r\n const structEls: StructElement[] = [];\r\n const sz = template.fontSize ?? defaultFontSize;\r\n const color = parseColor(template.color ?? defaultColor);\r\n\r\n ops.push(`${color} rg`);\r\n\r\n if (template.left) {\r\n const text = resolveTemplate(template.left, page, pages, title, date);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n ops.push(txtTagged(text, mgL, y, enc.f1, sz, enc, mcid));\r\n structEls.push({ type: 'P', children: [{ mcid, pageObjNum: tagCtx.pageObjNum }] });\r\n } else {\r\n ops.push(txt(text, mgL, y, enc.f1, sz, enc));\r\n }\r\n }\r\n\r\n if (template.center) {\r\n const text = resolveTemplate(template.center, page, pages, title, date);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n ops.push(txtCTagged(text, mgL, y, enc.f1, sz, cw, enc, mcid));\r\n structEls.push({ type: 'P', children: [{ mcid, pageObjNum: tagCtx.pageObjNum }] });\r\n } else {\r\n ops.push(txtC(text, mgL, y, enc.f1, sz, cw, enc));\r\n }\r\n }\r\n\r\n if (template.right) {\r\n const text = resolveTemplate(template.right, page, pages, title, date);\r\n if (tagCtx?.tagged) {\r\n const mcid = tagCtx.mcidAlloc.next(tagCtx.pageObjNum);\r\n ops.push(txtRTagged(text, pgW - mgR, y, enc.f1, sz, enc, mcid));\r\n structEls.push({ type: 'P', children: [{ mcid, pageObjNum: tagCtx.pageObjNum }] });\r\n } else {\r\n ops.push(txtR(text, pgW - mgR, y, enc.f1, sz, enc));\r\n }\r\n }\r\n\r\n return { ops, structEls };\r\n}\r\n\r\n// ── Main Builder ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Build a complete PDF document as a single-byte string.\r\n *\r\n * @param params - Document content (title, info items, rows, etc.)\r\n * @param layoutOptions - Optional layout customization\r\n * @returns Complete PDF as a binary string\r\n */\r\nexport function buildPDF(params: PdfParams, layoutOptions?: Partial<PdfLayoutOptions>): string {\r\n // ── Input Validation (system boundary) ───────────────────────────\r\n if (!params || typeof params !== 'object') {\r\n throw new Error('buildPDF: params is required and must be an object');\r\n }\r\n if (!Array.isArray(params.rows)) {\r\n throw new Error('buildPDF: params.rows must be an array');\r\n }\r\n if (!Array.isArray(params.headers)) {\r\n throw new Error('buildPDF: params.headers must be an array');\r\n }\r\n if (params.rows.length > 100_000) {\r\n throw new Error(`buildPDF: row count (${params.rows.length}) exceeds safe limit (100,000)`);\r\n }\r\n\r\n const { title, infoItems, balanceText, countText, headers, rows, footerText, fontData } = params;\r\n\r\n // Resolve layout\r\n const pgW = layoutOptions?.pageWidth ?? PG_W;\r\n const pgH = layoutOptions?.pageHeight ?? PG_H;\r\n const mg = layoutOptions?.margins ?? DEFAULT_MARGINS;\r\n const cw = pgW - mg.l - mg.r;\r\n const columns = layoutOptions?.columns ?? DEFAULT_COLUMNS;\r\n const rawColors = layoutOptions?.colors ?? DEFAULT_COLORS;\r\n const colors = layoutOptions?.colors ? normalizeColors(rawColors) : rawColors;\r\n const fs = layoutOptions?.fontSizes\r\n ? { ...DEFAULT_FONT_SIZES, ...layoutOptions.fontSizes }\r\n : DEFAULT_FONT_SIZES;\r\n const { cx, cwi } = computeColumnPositions(columns, mg.l, cw);\r\n\r\n // Build fontEntries\r\n const fontEntries: FontEntry[] = params.fontEntries\r\n || (fontData ? [{ fontData, fontRef: '/F3', lang: 'unknown' }] : []);\r\n\r\n const enc = createEncodingContext(fontEntries);\r\n\r\n // ── Resolve header/footer templates ──────────────────────────────\r\n const footerTpl: PageTemplate = layoutOptions?.footerTemplate ?? {\r\n left: footerText || undefined,\r\n right: '{page}/{pages}',\r\n };\r\n const headerTpl: PageTemplate | undefined = layoutOptions?.headerTemplate;\r\n const headerH = headerTpl ? HEADER_H : 0;\r\n\r\n const dateNow = new Date();\r\n const pad2d = (n: number) => String(n).padStart(2, '0');\r\n const dateStr = `${dateNow.getFullYear()}-${pad2d(dateNow.getMonth() + 1)}-${pad2d(dateNow.getDate())}`;\r\n\r\n // ── Pagination ───────────────────────────────────────────────────\r\n const infoCount = infoItems.length;\r\n const page1Header = TITLE_LN + 16 + (infoCount * INFO_LN) + 8 + BAL_H + 10;\r\n const rowsPage1 = Math.max(0, Math.floor((pgH - mg.t - mg.b - page1Header - TH_H - FT_H - headerH) / ROW_H));\r\n const rowsPerPage = Math.max(1, Math.floor((pgH - mg.t - mg.b - TH_H - FT_H - headerH) / ROW_H));\r\n const totalRows = rows.length;\r\n\r\n let totalPages: number;\r\n if (totalRows <= rowsPage1) {\r\n totalPages = 1;\r\n } else {\r\n totalPages = 1 + Math.ceil((totalRows - rowsPage1) / rowsPerPage);\r\n }\r\n if (totalPages < 1) totalPages = 1;\r\n\r\n // ── Tagged mode setup ─────────────────────────────────────────────\r\n const pdfaConfig = resolvePdfAConfig(layoutOptions?.tagged);\r\n const tagged = pdfaConfig.enabled;\r\n\r\n // ── Encryption setup ──────────────────────────────────────────────\r\n const encryptionOpts = layoutOptions?.encryption;\r\n if (tagged && encryptionOpts) {\r\n throw new Error('PDF/A and encryption are mutually exclusive (ISO 19005-1 §6.3.2)');\r\n }\r\n const encState: EncryptionState | null = encryptionOpts ? initEncryption(encryptionOpts) : null;\r\n\r\n // ── Compression setup ─────────────────────────────────────────────\r\n const compress = layoutOptions?.compress === true;\r\n\r\n // ── Watermark setup ──────────────────────────────────────────────\r\n const watermarkOpts = layoutOptions?.watermark;\r\n if (watermarkOpts) {\r\n validateWatermark(watermarkOpts, layoutOptions?.tagged);\r\n }\r\n\r\n // ── Attachments setup (PDF/A-3 only) ─────────────────────────────\r\n const attachments = layoutOptions?.attachments;\r\n validateAttachments(attachments, layoutOptions?.tagged);\r\n\r\n const wmState: WatermarkState | null = watermarkOpts\r\n ? buildWatermarkState(watermarkOpts, pgW, pgH, enc)\r\n : null;\r\n const wmExtraObjs = wmState\r\n ? wmState.extGStates.size + (wmState.imageXObj ? 1 : 0)\r\n : 0;\r\n\r\n const mcidAlloc = tagged ? createMCIDAllocator() : undefined;\r\n\r\n // Structure elements collected during page building (only when tagged)\r\n // The document structure: /Document → [/P (title), /P (info)..., /P (balance), /Table, /P (footer)...]\r\n const documentChildren: (StructElement | MCRef)[] = [];\r\n const tableRows: StructElement[] = [];\r\n\r\n // ── Build page content streams ───────────────────────────────────\r\n const pageStreams: string[] = [];\r\n let rowIdx = 0;\r\n\r\n // We need page obj nums for MCRef, but they depend on font count which we already know.\r\n // Compute pageObjStart the same way the assembly section does.\r\n const prePageObjStart = (enc.isUnicode && fontEntries.length > 0)\r\n ? 5 + fontEntries.length * 5 + wmExtraObjs\r\n : 5 + wmExtraObjs;\r\n\r\n // Map page object numbers to /StructParents values for ParentTree (ISO 32000-1 §14.7.4.4)\r\n const pageObjToStructParents = new Map<number, number>();\r\n\r\n for (let p = 0; p < totalPages; p++) {\r\n const pageObjNum = prePageObjStart + p * 2;\r\n if (tagged) pageObjToStructParents.set(pageObjNum, p);\r\n const tagCtx: TagContext | undefined = tagged && mcidAlloc\r\n ? { tagged: true, mcidAlloc, pageObjNum, structChildren: [] }\r\n : undefined;\r\n\r\n const ops: string[] = [];\r\n let y = pgH - mg.t;\r\n\r\n // Render header template (if provided)\r\n if (headerTpl) {\r\n const ht = _buildPageTemplate(\r\n headerTpl, p + 1, totalPages, title, dateStr,\r\n y - (headerTpl.fontSize ?? fs.ft),\r\n enc, mg.l, mg.r, pgW, cw, colors.footer, fs.ft, tagCtx,\r\n );\r\n ops.push(...ht.ops);\r\n if (tagged) documentChildren.push(...ht.structEls);\r\n y -= HEADER_H;\r\n }\r\n\r\n // Background watermark (behind content)\r\n if (wmState?.backgroundOps) {\r\n ops.push(wmState.backgroundOps);\r\n }\r\n\r\n if (p === 0) {\r\n // Title\r\n ops.push(`${colors.title} rg`);\r\n if (tagCtx) {\r\n const mcid = tagCtx.mcidAlloc.next(pageObjNum);\r\n ops.push(txtTagged(title, mg.l, y - fs.title, enc.f2, fs.title, enc, mcid));\r\n documentChildren.push({ type: 'P', children: [{ mcid, pageObjNum }] });\r\n } else {\r\n ops.push(txt(title, mg.l, y - fs.title, enc.f2, fs.title, enc));\r\n }\r\n y -= TITLE_LN;\r\n\r\n // Title underline\r\n ops.push(`0.75 w ${colors.title} RG`);\r\n ops.push(`${fmtNum(mg.l)} ${fmtNum(y)} m ${fmtNum(pgW - mg.r)} ${fmtNum(y)} l S`);\r\n y -= 14;\r\n\r\n // Info section\r\n for (const item of infoItems) {\r\n ops.push(`${colors.label} rg`);\r\n if (tagCtx) {\r\n const mcidLabel = tagCtx.mcidAlloc.next(pageObjNum);\r\n const mcidValue = tagCtx.mcidAlloc.next(pageObjNum);\r\n ops.push(txtTagged(`${item.label} :`, mg.l, y, enc.f2, fs.info, enc, mcidLabel));\r\n ops.push(`${colors.text} rg`);\r\n ops.push(txtTagged(item.value, mg.l + 100, y, enc.f1, fs.info, enc, mcidValue));\r\n documentChildren.push({\r\n type: 'P',\r\n children: [\r\n { mcid: mcidLabel, pageObjNum },\r\n { mcid: mcidValue, pageObjNum },\r\n ],\r\n });\r\n } else {\r\n ops.push(txt(`${item.label} :`, mg.l, y, enc.f2, fs.info, enc));\r\n ops.push(`${colors.text} rg`);\r\n ops.push(txt(item.value, mg.l + 100, y, enc.f1, fs.info, enc));\r\n }\r\n y -= INFO_LN;\r\n }\r\n y -= 6;\r\n\r\n // Balance box\r\n ops.push(`${colors.balBg} rg`);\r\n ops.push(`${fmtNum(mg.l)} ${fmtNum(y - BAL_H)} ${fmtNum(cw)} ${fmtNum(BAL_H)} re f`);\r\n ops.push(`0.5 w ${colors.balBrd} RG`);\r\n ops.push(`${fmtNum(mg.l)} ${fmtNum(y - BAL_H)} ${fmtNum(cw)} ${fmtNum(BAL_H)} re S`);\r\n ops.push(`${colors.title} rg`);\r\n if (tagCtx) {\r\n const mcidBal = tagCtx.mcidAlloc.next(pageObjNum);\r\n const mcidCnt = tagCtx.mcidAlloc.next(pageObjNum);\r\n ops.push(txtTagged(balanceText, mg.l + 8, y - 14, enc.f2, 12, enc, mcidBal));\r\n ops.push(`${colors.footer} rg`);\r\n ops.push(txtTagged(countText, mg.l + 8, y - 26, enc.f1, 7, enc, mcidCnt));\r\n documentChildren.push({\r\n type: 'P',\r\n children: [\r\n { mcid: mcidBal, pageObjNum },\r\n { mcid: mcidCnt, pageObjNum },\r\n ],\r\n });\r\n } else {\r\n ops.push(txt(balanceText, mg.l + 8, y - 14, enc.f2, 12, enc));\r\n ops.push(`${colors.footer} rg`);\r\n ops.push(txt(countText, mg.l + 8, y - 26, enc.f1, 7, enc));\r\n }\r\n y -= BAL_H + 8;\r\n }\r\n\r\n // Table header\r\n const th = _buildTableHeader(y, headers, enc, cx, cwi, columns, cw, mg.l, mg.r, pgW, colors, fs, tagCtx);\r\n ops.push(...th.ops);\r\n y = th.y;\r\n if (th.structRow) tableRows.push(th.structRow);\r\n\r\n // Table rows\r\n const maxRows = (p === 0) ? rowsPage1 : rowsPerPage;\r\n const endIdx = Math.min(rowIdx + maxRows, totalRows);\r\n while (rowIdx < endIdx) {\r\n const row = rows[rowIdx];\r\n const dr = _buildDataRow(y, row.cells, row.type, row.pointed, enc, cx, cwi, columns, cw, mg.l, mg.r, pgW, colors, fs, tagCtx);\r\n ops.push(...dr.ops);\r\n y = dr.y;\r\n if (dr.structRow) tableRows.push(dr.structRow);\r\n rowIdx++;\r\n }\r\n\r\n // Foreground watermark (above content)\r\n if (wmState?.foregroundOps) {\r\n ops.push(wmState.foregroundOps);\r\n }\r\n\r\n // Footer\r\n const ft = _buildPageTemplate(\r\n footerTpl, p + 1, totalPages, title, dateStr,\r\n mg.b - 5, enc, mg.l, mg.r, pgW, cw, colors.footer, fs.ft, tagCtx,\r\n );\r\n ops.push(...ft.ops);\r\n if (tagged) documentChildren.push(...ft.structEls);\r\n\r\n pageStreams.push(ops.join('\\n'));\r\n }\r\n\r\n // Build the table structure element (inserted before footer /P elements)\r\n if (tagged && tableRows.length > 0) {\r\n const tableEl: StructElement = { type: 'Table', children: tableRows };\r\n // Insert table after header P elements and before footer P elements\r\n // Header P elements: 1 (title) + infoItems.length + 1 (balance) = infoItems.length + 2\r\n const headerPCount = infoItems.length + 2;\r\n documentChildren.splice(headerPCount, 0, tableEl);\r\n }\r\n\r\n // ── Assemble PDF binary ──────────────────────────────────────────\r\n const { emit, emitObj, emitStreamObj, offset: getOffset, adjustOffset, objOffsets, parts } = createPdfWriter(compress, encState);\r\n\r\n // PDF Header\r\n emit(`%PDF-${pdfaConfig.pdfVersion}\\n`);\r\n emit('%\\xE2\\xE3\\xCF\\xD3\\n\\n');\r\n\r\n // Catalog — placeholder, will be rewritten after we know tagged obj nums\r\n emitObj(1, '<< /Type /Catalog /Pages 2 0 R >>');\r\n\r\n let pageObjStart: number;\r\n let structTreeRootObjNum = 0;\r\n\r\n if (enc.isUnicode && fontEntries.length > 0) {\r\n // Unicode mode: 5 objects per CIDFont group\r\n pageObjStart = 5 + fontEntries.length * 5 + wmExtraObjs;\r\n\r\n const kids: string[] = [];\r\n for (let p = 0; p < totalPages; p++) {\r\n kids.push(`${pageObjStart + p * 2} 0 R`);\r\n }\r\n emitObj(2, `<< /Type /Pages /Kids [${kids.join(' ')}] /Count ${totalPages} >>`);\r\n\r\n // Helvetica fonts (kept for mixed-content fallback)\r\n emitObj(3, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>');\r\n emitObj(4, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>');\r\n\r\n // CIDFont Type2 objects — one group of 5 per fontEntry\r\n for (let fi = 0; fi < fontEntries.length; fi++) {\r\n const fe = fontEntries[fi];\r\n const fd = fe.fontData;\r\n const base = 5 + fi * 5;\r\n\r\n const fontBytes = getDecodedFontBytes(fd);\r\n const usedGids = enc.getUsedGids ? enc.getUsedGids().get(fe.fontRef) : null;\r\n const ttfBinary = usedGids && usedGids.size > 0\r\n ? subsetTTF(fontBytes, usedGids)\r\n : uint8ToBinaryString(fontBytes);\r\n\r\n const fm = fd.metrics;\r\n const bfName = `/${fd.fontName.replace(/[^A-Za-z0-9-]/g, '')}`;\r\n const toUnicodeCMap = usedGids && usedGids.size > 0\r\n ? buildToUnicodeCMap(fd.cmap, usedGids)\r\n : buildToUnicodeCMap(fd.cmap, new Set());\r\n\r\n const subsetW = buildSubsetWidthArray(fd.widths, usedGids ?? new Set());\r\n const wArray = subsetW || fd.pdfWidthArray;\r\n\r\n // Type0 (Composite Font)\r\n emitObj(base,\r\n `<< /Type /Font /Subtype /Type0 /BaseFont ${bfName} ` +\r\n `/Encoding /Identity-H /DescendantFonts [${base + 1} 0 R] /ToUnicode ${base + 4} 0 R >>`);\r\n\r\n // CIDFont\r\n emitObj(base + 1,\r\n `<< /Type /Font /Subtype /CIDFontType2 /BaseFont ${bfName} ` +\r\n `/CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> ` +\r\n `/FontDescriptor ${base + 2} 0 R ` +\r\n `/DW ${fm.defaultWidth} ` +\r\n `/W [${wArray}] ` +\r\n `/CIDToGIDMap /Identity >>`);\r\n\r\n // FontDescriptor\r\n emitObj(base + 2,\r\n `<< /Type /FontDescriptor /FontName ${bfName} ` +\r\n `/Flags 4 ` +\r\n `/FontBBox [${fm.bbox.join(' ')}] ` +\r\n `/ItalicAngle 0 ` +\r\n `/Ascent ${fm.ascent} ` +\r\n `/Descent ${fm.descent} ` +\r\n `/CapHeight ${fm.capHeight} ` +\r\n `/StemV ${fm.stemV} ` +\r\n `/FontFile2 ${base + 3} 0 R >>`);\r\n\r\n // FontFile2 (raw TTF binary stream)\r\n emitStreamObj(base + 3,\r\n `<< /Length ${ttfBinary.length} /Length1 ${ttfBinary.length}`, ttfBinary);\r\n\r\n // ToUnicode CMap stream\r\n emitStreamObj(base + 4, `<< /Length ${toUnicodeCMap.length}`, toUnicodeCMap);\r\n }\r\n\r\n // Watermark objects (ExtGState + optional image)\r\n const wmObjStart = 5 + fontEntries.length * 5;\r\n let wmGsRes = '';\r\n let wmImgRes = '';\r\n if (wmState) {\r\n let wmObjIdx = 0;\r\n const gsRefs: string[] = [];\r\n for (const [gsName, gsDict] of wmState.extGStates) {\r\n emitObj(wmObjStart + wmObjIdx, gsDict);\r\n gsRefs.push(`${gsName} ${wmObjStart + wmObjIdx} 0 R`);\r\n wmObjIdx++;\r\n }\r\n wmGsRes = gsRefs.length > 0 ? ` /ExtGState << ${gsRefs.join(' ')} >>` : '';\r\n if (wmState.imageXObj) {\r\n emitObj(wmObjStart + wmObjIdx, wmState.imageXObj);\r\n wmImgRes = ` /XObject << /ImW1 ${wmObjStart + wmObjIdx} 0 R >>`;\r\n }\r\n }\r\n\r\n // Build font resources\r\n let fontRes = '/F1 3 0 R /F2 4 0 R';\r\n for (let fi = 0; fi < fontEntries.length; fi++) {\r\n fontRes += ` ${fontEntries[fi].fontRef} ${5 + fi * 5} 0 R`;\r\n }\r\n\r\n // Pages\r\n for (let p = 0; p < totalPages; p++) {\r\n const pageObjNum = pageObjStart + p * 2;\r\n const streamObjNum = pageObjStart + 1 + p * 2;\r\n const stream = pageStreams[p];\r\n\r\n const structParents = tagged ? ` /StructParents ${p}` : '';\r\n emitObj(pageObjNum,\r\n `<< /Type /Page /Parent 2 0 R ` +\r\n `/MediaBox [0 0 ${fmtNum(pgW)} ${fmtNum(pgH)}] ` +\r\n `/Contents ${streamObjNum} 0 R ` +\r\n `/Resources << /Font << ${fontRes} >>${wmImgRes}${wmGsRes} >>${structParents} >>`\r\n );\r\n emitStreamObj(streamObjNum, `<< /Length ${stream.length}`, stream);\r\n }\r\n } else {\r\n // Latin mode\r\n pageObjStart = 5 + wmExtraObjs;\r\n\r\n const kids: string[] = [];\r\n for (let p = 0; p < totalPages; p++) {\r\n kids.push(`${pageObjStart + p * 2} 0 R`);\r\n }\r\n emitObj(2, `<< /Type /Pages /Kids [${kids.join(' ')}] /Count ${totalPages} >>`);\r\n emitObj(3, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>');\r\n emitObj(4, '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>');\r\n\r\n // Watermark objects (Latin mode)\r\n const wmObjStartLatin = 5;\r\n let wmGsResLatin = '';\r\n let wmImgResLatin = '';\r\n if (wmState) {\r\n let wmObjIdx = 0;\r\n const gsRefs: string[] = [];\r\n for (const [gsName, gsDict] of wmState.extGStates) {\r\n emitObj(wmObjStartLatin + wmObjIdx, gsDict);\r\n gsRefs.push(`${gsName} ${wmObjStartLatin + wmObjIdx} 0 R`);\r\n wmObjIdx++;\r\n }\r\n wmGsResLatin = gsRefs.length > 0 ? ` /ExtGState << ${gsRefs.join(' ')} >>` : '';\r\n if (wmState.imageXObj) {\r\n emitObj(wmObjStartLatin + wmObjIdx, wmState.imageXObj);\r\n wmImgResLatin = ` /XObject << /ImW1 ${wmObjStartLatin + wmObjIdx} 0 R >>`;\r\n }\r\n }\r\n\r\n for (let p = 0; p < totalPages; p++) {\r\n const pageObjNum = pageObjStart + p * 2;\r\n const streamObjNum = pageObjStart + 1 + p * 2;\r\n const stream = pageStreams[p];\r\n\r\n const structParents = tagged ? ` /StructParents ${p}` : '';\r\n emitObj(pageObjNum,\r\n `<< /Type /Page /Parent 2 0 R ` +\r\n `/MediaBox [0 0 ${fmtNum(pgW)} ${fmtNum(pgH)}] ` +\r\n `/Contents ${streamObjNum} 0 R ` +\r\n `/Resources << /Font << /F1 3 0 R /F2 4 0 R >>${wmImgResLatin}${wmGsResLatin} >>${structParents} >>`\r\n );\r\n emitStreamObj(streamObjNum, `<< /Length ${stream.length}`, stream);\r\n }\r\n }\r\n\r\n // /Info dictionary (ISO 32000-1 §14.3.3)\r\n const baseObjCount = enc.isUnicode\r\n ? 4 + fontEntries.length * 5 + wmExtraObjs + totalPages * 2\r\n : 4 + wmExtraObjs + totalPages * 2;\r\n const infoObjNum = baseObjCount + 1;\r\n\r\n const { pdfDate, xmpDate: isoDate } = buildPdfMetadata();\r\n const infoTitle = params.docTitle || title || '';\r\n emitObj(infoObjNum,\r\n `<< /Title ${encodePdfTextString(infoTitle)} /Producer (pdfnative) /CreationDate (${pdfDate}) >>`);\r\n\r\n let totalObjs = infoObjNum;\r\n\r\n // ── Tagged PDF objects (StructTreeRoot, XMP, ICC, OutputIntent) ──\r\n let xmpObjNum = 0;\r\n let outputIntentObjNum = 0;\r\n let afArrayStr = '';\r\n let embeddedFilesNamesDict = '';\r\n\r\n if (tagged) {\r\n // Build document structure tree\r\n const documentEl: StructElement = { type: 'Document', children: documentChildren };\r\n const treeStart = totalObjs + 1;\r\n const tree = buildStructureTree(documentEl, treeStart, pageObjToStructParents);\r\n\r\n for (const [objNum, content] of tree.objects) {\r\n emitObj(objNum, content);\r\n }\r\n structTreeRootObjNum = tree.structTreeRootObjNum;\r\n totalObjs = treeStart + tree.totalObjects - 1;\r\n\r\n // XMP metadata stream (skip compression for PDF/A validator compatibility)\r\n xmpObjNum = totalObjs + 1;\r\n const xmpContent = buildXMPMetadata(infoTitle, isoDate, pdfaConfig.pdfaPart, pdfaConfig.pdfaConformance);\r\n emitStreamObj(xmpObjNum,\r\n `<< /Type /Metadata /Subtype /XML /Length ${xmpContent.length}`, xmpContent, true);\r\n totalObjs = xmpObjNum;\r\n\r\n // ICC profile stream\r\n const iccObjNum = totalObjs + 1;\r\n const iccProfile = buildMinimalSRGBProfile();\r\n emitStreamObj(iccObjNum,\r\n `<< /N 3 /Length ${iccProfile.length}`, iccProfile);\r\n totalObjs = iccObjNum;\r\n\r\n // OutputIntent\r\n outputIntentObjNum = totalObjs + 1;\r\n emitObj(outputIntentObjNum, buildOutputIntentDict(iccObjNum, pdfaConfig.outputIntentSubtype));\r\n totalObjs = outputIntentObjNum;\r\n\r\n // Embedded file attachments (PDF/A-3 only)\r\n if (attachments && attachments.length > 0) {\r\n const efResult = buildEmbeddedFiles(attachments, totalObjs + 1);\r\n for (const [objNum, content] of efResult.objects) {\r\n const streamData = efResult.streams.get(objNum);\r\n if (streamData !== undefined) {\r\n emitStreamObj(objNum, content, streamData);\r\n } else {\r\n emitObj(objNum, content);\r\n }\r\n }\r\n afArrayStr = efResult.filespecObjNums.map(n => `${n} 0 R`).join(' ');\r\n embeddedFilesNamesDict = efResult.namesDict;\r\n totalObjs += efResult.totalObjects;\r\n }\r\n }\r\n\r\n // ── Rewrite Catalog with tagged attributes ──────────────────────\r\n if (tagged) {\r\n // Overwrite the catalog object in-place by rebuilding parts[catalogIdx]\r\n // We need to find and replace the catalog entry\r\n let catalogContent =\r\n `<< /Type /Catalog /Pages 2 0 R ` +\r\n `/MarkInfo << /Marked true >> ` +\r\n `/StructTreeRoot ${structTreeRootObjNum} 0 R ` +\r\n `/Metadata ${xmpObjNum} 0 R ` +\r\n `/OutputIntents [${outputIntentObjNum} 0 R]`;\r\n if (afArrayStr) {\r\n catalogContent += ` /AF [${afArrayStr}] ${embeddedFilesNamesDict}`;\r\n }\r\n catalogContent += ` >>`;\r\n\r\n // Rebuild: find the catalog object string and replace it\r\n const oldCatalog = '1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n\\n';\r\n const newCatalog = `1 0 obj\\n${catalogContent}\\nendobj\\n\\n`;\r\n const idx = parts.indexOf(oldCatalog);\r\n if (idx !== -1) {\r\n const sizeDiff = newCatalog.length - oldCatalog.length;\r\n parts[idx] = newCatalog;\r\n // Adjust all offsets after the catalog\r\n adjustOffset(sizeDiff);\r\n for (let i = 2; i <= totalObjs; i++) {\r\n if (objOffsets[i] !== undefined) {\r\n objOffsets[i] += sizeDiff;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Xref, Trailer, %%EOF ────────────────────────────────────────\r\n const writer = { emit, emitObj, emitStreamObj, offset: getOffset, adjustOffset, objOffsets, parts };\r\n writeXrefTrailer(writer, totalObjs, infoObjNum, encState, `${infoTitle}|${pdfDate}`);\r\n\r\n return parts.join('');\r\n}\r\n\r\n/**\r\n * Build a PDF and return it as a Uint8Array (ready for download or Blob).\r\n *\r\n * @param params - PDF content parameters (title, rows, info items, fonts)\r\n * @param layoutOptions - Optional layout customization (page size, margins, tagged mode)\r\n * @returns PDF as Uint8Array ready for download or Blob\r\n */\r\nexport function buildPDFBytes(params: PdfParams, layoutOptions?: Partial<PdfLayoutOptions>): Uint8Array {\r\n return toBytes(buildPDF(params, layoutOptions));\r\n}\r\n","/**\r\n * pdfnative — PDF Worker Entry Point\r\n * =====================================\r\n * Self-contained Web Worker that generates PDFs off the main thread.\r\n * This file is bundled separately by tsup as a standalone worker script.\r\n *\r\n * Protocol:\r\n * Main → Worker: { type: 'GENERATE_PDF', params: PdfParams }\r\n * Worker → Main: { type: 'progress', percent: number }\r\n * Worker → Main: { type: 'complete', pdfBytes: Uint8Array } (Transferable)\r\n * Worker → Main: { type: 'error', message: string }\r\n */\r\n\r\nimport type { PdfParams, WorkerInputMessage } from '../types/pdf-types.js';\r\nimport { buildPDF } from '../core/pdf-builder.js';\r\nimport { toBytes } from '../core/pdf-stream.js';\r\n\r\ndeclare const self: DedicatedWorkerGlobalScope;\r\n\r\nself.onmessage = (e: MessageEvent<WorkerInputMessage>) => {\r\n const msg = e.data;\r\n\r\n if (msg.type !== 'GENERATE_PDF') return;\r\n\r\n try {\r\n const params: PdfParams = msg.params;\r\n\r\n // Report start\r\n self.postMessage({ type: 'progress', percent: 10 });\r\n\r\n // Build PDF string\r\n const pdfString = buildPDF(params);\r\n self.postMessage({ type: 'progress', percent: 80 });\r\n\r\n // Convert to bytes\r\n const pdfBytes = toBytes(pdfString);\r\n self.postMessage({ type: 'progress', percent: 95 });\r\n\r\n // Send back via Transferable (zero-copy)\r\n self.postMessage(\r\n { type: 'complete', pdfBytes },\r\n { transfer: [pdfBytes.buffer] }\r\n );\r\n } catch (err) {\r\n self.postMessage({\r\n type: 'error',\r\n message: err instanceof Error ? err.message : String(err)\r\n });\r\n }\r\n};\r\n\r\n// Announce capabilities\r\nself.postMessage({ type: 'ready', version: '0.1.0' });\r\n"]}