hwpkit-dev 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contract/result.ts","../src/pipeline/registry.ts","../src/model/doc-props.ts","../src/model/builders.ts","../src/safety/ShieldedParser.ts","../src/safety/StyleBridge.ts","../src/toolkit/ArchiveKit.ts","../src/toolkit/XmlKit.ts","../src/toolkit/TextKit.ts","../src/decoders/hwpx/HwpxDecoder.ts","../src/toolkit/BinaryKit.ts","../src/decoders/hwp/HwpScanner.ts","../src/decoders/docx/DocxDecoder.ts","../src/decoders/md/MdDecoder.ts","../src/encoders/hwpx/HwpxEncoder.ts","../src/encoders/docx/DocxEncoder.ts","../src/encoders/md/MdEncoder.ts","../src/pipeline/Pipeline.ts","../src/walk/TreeWalker.ts","../src/walk/tree-ops.ts"],"sourcesContent":["export type Outcome<T> = Ok<T> | Fail;\n\nexport interface Ok<T> {\n ok: true;\n data: T;\n warns: string[];\n}\n\nexport interface Fail {\n ok: false;\n error: string;\n warns: string[];\n}\n\nexport function succeed<T>(data: T, warns: string[] = []): Ok<T> {\n return { ok: true, data, warns };\n}\n\nexport function fail(error: string, warns: string[] = []): Fail {\n return { ok: false, error, warns };\n}\n","import type { Decoder } from '../contract/decoder';\nimport type { Encoder } from '../contract/encoder';\n\nclass FormatRegistry {\n private decoders = new Map<string, Decoder>();\n private encoders = new Map<string, Encoder>();\n\n registerDecoder(d: Decoder): void { this.decoders.set(d.format, d); }\n registerEncoder(e: Encoder): void { this.encoders.set(e.format, e); }\n\n getDecoder(fmt: string): Decoder | undefined { return this.decoders.get(fmt); }\n getEncoder(fmt: string): Encoder | undefined { return this.encoders.get(fmt); }\n\n supportedInputs(): string[] { return [...this.decoders.keys()]; }\n supportedOutputs(): string[] { return [...this.encoders.keys()]; }\n}\n\nexport const registry = new FormatRegistry();\n","export type Align = 'left' | 'center' | 'right' | 'justify';\nexport type VAlign = 'top' | 'mid' | 'bot';\nexport type Heading = 1 | 2 | 3 | 4 | 5 | 6;\nexport type StrokeKind = 'solid' | 'dash' | 'dot' | 'double' | 'none';\n\nexport interface TextProps {\n b?: boolean;\n i?: boolean;\n u?: boolean;\n s?: boolean;\n sup?: boolean;\n sub?: boolean;\n font?: string;\n pt?: number;\n color?: string;\n bg?: string;\n}\n\nexport interface ParaProps {\n align?: Align;\n heading?: Heading;\n indentPt?: number;\n spaceBefore?: number;\n spaceAfter?: number;\n lineHeight?: number;\n listLv?: number;\n listOrd?: boolean;\n listMark?: string;\n}\n\nexport interface Stroke {\n kind: StrokeKind;\n pt: number;\n color: string;\n}\n\nexport interface CellProps {\n top?: Stroke;\n bot?: Stroke;\n left?: Stroke;\n right?: Stroke;\n bg?: string;\n padPt?: number;\n align?: Align;\n va?: VAlign;\n isHeader?: boolean;\n}\n\nexport interface TableLook {\n firstRow?: boolean;\n lastRow?: boolean;\n firstCol?: boolean;\n lastCol?: boolean;\n bandedRows?: boolean;\n bandedCols?: boolean;\n}\n\nexport interface GridProps {\n widthPct?: number;\n colWidths?: number[]; // column widths in points\n defaultStroke?: Stroke;\n look?: TableLook;\n headerRow?: boolean;\n}\n\nexport interface PageDims {\n wPt: number;\n hPt: number;\n mt: number;\n mb: number;\n ml: number;\n mr: number;\n orient?: 'portrait' | 'landscape';\n}\n\nexport interface DocMeta {\n title?: string;\n author?: string;\n subject?: string;\n desc?: string;\n keywords?: string;\n created?: string;\n modified?: string;\n}\n\nexport const A4: PageDims = {\n wPt: 595.28, hPt: 841.89,\n mt: 56.69, mb: 56.69, ml: 70.87, mr: 70.87,\n orient: 'portrait',\n};\n\nexport const DEFAULT_STROKE: Stroke = { kind: 'solid', pt: 0.5, color: '000000' };\n","import type {\n DocRoot, SheetNode, ParaNode, SpanNode, ImgNode,\n GridNode, RowNode, CellNode, ContentNode, TxtNode, PageNumNode,\n} from './doc-tree';\nimport type { TextProps, ParaProps, CellProps, GridProps, DocMeta, PageDims } from './doc-props';\nimport { A4 } from './doc-props';\n\nexport function buildRoot(meta: DocMeta = {}, kids: SheetNode[] = []): DocRoot {\n return { tag: 'root', meta, kids };\n}\n\nexport function buildSheet(\n kids: ContentNode[] = [],\n dims: PageDims = A4,\n opts?: { header?: ParaNode[]; footer?: ParaNode[] },\n): SheetNode {\n const node: SheetNode = { tag: 'sheet', dims, kids };\n if (opts?.header) node.header = opts.header;\n if (opts?.footer) node.footer = opts.footer;\n return node;\n}\n\nexport function buildPageNum(format?: PageNumNode['format']): PageNumNode {\n return { tag: 'pagenum', format };\n}\n\nexport function buildPara(kids: ParaNode['kids'] = [], props: ParaProps = {}): ParaNode {\n return { tag: 'para', props, kids };\n}\n\nexport function buildSpan(content: string, props: TextProps = {}): SpanNode {\n const txt: TxtNode = { tag: 'txt', content };\n return { tag: 'span', props, kids: [txt] };\n}\n\nexport function buildImg(\n b64: string,\n mime: ImgNode['mime'],\n w: number,\n h: number,\n alt?: string,\n): ImgNode {\n return { tag: 'img', b64, mime, w, h, alt };\n}\n\nexport function buildGrid(kids: RowNode[], props: GridProps = {}): GridNode {\n return { tag: 'grid', props, kids };\n}\n\nexport function buildRow(kids: CellNode[]): RowNode {\n return { tag: 'row', kids };\n}\n\nexport function buildCell(\n kids: ParaNode[],\n opts: { cs?: number; rs?: number; props?: CellProps } = {},\n): CellNode {\n return { tag: 'cell', cs: opts.cs ?? 1, rs: opts.rs ?? 1, props: opts.props ?? {}, kids };\n}\n","export class ShieldedParser {\n private log: string[] = [];\n\n /** 단일 요소 안전 파싱 */\n guard<T>(fn: () => T, fallback: T, label: string): T {\n try {\n const v = fn();\n if (v == null) {\n this.warn(label, 'returned null/undefined');\n return fallback;\n }\n return v;\n } catch (e: any) {\n this.warn(label, e?.message ?? String(e));\n return fallback;\n }\n }\n\n /** 배열 각 요소 독립 파싱 (하나 실패해도 나머지 계속) */\n guardAll<I, O>(\n items: I[],\n fn: (x: I, i: number) => O,\n fb: (x: I, i: number) => O,\n label: string,\n ): O[] {\n return items.map((x, i) =>\n this.guard(() => fn(x, i), fb(x, i), `${label}[${i}]`),\n );\n }\n\n /**\n * 표 전용 4단계 폴백\n * Lv1: Full → Lv2: Grid → Lv3: Flat → Lv4: Text\n */\n guardGrid<T>(\n node: unknown,\n lv1Full: (n: unknown) => T,\n lv2Grid: (n: unknown) => T,\n lv3Flat: (n: unknown) => T,\n lv4Text: (n: unknown) => T,\n label: string,\n ): { value: T; level: 1 | 2 | 3 | 4 } {\n const levels: [(n: unknown) => T, 1 | 2 | 3 | 4][] = [\n [lv1Full, 1], [lv2Grid, 2], [lv3Flat, 3], [lv4Text, 4],\n ];\n\n for (const [fn, lv] of levels) {\n try {\n const v = fn(node);\n if (v != null) {\n if (lv > 1) this.warn(label, `degraded to level ${lv}`);\n return { value: v, level: lv };\n }\n } catch (e: any) {\n this.warn(label, `Lv${lv} failed: ${e?.message ?? String(e)}`);\n }\n }\n\n this.warn(label, 'ALL LEVELS FAILED — returning lv4Text forced');\n return { value: lv4Text(null), level: 4 };\n }\n\n /** 이미지 안전 파싱 */\n guardImg<T>(\n node: unknown,\n fn: (n: unknown) => T,\n placeholder: (alt: string) => T,\n label: string,\n ): T {\n try {\n const v = fn(node);\n if (v != null) return v;\n } catch (e: any) {\n this.warn(label, e?.message ?? String(e));\n }\n this.warn(label, 'using placeholder image');\n return placeholder(`[이미지 로드 실패: ${label}]`);\n }\n\n private warn(label: string, msg: string): void {\n const w = `[SHIELD] ${label}: ${msg}`;\n console.warn(w);\n this.log.push(w);\n }\n\n flush(): string[] {\n const r = [...this.log];\n this.log = [];\n return r;\n }\n}\n","import type { Align, StrokeKind, Stroke } from '../model/doc-props';\n\n// ─── 단위 변환 ─────────────────────────────────────────────\nexport const Metric = {\n // HWP 세계 (1 inch = 7200 HWPUNIT)\n hwpToPt: (v: number) => v / 100,\n ptToHwp: (v: number) => Math.round(v * 100),\n hwpToDxa: (v: number) => Math.round(v / 5),\n dxaToHwp: (v: number) => Math.round(v * 5),\n hwpToEmu: (v: number) => Math.round(v * 127),\n emuToHwp: (v: number) => Math.round(v / 127),\n\n // DOCX 세계 (1 inch = 1440 dxa, 1 pt = 20 dxa)\n dxaToPt: (v: number) => v / 20,\n ptToDxa: (v: number) => Math.round(v * 20),\n dxaToEmu: (v: number) => Math.round(v * 635),\n emuToDxa: (v: number) => Math.round(v / 635),\n emuToPt: (v: number) => v / 12700,\n ptToEmu: (v: number) => Math.round(v * 12700),\n\n // HWPX charPr height: 1000 = 10pt\n hHeightToPt: (v: number) => v / 100,\n ptToHHeight: (v: number) => Math.round(v * 100),\n\n // DOCX half-point: 24 = 12pt\n halfPtToPt: (v: number) => v / 2,\n ptToHalfPt: (v: number) => Math.round(v * 2),\n} as const;\n\n// ─── 색상 정규화 ───────────────────────────────────────────\nexport function safeHex(raw: string | number | null | undefined): string | undefined {\n if (raw == null) return undefined;\n if (typeof raw === 'number') {\n if (raw <= 0) return '000000';\n if (raw >= 0xFFFFFF) return undefined;\n return raw.toString(16).padStart(6, '0').toUpperCase();\n }\n let s = String(raw).replace(/^#/, '').toUpperCase();\n if (/^[0-9A-F]{3}$/.test(s)) s = s[0] + s[0] + s[1] + s[1] + s[2] + s[2];\n if (/^[0-9A-F]{6}$/.test(s)) return s;\n if (s === 'AUTO' || s === 'NONE' || s === 'TRANSPARENT') return undefined;\n return undefined;\n}\n\n// ─── 정렬 정규화 ───────────────────────────────────────────\nconst ALIGN_MAP: Record<string, Align> = {\n LEFT: 'left', CENTER: 'center', RIGHT: 'right', JUSTIFY: 'justify',\n BOTH: 'justify', DISTRIBUTE: 'justify',\n left: 'left', center: 'center', right: 'right', both: 'justify',\n start: 'left', end: 'right',\n};\nexport function safeAlign(raw?: string): Align {\n return ALIGN_MAP[raw ?? ''] ?? 'justify';\n}\n\n// ─── 테두리 정규화 ─────────────────────────────────────────\nconst HWPX_STROKE: Record<string, StrokeKind> = {\n SOLID: 'solid', NONE: 'none', DASH: 'dash', DOT: 'dot',\n DOUBLE: 'double', LONG_DASH: 'dash', DASH_DOT: 'dash',\n};\nconst DOCX_STROKE: Record<string, StrokeKind> = {\n single: 'solid', none: 'none', nil: 'none', dashed: 'dash',\n dotted: 'dot', double: 'double', wave: 'solid',\n};\n\nexport function safeStrokeHwpx(type?: string, w?: number, c?: string): Stroke {\n return {\n kind: HWPX_STROKE[type ?? ''] ?? 'solid',\n pt: w != null ? Metric.hwpToPt(w) : 0.5,\n color: safeHex(c) ?? '000000',\n };\n}\n\nexport function safeStrokeDocx(val?: string, sz?: number, c?: string): Stroke {\n return {\n kind: DOCX_STROKE[val ?? ''] ?? 'solid',\n pt: sz != null ? sz / 8 : 0.5,\n color: safeHex(c) ?? '000000',\n };\n}\n\n// ─── 폰트 정규화 ───────────────────────────────────────────\nconst FONT_MAP: Record<string, string> = {\n '맑은 고딕': 'Malgun Gothic',\n '바탕': 'Batang',\n '돋움': 'Dotum',\n '굴림': 'Gulim',\n '한컴바탕': 'Batang',\n '한컴돋움': 'Malgun Gothic',\n '함초롬바탕': 'Batang',\n '함초롬돋움': 'Malgun Gothic',\n};\nexport function safeFont(raw?: string): string {\n return FONT_MAP[raw ?? ''] ?? raw ?? 'Malgun Gothic';\n}\n\n// Reverse mapping: English → Korean (for HWPX encoding)\nconst FONT_MAP_KR: Record<string, string> = {\n 'Malgun Gothic': '맑은 고딕',\n 'Batang': '바탕',\n 'Dotum': '돋움',\n 'Gulim': '굴림',\n};\nexport function safeFontToKr(raw?: string): string {\n return FONT_MAP_KR[raw ?? ''] ?? raw ?? '맑은 고딕';\n}\n","import pako from 'pako';\n\ninterface ZipEntry {\n name: string;\n data: Uint8Array;\n}\n\nexport const ArchiveKit = {\n async inflate(compressed: Uint8Array): Promise<Uint8Array> {\n return pako.inflate(compressed);\n },\n\n async deflate(data: Uint8Array): Promise<Uint8Array> {\n return pako.deflate(data, { level: 6 });\n },\n\n async unzip(zipData: Uint8Array): Promise<Map<string, Uint8Array>> {\n const files = new Map<string, Uint8Array>();\n const view = new DataView(zipData.buffer, zipData.byteOffset, zipData.byteLength);\n\n let offset = 0;\n while (offset < zipData.length - 4) {\n const sig = view.getUint32(offset, true);\n\n if (sig === 0x04034b50) {\n const compressionMethod = view.getUint16(offset + 8, true);\n const compressedSize = view.getUint32(offset + 18, true);\n const uncompressedSize = view.getUint32(offset + 22, true);\n const fileNameLength = view.getUint16(offset + 26, true);\n const extraLength = view.getUint16(offset + 28, true);\n\n const nameBytes = zipData.subarray(offset + 30, offset + 30 + fileNameLength);\n const name = new TextDecoder('utf-8').decode(nameBytes);\n\n const dataOffset = offset + 30 + fileNameLength + extraLength;\n let fileData: Uint8Array;\n\n if (compressionMethod === 0) {\n fileData = zipData.subarray(dataOffset, dataOffset + uncompressedSize);\n } else if (compressionMethod === 8) {\n const compressed = zipData.subarray(dataOffset, dataOffset + compressedSize);\n fileData = pako.inflateRaw(compressed);\n } else {\n throw new Error(`Unsupported ZIP compression method: ${compressionMethod}`);\n }\n\n files.set(name, new Uint8Array(fileData));\n offset = dataOffset + compressedSize;\n } else if (sig === 0x02014b50 || sig === 0x06054b50) {\n break;\n } else {\n offset++;\n }\n }\n\n return files;\n },\n\n async zip(entries: ZipEntry[]): Promise<Uint8Array> {\n const localHeaders: Uint8Array[] = [];\n const centralHeaders: Uint8Array[] = [];\n let localOffset = 0;\n\n for (const entry of entries) {\n const nameBytes = new TextEncoder().encode(entry.name);\n const crc = crc32(entry.data);\n\n // 'mimetype' and 'version.xml' must be stored uncompressed per HWPX spec\n const store = entry.name === 'mimetype' || entry.name === 'version.xml';\n const method = store ? 0 : 8;\n const payload = store ? entry.data : pako.deflateRaw(entry.data, { level: 6 });\n\n // Local file header (30 bytes + name + data)\n const local = new Uint8Array(30 + nameBytes.length + payload.length);\n const lv = new DataView(local.buffer);\n lv.setUint32(0, 0x04034b50, true);\n lv.setUint16(4, 20, true);\n lv.setUint16(6, 0, true);\n lv.setUint16(8, method, true);\n lv.setUint16(10, 0, true);\n lv.setUint16(12, 0x0021, true); // date (1980-01-01)\n lv.setUint32(14, crc, true);\n lv.setUint32(18, payload.length, true);\n lv.setUint32(22, entry.data.length, true);\n lv.setUint16(26, nameBytes.length, true);\n lv.setUint16(28, 0, true);\n local.set(nameBytes, 30);\n local.set(payload, 30 + nameBytes.length);\n\n // Central directory header (46 bytes + name)\n const central = new Uint8Array(46 + nameBytes.length);\n const cv = new DataView(central.buffer);\n cv.setUint32(0, 0x02014b50, true);\n cv.setUint16(4, 20, true);\n cv.setUint16(6, 20, true);\n cv.setUint16(8, 0, true);\n cv.setUint16(10, method, true);\n cv.setUint16(12, 0, true); // mod time\n cv.setUint16(14, 0x0021, true); // mod date (1980-01-01)\n cv.setUint32(16, crc, true);\n cv.setUint32(20, payload.length, true);\n cv.setUint32(24, entry.data.length, true);\n cv.setUint16(28, nameBytes.length, true);\n cv.setUint16(30, 0, true);\n cv.setUint16(32, 0, true);\n cv.setUint16(34, 0, true);\n cv.setUint16(36, 0, true);\n cv.setUint32(38, 0, true);\n cv.setUint32(42, localOffset, true);\n central.set(nameBytes, 46);\n\n localHeaders.push(local);\n centralHeaders.push(central);\n localOffset += local.length;\n }\n\n const centralDir = concat(centralHeaders);\n const eocd = new Uint8Array(22);\n const ev = new DataView(eocd.buffer);\n ev.setUint32(0, 0x06054b50, true);\n ev.setUint16(4, 0, true);\n ev.setUint16(6, 0, true);\n ev.setUint16(8, entries.length, true);\n ev.setUint16(10, entries.length, true);\n ev.setUint32(12, centralDir.length, true);\n ev.setUint32(16, localOffset, true);\n ev.setUint16(20, 0, true);\n\n return concat([...localHeaders, centralDir, eocd]);\n },\n};\n\nfunction concat(arrays: Uint8Array[]): Uint8Array {\n const total = arrays.reduce((s, a) => s + a.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const a of arrays) { out.set(a, offset); offset += a.length; }\n return out;\n}\n\nfunction crc32(data: Uint8Array): number {\n let crc = 0xFFFFFFFF;\n for (const byte of data) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n crc = (crc & 1) ? (crc >>> 1) ^ 0xEDB88320 : crc >>> 1;\n }\n }\n return (crc ^ 0xFFFFFFFF) >>> 0;\n}\n","import { SaxesParser } from 'saxes';\n\n// Parses XML into an xml2js-compatible object structure:\n// { tagName: [{ _attr: { k: v }, _text: '...', childTag: [...] }] }\nfunction parseXmlStrict(xml: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const parser = new SaxesParser({ xmlns: false });\n\n interface Frame { tag: string; obj: Record<string, unknown> }\n const stack: Frame[] = [];\n let result: unknown = null;\n\n parser.on('error', (err: Error) => reject(err));\n\n parser.on('opentag', (node: any) => {\n const obj: Record<string, unknown> = {};\n const attrs = node.attributes as Record<string, string>;\n if (attrs && Object.keys(attrs).length > 0) {\n obj['_attr'] = { ...attrs };\n }\n stack.push({ tag: node.name as string, obj });\n });\n\n const appendText = (text: string) => {\n if (stack.length > 0 && text) {\n const frame = stack[stack.length - 1];\n const cur = frame.obj['_text'];\n frame.obj['_text'] = typeof cur === 'string' ? cur + text : text;\n }\n };\n\n parser.on('text', (text: string) => appendText(text));\n parser.on('cdata', (cdata: string) => appendText(cdata));\n\n parser.on('closetag', () => {\n const frame = stack.pop();\n if (!frame) return;\n const { tag, obj } = frame;\n\n // Drop whitespace-only _text\n if (typeof obj['_text'] === 'string' && !(obj['_text'] as string).trim()) {\n delete obj['_text'];\n }\n\n if (stack.length === 0) {\n result = { [tag]: [obj] };\n } else {\n const parent = stack[stack.length - 1].obj;\n const existing = parent[tag];\n if (Array.isArray(existing)) {\n (existing as unknown[]).push(obj);\n } else {\n parent[tag] = [obj];\n }\n // Track child order for document-order iteration\n if (!parent['_childOrder']) parent['_childOrder'] = [];\n (parent['_childOrder'] as string[]).push(tag);\n }\n });\n\n try {\n parser.write(xml).close();\n resolve(result);\n } catch (e) {\n reject(e);\n }\n });\n}\n\nexport const XmlKit = {\n /** @deprecated Use parseStrict instead */\n async parse(xml: string): Promise<unknown> {\n return parseXmlStrict(xml);\n },\n\n async parseStrict(xml: string): Promise<unknown> {\n return parseXmlStrict(xml);\n },\n\n attr(node: Record<string, unknown>, key: string): string | undefined {\n const a = node['_attr'] as Record<string, string> | undefined;\n return a?.[key];\n },\n\n text(node: Record<string, unknown> | string | undefined): string {\n if (node == null) return '';\n if (typeof node === 'string') return node;\n const t = node['_text'];\n return typeof t === 'string' ? t : '';\n },\n};\n","export const TextKit = {\n decode(data: Uint8Array, encoding = 'utf-8'): string {\n try {\n return new TextDecoder(encoding, { fatal: true }).decode(data);\n } catch {\n return new TextDecoder('utf-8', { fatal: false }).decode(data);\n }\n },\n\n encode(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n },\n\n escapeXml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n },\n\n unescapeXml(s: string): string {\n return s\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\");\n },\n\n normalizeWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n },\n\n stripControl(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\n },\n\n base64Encode(data: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < data.length; i++) {\n binary += String.fromCharCode(data[i]);\n }\n return btoa(binary);\n },\n\n base64Decode(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n },\n};\n","import type { Decoder } from '../../contract/decoder';\nimport type { DocRoot, ContentNode, ParaNode, SpanNode, GridNode, ImgNode, PageNumNode } from '../../model/doc-tree';\nimport type { Outcome } from '../../contract/result';\nimport type { DocMeta, PageDims, TextProps, ParaProps, CellProps, GridProps, Stroke } from '../../model/doc-props';\nimport { A4 } from '../../model/doc-props';\nimport { succeed, fail } from '../../contract/result';\nimport { buildRoot, buildSheet, buildPara, buildSpan, buildImg, buildGrid, buildRow, buildCell } from '../../model/builders';\nimport { ShieldedParser } from '../../safety/ShieldedParser';\nimport { Metric, safeAlign, safeFont, safeHex, safeStrokeHwpx } from '../../safety/StyleBridge';\nimport { ArchiveKit } from '../../toolkit/ArchiveKit';\nimport { XmlKit } from '../../toolkit/XmlKit';\nimport { TextKit } from '../../toolkit/TextKit';\nimport { registry } from '../../pipeline/registry';\n\ninterface BorderFillInfo {\n stroke?: Stroke;\n bgColor?: string;\n}\n\ninterface CharPrInfo {\n b?: boolean; i?: boolean; u?: boolean; s?: boolean;\n pt?: number; color?: string; font?: string; bg?: string;\n}\n\ninterface DecCtx {\n files: Map<string, Uint8Array>;\n shield: ShieldedParser;\n borderFills: Map<number, BorderFillInfo>;\n charPrs: Map<number, CharPrInfo>;\n paraPrs: Map<number, { align?: string }>;\n warns: string[];\n}\n\nexport class HwpxDecoder implements Decoder {\n readonly format = 'hwpx';\n\n async decode(data: Uint8Array): Promise<Outcome<DocRoot>> {\n const shield = new ShieldedParser();\n const warns: string[] = [];\n\n try {\n const files = await ArchiveKit.unzip(data);\n\n const bodyXml = files.get('Contents/section0.xml')\n ?? files.get('section0.xml')\n ?? findSectionFile(files);\n\n if (!bodyXml) return fail('HWPX: section0.xml not found in archive');\n\n const headXml = files.get('Contents/header.xml') ?? files.get('header.xml');\n\n let meta: DocMeta = {};\n let dims: PageDims = { ...A4 };\n let borderFills = new Map<number, BorderFillInfo>();\n let charPrs = new Map<number, CharPrInfo>();\n let paraPrs = new Map<number, { align?: string }>();\n\n if (headXml) {\n try {\n const headStr = TextKit.decode(headXml);\n const headObj: any = await XmlKit.parseStrict(headStr);\n if (headObj) {\n meta = extractMeta(headObj);\n dims = extractDims(headObj) ?? dims;\n borderFills = extractBorderFills(headObj);\n charPrs = extractCharPrs(headObj);\n paraPrs = extractParaPrs(headObj);\n }\n } catch {\n // header parse failure is non-fatal\n }\n }\n\n const ctx: DecCtx = { files, shield, borderFills, charPrs, paraPrs, warns };\n\n const bodyStr = TextKit.decode(bodyXml);\n const bodyObj: any = await XmlKit.parseStrict(bodyStr);\n\n const sections = normalizeSections(bodyObj);\n const kids = shield.guardAll(\n sections,\n (sec: any) => decodeSection(sec, dims, ctx),\n () => buildSheet([buildPara([buildSpan('[섹션 파싱 실패]')])], dims),\n 'hwpx:section',\n );\n\n warns.push(...shield.flush());\n return succeed(buildRoot(meta, kids), warns);\n } catch (e: any) {\n warns.push(...shield.flush());\n return fail(`HWPX decode error: ${e?.message ?? String(e)}`, warns);\n }\n }\n}\n\n// ─── helpers ────────────────────────────────────────────────\n\nfunction findSectionFile(files: Map<string, Uint8Array>): Uint8Array | undefined {\n for (const [key, val] of files) {\n if (key.toLowerCase().includes('section') && key.endsWith('.xml')) return val;\n }\n return undefined;\n}\n\nfunction normalizeSections(bodyObj: any): any[] {\n // <hs:sec> (real HWPX), <hp:SEC> (legacy)\n if (bodyObj?.['hs:sec']) return toArr(bodyObj['hs:sec']);\n if (bodyObj?.['hp:SEC']) return toArr(bodyObj['hp:SEC']);\n\n const root = bodyObj?.['hp:HWPML'] ?? bodyObj?.HWPML ?? bodyObj;\n const body = root?.['hp:BODY']?.[0] ?? root?.BODY?.[0] ?? root?.['hp:BODY'] ?? root?.BODY;\n if (!body) return [bodyObj];\n const sections = body?.['hp:SECTION'] ?? body?.SECTION ?? [];\n return Array.isArray(sections) ? sections : [sections];\n}\n\n// Get a tag regardless of namespace/case variations\nfunction getTag(obj: any, ...names: string[]): any[] {\n for (const n of names) {\n const v = obj?.[n];\n if (v != null) return toArr(v);\n }\n return [];\n}\n\nfunction extractMeta(headObj: any): DocMeta {\n try {\n // Support both <hh:HEAD> and <hh:head>\n const root = headObj?.['hh:head']?.[0] ?? headObj?.['hh:HEAD']?.[0] ?? headObj?.HEAD?.[0] ?? headObj;\n const info = root?.['hh:DOCSUMMARY']?.[0] ?? root?.DOCSUMMARY?.[0];\n if (!info) return {};\n const a = (k: string) => info?.[`hh:${k}`]?.[0]?._text ?? info?.[k]?.[0]?._text ?? '';\n return { title: a('TITLE') || undefined, author: a('AUTHOR') || undefined, subject: a('SUBJECT') || undefined };\n } catch { return {}; }\n}\n\nfunction extractDims(headObj: any): PageDims | null {\n try {\n const root = headObj?.['hh:head']?.[0] ?? headObj?.['hh:HEAD']?.[0] ?? headObj?.HEAD?.[0] ?? headObj;\n const refList = root?.['hh:refList']?.[0] ?? root?.['hh:REFLIST']?.[0] ?? root?.REFLIST?.[0];\n if (!refList) return null;\n\n const secPrList = refList?.['hh:SECPRLST']?.[0]?.['hh:SECPR']\n ?? refList?.SECPRLST?.[0]?.SECPR;\n const sec = Array.isArray(secPrList) ? secPrList[0] : secPrList;\n if (!sec) return null;\n\n const pa = sec?.['hh:PAGEPROPERTY']?.[0]?._attr ?? sec?.PAGEPROPERTY?.[0]?._attr;\n if (!pa) return null;\n\n return {\n wPt: Metric.hwpToPt(Number(pa.Width ?? 59528)),\n hPt: Metric.hwpToPt(Number(pa.Height ?? 84188)),\n mt: Metric.hwpToPt(Number(pa.TopMargin ?? 5670)),\n mb: Metric.hwpToPt(Number(pa.BottomMargin ?? 4252)),\n ml: Metric.hwpToPt(Number(pa.LeftMargin ?? 8504)),\n mr: Metric.hwpToPt(Number(pa.RightMargin ?? 8504)),\n orient: Number(pa.Landscape) === 1 ? 'landscape' : 'portrait',\n };\n } catch { return null; }\n}\n\nfunction extractBorderFills(headObj: any): Map<number, BorderFillInfo> {\n const map = new Map<number, BorderFillInfo>();\n try {\n const root = headObj?.['hh:head']?.[0] ?? headObj?.['hh:HEAD']?.[0] ?? headObj?.HEAD?.[0] ?? headObj;\n const refList = root?.['hh:refList']?.[0] ?? root?.['hh:REFLIST']?.[0] ?? root?.REFLIST?.[0];\n if (!refList) return map;\n\n const bfList = refList?.['hh:borderFills']?.[0] ?? refList?.['hh:BORDERFILLLIST']?.[0] ?? refList?.BORDERFILLLIST?.[0];\n if (!bfList) return map;\n\n const bfs = getTag(bfList, 'hh:borderFill', 'hh:BORDERFILL');\n for (const bf of bfs) {\n const attr = bf?._attr ?? {};\n const id = Number(attr.id ?? 0);\n if (id === 0) continue;\n\n const info: BorderFillInfo = {};\n\n // Parse border (take top as representative)\n const top = bf?.['hh:topBorder']?.[0]?._attr ?? bf?.['hh:top']?.[0]?._attr ?? bf?.top?.[0]?._attr;\n if (top) {\n // width is in mm (e.g. \"0.18 mm\"), convert mm → pt (1mm ≈ 2.835pt), then pt → hwp (*100) for safeStrokeHwpx\n const mmVal = parseFloat(top.width) || undefined;\n const hwpVal = mmVal != null ? mmVal * 2.835 * 100 : undefined;\n info.stroke = safeStrokeHwpx(top.type, hwpVal, top.color);\n }\n\n // Parse fill (real HWPX uses hc:fillBrush, not hh:fillBrush)\n const fillBrush = bf?.['hc:fillBrush']?.[0] ?? bf?.['hh:fillBrush']?.[0] ?? bf?.['hh:fill']?.[0] ?? bf?.fill?.[0] ?? bf?.fillBrush?.[0];\n if (fillBrush) {\n const winBrush = fillBrush?.['hc:winBrush']?.[0]?._attr ?? fillBrush?.['hh:winBrush']?.[0]?._attr ?? fillBrush?.winBrush?.[0]?._attr;\n if (winBrush?.faceColor && winBrush.faceColor !== 'none') {\n info.bgColor = safeHex(winBrush.faceColor);\n }\n }\n\n map.set(id, info);\n }\n } catch { /* non-fatal */ }\n return map;\n}\n\nfunction extractCharPrs(headObj: any): Map<number, CharPrInfo> {\n const map = new Map<number, CharPrInfo>();\n try {\n const root = headObj?.['hh:head']?.[0] ?? headObj?.['hh:HEAD']?.[0] ?? headObj?.HEAD?.[0] ?? headObj;\n const refList = root?.['hh:refList']?.[0] ?? root?.['hh:REFLIST']?.[0] ?? root?.REFLIST?.[0];\n if (!refList) return map;\n\n const cpList = refList?.['hh:charProperties']?.[0] ?? refList?.['hh:CHARPROPERTIES']?.[0];\n if (!cpList) return map;\n\n const cps = getTag(cpList, 'hh:charPr', 'hh:CHARPR');\n for (const cp of cps) {\n const attr = cp?._attr ?? {};\n const id = Number(attr.id ?? -1);\n if (id < 0) continue;\n\n const info: CharPrInfo = {};\n\n // height → pt\n if (attr.height) info.pt = Metric.hHeightToPt(Number(attr.height));\n\n // textColor\n if (attr.textColor) info.color = safeHex(attr.textColor);\n\n // bold\n if (cp?.['hh:bold']?.[0] != null) info.b = true;\n\n // italic\n if (cp?.['hh:italic']?.[0] != null) info.i = true;\n\n // underline\n const ulAttr = cp?.['hh:underline']?.[0]?._attr;\n if (ulAttr?.type && ulAttr.type !== 'NONE') info.u = true;\n\n // strikeout — shape=\"3D\" is default \"no strikeout\" in real HWPX; only SOLID/etc means active\n const stAttr = cp?.['hh:strikeout']?.[0]?._attr;\n if (stAttr?.shape && stAttr.shape !== 'NONE' && stAttr.shape !== '3D') info.s = true;\n\n // font — from fontRef + fontface\n // (simplified: just store what we find)\n\n map.set(id, info);\n }\n } catch { /* non-fatal */ }\n return map;\n}\n\nfunction extractParaPrs(headObj: any): Map<number, { align?: string }> {\n const map = new Map<number, { align?: string }>();\n try {\n const root = headObj?.['hh:head']?.[0] ?? headObj?.['hh:HEAD']?.[0] ?? headObj?.HEAD?.[0] ?? headObj;\n const refList = root?.['hh:refList']?.[0] ?? root?.['hh:REFLIST']?.[0] ?? root?.REFLIST?.[0];\n if (!refList) return map;\n\n const ppList = refList?.['hh:paraProperties']?.[0] ?? refList?.['hh:PARAPROPERTIES']?.[0];\n if (!ppList) return map;\n\n const pps = getTag(ppList, 'hh:paraPr', 'hh:PARAPR');\n for (const pp of pps) {\n const attr = pp?._attr ?? {};\n const id = Number(attr.id ?? -1);\n if (id < 0) continue;\n\n const alignNode = pp?.['hh:align']?.[0]?._attr ?? pp?.['hh:ALIGN']?.[0]?._attr;\n const align = alignNode?.horizontal ?? alignNode?.Horizontal;\n\n map.set(id, { align });\n }\n } catch { /* non-fatal */ }\n return map;\n}\n\n// ─── Section decoding ──────────────────────────────────────\n\nfunction addParaItems(p: any, items: { type: string; node: any }[]): void {\n // Check if this paragraph contains a table in its runs\n const runs = getTag(p, 'hp:run', 'hp:RUN');\n let hasTable = false;\n for (const run of runs) {\n const tbls = getTag(run, 'hp:tbl', 'hp:TABLE');\n for (const tbl of tbls) {\n items.push({ type: 'table', node: tbl });\n hasTable = true;\n }\n }\n // Also add as paragraph unless it's just a table container\n const hasText = runs.some((run: any) => {\n const ts = getTag(run, 'hp:t', 'hp:T', 'hp:CHAR');\n return ts.some((t: any) => {\n const text = typeof t === 'string' ? t : t?._text ?? '';\n return text.trim().length > 0;\n });\n });\n if (hasText || !hasTable) {\n items.push({ type: 'para', node: p });\n }\n}\n\nfunction decodeSection(sec: any, dims: PageDims, ctx: DecCtx) {\n // Try to extract dims from first paragraph's secPr\n const firstParas = getTag(sec, 'hp:p', 'hp:P');\n const pageDims = extractSecPrDims(firstParas[0]) ?? dims;\n\n // Build items list preserving document order via _childOrder\n const items: { type: string; node: any }[] = [];\n const paras = getTag(sec, 'hp:p', 'hp:P');\n const childOrder = sec?.['_childOrder'] as string[] | undefined;\n\n if (Array.isArray(childOrder)) {\n let pi = 0;\n for (const tag of childOrder) {\n if ((tag === 'hp:p' || tag === 'hp:P') && pi < paras.length) {\n const p = paras[pi++];\n addParaItems(p, items);\n }\n }\n // Append any remaining\n while (pi < paras.length) addParaItems(paras[pi++], items);\n } else {\n // No order info — process paragraphs sequentially\n for (const p of paras) addParaItems(p, items);\n }\n\n const kids: ContentNode[] = ctx.shield.guardAll(\n items,\n (item: any) => {\n if (item.type === 'table') {\n const { value } = ctx.shield.guardGrid(\n item.node,\n (n) => decodeGrid(n, ctx),\n (n) => decodeGridSimple(n, ctx),\n (n) => decodeGridFlat(n),\n (n) => decodeGridText(n) as unknown as GridNode,\n 'hwpx:table',\n );\n return value;\n }\n return decodePara(item.node, ctx);\n },\n () => buildPara([buildSpan('[파싱 실패]')]),\n 'hwpx:content',\n );\n\n // Decode header/footer\n const headerParas = decodeHeaderFooter(sec, 'header', ctx);\n const footerParas = decodeHeaderFooter(sec, 'footer', ctx);\n\n return buildSheet(\n kids.filter(Boolean) as ContentNode[],\n pageDims,\n { header: headerParas, footer: footerParas },\n );\n}\n\nfunction extractSecPrDims(p: any): PageDims | null {\n if (!p) return null;\n try {\n const runs = getTag(p, 'hp:run', 'hp:RUN');\n for (const run of runs) {\n const secPr = run?.['hp:secPr']?.[0] ?? run?.['hp:SECPR']?.[0];\n if (!secPr) continue;\n const pagePr = secPr?.['hp:pagePr']?.[0]?._attr ?? secPr?.['hp:PAGEPR']?.[0]?._attr;\n if (!pagePr) continue;\n const margin = secPr?.['hp:pagePr']?.[0]?.['hp:margin']?.[0]?._attr\n ?? secPr?.['hp:PAGEPR']?.[0]?.['hp:MARGIN']?.[0]?._attr ?? {};\n return {\n wPt: Metric.hwpToPt(Number(pagePr.width ?? 59528)),\n hPt: Metric.hwpToPt(Number(pagePr.height ?? 84188)),\n mt: Metric.hwpToPt(Number(margin.top ?? 5670)),\n mb: Metric.hwpToPt(Number(margin.bottom ?? 4252)),\n ml: Metric.hwpToPt(Number(margin.left ?? 8504)),\n mr: Metric.hwpToPt(Number(margin.right ?? 8504)),\n orient: pagePr.landscape === 'NARROWLY' ? 'landscape' : 'portrait',\n };\n }\n } catch { /* ignore */ }\n return null;\n}\n\nfunction decodeHeaderFooter(sec: any, kind: 'header' | 'footer', ctx: DecCtx): ParaNode[] | undefined {\n try {\n const hf = sec?.['hp:headerFooter']?.[0] ?? sec?.['hp:HEADERFOOTER']?.[0]\n ?? sec?.headerFooter?.[0] ?? sec?.HEADERFOOTER?.[0];\n if (!hf) return undefined;\n\n const part = hf?.['hp:' + kind]?.[0] ?? hf?.['hp:' + kind.toUpperCase()]?.[0]\n ?? hf?.[kind]?.[0] ?? hf?.[kind.toUpperCase()]?.[0];\n if (!part) return undefined;\n\n const paras = getTag(part, 'hp:p', 'hp:P');\n if (paras.length === 0) return undefined;\n\n return paras.map((p: any) => decodePara(p, ctx));\n } catch {\n return undefined;\n }\n}\n\n// ─── Paragraph & run decoding ──────────────────────────────\n\nfunction decodePara(p: any, ctx: DecCtx): ParaNode {\n const pAttr = p?._attr ?? {};\n const paraPrIdRef = Number(pAttr.paraPrIDRef ?? -1);\n\n // Resolve paraPr from IDRef or inline\n let align: string | undefined;\n const paraPrDef = ctx.paraPrs.get(paraPrIdRef);\n if (paraPrDef?.align) align = paraPrDef.align;\n\n // Check inline PARAPR too\n const inlineParaPr = p?.['hp:PARAPR']?.[0] ?? p?.['hp:paraPr']?.[0] ?? p?.PARAPR?.[0];\n if (inlineParaPr) {\n const alignNode = inlineParaPr?.['hp:ALIGN']?.[0]?._attr ?? inlineParaPr?.['hp:align']?.[0]?._attr\n ?? inlineParaPr?.ALIGN?.[0]?._attr;\n if (alignNode?.Type) align = alignNode.Type;\n if (alignNode?.horizontal) align = alignNode.horizontal;\n }\n\n const inlineAttr = inlineParaPr?._attr ?? {};\n const props: ParaProps = { align: safeAlign(align) };\n\n // List support (from inline attr)\n if (inlineAttr.listType) {\n props.listOrd = inlineAttr.listType === 'DIGIT' || inlineAttr.listType === 'DECIMAL';\n props.listLv = Number(inlineAttr.listLevel ?? 0);\n }\n\n const runs = getTag(p, 'hp:run', 'hp:RUN');\n const kids: (SpanNode | ImgNode)[] = [];\n\n for (const run of runs) {\n // Images inside run\n const pics = getTag(run, 'hp:pic', 'hp:PIC');\n for (const pic of pics) {\n const img = decodePic(pic, ctx);\n if (img) kids.push(img);\n }\n\n // Page number\n const pageNums = getTag(run, 'hp:pageNum', 'hp:PAGENUM');\n if (pageNums.length > 0) {\n const pn = pageNums[0]?._attr ?? {};\n const fmt = pn.formatType === 'ROMAN_LOWER' ? 'roman' as const\n : pn.formatType === 'ROMAN_UPPER' ? 'romanCaps' as const\n : 'decimal' as const;\n const pageNumNode: PageNumNode = { tag: 'pagenum', format: fmt };\n const spanProps = resolveCharPr(run, ctx);\n kids.push({ tag: 'span', props: spanProps, kids: [pageNumNode] });\n continue;\n }\n\n // Text\n const textNodes = getTag(run, 'hp:t', 'hp:T', 'hp:CHAR');\n const content = textNodes.map((t: any) => typeof t === 'string' ? t : t?._text ?? t?._ ?? '').join('');\n\n // Skip empty secPr-only runs\n if (content === '' && (run?.['hp:secPr']?.[0] || run?.['hp:SECPR']?.[0]) && pics.length === 0) continue;\n\n const spanProps = resolveCharPr(run, ctx);\n kids.push(buildSpan(content, spanProps));\n }\n\n return buildPara(kids.filter(Boolean) as ParaNode['kids'], props);\n}\n\nfunction resolveCharPr(run: any, ctx: DecCtx): TextProps {\n const runAttr = run?._attr ?? {};\n const charPrIdRef = Number(runAttr.charPrIDRef ?? -1);\n\n // Try IDRef first\n const def = ctx.charPrs.get(charPrIdRef);\n if (def) {\n return {\n b: def.b, i: def.i, u: def.u, s: def.s,\n pt: def.pt, color: def.color, font: def.font, bg: def.bg,\n };\n }\n\n // Fallback: inline CHARPR\n const ca = run?.['hp:CHARPR']?.[0]?._attr ?? run?.['hp:charPr']?.[0]?._attr ?? run?.CHARPR?.[0]?._attr ?? {};\n return {\n b: ca.Bold === '1' || ca.Bold === 'true' || undefined,\n i: ca.Italic === '1' || ca.Italic === 'true' || undefined,\n u: ca.Underline ? ca.Underline !== 'NONE' : undefined,\n s: ca.Strikeout ? ca.Strikeout !== 'NONE' : undefined,\n font: safeFont(ca.FontName ?? ca.FaceNameHangul),\n pt: ca.Height ? Metric.hHeightToPt(Number(ca.Height)) : undefined,\n color: safeHex(ca.TextColor),\n bg: safeHex(ca.BgColor),\n };\n}\n\n// ─── Image decoding ────────────────────────────────────────\n\nfunction decodePic(pic: any, ctx: DecCtx): ImgNode | null {\n try {\n const szAttr = pic?.['hp:sz']?.[0]?._attr ?? pic?.sz?.[0]?._attr ?? {};\n const w = Metric.hwpToPt(Number(szAttr.width ?? 0));\n const h = Metric.hwpToPt(Number(szAttr.height ?? 0));\n\n // Try multiple tag patterns for image reference\n const imgNode = pic?.['hp:img']?.[0]?._attr ?? pic?.['hc:img']?.[0]?._attr\n ?? pic?.img?.[0]?._attr ?? {};\n const binRef = imgNode.binaryItemIDRef ?? imgNode.BinaryItemIDRef;\n if (!binRef) return null;\n\n // Find binary data\n let imgData: Uint8Array | undefined;\n for (const [key, val] of ctx.files) {\n if (key.includes(binRef) || key.toLowerCase().includes(binRef.toLowerCase())) {\n imgData = val;\n break;\n }\n }\n if (!imgData) return null;\n\n const ext = binRef.split('.').pop()?.toLowerCase() ?? 'png';\n const mimeMap: Record<string, ImgNode['mime']> = {\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',\n gif: 'image/gif', bmp: 'image/bmp',\n };\n\n return buildImg(TextKit.base64Encode(imgData), mimeMap[ext] ?? 'image/png', w, h);\n } catch {\n return null;\n }\n}\n\n// ─── Table decoding ────────────────────────────────────────\n\nfunction decodeGrid(tbl: any, ctx: DecCtx): GridNode {\n const tblAttr = tbl?._attr ?? {};\n const borderFillId = Number(tblAttr.borderFillIDRef ?? 0);\n const borderFill = ctx.borderFills.get(borderFillId);\n const headerRow = tblAttr.repeatHeader === '1';\n\n const gridProps: GridProps = { headerRow: headerRow || undefined };\n if (borderFill?.stroke) gridProps.defaultStroke = borderFill.stroke;\n\n const rowArr = getTag(tbl, 'hp:tr', 'hp:ROW');\n const rowNodes = rowArr.map((row: any) => {\n const cellArr = getTag(row, 'hp:tc', 'hp:CELL');\n const cellNodes = cellArr.map((cell: any) => {\n const ca = cell?._attr ?? {};\n\n // Cell borderFill\n const cellBfId = Number(ca.borderFillIDRef ?? 0);\n const cellBf = ctx.borderFills.get(cellBfId);\n\n const cellProps: CellProps = {\n bg: cellBf?.bgColor ?? safeHex(ca.BgColor),\n };\n\n if (cellBf?.stroke) {\n cellProps.top = cellBf.stroke;\n cellProps.bot = cellBf.stroke;\n cellProps.left = cellBf.stroke;\n cellProps.right = cellBf.stroke;\n }\n\n // Vertical alignment from subList\n const subList = cell?.['hp:subList']?.[0] ?? cell?.subList?.[0];\n const subAttr = subList?._attr ?? {};\n if (subAttr.vertAlign) {\n const vaMap: Record<string, 'top' | 'mid' | 'bot'> = {\n TOP: 'top', CENTER: 'mid', BOTTOM: 'bot',\n };\n cellProps.va = vaMap[subAttr.vertAlign];\n }\n\n // Colspan/rowspan from cellSpan element or attributes\n const cellSpan = cell?.['hp:cellSpan']?.[0]?._attr ?? {};\n const cs = Number(cellSpan.colSpan ?? ca.ColSpan ?? 1);\n const rs = Number(cellSpan.rowSpan ?? ca.RowSpan ?? 1);\n\n // Parse paragraphs\n let paras: ParaNode[];\n if (subList) {\n const subParas = getTag(subList, 'hp:p', 'hp:P');\n paras = subParas.map((p: any) => decodePara(p, ctx));\n } else {\n paras = getTag(cell, 'hp:p', 'hp:P').map((p: any) => decodePara(p, ctx));\n }\n\n return buildCell(\n paras.length > 0 ? paras : [buildPara([buildSpan('')])],\n { cs, rs, props: cellProps },\n );\n });\n return buildRow(cellNodes);\n });\n return buildGrid(rowNodes, gridProps);\n}\n\nfunction decodeGridSimple(tbl: any, ctx: DecCtx): GridNode {\n const rowArr = getTag(tbl, 'hp:tr', 'hp:ROW');\n const rowNodes = rowArr.map((row: any) => {\n const cellArr = getTag(row, 'hp:tc', 'hp:CELL');\n return buildRow(cellArr.map((cell: any) => buildCell([buildPara([buildSpan(cellText(cell))])])));\n });\n return buildGrid(rowNodes);\n}\n\nfunction decodeGridFlat(tbl: any): GridNode {\n return buildGrid([buildRow([buildCell([buildPara([buildSpan(tableText(tbl))])])])]);\n}\n\nfunction decodeGridText(tbl: any): ParaNode {\n return buildPara([buildSpan(tableText(tbl))]);\n}\n\nfunction cellText(cell: any): string {\n const subList = cell?.['hp:subList']?.[0] ?? cell?.subList?.[0];\n const source = subList ?? cell;\n return getTag(source, 'hp:p', 'hp:P').map((p: any) =>\n getTag(p, 'hp:run', 'hp:RUN').map((r: any) =>\n getTag(r, 'hp:t', 'hp:T').map((t: any) => typeof t === 'string' ? t : t?._text ?? t?._ ?? '').join(''),\n ).join(''),\n ).join(' ');\n}\n\nfunction tableText(tbl: any): string {\n return getTag(tbl, 'hp:tr', 'hp:ROW').map((row: any) =>\n getTag(row, 'hp:tc', 'hp:CELL').map((c: any) => cellText(c)).join('\\t'),\n ).join('\\n');\n}\n\nfunction toArr(v: any): any[] { return v == null ? [] : Array.isArray(v) ? v : [v]; }\n\n// Auto-register\nregistry.registerDecoder(new HwpxDecoder());\n","/**\n * OLE2 Compound File Binary Format (CFB) parser.\n * Used for legacy HWP 5.0 files.\n */\n\nexport const BinaryKit = {\n readU16LE(buf: Uint8Array, offset: number): number {\n return buf[offset] | (buf[offset + 1] << 8);\n },\n\n readU32LE(buf: Uint8Array, offset: number): number {\n return (\n (buf[offset] | (buf[offset + 1] << 8) | (buf[offset + 2] << 16)) >>> 0\n ) + buf[offset + 3] * 0x1000000;\n },\n\n isOle2(data: Uint8Array): boolean {\n return (\n data.length >= 8 &&\n data[0] === 0xD0 && data[1] === 0xCF &&\n data[2] === 0x11 && data[3] === 0xE0 &&\n data[4] === 0xA1 && data[5] === 0xB1 &&\n data[6] === 0x1A && data[7] === 0xE1\n );\n },\n\n parseCfb(data: Uint8Array): Map<string, Uint8Array> {\n const streams = new Map<string, Uint8Array>();\n\n if (!this.isOle2(data)) {\n throw new Error('Not a valid OLE2 file');\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const sectorSize = 1 << view.getUint16(30, true);\n const miniSectorSz = 1 << view.getUint16(32, true);\n const dirFirstSec = view.getUint32(48, true);\n const miniStreamCutoff = view.getUint32(56, true);\n const miniFatFirst = view.getUint32(60, true);\n const miniFatCnt = view.getUint32(64, true);\n const difatFirst = view.getUint32(68, true);\n\n const ENDOFCHAIN = 0xFFFFFFFE;\n const FREESECT = 0xFFFFFFFF;\n\n const sectorAt = (sec: number): Uint8Array =>\n data.subarray(512 + sec * sectorSize, 512 + (sec + 1) * sectorSize);\n\n // Build FAT from DIFAT\n const fatSecNums: number[] = [];\n for (let i = 0; i < 109; i++) {\n const s = view.getUint32(76 + i * 4, true);\n if (s === FREESECT || s === ENDOFCHAIN) break;\n fatSecNums.push(s);\n }\n if (difatFirst !== ENDOFCHAIN && difatFirst !== FREESECT) {\n let difSec = difatFirst;\n while (difSec !== ENDOFCHAIN && difSec !== FREESECT) {\n const sec = sectorAt(difSec);\n const sv = new DataView(sec.buffer, sec.byteOffset, sec.byteLength);\n for (let i = 0; i < (sectorSize / 4) - 1; i++) {\n const s = sv.getUint32(i * 4, true);\n if (s === FREESECT || s === ENDOFCHAIN) break;\n fatSecNums.push(s);\n }\n difSec = sv.getUint32(sectorSize - 4, true);\n }\n }\n\n const fat: number[] = [];\n for (const sec of fatSecNums) {\n const s = sectorAt(sec);\n const sv = new DataView(s.buffer, s.byteOffset, s.byteLength);\n for (let i = 0; i < sectorSize / 4; i++) {\n fat.push(sv.getUint32(i * 4, true));\n }\n }\n\n const readChain = (startSec: number): Uint8Array => {\n const chunks: Uint8Array[] = [];\n let sec = startSec;\n while (sec !== ENDOFCHAIN && sec !== FREESECT && sec < fat.length) {\n chunks.push(sectorAt(sec));\n sec = fat[sec];\n }\n return concatUint8(chunks);\n };\n\n // Directory entries\n const dirData = readChain(dirFirstSec);\n const dirView = new DataView(dirData.buffer, dirData.byteOffset, dirData.byteLength);\n const dirCount = dirData.length / 128;\n\n interface DirEntry {\n name: string;\n type: number;\n startSec: number;\n size: number;\n childId: number;\n siblingLeftId: number;\n siblingRightId: number;\n }\n\n const dirEntries: DirEntry[] = [];\n for (let i = 0; i < dirCount; i++) {\n const base = i * 128;\n const nameLen = dirView.getUint16(base + 64, true);\n const nameBytes = dirData.subarray(base, base + Math.max(0, nameLen - 2));\n const name = new TextDecoder('utf-16le').decode(nameBytes);\n const type = dirData[base + 66];\n const childId = dirView.getInt32(base + 76, true);\n const sibLeft = dirView.getInt32(base + 68, true);\n const sibRight = dirView.getInt32(base + 72, true);\n const startSec = dirView.getUint32(base + 116, true);\n const size = dirView.getUint32(base + 120, true);\n dirEntries.push({ name, type, startSec, size, childId, siblingLeftId: sibLeft, siblingRightId: sibRight });\n }\n\n // Mini stream\n const rootEntry = dirEntries[0];\n let miniStreamData: Uint8Array | null = null;\n let miniFat: number[] = [];\n\n if (rootEntry && rootEntry.startSec !== ENDOFCHAIN && rootEntry.startSec !== FREESECT) {\n miniStreamData = readChain(rootEntry.startSec);\n }\n\n if (miniFatCnt > 0 && miniFatFirst !== ENDOFCHAIN && miniFatFirst !== FREESECT) {\n const mfData = readChain(miniFatFirst);\n const mfv = new DataView(mfData.buffer, mfData.byteOffset, mfData.byteLength);\n for (let i = 0; i < mfData.length / 4; i++) {\n miniFat.push(mfv.getUint32(i * 4, true));\n }\n }\n\n const readMiniChain = (startSec: number, size: number): Uint8Array => {\n if (!miniStreamData) return new Uint8Array(0);\n const chunks: Uint8Array[] = [];\n let sec = startSec;\n let remaining = size;\n while (sec !== ENDOFCHAIN && sec !== FREESECT && sec < miniFat.length && remaining > 0) {\n const off = sec * miniSectorSz;\n const chunk = miniStreamData.subarray(off, off + Math.min(miniSectorSz, remaining));\n chunks.push(chunk);\n remaining -= chunk.length;\n sec = miniFat[sec];\n }\n return concatUint8(chunks).subarray(0, size);\n };\n\n // DFS traversal\n const visit = (id: number, path: string): void => {\n if (id < 0 || id >= dirEntries.length) return;\n const entry = dirEntries[id];\n const fullPath = path ? `${path}/${entry.name}` : entry.name;\n\n if (entry.type === 2) {\n let streamData: Uint8Array;\n if (entry.size < miniStreamCutoff && miniStreamData) {\n streamData = readMiniChain(entry.startSec, entry.size);\n } else {\n streamData = readChain(entry.startSec).subarray(0, entry.size);\n }\n streams.set(fullPath, streamData);\n streams.set(entry.name, streamData);\n }\n\n if (entry.childId >= 0) visit(entry.childId, fullPath);\n if (entry.siblingLeftId >= 0) visit(entry.siblingLeftId, path);\n if (entry.siblingRightId >= 0) visit(entry.siblingRightId, path);\n };\n\n if (dirEntries.length > 0 && dirEntries[0].childId >= 0) {\n visit(dirEntries[0].childId, '');\n }\n\n return streams;\n },\n};\n\nfunction concatUint8(arrays: Uint8Array[]): Uint8Array {\n const total = arrays.reduce((s, a) => s + a.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const a of arrays) { out.set(a, off); off += a.length; }\n return out;\n}\n","import type { Decoder } from '../../contract/decoder';\nimport type { DocRoot, ContentNode, ParaNode, SpanNode } from '../../model/doc-tree';\nimport type { Outcome } from '../../contract/result';\nimport type { Align, Stroke, StrokeKind, PageDims, TextProps, ParaProps, CellProps, GridProps } from '../../model/doc-props';\nimport { succeed, fail } from '../../contract/result';\nimport { buildRoot, buildSheet, buildPara, buildSpan, buildGrid, buildRow, buildCell } from '../../model/builders';\nimport { ShieldedParser } from '../../safety/ShieldedParser';\nimport { BinaryKit } from '../../toolkit/BinaryKit';\nimport { Metric, safeHex, safeFont } from '../../safety/StyleBridge';\nimport { registry } from '../../pipeline/registry';\nimport { A4 } from '../../model/doc-props';\nimport pako from 'pako';\n\n/* ═══════════════════════════════════════════════════════════════\n HWP 5.0 Tag Constants\n ═══════════════════════════════════════════════════════════════ */\n\nconst HWPTAG_BEGIN = 16;\n\nconst TAG_FACE_NAME = HWPTAG_BEGIN + 3; // 19\nconst TAG_BORDER_FILL = HWPTAG_BEGIN + 4; // 20\nconst TAG_CHAR_SHAPE = HWPTAG_BEGIN + 5; // 21\nconst TAG_PARA_SHAPE = HWPTAG_BEGIN + 9; // 25\nconst TAG_PARA_HEADER = HWPTAG_BEGIN + 50; // 66\nconst TAG_PARA_TEXT = HWPTAG_BEGIN + 51; // 67\nconst TAG_PARA_CHAR_SHAPE = HWPTAG_BEGIN + 52; // 68\nconst TAG_CTRL_HEADER = HWPTAG_BEGIN + 55; // 71\nconst TAG_PAGE_DEF = HWPTAG_BEGIN + 57; // 73\n\n// TABLE / CELL tags vary by HWP version\nconst TAG_LIST_HEADER = HWPTAG_BEGIN + 56; // 72\nconst TAG_TABLE_A = HWPTAG_BEGIN + 61; // 77\nconst TAG_CELL_A = HWPTAG_BEGIN + 62; // 78\nconst TAG_TABLE_B = HWPTAG_BEGIN + 64; // 80\nconst TAG_CELL_B = HWPTAG_BEGIN + 65; // 81\n\nfunction isTableTag(t: number) { return t === TAG_TABLE_A || t === TAG_TABLE_B; }\nfunction isCellTag(t: number) { return t === TAG_CELL_A || t === TAG_CELL_B || t === TAG_LIST_HEADER; }\n\n// CTRL_HEADER ctrlId for table: ' lbt' as UINT32-LE = 0x74626C20\nconst CTRL_TABLE = 0x74626C20;\n\n/* ═══════════════════════════════════════════════════════════════\n Types\n ═══════════════════════════════════════════════════════════════ */\n\ninterface HwpRecord {\n tag: number;\n level: number;\n data: Uint8Array;\n}\n\ninterface HwpCharShape {\n faceIds: number[];\n height: number;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikeout: boolean;\n superscript: boolean;\n subscript: boolean;\n textColor: string;\n}\n\ninterface HwpParaShape {\n align: Align;\n spaceBefore: number;\n spaceAfter: number;\n lineSpacing: number;\n indent: number;\n}\n\ninterface HwpBorderFill {\n borders: { type: number; widthPt: number; color: string }[];\n bgColor?: string;\n}\n\ninterface DocInfo {\n faceNames: string[];\n charShapes: HwpCharShape[];\n paraShapes: HwpParaShape[];\n borderFills: HwpBorderFill[];\n}\n\ninterface ParsedChar { pos: number; ch: string }\ninterface ParaTextResult { chars: ParsedChar[]; controlPositions: number[] }\n\n/* ═══════════════════════════════════════════════════════════════\n Low-level record parsing\n ═══════════════════════════════════════════════════════════════ */\n\nfunction parseRecords(data: Uint8Array): HwpRecord[] {\n const out: HwpRecord[] = [];\n let off = 0;\n while (off + 4 <= data.length) {\n const hdr = BinaryKit.readU32LE(data, off);\n const tag = hdr & 0x3FF;\n const level = (hdr >> 10) & 0x3FF;\n let size = (hdr >> 20) & 0xFFF;\n off += 4;\n if (size === 0xFFF) {\n if (off + 4 > data.length) break;\n size = BinaryKit.readU32LE(data, off);\n off += 4;\n }\n if (off + size > data.length) break;\n out.push({ tag, level, data: data.subarray(off, off + size) });\n off += size;\n }\n return out;\n}\n\nfunction tryInflate(data: Uint8Array): Uint8Array {\n try { return pako.inflateRaw(data); } catch { return data; }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n FileHeader\n ═══════════════════════════════════════════════════════════════ */\n\nfunction parseFileHeader(buf: Uint8Array) {\n if (buf.length < 40) return { compressed: true, encrypted: false };\n const props = BinaryKit.readU32LE(buf, 36);\n return { compressed: (props & 1) !== 0, encrypted: (props & 2) !== 0 };\n}\n\n/* ═══════════════════════════════════════════════════════════════\n DocInfo parsing\n ═══════════════════════════════════════════════════════════════ */\n\nfunction parseDocInfo(data: Uint8Array, compressed: boolean): DocInfo {\n const raw = compressed ? tryInflate(data) : data;\n const recs = parseRecords(raw);\n const info: DocInfo = { faceNames: [], charShapes: [], paraShapes: [], borderFills: [] };\n\n for (const r of recs) {\n try {\n if (r.tag === TAG_FACE_NAME) info.faceNames.push(parseFaceName(r.data));\n if (r.tag === TAG_CHAR_SHAPE) info.charShapes.push(parseCharShape(r.data));\n if (r.tag === TAG_PARA_SHAPE) info.paraShapes.push(parseParaShape(r.data));\n if (r.tag === TAG_BORDER_FILL) info.borderFills.push(parseBorderFill(r.data));\n } catch { /* skip malformed record */ }\n }\n return info;\n}\n\n/* ── FACE_NAME ──────────────────────────────────────────────── */\n\nfunction parseFaceName(d: Uint8Array): string {\n if (d.length < 3) return '';\n const len = BinaryKit.readU16LE(d, 1); // UTF-16 char count\n if (d.length < 3 + len * 2) return '';\n return new TextDecoder('utf-16le').decode(d.subarray(3, 3 + len * 2));\n}\n\n/* ── CHAR_SHAPE ─────────────────────────────────────────────── */\n/* offset size field\n 0 14 faceId[7] (UINT16 × 7)\n 14 7 ratio[7]\n 21 7 spacing[7]\n 28 7 relSize[7]\n 35 7 offset[7]\n 42 4 height (UINT32, HWP-units 100 = 1pt)\n 46 4 attr (UINT32, bit flags)\n 50 1 shadowX\n 51 1 shadowY\n 52 4 textColor (COLORREF R,G,B,0) */\n\nfunction parseCharShape(d: Uint8Array): HwpCharShape {\n const faceIds: number[] = [];\n for (let i = 0; i < 7; i++) faceIds.push(d.length >= (i + 1) * 2 ? BinaryKit.readU16LE(d, i * 2) : 0);\n\n const height = d.length >= 46 ? BinaryKit.readU32LE(d, 42) : 1000;\n const attr = d.length >= 50 ? BinaryKit.readU32LE(d, 46) : 0;\n\n // attr bit layout (HWP 5.0 spec Table 35):\n // 0: italic, 1: bold, 2-4: underline type(3), 5-8: underline shape(4),\n // 9-11: outline(3), 12-13: shadow(2), 14: emboss, 15: engrave,\n // 16-17: super/sub(2, 0=none,1=super,2=sub), 18-20: strikeout type(3),\n // 21-24: strikeout shape(4), 25: annotLine, 26-28: annotLine type,\n // 29: useFontSpace, 30: kerning\n const ulType = (attr >> 2) & 0x7; // 3 bits at 2-4\n const skType = (attr >> 18) & 0x7; // 3 bits at 18-20\n const suType = (attr >> 16) & 0x3; // 2 bits at 16-17 (0=none,1=super,2=sub)\n\n return {\n faceIds,\n height: (height > 0 && height < 100000) ? height : 1000,\n italic: (attr & 1) !== 0,\n bold: ((attr >> 1) & 1) !== 0,\n underline: ulType !== 0,\n strikeout: skType !== 0,\n superscript: suType === 1,\n subscript: suType === 2,\n textColor: d.length >= 56 ? colorRef(d, 52) : '000000',\n };\n}\n\n/* ── PARA_SHAPE ─────────────────────────────────────────────── */\n/* offset size field\n 0 4 attr1 (bits 0-1 = alignment: 0=justify,1=left,2=right,3=center)\n 4 4 leftMargin (HWPUNIT)\n 8 4 rightMargin\n 12 4 indent\n 16 4 spaceBefore\n 20 4 spaceAfter\n 24 4 lineSpacing */\n\nconst ALIGN_TBL: Record<number, Align> = { 0: 'justify', 1: 'left', 2: 'right', 3: 'center', 4: 'justify' };\n\nfunction parseParaShape(d: Uint8Array): HwpParaShape {\n if (d.length < 4) return { align: 'left', spaceBefore: 0, spaceAfter: 0, lineSpacing: 160, indent: 0 };\n const attr = BinaryKit.readU32LE(d, 0);\n return {\n align: ALIGN_TBL[attr & 0x7] ?? 'left',\n indent: d.length >= 16 ? i32(d, 12) : 0,\n spaceBefore: d.length >= 20 ? i32(d, 16) : 0,\n spaceAfter: d.length >= 24 ? i32(d, 20) : 0,\n lineSpacing: d.length >= 28 ? i32(d, 24) : 160,\n };\n}\n\n/* ── BORDER_FILL ────────────────────────────────────────────── */\n/* [0:2] attr\n For each of 5 borders (left,right,top,bottom,diagonal): 6 bytes\n +0 type(BYTE) +1 widthIdx(BYTE) +2 color(COLORREF)\n [32:4] fillType\n [36:4] faceColor (bgColor for solid fill) */\n\nconst BORDER_W_PT = [0.28, 0.34, 0.43, 0.57, 0.71, 0.85, 1.13, 1.42, 1.70, 1.98, 2.84, 4.25, 5.67, 8.50, 11.34, 14.17];\nconst BORDER_KIND: Record<number, StrokeKind> = { 0:'none',1:'solid',2:'dash',3:'dot',4:'dash',5:'dash',6:'dash',7:'dot',8:'double',9:'double',10:'double' };\n\nfunction parseBorderFill(d: Uint8Array): HwpBorderFill {\n const borders: HwpBorderFill['borders'] = [];\n for (let i = 0; i < 4; i++) {\n const b = 2 + i * 6;\n if (b + 6 <= d.length) {\n borders.push({ type: d[b], widthPt: BORDER_W_PT[d[b + 1]] ?? 0.5, color: colorRef(d, b + 2) });\n } else {\n borders.push({ type: 0, widthPt: 0.5, color: '000000' });\n }\n }\n let bgColor: string | undefined;\n const fOff = 32; // after attr(2) + 5 borders(30)\n if (d.length >= fOff + 8) {\n const ft = BinaryKit.readU32LE(d, fOff);\n if (ft & 1) bgColor = colorRef(d, fOff + 4);\n }\n return { borders, bgColor };\n}\n\n/* ═══════════════════════════════════════════════════════════════\n Body section parsing\n ═══════════════════════════════════════════════════════════════ */\n\nfunction parseBody(\n raw: Uint8Array, compressed: boolean, di: DocInfo, shield: ShieldedParser,\n): { content: ContentNode[]; pageDims?: PageDims } {\n const recs = parseRecords(compressed ? tryInflate(raw) : raw);\n const content: ContentNode[] = [];\n let pageDims: PageDims | undefined;\n let i = 0;\n\n while (i < recs.length) {\n if (recs[i].tag === TAG_PAGE_DEF) {\n pageDims = shield.guard(() => parsePageDef(recs[i].data), A4, 'hwp:pageDef');\n i++;\n } else if (recs[i].tag === TAG_PARA_HEADER) {\n const r = shield.guard(\n () => parseParagraphGroup(recs, i, di, shield),\n { nodes: [] as ContentNode[], next: i + 1 },\n `hwp:para@${i}`,\n );\n content.push(...r.nodes);\n i = r.next;\n } else {\n i++;\n }\n }\n return { content, pageDims };\n}\n\n/* ── Paragraph group ────────────────────────────────────────── */\n\nfunction parseParagraphGroup(\n recs: HwpRecord[], start: number, di: DocInfo, shield: ShieldedParser,\n): { nodes: ContentNode[]; next: number } {\n const hdr = recs[start];\n const lv = hdr.level;\n\n // paraShapeId at offset 8 (UINT16)\n const psId = hdr.data.length >= 10 ? BinaryKit.readU16LE(hdr.data, 8) : 0;\n const ps = di.paraShapes[psId];\n\n let text: ParaTextResult | null = null;\n let csPairs: [number, number][] = [];\n const grids: ContentNode[] = [];\n let i = start + 1;\n\n while (i < recs.length && recs[i].level > lv) {\n const r = recs[i];\n\n if (r.tag === TAG_PARA_TEXT && r.level === lv + 1) {\n text = decodeParaText(r.data);\n i++;\n } else if (r.tag === TAG_PARA_CHAR_SHAPE && r.level === lv + 1) {\n csPairs = parseCharShapePairs(r.data);\n i++;\n } else if (r.tag === TAG_CTRL_HEADER && r.level === lv + 1) {\n if (r.data.length >= 4 && BinaryKit.readU32LE(r.data, 0) === CTRL_TABLE) {\n const tr = shield.guard(\n () => parseTableCtrl(recs, i, di, shield),\n { grid: null, next: skipKids(recs, i) },\n `hwp:tbl@${i}`,\n );\n if (tr.grid) grids.push(tr.grid);\n i = tr.next;\n } else {\n i = skipKids(recs, i);\n }\n } else {\n i++;\n }\n }\n\n const nodes: ContentNode[] = [];\n\n // Build paragraph from text\n if (text && text.chars.length > 0) {\n const joined = text.chars.map(c => c.ch).join('');\n if (joined.trim()) {\n const spans = resolveCharShapes(text.chars, csPairs, di);\n nodes.push(buildPara(spans, buildParaProps(ps)));\n }\n }\n\n nodes.push(...grids);\n return { nodes, next: i };\n}\n\nfunction skipKids(recs: HwpRecord[], idx: number): number {\n const lv = recs[idx].level;\n let i = idx + 1;\n while (i < recs.length && recs[i].level > lv) i++;\n return i;\n}\n\n/* ── PARA_TEXT ───────────────────────────────────────────────── */\n\n// Extended controls: 8 WORDs, associated CTRL_HEADER\nconst EXT_CTRL = new Set([2, 3, 11, 12, 14, 15]);\n// Inline controls: 8 WORDs, no CTRL_HEADER\nconst INL_CTRL = new Set([4, 5, 6, 7, 8]);\n\nfunction decodeParaText(d: Uint8Array): ParaTextResult {\n const chars: ParsedChar[] = [];\n const controlPositions: number[] = [];\n let i = 0, pos = 0;\n\n while (i + 1 < d.length) {\n const c = d[i] | (d[i + 1] << 8);\n if (c === 0) { i += 2; pos++; continue; }\n if (c === 13) { break; } // paragraph end\n if (c === 10) { chars.push({ pos, ch: '\\n' }); i += 2; pos++; continue; }\n\n if (EXT_CTRL.has(c)) {\n controlPositions.push(pos);\n i += 16; pos += 8; continue; // 8 WORDs\n }\n if (INL_CTRL.has(c)) {\n i += 16; pos += 8; continue;\n }\n if (c === 9) { // tab (inline 8 WORDs)\n chars.push({ pos, ch: '\\t' });\n i += 16; pos += 8; continue;\n }\n if (c >= 1 && c <= 31) { i += 2; pos++; continue; } // other control\n\n chars.push({ pos, ch: String.fromCharCode(c) });\n i += 2; pos++;\n }\n return { chars, controlPositions };\n}\n\n/* ── PARA_CHAR_SHAPE ────────────────────────────────────────── */\n\nfunction parseCharShapePairs(d: Uint8Array): [number, number][] {\n const out: [number, number][] = [];\n for (let i = 0; i + 7 < d.length; i += 8)\n out.push([BinaryKit.readU32LE(d, i), BinaryKit.readU32LE(d, i + 4)]);\n return out;\n}\n\n/* ── Char-shape → SpanNode resolution ───────────────────────── */\n\nfunction resolveCharShapes(chars: ParsedChar[], pairs: [number, number][], di: DocInfo): SpanNode[] {\n if (chars.length === 0) return [buildSpan('')];\n\n const defaultId = pairs.length > 0 ? pairs[0][1] : 0;\n\n function idFor(pos: number): number {\n let id = defaultId;\n for (const [p, sid] of pairs) { if (p <= pos) id = sid; else break; }\n return id;\n }\n\n const spans: SpanNode[] = [];\n let curId = idFor(chars[0].pos);\n let buf = chars[0].ch;\n\n for (let k = 1; k < chars.length; k++) {\n const sid = idFor(chars[k].pos);\n if (sid !== curId) { spans.push(styledSpan(buf, curId, di)); buf = ''; curId = sid; }\n buf += chars[k].ch;\n }\n if (buf) spans.push(styledSpan(buf, curId, di));\n return spans;\n}\n\nfunction styledSpan(text: string, shapeId: number, di: DocInfo): SpanNode {\n const cs = di.charShapes[shapeId];\n if (!cs) return buildSpan(text);\n\n const props: TextProps = {};\n const fid = cs.faceIds[0] ?? 0;\n if (fid < di.faceNames.length && di.faceNames[fid]) props.font = safeFont(di.faceNames[fid]);\n if (cs.height > 0) props.pt = Metric.hwpToPt(cs.height);\n if (cs.bold) props.b = true;\n if (cs.italic) props.i = true;\n if (cs.underline) props.u = true;\n if (cs.strikeout) props.s = true;\n if (cs.superscript) props.sup = true;\n if (cs.subscript) props.sub = true;\n\n const hex = safeHex(cs.textColor);\n if (hex && hex !== '000000') props.color = hex;\n\n return buildSpan(text, props);\n}\n\n/* ── Table control parsing ──────────────────────────────────── */\n\nfunction parseTableCtrl(\n recs: HwpRecord[], ctrlIdx: number, di: DocInfo, shield: ShieldedParser,\n): { grid: ContentNode | null; next: number } {\n const ctrlLv = recs[ctrlIdx].level;\n let i = ctrlIdx + 1;\n\n let tblData: Uint8Array | null = null;\n const cells: { data: Uint8Array; tag: number; cStart: number; cEnd: number }[] = [];\n\n // Collect TABLE and cell records within this control's scope\n const tblLevel = ctrlLv + 1;\n\n while (i < recs.length && recs[i].level > ctrlLv) {\n const r = recs[i];\n\n if (isTableTag(r.tag) && r.level === tblLevel) {\n tblData = r.data;\n i++;\n } else if (r.tag === TAG_LIST_HEADER && r.level === tblLevel) {\n // LIST_HEADER as cell: paraCount tells how many paragraphs follow\n const cellData = r.data;\n const paraCount = cellData.length >= 2 ? BinaryKit.readU16LE(cellData, 0) : 0;\n i++;\n const cStart = i;\n // Consume exactly paraCount paragraphs (each with its child records)\n let consumed = 0;\n while (i < recs.length && consumed < paraCount) {\n if (recs[i].tag === TAG_PARA_HEADER && recs[i].level === tblLevel) {\n consumed++;\n i++;\n // Skip child records of this paragraph\n while (i < recs.length && recs[i].level > tblLevel) i++;\n } else if (recs[i].level > tblLevel) {\n i++;\n } else {\n break; // hit next sibling at same level\n }\n }\n cells.push({ data: cellData, tag: TAG_LIST_HEADER, cStart, cEnd: i });\n } else if (isCellTag(r.tag) && r.level === tblLevel) {\n // Full CELL record (with cell-specific fields)\n const cellData = r.data;\n const cellTag = r.tag;\n i++;\n const cStart = i;\n while (i < recs.length && recs[i].level > tblLevel) i++;\n cells.push({ data: cellData, tag: cellTag, cStart, cEnd: i });\n } else {\n i++;\n }\n }\n\n if (!tblData || cells.length === 0) return { grid: null, next: i };\n\n const rowCnt = tblData.length >= 6 ? BinaryKit.readU16LE(tblData, 4) : 1;\n const colCnt = tblData.length >= 8 ? BinaryKit.readU16LE(tblData, 6) : 1;\n\n interface PC { row: number; col: number; cs: number; rs: number; widthHwp: number; props: CellProps; paras: ParaNode[] }\n const parsed: PC[] = [];\n\n for (let ci = 0; ci < cells.length; ci++) {\n const c = cells[ci];\n const seqIdx = ci;\n const pc = shield.guard(\n () => parseCellRec(c.data, c.tag, recs, c.cStart, c.cEnd, di, shield, seqIdx, colCnt),\n { row: Math.floor(ci / (colCnt || 1)), col: ci % (colCnt || 1), cs: 1, rs: 1, widthHwp: 0, props: {}, paras: [buildPara([buildSpan('')])] },\n `hwp:cell@${c.cStart}`,\n );\n parsed.push(pc);\n }\n\n // Determine actual row count from cell data (may exceed rowCnt for merged cells)\n const maxRow = parsed.reduce((m, c) => Math.max(m, c.row + c.rs), 0);\n const actualRowCnt = Math.max(rowCnt, maxRow);\n\n // Validate cell positions; fallback to sequential layout if invalid\n const posValid = parsed.every(c => c.row >= 0 && c.col >= 0 && c.col < colCnt);\n if (!posValid) {\n let idx = 0;\n for (const c of parsed) { c.row = Math.floor(idx / colCnt); c.col = idx % colCnt; idx++; }\n }\n\n // Compute column widths in points from cell widths\n const colWidthsPt: number[] = new Array(colCnt).fill(0);\n // Pass 1: use cells with cs=1 for exact column widths\n for (const c of parsed) {\n if (c.cs === 1 && c.widthHwp > 0) {\n const wPt = Metric.hwpToPt(c.widthHwp);\n if (wPt > colWidthsPt[c.col]) colWidthsPt[c.col] = wPt;\n }\n }\n // Pass 2: for columns still 0, try to derive from multi-span cells\n const zeroColumns = colWidthsPt.filter(w => w === 0).length;\n if (zeroColumns > 0) {\n for (const c of parsed) {\n if (c.cs > 1 && c.widthHwp > 0) {\n // Subtract known column widths from the span\n let known = 0;\n let unknownCols = 0;\n for (let ci = c.col; ci < c.col + c.cs && ci < colCnt; ci++) {\n if (colWidthsPt[ci] > 0) known += colWidthsPt[ci];\n else unknownCols++;\n }\n if (unknownCols > 0) {\n const remaining = Metric.hwpToPt(c.widthHwp) - known;\n const each = remaining > 0 ? remaining / unknownCols : 0;\n for (let ci = c.col; ci < c.col + c.cs && ci < colCnt; ci++) {\n if (colWidthsPt[ci] === 0 && each > 0) colWidthsPt[ci] = each;\n }\n }\n }\n }\n }\n\n const rows = [];\n for (let r = 0; r < actualRowCnt; r++) {\n const rc = parsed.filter(c => c.row === r).sort((a, b) => a.col - b.col);\n if (rc.length === 0) continue;\n rows.push(buildRow(rc.map(c =>\n buildCell(c.paras.length ? c.paras : [buildPara([buildSpan('')])], { cs: c.cs, rs: c.rs, props: c.props }),\n )));\n }\n if (rows.length === 0) return { grid: null, next: i };\n\n // Table-level default stroke\n let defStroke: Stroke | undefined;\n const bfOff = 18 + rowCnt * 2;\n if (tblData.length >= bfOff + 2) {\n const bfId = BinaryKit.readU16LE(tblData, bfOff);\n defStroke = strokeFromBF(bfId, di);\n }\n\n const gp: GridProps = {};\n if (defStroke) gp.defaultStroke = defStroke;\n const hasWidths = colWidthsPt.some(w => w > 0);\n if (hasWidths) gp.colWidths = colWidthsPt;\n return { grid: buildGrid(rows, gp), next: i };\n}\n\n/* ── Cell record ────────────────────────────────────────────── */\n/* LIST_HEADER for cells (HWP 5.0/5.1):\n [0:2] paraCount [2:4] attr (bits 6-7 = vertAlign)\n [6:2] unknown [8:2] rowAddr [10:2] colAddr\n [12:2] rowSpan [14:2] colSpan\n [16:4] width(HWPUNIT) [20:4] height(HWPUNIT)\n [24:8] padding[4] [32:2] borderFillId */\n\nfunction parseCellRec(\n d: Uint8Array, tag: number, recs: HwpRecord[], cStart: number, cEnd: number,\n di: DocInfo, shield: ShieldedParser, seqIdx: number, colCnt: number,\n) {\n let col: number, row: number, cs = 1, rs = 1;\n let widthHwp = 0;\n const props: CellProps = {};\n\n const attr = d.length >= 6 ? BinaryKit.readU32LE(d, 2) : 0;\n const va = (attr >> 6) & 0x3;\n if (va === 1) props.va = 'mid';\n else if (va === 2) props.va = 'bot';\n\n if (tag === TAG_LIST_HEADER && d.length >= 22) {\n // LIST_HEADER with cell-specific fields\n // offset 8: colAddr, offset 10: rowAddr (HWP 5.0 spec)\n col = BinaryKit.readU16LE(d, 8);\n row = BinaryKit.readU16LE(d, 10);\n rs = Math.max(1, BinaryKit.readU16LE(d, 12));\n cs = Math.max(1, BinaryKit.readU16LE(d, 14));\n widthHwp = BinaryKit.readU32LE(d, 16);\n\n const bfId = d.length >= 34 ? BinaryKit.readU16LE(d, 32) : 0;\n if (bfId > 0 && bfId <= di.borderFills.length) {\n const bf = di.borderFills[bfId - 1];\n if (bf.borders.length >= 4) {\n props.left = toStroke(bf.borders[0]);\n props.right = toStroke(bf.borders[1]);\n props.top = toStroke(bf.borders[2]);\n props.bot = toStroke(bf.borders[3]);\n }\n if (bf.bgColor && bf.bgColor !== 'FFFFFF') props.bg = bf.bgColor;\n }\n } else if (tag !== TAG_LIST_HEADER) {\n // Full CELL record with position/span/borderFill\n col = d.length >= 8 ? BinaryKit.readU16LE(d, 6) : seqIdx % (colCnt || 1);\n row = d.length >= 10 ? BinaryKit.readU16LE(d, 8) : Math.floor(seqIdx / (colCnt || 1));\n cs = d.length >= 12 ? Math.max(1, BinaryKit.readU16LE(d, 10)) : 1;\n rs = d.length >= 14 ? Math.max(1, BinaryKit.readU16LE(d, 12)) : 1;\n widthHwp = d.length >= 18 ? BinaryKit.readU32LE(d, 14) : 0;\n\n const bfId = d.length >= 32 ? BinaryKit.readU16LE(d, 30) : 0;\n if (bfId > 0 && bfId <= di.borderFills.length) {\n const bf = di.borderFills[bfId - 1];\n if (bf.borders.length >= 4) {\n props.left = toStroke(bf.borders[0]);\n props.right = toStroke(bf.borders[1]);\n props.top = toStroke(bf.borders[2]);\n props.bot = toStroke(bf.borders[3]);\n }\n if (bf.bgColor && bf.bgColor !== 'FFFFFF') props.bg = bf.bgColor;\n }\n } else {\n // Fallback: LIST_HEADER too short, compute sequentially\n row = Math.floor(seqIdx / (colCnt || 1));\n col = seqIdx % (colCnt || 1);\n }\n\n // Parse cell content paragraphs\n const paras: ParaNode[] = [];\n let k = cStart;\n while (k < cEnd) {\n if (recs[k].tag === TAG_PARA_HEADER) {\n // For cell paragraphs, they might be at various nesting levels\n const r = shield.guard(\n () => {\n const hdr = recs[k];\n const lv = hdr.level;\n const psId = hdr.data.length >= 10 ? BinaryKit.readU16LE(hdr.data, 8) : 0;\n const ps = di.paraShapes[psId];\n let txt: ParaTextResult | null = null;\n let csp: [number, number][] = [];\n let j = k + 1;\n while (j < cEnd && recs[j].level > lv) {\n if (recs[j].tag === TAG_PARA_TEXT) { txt = decodeParaText(recs[j].data); j++; }\n else if (recs[j].tag === TAG_PARA_CHAR_SHAPE) { csp = parseCharShapePairs(recs[j].data); j++; }\n else j++;\n }\n const spans = txt && txt.chars.length > 0 ? resolveCharShapes(txt.chars, csp, di) : [buildSpan('')];\n return { para: buildPara(spans, buildParaProps(ps)), next: j };\n },\n { para: buildPara([buildSpan('')]), next: k + 1 },\n `hwp:cellP@${k}`,\n );\n paras.push(r.para);\n k = r.next;\n } else { k++; }\n }\n\n return { row, col, cs, rs, props, widthHwp, paras: paras.length ? paras : [buildPara([buildSpan('')])] };\n}\n\n/* ── PAGE_DEF ───────────────────────────────────────────────── */\n/* [0:4] width [4:4] height [8:4] ml [12:4] mr\n [16:4] mt [20:4] mb [36:4] attr (bit0=landscape) */\n\nfunction parsePageDef(d: Uint8Array): PageDims {\n if (d.length < 24) return A4;\n const w = BinaryKit.readU32LE(d, 0);\n const h = BinaryKit.readU32LE(d, 4);\n const ml = BinaryKit.readU32LE(d, 8);\n const mr = BinaryKit.readU32LE(d, 12);\n const mt = BinaryKit.readU32LE(d, 16);\n const mb = BinaryKit.readU32LE(d, 20);\n const at = d.length >= 40 ? BinaryKit.readU32LE(d, 36) : 0;\n return {\n wPt: Metric.hwpToPt(w), hPt: Metric.hwpToPt(h),\n ml: Metric.hwpToPt(ml), mr: Metric.hwpToPt(mr),\n mt: Metric.hwpToPt(mt), mb: Metric.hwpToPt(mb),\n orient: (at & 1) ? 'landscape' : 'portrait',\n };\n}\n\n/* ═══════════════════════════════════════════════════════════════\n Helpers\n ═══════════════════════════════════════════════════════════════ */\n\nfunction i32(d: Uint8Array, o: number): number {\n const u = BinaryKit.readU32LE(d, o);\n return u > 0x7FFFFFFF ? u - 0x100000000 : u;\n}\n\nfunction colorRef(d: Uint8Array, o: number): string {\n if (o + 3 > d.length) return '000000';\n return ((d[o] << 16) | (d[o + 1] << 8) | d[o + 2]).toString(16).padStart(6, '0').toUpperCase();\n}\n\nfunction toStroke(b: { type: number; widthPt: number; color: string }): Stroke {\n return { kind: BORDER_KIND[b.type] ?? 'solid', pt: b.widthPt, color: b.color };\n}\n\nfunction strokeFromBF(bfId: number, di: DocInfo): Stroke | undefined {\n if (bfId <= 0 || bfId > di.borderFills.length) return undefined;\n const bf = di.borderFills[bfId - 1];\n if (!bf.borders.length) return undefined;\n const b = bf.borders[0];\n return { kind: BORDER_KIND[b.type] ?? 'solid', pt: b.widthPt, color: b.color };\n}\n\nfunction buildParaProps(ps?: HwpParaShape): ParaProps {\n if (!ps) return {};\n const p: ParaProps = {};\n if (ps.align && ps.align !== 'left') p.align = ps.align;\n if (ps.spaceBefore > 0) p.spaceBefore = Metric.hwpToPt(ps.spaceBefore);\n if (ps.spaceAfter > 0) p.spaceAfter = Metric.hwpToPt(ps.spaceAfter);\n if (ps.lineSpacing > 0 && ps.lineSpacing !== 160) p.lineHeight = ps.lineSpacing / 100;\n if (ps.indent > 0) p.indentPt = Metric.hwpToPt(ps.indent);\n return p;\n}\n\n/* ═══════════════════════════════════════════════════════════════\n Decoder class\n ═══════════════════════════════════════════════════════════════ */\n\nexport class HwpScanner implements Decoder {\n readonly format = 'hwp';\n\n async decode(data: Uint8Array): Promise<Outcome<DocRoot>> {\n const shield = new ShieldedParser();\n const warns: string[] = [];\n\n try {\n if (!BinaryKit.isOle2(data)) return fail('HWP: Invalid OLE2 signature');\n const streams = BinaryKit.parseCfb(data);\n\n // FileHeader\n const fh = streams.get('FileHeader');\n const { compressed, encrypted } = fh ? parseFileHeader(fh) : { compressed: true, encrypted: false };\n if (encrypted) return fail('HWP: 암호화된 파일은 지원하지 않습니다');\n\n // DocInfo\n const diRaw = streams.get('DocInfo');\n let di: DocInfo = { faceNames: [], charShapes: [], paraShapes: [], borderFills: [] };\n if (diRaw) {\n di = shield.guard(() => parseDocInfo(diRaw, compressed), di, 'hwp:docInfo');\n }\n\n // Body sections\n const allContent: ContentNode[] = [];\n let pageDims: PageDims = A4;\n\n for (let s = 0; s < 100; s++) {\n const sec = streams.get(`BodyText/Section${s}`) ?? streams.get(`Section${s}`);\n if (!sec) {\n if (s === 0) {\n const fb = findBodySection(streams);\n if (fb) {\n const r = parseBody(fb, compressed, di, shield);\n allContent.push(...r.content);\n if (r.pageDims) pageDims = r.pageDims;\n }\n }\n break;\n }\n const r = shield.guard(\n () => parseBody(sec, compressed, di, shield),\n { content: [], pageDims: undefined },\n `hwp:sec${s}`,\n );\n allContent.push(...r.content);\n if (r.pageDims) pageDims = r.pageDims;\n }\n\n warns.push(...shield.flush());\n const content = allContent.length > 0 ? allContent : [buildPara([buildSpan('')])];\n return succeed(buildRoot({}, [buildSheet(content, pageDims)]), warns);\n } catch (e: any) {\n warns.push(...shield.flush());\n return fail(`HWP decode error: ${e?.message ?? String(e)}`, warns);\n }\n }\n}\n\nfunction findBodySection(streams: Map<string, Uint8Array>): Uint8Array | undefined {\n for (const [k, v] of streams)\n if (k.includes('Section') && !k.includes('Header') && !k.includes('Info')) return v;\n return undefined;\n}\n\nregistry.registerDecoder(new HwpScanner());\n","import type { Decoder } from '../../contract/decoder';\nimport type { DocRoot, ContentNode, ParaNode, SpanNode, GridNode, ImgNode, PageNumNode, CellNode } from '../../model/doc-tree';\nimport type { Outcome } from '../../contract/result';\nimport type { DocMeta, PageDims, TextProps, ParaProps, CellProps, GridProps, TableLook } from '../../model/doc-props';\nimport { A4 } from '../../model/doc-props';\nimport { succeed, fail } from '../../contract/result';\nimport { buildRoot, buildSheet, buildPara, buildSpan, buildImg, buildGrid, buildRow, buildCell } from '../../model/builders';\nimport { ShieldedParser } from '../../safety/ShieldedParser';\nimport { Metric, safeAlign, safeFont, safeHex, safeStrokeDocx } from '../../safety/StyleBridge';\nimport { ArchiveKit } from '../../toolkit/ArchiveKit';\nimport { XmlKit } from '../../toolkit/XmlKit';\nimport { TextKit } from '../../toolkit/TextKit';\nimport { registry } from '../../pipeline/registry';\n\nexport class DocxDecoder implements Decoder {\n readonly format = 'docx';\n\n async decode(data: Uint8Array): Promise<Outcome<DocRoot>> {\n const shield = new ShieldedParser();\n const warns: string[] = [];\n\n try {\n const files = await ArchiveKit.unzip(data);\n\n const docXml = files.get('word/document.xml');\n if (!docXml) return fail('DOCX: word/document.xml not found');\n\n const relsXml = files.get('word/_rels/document.xml.rels');\n const relsMap = relsXml ? await parseRels(TextKit.decode(relsXml)) : new Map<string, string>();\n\n const coreXml = files.get('docProps/core.xml');\n let meta: DocMeta = {};\n if (coreXml) {\n try {\n meta = await parseCoreProps(TextKit.decode(coreXml));\n } catch {\n // ignore — meta is optional\n }\n }\n\n // Parse numbering.xml for list support\n const numXml = files.get('word/numbering.xml');\n let numMap: NumMap = new Map();\n if (numXml) {\n try {\n numMap = await parseNumbering(TextKit.decode(numXml));\n } catch { /* non-fatal */ }\n }\n\n const docStr = TextKit.decode(docXml);\n const docObj: any = await XmlKit.parseStrict(docStr);\n\n const body = getBody(docObj);\n const dims = extractDims(body) ?? { ...A4 };\n const elements = getBodyElements(body);\n\n const decCtx: DecCtx = { relsMap, files, shield, numMap, warns };\n\n const kids: ContentNode[] = shield.guardAll(\n elements,\n (el: any) => decodeElement(el, decCtx),\n () => buildPara([buildSpan('[요소 파싱 실패]')]),\n 'docx:bodyElement',\n );\n\n // Decode header/footer\n const headerParas = await decodeHeaderFooter('header', body, relsMap, files, decCtx);\n const footerParas = await decodeHeaderFooter('footer', body, relsMap, files, decCtx);\n\n warns.push(...shield.flush());\n const sheet = buildSheet(\n kids.filter(Boolean) as ContentNode[],\n dims,\n { header: headerParas, footer: footerParas },\n );\n return succeed(buildRoot(meta, [sheet]), warns);\n } catch (e: any) {\n warns.push(...shield.flush());\n return fail(`DOCX decode error: ${e?.message ?? String(e)}`, warns);\n }\n }\n}\n\n// ─── types ─────────────────────────────────────────────────\n\ninterface DecCtx {\n relsMap: Map<string, string>;\n files: Map<string, Uint8Array>;\n shield: ShieldedParser;\n numMap: NumMap;\n warns: string[];\n}\n\n// numId → { abstractNumId, levels: Map<ilvl, { fmt, isOrdered }> }\ntype NumMap = Map<number, { levels: Map<number, { fmt: string; isOrdered: boolean }> }>;\n\n// ─── helpers ────────────────────────────────────────────────\n\nfunction toArr(v: any): any[] { return v == null ? [] : Array.isArray(v) ? v : [v]; }\n\nasync function parseRels(xml: string): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n try {\n const obj: any = await XmlKit.parseStrict(xml);\n for (const rel of toArr(obj?.Relationships?.[0]?.Relationship)) {\n const a = rel?._attr ?? {};\n if (a.Id && a.Target) map.set(a.Id, a.Target);\n }\n } catch { /* ignore */ }\n return map;\n}\n\nasync function parseCoreProps(xml: string): Promise<DocMeta> {\n try {\n const obj: any = await XmlKit.parseStrict(xml);\n const c = obj?.['cp:coreProperties']?.[0] ?? obj?.coreProperties?.[0] ?? {};\n return {\n title: c?.['dc:title']?.[0]?._text ?? undefined,\n author: c?.['dc:creator']?.[0]?._text ?? undefined,\n subject: c?.['dc:subject']?.[0]?._text ?? undefined,\n created: c?.['dcterms:created']?.[0]?._text ?? undefined,\n modified: c?.['dcterms:modified']?.[0]?._text ?? undefined,\n };\n } catch { return {}; }\n}\n\nasync function parseNumbering(xml: string): Promise<NumMap> {\n const map: NumMap = new Map();\n try {\n const obj: any = await XmlKit.parseStrict(xml);\n const root = obj?.['w:numbering']?.[0] ?? obj?.numbering?.[0] ?? obj;\n\n // Parse abstractNums\n const absMap = new Map<number, Map<number, { fmt: string; isOrdered: boolean }>>();\n for (const abs of toArr(root?.['w:abstractNum'] ?? root?.abstractNum)) {\n const absId = Number(abs?._attr?.['w:abstractNumId'] ?? abs?._attr?.abstractNumId ?? 0);\n const levels = new Map<number, { fmt: string; isOrdered: boolean }>();\n for (const lvl of toArr(abs?.['w:lvl'] ?? abs?.lvl)) {\n const ilvl = Number(lvl?._attr?.['w:ilvl'] ?? lvl?._attr?.ilvl ?? 0);\n const fmtNode = lvl?.['w:numFmt']?.[0]?._attr ?? lvl?.numFmt?.[0]?._attr ?? {};\n const fmt = fmtNode?.['w:val'] ?? fmtNode?.val ?? 'decimal';\n levels.set(ilvl, { fmt, isOrdered: fmt !== 'bullet' });\n }\n absMap.set(absId, levels);\n }\n\n // Parse nums\n for (const num of toArr(root?.['w:num'] ?? root?.num)) {\n const numId = Number(num?._attr?.['w:numId'] ?? num?._attr?.numId ?? 0);\n const absRef = num?.['w:abstractNumId']?.[0]?._attr ?? num?.abstractNumId?.[0]?._attr ?? {};\n const absId = Number(absRef?.['w:val'] ?? absRef?.val ?? 0);\n const levels = absMap.get(absId) ?? new Map();\n map.set(numId, { levels });\n }\n } catch { /* non-fatal */ }\n return map;\n}\n\nfunction getBody(obj: any): any {\n return obj?.['w:document']?.[0]?.['w:body']?.[0] ?? obj?.document?.[0]?.body?.[0] ?? obj;\n}\n\nfunction extractDims(body: any): PageDims | null {\n try {\n const sp = body?.['w:sectPr']?.[0] ?? body?.sectPr?.[0];\n if (!sp) return null;\n const sz = sp?.['w:pgSz']?.[0]?._attr ?? sp?.pgSz?.[0]?._attr;\n const mar = sp?.['w:pgMar']?.[0]?._attr ?? sp?.pgMar?.[0]?._attr;\n if (!sz) return null;\n return {\n wPt: Metric.dxaToPt(Number(sz['w:w'] ?? sz.w ?? 11906)),\n hPt: Metric.dxaToPt(Number(sz['w:h'] ?? sz.h ?? 16838)),\n mt: Metric.dxaToPt(Number(mar?.['w:top'] ?? mar?.top ?? 1440)),\n mb: Metric.dxaToPt(Number(mar?.['w:bottom'] ?? mar?.bottom ?? 1440)),\n ml: Metric.dxaToPt(Number(mar?.['w:left'] ?? mar?.left ?? 1800)),\n mr: Metric.dxaToPt(Number(mar?.['w:right'] ?? mar?.right ?? 1800)),\n orient: (sz['w:orient'] ?? sz.orient) === 'landscape' ? 'landscape' : 'portrait',\n };\n } catch { return null; }\n}\n\nfunction getBodyElements(body: any): { type: string; node: any }[] {\n const paras = toArr(body?.['w:p'] ?? body?.p);\n const tables = toArr(body?.['w:tbl'] ?? body?.tbl);\n\n if (tables.length === 0) return paras.map((n: any) => ({ type: 'para', node: n }));\n if (paras.length === 0) return tables.map((n: any) => ({ type: 'table', node: n }));\n\n // Use _childOrder from XmlKit to preserve document order\n const childOrder = body?.['_childOrder'] as string[] | undefined;\n if (Array.isArray(childOrder)) {\n const items: { type: string; node: any }[] = [];\n let pi = 0, ti = 0;\n for (const tag of childOrder) {\n if ((tag === 'w:p' || tag === 'p') && pi < paras.length) {\n items.push({ type: 'para', node: paras[pi++] });\n } else if ((tag === 'w:tbl' || tag === 'tbl') && ti < tables.length) {\n items.push({ type: 'table', node: tables[ti++] });\n }\n }\n while (pi < paras.length) items.push({ type: 'para', node: paras[pi++] });\n while (ti < tables.length) items.push({ type: 'table', node: tables[ti++] });\n return items;\n }\n\n // Fallback: paragraphs first, then tables\n return [\n ...paras.map((n: any) => ({ type: 'para', node: n })),\n ...tables.map((n: any) => ({ type: 'table', node: n })),\n ];\n}\n\n// ─── Header/Footer decoding ────────────────────────────────\n\nasync function decodeHeaderFooter(\n kind: 'header' | 'footer',\n body: any,\n relsMap: Map<string, string>,\n files: Map<string, Uint8Array>,\n ctx: DecCtx,\n): Promise<ParaNode[] | undefined> {\n try {\n const sp = body?.['w:sectPr']?.[0] ?? body?.sectPr?.[0];\n if (!sp) return undefined;\n\n const refTag = kind === 'header' ? 'w:headerReference' : 'w:footerReference';\n const refs = toArr(sp?.[refTag] ?? sp?.[refTag.replace('w:', '')]);\n if (refs.length === 0) return undefined;\n\n const rId = refs[0]?._attr?.['r:id'] ?? refs[0]?._attr?.['r:Id'] ?? refs[0]?._attr?.id;\n if (!rId) return undefined;\n\n const target = relsMap.get(rId);\n if (!target) return undefined;\n\n const filePath = target.startsWith('/') ? target.slice(1) : `word/${target}`;\n const fileData = files.get(filePath);\n if (!fileData) return undefined;\n\n const xmlStr = TextKit.decode(fileData);\n const obj: any = await XmlKit.parseStrict(xmlStr);\n\n const rootTag = kind === 'header' ? 'w:hdr' : 'w:ftr';\n const root = obj?.[rootTag]?.[0] ?? obj?.[rootTag.replace('w:', '')]?.[0] ?? obj;\n\n const paras = toArr(root?.['w:p'] ?? root?.p);\n if (paras.length === 0) return undefined;\n\n return paras.map((p: any) => decodePara(p, ctx));\n } catch {\n return undefined;\n }\n}\n\n// ─── Element decoding ──────────────────────────────────────\n\nfunction decodeElement(\n el: { type: string; node: any },\n ctx: DecCtx,\n): ContentNode {\n if (el.type === 'table') {\n const { value } = ctx.shield.guardGrid(\n el.node,\n (n) => decodeGrid(n as any, ctx),\n (n) => decodeGridSimple(n as any),\n (n) => decodeGridFlat(n as any),\n (n) => decodeGridText(n as any) as unknown as GridNode,\n 'docx:table',\n );\n return value;\n }\n return decodePara(el.node, ctx);\n}\n\nfunction decodePara(\n p: any,\n ctx: DecCtx,\n): ParaNode {\n const pPr = p?.['w:pPr']?.[0] ?? {};\n const alignVal = pPr?.['w:jc']?.[0]?._attr?.['w:val'] ?? pPr?.['w:jc']?.[0]?._attr?.val;\n const headStyle = pPr?.['w:pStyle']?.[0]?._attr?.['w:val'] ?? pPr?.['w:pStyle']?.[0]?._attr?.val ?? '';\n\n const props: ParaProps = {\n align: safeAlign(alignVal),\n heading: parseHeading(headStyle),\n };\n\n // List/numbering\n const numPr = pPr?.['w:numPr']?.[0] ?? pPr?.numPr?.[0];\n if (numPr) {\n const ilvlNode = numPr?.['w:ilvl']?.[0]?._attr ?? numPr?.ilvl?.[0]?._attr ?? {};\n const numIdNode = numPr?.['w:numId']?.[0]?._attr ?? numPr?.numId?.[0]?._attr ?? {};\n const ilvl = Number(ilvlNode?.['w:val'] ?? ilvlNode?.val ?? 0);\n const numId = Number(numIdNode?.['w:val'] ?? numIdNode?.val ?? 0);\n\n props.listLv = ilvl;\n const numEntry = ctx.numMap.get(numId);\n if (numEntry) {\n const lvlInfo = numEntry.levels.get(ilvl) ?? numEntry.levels.get(0);\n props.listOrd = lvlInfo?.isOrdered ?? false;\n } else {\n // Fallback: numId=1 is typically bullet, numId=2 is numbered\n props.listOrd = numId >= 2;\n }\n }\n\n const runs = toArr(p?.['w:r'] ?? p?.r);\n const kids: (SpanNode | ImgNode)[] = ctx.shield.guardAll(\n runs,\n (run: any) => decodeRunOrImage(run, ctx),\n () => buildSpan(''),\n 'docx:run',\n );\n\n return buildPara(kids.filter(Boolean) as ParaNode['kids'], props);\n}\n\nfunction decodeRunOrImage(run: any, ctx: DecCtx): SpanNode | ImgNode {\n // Check for drawing (image)\n const drawing = run?.['w:drawing']?.[0] ?? run?.drawing?.[0];\n if (drawing) {\n const img = decodeDrawing(drawing, ctx);\n if (img) return img;\n }\n return decodeRun(run, ctx);\n}\n\nfunction decodeDrawing(drawing: any, ctx: DecCtx): ImgNode | null {\n try {\n const inline = drawing?.['wp:inline']?.[0] ?? drawing?.inline?.[0];\n const anchor = drawing?.['wp:anchor']?.[0] ?? drawing?.anchor?.[0];\n const container = inline ?? anchor;\n if (!container) return null;\n\n // Get dimensions\n const extent = container?.['wp:extent']?.[0]?._attr ?? container?.extent?.[0]?._attr ?? {};\n const cx = Number(extent?.cx ?? 0);\n const cy = Number(extent?.cy ?? 0);\n const wPt = Metric.emuToPt(cx);\n const hPt = Metric.emuToPt(cy);\n\n // Get alt text\n const docPr = container?.['wp:docPr']?.[0]?._attr ?? container?.docPr?.[0]?._attr ?? {};\n const alt = docPr?.descr ?? docPr?.name ?? '';\n\n // Navigate to blip\n const graphic = container?.['a:graphic']?.[0] ?? container?.graphic?.[0];\n const graphicData = graphic?.['a:graphicData']?.[0] ?? graphic?.graphicData?.[0];\n const pic = graphicData?.['pic:pic']?.[0] ?? graphicData?.pic?.[0];\n const blipFill = pic?.['pic:blipFill']?.[0] ?? pic?.blipFill?.[0];\n const blip = blipFill?.['a:blip']?.[0]?._attr ?? blipFill?.blip?.[0]?._attr ?? {};\n const rId = blip?.['r:embed'] ?? blip?.embed;\n\n if (!rId) return null;\n\n const target = ctx.relsMap.get(rId);\n if (!target) return null;\n\n const filePath = target.startsWith('/') ? target.slice(1) : `word/${target}`;\n const fileData = ctx.files.get(filePath);\n if (!fileData) return null;\n\n const ext = target.split('.').pop()?.toLowerCase() ?? 'png';\n const mimeMap: Record<string, ImgNode['mime']> = {\n png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',\n gif: 'image/gif', bmp: 'image/bmp',\n };\n const mime = mimeMap[ext] ?? 'image/png';\n\n return buildImg(TextKit.base64Encode(fileData), mime, wPt, hPt, alt || undefined);\n } catch {\n return null;\n }\n}\n\nfunction decodeRun(run: any, ctx: DecCtx): SpanNode {\n const rPr = run?.['w:rPr']?.[0] ?? run?.rPr?.[0] ?? {};\n\n const szAttr = rPr?.['w:sz']?.[0]?._attr ?? rPr?.sz?.[0]?._attr ?? {};\n const szVal = szAttr?.['w:val'] ?? szAttr?.val;\n\n const colorAttr = rPr?.['w:color']?.[0]?._attr ?? rPr?.color?.[0]?._attr ?? {};\n const colorVal = colorAttr?.['w:val'] ?? colorAttr?.val;\n\n const fontAttr = rPr?.['w:rFonts']?.[0]?._attr ?? rPr?.rFonts?.[0]?._attr ?? {};\n const fontName = fontAttr?.['w:ascii'] ?? fontAttr?.ascii\n ?? fontAttr?.['w:hAnsi'] ?? fontAttr?.hAnsi\n ?? fontAttr?.['w:eastAsia'] ?? fontAttr?.eastAsia;\n\n const underVal = rPr?.['w:u']?.[0]?._attr?.['w:val'] ?? rPr?.['w:u']?.[0]?._attr?.val;\n\n // Background/highlight\n const shdAttr = rPr?.['w:shd']?.[0]?._attr ?? rPr?.shd?.[0]?._attr ?? {};\n const bgVal = safeHex(shdAttr?.['w:fill'] ?? shdAttr?.fill);\n\n // Superscript/subscript\n const vertAlignVal = rPr?.['w:vertAlign']?.[0]?._attr?.['w:val'] ?? rPr?.['w:vertAlign']?.[0]?._attr?.val;\n\n // Check bold/italic/strike — val=\"0\" means explicitly OFF\n const bNode = rPr?.['w:b']?.[0] ?? rPr?.b?.[0];\n const isBold = bNode != null && (bNode?._attr?.['w:val'] ?? bNode?._attr?.val ?? '1') !== '0';\n const iNode = rPr?.['w:i']?.[0] ?? rPr?.i?.[0];\n const isItalic = iNode != null && (iNode?._attr?.['w:val'] ?? iNode?._attr?.val ?? '1') !== '0';\n const sNode = rPr?.['w:strike']?.[0] ?? rPr?.strike?.[0];\n const isStrike = sNode != null && (sNode?._attr?.['w:val'] ?? sNode?._attr?.val ?? '1') !== '0';\n\n const props: TextProps = {\n b: isBold || undefined,\n i: isItalic || undefined,\n u: underVal && underVal !== 'none' ? true : undefined,\n s: isStrike || undefined,\n sup: vertAlignVal === 'superscript' || undefined,\n sub: vertAlignVal === 'subscript' || undefined,\n pt: szVal ? Metric.halfPtToPt(Number(szVal)) : undefined,\n color: safeHex(colorVal),\n font: fontName ? safeFont(fontName) : undefined,\n bg: bgVal,\n };\n\n // Check for field codes (PAGE number)\n const fldChar = run?.['w:fldChar']?.[0]?._attr ?? run?.fldChar?.[0]?._attr;\n const instrText = run?.['w:instrText']?.[0];\n\n const textNodes = toArr(run?.['w:t'] ?? run?.t);\n const content = textNodes.map((t: any) => typeof t === 'string' ? t : t?._ ?? t?._text ?? '').join('');\n\n // Handle page number field in instrText\n if (instrText) {\n const instrStr = typeof instrText === 'string' ? instrText : instrText?._text ?? '';\n if (instrStr.trim().toUpperCase() === 'PAGE') {\n const pageNum: PageNumNode = { tag: 'pagenum', format: 'decimal' };\n return { tag: 'span', props, kids: [pageNum] };\n }\n }\n\n return buildSpan(content, props);\n}\n\nfunction decodeGrid(\n tbl: any,\n ctx: DecCtx,\n): GridNode {\n // Parse tblPr for table styles\n const tblPr = tbl?.['w:tblPr']?.[0] ?? tbl?.tblPr?.[0] ?? {};\n const tblLookAttr = tblPr?.['w:tblLook']?.[0]?._attr ?? tblPr?.tblLook?.[0]?._attr ?? {};\n\n const look: TableLook = {\n firstRow: tblLookAttr?.['w:firstRow'] === '1' || undefined,\n lastRow: tblLookAttr?.['w:lastRow'] === '1' || undefined,\n firstCol: tblLookAttr?.['w:firstColumn'] === '1' || tblLookAttr?.['w:firstCol'] === '1' || undefined,\n lastCol: tblLookAttr?.['w:lastColumn'] === '1' || tblLookAttr?.['w:lastCol'] === '1' || undefined,\n bandedRows: tblLookAttr?.['w:noHBand'] === '0' || undefined,\n bandedCols: tblLookAttr?.['w:noVBand'] === '0' || undefined,\n };\n\n // Parse table borders for defaultStroke\n const tblBorders = tblPr?.['w:tblBorders']?.[0] ?? tblPr?.tblBorders?.[0];\n let defaultStroke = undefined;\n if (tblBorders) {\n const top = tblBorders?.['w:top']?.[0]?._attr ?? tblBorders?.top?.[0]?._attr;\n if (top) {\n defaultStroke = safeStrokeDocx(\n top?.['w:val'] ?? top?.val,\n Number(top?.['w:sz'] ?? top?.sz ?? 4),\n top?.['w:color'] ?? top?.color,\n );\n }\n }\n\n const gridProps: GridProps = { look, defaultStroke };\n\n const rowArr = toArr(tbl?.['w:tr'] ?? tbl?.tr);\n\n // ── Pass 1: parse raw cells with vMerge info ──\n interface RawCell {\n cell: any; gridSpan: number;\n vMergeRestart: boolean; vMergeContinue: boolean;\n }\n const rawGrid: RawCell[][] = rowArr.map((row: any) => {\n const cellArr = toArr(row?.['w:tc'] ?? row?.tc);\n return cellArr.map((cell: any): RawCell => {\n const tcPr = cell?.['w:tcPr']?.[0] ?? {};\n const gridSpan = Number(tcPr?.['w:gridSpan']?.[0]?._attr?.['w:val'] ?? 1);\n const vMergeNode = tcPr?.['w:vMerge']?.[0];\n const vMergeVal = vMergeNode?._attr?.['w:val'] ?? vMergeNode?._attr?.val;\n const vMergeRestart = vMergeVal === 'restart';\n // vMerge present but val is not \"restart\" → continuation cell\n const vMergeContinue = vMergeNode != null && !vMergeRestart;\n return { cell, gridSpan, vMergeRestart, vMergeContinue };\n });\n });\n\n // ── Pass 2: compute rowSpan for restart cells ──\n // rsMap[ri][ci] = computed rowSpan (only set for restart cells)\n const rsMap: Map<string, number> = new Map();\n for (let ri = 0; ri < rawGrid.length; ri++) {\n let gridCol = 0;\n for (let ci = 0; ci < rawGrid[ri].length; ci++) {\n const rc = rawGrid[ri][ci];\n if (rc.vMergeRestart) {\n let span = 1;\n for (let nr = ri + 1; nr < rawGrid.length; nr++) {\n // Find the cell at the same grid column in the next row\n let col = 0;\n let found = false;\n for (const nc of rawGrid[nr]) {\n if (col === gridCol && nc.vMergeContinue) {\n span++;\n found = true;\n break;\n }\n col += nc.gridSpan;\n }\n if (!found) break;\n }\n rsMap.set(`${ri},${ci}`, span);\n }\n gridCol += rc.gridSpan;\n }\n }\n\n // ── Pass 3: build CellNodes, skip continuation cells ──\n const rowNodes = rawGrid.map((rawRow, ri) => {\n // Check for header row\n const row = rowArr[ri];\n const trPr = row?.['w:trPr']?.[0] ?? row?.trPr?.[0] ?? {};\n const isHeaderRow = trPr?.['w:tblHeader']?.[0] != null || trPr?.tblHeader?.[0] != null;\n if (ri === 0 && isHeaderRow) gridProps.headerRow = true;\n\n const cellNodes: CellNode[] = [];\n for (let ci = 0; ci < rawRow.length; ci++) {\n const rc = rawRow[ci];\n // Skip continuation cells — they are part of a vertical merge\n if (rc.vMergeContinue) continue;\n\n const cell = rc.cell;\n const tcPr = cell?.['w:tcPr']?.[0] ?? {};\n\n // Cell background\n const bgAttr = tcPr?.['w:shd']?.[0]?._attr ?? {};\n const bg = safeHex(bgAttr?.['w:fill'] ?? bgAttr?.fill);\n\n // Cell borders\n const tcBorders = tcPr?.['w:tcBorders']?.[0] ?? tcPr?.tcBorders?.[0];\n const cp: CellProps = { bg, isHeader: isHeaderRow || undefined };\n\n if (tcBorders) {\n const dirs: Array<[string, 'top' | 'bot' | 'left' | 'right']> = [\n ['top', 'top'], ['bottom', 'bot'], ['left', 'left'], ['right', 'right'],\n ];\n for (const [xmlTag, propKey] of dirs) {\n const bdr = tcBorders?.['w:' + xmlTag]?.[0]?._attr ?? tcBorders?.[xmlTag]?.[0]?._attr;\n if (bdr) {\n cp[propKey] = safeStrokeDocx(\n bdr?.['w:val'] ?? bdr?.val,\n Number(bdr?.['w:sz'] ?? bdr?.sz ?? 4),\n bdr?.['w:color'] ?? bdr?.color,\n );\n }\n }\n }\n\n // Vertical alignment\n const vaAttr = tcPr?.['w:vAlign']?.[0]?._attr ?? tcPr?.vAlign?.[0]?._attr ?? {};\n const vaVal = vaAttr?.['w:val'] ?? vaAttr?.val;\n if (vaVal) {\n const vaMap: Record<string, 'top' | 'mid' | 'bot'> = { top: 'top', center: 'mid', bottom: 'bot' };\n cp.va = vaMap[vaVal];\n }\n\n const rs = rsMap.get(`${ri},${ci}`) ?? 1;\n\n const paras = toArr(cell?.['w:p'] ?? cell?.p).map((p: any) => decodePara(p, ctx));\n cellNodes.push(buildCell(\n paras.length > 0 ? paras : [buildPara([buildSpan('')])],\n { cs: rc.gridSpan, rs, props: cp },\n ));\n }\n return buildRow(cellNodes);\n });\n return buildGrid(rowNodes, gridProps);\n}\n\nfunction decodeGridSimple(tbl: any): GridNode {\n const rowArr = toArr(tbl?.['w:tr'] ?? tbl?.tr);\n const rowNodes = rowArr.map((row: any) => {\n const cellArr = toArr(row?.['w:tc'] ?? row?.tc);\n return buildRow(cellArr.map((c: any) => buildCell([buildPara([buildSpan(cellText(c))])])));\n });\n return buildGrid(rowNodes);\n}\n\nfunction decodeGridFlat(tbl: any): GridNode {\n return buildGrid([buildRow([buildCell([buildPara([buildSpan(tableText(tbl))])])])]);\n}\n\nfunction decodeGridText(tbl: any): ParaNode {\n return buildPara([buildSpan(tableText(tbl))]);\n}\n\nfunction cellText(cell: any): string {\n return toArr(cell?.['w:p'] ?? cell?.p).map((p: any) =>\n toArr(p?.['w:r'] ?? p?.r).map((r: any) =>\n toArr(r?.['w:t'] ?? r?.t).map((t: any) => typeof t === 'string' ? t : t?._ ?? '').join(''),\n ).join(''),\n ).join(' ');\n}\n\nfunction tableText(tbl: any): string {\n return toArr(tbl?.['w:tr'] ?? tbl?.tr).map((row: any) =>\n toArr(row?.['w:tc'] ?? row?.tc).map((c: any) => cellText(c)).join('\\t'),\n ).join('\\n');\n}\n\nfunction parseHeading(style?: string): 1 | 2 | 3 | 4 | 5 | 6 | undefined {\n if (!style) return undefined;\n const m = style.match(/[Hh]eading(\\d)/);\n if (m) { const n = Number(m[1]); if (n >= 1 && n <= 6) return n as any; }\n return undefined;\n}\n\nregistry.registerDecoder(new DocxDecoder());\n","import type { Decoder } from '../../contract/decoder';\nimport type { DocRoot, ContentNode, ParaNode, SpanNode, ImgNode } from '../../model/doc-tree';\nimport type { Outcome } from '../../contract/result';\nimport type { ParaProps, TextProps } from '../../model/doc-props';\nimport { A4 } from '../../model/doc-props';\nimport { succeed, fail } from '../../contract/result';\nimport { buildRoot, buildSheet, buildPara, buildSpan, buildImg, buildGrid, buildRow, buildCell } from '../../model/builders';\nimport { ShieldedParser } from '../../safety/ShieldedParser';\nimport { TextKit } from '../../toolkit/TextKit';\nimport { registry } from '../../pipeline/registry';\n\nexport class MdDecoder implements Decoder {\n readonly format = 'md';\n\n async decode(data: Uint8Array): Promise<Outcome<DocRoot>> {\n const shield = new ShieldedParser();\n const warns: string[] = [];\n\n try {\n const text = TextKit.decode(data);\n const lines = text.split(/\\r?\\n/);\n const kids: ContentNode[] = [];\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n // Heading\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n const level = headingMatch[1].length as 1 | 2 | 3 | 4 | 5 | 6;\n kids.push(buildPara([buildSpan(headingMatch[2], { b: level <= 2 })], { heading: level }));\n i++; continue;\n }\n\n // Table (pipe + separator line)\n if (line.includes('|') && i + 1 < lines.length && lines[i + 1].match(/^\\s*\\|?\\s*[-:]+\\s*\\|/)) {\n const tableResult = shield.guard(() => parseMdTable(lines, i), null, `md:table@${i}`);\n if (tableResult) { kids.push(tableResult.node); i = tableResult.nextLine; continue; }\n }\n\n // HR\n if (line.match(/^[-*_]{3,}$/)) { kids.push(buildPara([buildSpan('')], {})); i++; continue; }\n\n // List item\n const listMatch = line.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/);\n if (listMatch) {\n kids.push(buildPara(parseInline(listMatch[3]), {\n listLv: Math.floor(listMatch[1].length / 2),\n listOrd: /\\d+\\./.test(listMatch[2]),\n }));\n i++; continue;\n }\n\n // Blockquote\n const bqMatch = line.match(/^>\\s*(.*)$/);\n if (bqMatch) { kids.push(buildPara([buildSpan(bqMatch[1])], { indentPt: 28 })); i++; continue; }\n\n // Code block\n if (line.startsWith('```')) {\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].startsWith('```')) { codeLines.push(lines[i]); i++; }\n i++;\n kids.push(buildPara([buildSpan(codeLines.join('\\n'), { font: 'Courier New' })], {}));\n continue;\n }\n\n // Empty line\n if (line.trim() === '') { i++; continue; }\n\n // Regular paragraph — check for alignment div\n const alignMatch = line.match(/^<div\\s+align=\"(center|right|left)\">(.*?)<\\/div>$/i);\n if (alignMatch) {\n const align = alignMatch[1].toLowerCase() as 'left' | 'center' | 'right';\n kids.push(buildPara(parseInline(alignMatch[2]), { align }));\n i++; continue;\n }\n\n // Regular paragraph\n kids.push(buildPara(parseInline(line), {}));\n i++;\n }\n\n warns.push(...shield.flush());\n const sheet = buildSheet(kids.length > 0 ? kids : [buildPara([buildSpan('')])], A4);\n return succeed(buildRoot({}, [sheet]), warns);\n } catch (e: any) {\n warns.push(...shield.flush());\n return fail(`MD decode error: ${e?.message ?? String(e)}`, warns);\n }\n }\n}\n\nfunction parseInline(text: string): (SpanNode | ImgNode)[] {\n const result: (SpanNode | ImgNode)[] = [];\n let rem = text;\n\n while (rem.length > 0) {\n // Image: ![alt](data:mime;base64,...)\n let m = rem.match(/^(.*?)!\\[([^\\]]*)\\]\\((data:([^;]+);base64,([^)]+))\\)(.*)/s);\n if (m) {\n if (m[1]) result.push(buildSpan(m[1]));\n const mime = m[4] as ImgNode['mime'];\n const validMimes = ['image/png', 'image/jpeg', 'image/gif', 'image/bmp'];\n result.push(buildImg(m[5], validMimes.includes(mime) ? mime : 'image/png', 100, 100, m[2] || undefined));\n rem = m[6]; continue;\n }\n\n // Image: ![alt](url) — non-base64\n m = rem.match(/^(.*?)!\\[([^\\]]*)\\]\\(([^)]+)\\)(.*)/s);\n if (m) {\n if (m[1]) result.push(buildSpan(m[1]));\n // Can't convert URL to base64, just preserve alt text\n result.push(buildSpan(`[이미지: ${m[2] || m[3]}]`));\n rem = m[4]; continue;\n }\n\n // Bold+italic\n m = rem.match(/^(.*?)\\*\\*\\*(.+?)\\*\\*\\*(.*)/s);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { b: true, i: true })); rem = m[3]; continue; }\n\n // Bold\n m = rem.match(/^(.*?)\\*\\*(.+?)\\*\\*(.*)/s);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { b: true })); rem = m[3]; continue; }\n\n // Italic\n m = rem.match(/^(.*?)\\*(.+?)\\*(.*)/s);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { i: true })); rem = m[3]; continue; }\n\n // Strikethrough ~~text~~\n m = rem.match(/^(.*?)~~(.+?)~~(.*)/s);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { s: true })); rem = m[3]; continue; }\n\n // Underline <u>text</u>\n m = rem.match(/^(.*?)<u>(.+?)<\\/u>(.*)/si);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { u: true })); rem = m[3]; continue; }\n\n // Superscript <sup>text</sup>\n m = rem.match(/^(.*?)<sup>(.+?)<\\/sup>(.*)/si);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { sup: true })); rem = m[3]; continue; }\n\n // Subscript <sub>text</sub>\n m = rem.match(/^(.*?)<sub>(.+?)<\\/sub>(.*)/si);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { sub: true })); rem = m[3]; continue; }\n\n // Inline code\n m = rem.match(/^(.*?)`(.+?)`(.*)/s);\n if (m) { if (m[1]) result.push(buildSpan(m[1])); result.push(buildSpan(m[2], { font: 'Courier New' })); rem = m[3]; continue; }\n\n result.push(buildSpan(rem));\n break;\n }\n\n return result.length > 0 ? result : [buildSpan(text)];\n}\n\nfunction parseMdTable(lines: string[], startLine: number): { node: any; nextLine: number } | null {\n const parse = (line: string) => line.split('|').map(c => c.trim()).filter((c, i, arr) => i > 0 || c !== '');\n const headers = parse(lines[startLine]);\n\n let cur = startLine + 2;\n const rows: string[][] = [];\n while (cur < lines.length) {\n if (!lines[cur].includes('|')) break;\n const cells = parse(lines[cur]);\n if (cells.length === 0) break;\n rows.push(cells);\n cur++;\n }\n\n const allRows = [headers, ...rows];\n const gridRows = allRows.map((row, ri) =>\n buildRow(row.map(cell => buildCell([buildPara([buildSpan(cell, ri === 0 ? { b: true } : {})])]))),\n );\n\n return { node: buildGrid(gridRows), nextLine: cur };\n}\n\nregistry.registerDecoder(new MdDecoder());\n","import type { Encoder } from '../../contract/encoder';\nimport type { DocRoot, ParaNode, SpanNode, GridNode, ContentNode, ImgNode, SheetNode } from '../../model/doc-tree';\nimport type { Outcome } from '../../contract/result';\nimport type { PageDims, TextProps, ParaProps, CellProps, Stroke } from '../../model/doc-props';\nimport { A4, DEFAULT_STROKE } from '../../model/doc-props';\nimport { succeed, fail } from '../../contract/result';\nimport { Metric, safeFontToKr } from '../../safety/StyleBridge';\nimport { ArchiveKit } from '../../toolkit/ArchiveKit';\nimport { TextKit } from '../../toolkit/TextKit';\nimport { registry } from '../../pipeline/registry';\n\n// ─── All HWPX namespaces ────────────────────────────────────\nconst NS = [\n 'xmlns:ha=\"http://www.hancom.co.kr/hwpml/2011/app\"',\n 'xmlns:hp=\"http://www.hancom.co.kr/hwpml/2011/paragraph\"',\n 'xmlns:hp10=\"http://www.hancom.co.kr/hwpml/2016/paragraph\"',\n 'xmlns:hs=\"http://www.hancom.co.kr/hwpml/2011/section\"',\n 'xmlns:hc=\"http://www.hancom.co.kr/hwpml/2011/core\"',\n 'xmlns:hh=\"http://www.hancom.co.kr/hwpml/2011/head\"',\n 'xmlns:hhs=\"http://www.hancom.co.kr/hwpml/2011/history\"',\n 'xmlns:hm=\"http://www.hancom.co.kr/hwpml/2011/master-page\"',\n 'xmlns:hpf=\"http://www.hancom.co.kr/schema/2011/hpf\"',\n 'xmlns:dc=\"http://purl.org/dc/elements/1.1/\"',\n 'xmlns:opf=\"http://www.idpf.org/2007/opf/\"',\n 'xmlns:ooxmlchart=\"http://www.hancom.co.kr/hwpml/2016/ooxmlchart\"',\n 'xmlns:epub=\"http://www.idpf.org/2007/ops\"',\n 'xmlns:config=\"urn:oasis:names:tc:opendocument:xmlns:config:1.0\"',\n].join(' ');\n\n// ─── Registries for IDRef system ────────────────────────────\n\ninterface CharPrDef {\n id: number;\n height: number;\n bold: boolean;\n italic: boolean;\n underline: string;\n strikeout: string;\n textColor: string;\n fontName: string;\n fontId: number;\n bg?: string;\n}\n\ninterface ParaPrDef {\n id: number;\n align: string;\n listType?: string;\n listLevel?: number;\n}\n\ninterface BinEntry { id: string; name: string; data: Uint8Array }\n\ninterface HwpxCtx {\n charPrs: CharPrDef[];\n charPrMap: Map<string, number>;\n paraPrs: ParaPrDef[];\n paraPrMap: Map<string, number>;\n borderFills: { id: number; xml: string }[];\n bins: BinEntry[];\n nextBinNum: number;\n nextElementId: number;\n availableWidth: number; // HWPUNIT — page width minus margins\n fonts: string[];\n fontMap: Map<string, number>;\n}\n\nfunction charPrKey(p: TextProps): string {\n return `${p.b ? 1 : 0}|${p.i ? 1 : 0}|${p.u ? 1 : 0}|${p.s ? 1 : 0}|${p.pt ?? 10}|${p.color ?? '000000'}|${p.font ?? ''}|${p.bg ?? ''}`;\n}\n\nfunction paraPrKey(p: ParaProps): string {\n return `${p.align ?? 'left'}|${p.listOrd ?? ''}|${p.listLv ?? 0}`;\n}\n\nfunction registerFont(name: string, ctx: HwpxCtx): number {\n const n = name || '굴림체';\n const existing = ctx.fontMap.get(n);\n if (existing !== undefined) return existing;\n const id = ctx.fonts.length;\n ctx.fonts.push(n);\n ctx.fontMap.set(n, id);\n return id;\n}\n\nfunction registerCharPr(props: TextProps, ctx: HwpxCtx): number {\n const key = charPrKey(props);\n const existing = ctx.charPrMap.get(key);\n if (existing !== undefined) return existing;\n\n const fontName = safeFontToKr(props.font) || '굴림체';\n const fontId = registerFont(fontName, ctx);\n\n const id = ctx.charPrs.length;\n const def: CharPrDef = {\n id,\n height: Metric.ptToHHeight(props.pt ?? 10),\n bold: !!props.b,\n italic: !!props.i,\n underline: props.u ? 'BOTTOM' : 'NONE',\n strikeout: props.s ? 'SOLID' : 'NONE',\n textColor: props.color ? `#${props.color}` : '#000000',\n fontName,\n fontId,\n bg: props.bg,\n };\n ctx.charPrs.push(def);\n ctx.charPrMap.set(key, id);\n return id;\n}\n\nfunction registerParaPr(props: ParaProps, ctx: HwpxCtx): number {\n const key = paraPrKey(props);\n const existing = ctx.paraPrMap.get(key);\n if (existing !== undefined) return existing;\n\n const id = ctx.paraPrs.length;\n const def: ParaPrDef = {\n id,\n align: (props.align ?? 'left').toUpperCase(),\n };\n if (props.listOrd !== undefined) {\n def.listType = props.listOrd ? 'DIGIT' : 'BULLET';\n def.listLevel = props.listLv ?? 0;\n }\n ctx.paraPrs.push(def);\n ctx.paraPrMap.set(key, id);\n return id;\n}\n\n// ─── Pre-scan: collect all charPr/paraPr used ───────────────\n\nfunction scanContent(kids: ContentNode[], ctx: HwpxCtx): void {\n for (const kid of kids) {\n if (kid.tag === 'para') scanPara(kid, ctx);\n else if (kid.tag === 'grid') scanGrid(kid, ctx);\n }\n}\n\nfunction scanPara(para: ParaNode, ctx: HwpxCtx): void {\n registerParaPr(para.props, ctx);\n for (const kid of para.kids) {\n if (kid.tag === 'span') registerCharPr(kid.props, ctx);\n else if (kid.tag === 'img') registerImage(kid, ctx);\n }\n}\n\nfunction scanGrid(grid: GridNode, ctx: HwpxCtx): void {\n for (const row of grid.kids)\n for (const cell of row.kids)\n for (const p of cell.kids) scanPara(p, ctx);\n}\n\nfunction scanParas(paras: ParaNode[], ctx: HwpxCtx): void {\n for (const p of paras) scanPara(p, ctx);\n}\n\n// ─── Image handling ─────────────────────────────────────────\n\nfunction mimeToExt(mime: string): string {\n if (mime.includes('jpeg')) return 'jpg';\n if (mime.includes('gif')) return 'gif';\n if (mime.includes('bmp')) return 'bmp';\n return 'png';\n}\n\nfunction registerImage(img: ImgNode, ctx: HwpxCtx): void {\n if ((img as any)._binId) return;\n const ext = mimeToExt(img.mime);\n const id = `BIN${String(ctx.nextBinNum).padStart(4, '0')}`;\n const name = `${id}.${ext}`;\n ctx.nextBinNum++;\n const data = TextKit.base64Decode(img.b64);\n ctx.bins.push({ id, name, data });\n (img as any)._binId = id;\n}\n\n// ─── BorderFill ─────────────────────────────────────────────\n\nfunction addBorderFill(ctx: HwpxCtx, stroke?: Stroke, bgColor?: string): number {\n const id = ctx.borderFills.length + 1;\n const s = stroke ?? DEFAULT_STROKE;\n const kindMap: Record<string, string> = { solid: 'SOLID', dash: 'DASH', dot: 'DOT', double: 'DOUBLE', none: 'NONE' };\n const type = kindMap[s.kind] ?? 'SOLID';\n const w = `${(s.pt * 0.3528).toFixed(2)} mm`;\n const c = s.color.startsWith('#') ? s.color : `#${s.color}`;\n\n let fill = '';\n if (bgColor) {\n const bc = bgColor.startsWith('#') ? bgColor : `#${bgColor}`;\n fill = `<hc:fillBrush><hc:winBrush faceColor=\"${bc}\" hatchColor=\"none\" alpha=\"0\"/></hc:fillBrush>`;\n }\n\n const xml = `<hh:borderFill id=\"${id}\" threeD=\"0\" shadow=\"0\" centerLine=\"NONE\" breakCellSeparateLine=\"0\"><hh:slash type=\"NONE\" Crooked=\"0\" isCounter=\"0\"/><hh:backSlash type=\"NONE\" Crooked=\"0\" isCounter=\"0\"/><hh:leftBorder type=\"${type}\" width=\"${w}\" color=\"${c}\"/><hh:rightBorder type=\"${type}\" width=\"${w}\" color=\"${c}\"/><hh:topBorder type=\"${type}\" width=\"${w}\" color=\"${c}\"/><hh:bottomBorder type=\"${type}\" width=\"${w}\" color=\"${c}\"/><hh:diagonal type=\"SOLID\" width=\"0.1 mm\" color=\"#000000\"/>${fill}</hh:borderFill>`;\n ctx.borderFills.push({ id, xml });\n return id;\n}\n\n// ─── Encoder class ──────────────────────────────────────────\n\nexport class HwpxEncoder implements Encoder {\n readonly format = 'hwpx';\n\n async encode(doc: DocRoot): Promise<Outcome<Uint8Array>> {\n try {\n const sheet = doc.kids[0];\n const dims = sheet?.dims ?? A4;\n\n // Available width = page width - left margin - right margin (in HWPUNIT)\n const availableWidth = Metric.ptToHwp(dims.wPt) - Metric.ptToHwp(dims.ml) - Metric.ptToHwp(dims.mr);\n\n const ctx: HwpxCtx = {\n charPrs: [], charPrMap: new Map(),\n paraPrs: [], paraPrMap: new Map(),\n borderFills: [], bins: [], nextBinNum: 1, nextElementId: 10000,\n availableWidth,\n fonts: [], fontMap: new Map(),\n };\n\n // Default borderFill (id=1, no border)\n addBorderFill(ctx, { kind: 'none', pt: 0.1, color: '000000' });\n // Table border borderFill (id=2)\n addBorderFill(ctx, DEFAULT_STROKE);\n // Default no-border for text areas (id=3)\n addBorderFill(ctx, { kind: 'none', pt: 0.1, color: '000000' });\n\n // Register default charPr (id=0) and paraPr (id=0)\n registerCharPr({}, ctx);\n registerParaPr({}, ctx);\n\n // Pre-scan all content to collect charPr/paraPr/images\n scanContent(sheet?.kids ?? [], ctx);\n if (sheet?.header) scanParas(sheet.header, ctx);\n if (sheet?.footer) scanParas(sheet.footer, ctx);\n\n // Extract plain text preview from document\n const previewText = extractPreviewText(sheet);\n\n // IMPORTANT: Generate section XML FIRST so that borderFills created\n // during table encoding are registered in ctx before headerXml runs.\n const sectionData = TextKit.encode(sectionXml(sheet, dims, ctx));\n const headerData = TextKit.encode(headerXml(dims, doc.meta, ctx));\n\n const entries: { name: string; data: Uint8Array }[] = [\n { name: 'mimetype', data: TextKit.encode('application/hwp+zip') },\n { name: 'version.xml', data: TextKit.encode(VERSION_XML) },\n { name: 'Contents/header.xml', data: headerData },\n { name: 'Contents/section0.xml', data: sectionData },\n { name: 'Preview/PrvText.txt', data: TextKit.encode(previewText) },\n { name: 'settings.xml', data: TextKit.encode(SETTINGS_XML) },\n { name: 'META-INF/container.rdf', data: TextKit.encode(CONTAINER_RDF) },\n { name: 'Contents/content.hpf', data: TextKit.encode(contentHpf(ctx, doc.meta)) },\n { name: 'META-INF/container.xml', data: TextKit.encode(CONTAINER_XML) },\n { name: 'META-INF/manifest.xml', data: TextKit.encode(MANIFEST_XML) },\n ];\n\n for (const bin of ctx.bins) {\n entries.push({ name: `BinData/${bin.name}`, data: bin.data });\n }\n\n return succeed(await ArchiveKit.zip(entries));\n } catch (e: any) {\n return fail(`HWPX encode error: ${e?.message ?? String(e)}`);\n }\n }\n}\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst VERSION_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><hv:HCFVersion xmlns:hv=\"http://www.hancom.co.kr/hwpml/2011/version\" tagetApplication=\"WORDPROCESSOR\" major=\"5\" minor=\"1\" micro=\"0\" buildNumber=\"1\" os=\"6\" xmlVersion=\"1.2\" application=\"Hancom Office Hangul\" appVersion=\"11, 0, 0, 0\"/>`;\n\nconst CONTAINER_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><ocf:container xmlns:ocf=\"urn:oasis:names:tc:opendocument:xmlns:container\" xmlns:hpf=\"http://www.hancom.co.kr/schema/2011/hpf\"><ocf:rootfiles><ocf:rootfile full-path=\"Contents/content.hpf\" media-type=\"application/hwpml-package+xml\"/><ocf:rootfile full-path=\"Preview/PrvText.txt\" media-type=\"text/plain\"/><ocf:rootfile full-path=\"META-INF/container.rdf\" media-type=\"application/rdf+xml\"/></ocf:rootfiles></ocf:container>`;\n\nconst CONTAINER_RDF = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"><rdf:Description rdf:about=\"\"><ns0:hasPart xmlns:ns0=\"http://www.hancom.co.kr/hwpml/2016/meta/pkg#\" rdf:resource=\"Contents/header.xml\"/></rdf:Description><rdf:Description rdf:about=\"Contents/header.xml\"><rdf:type rdf:resource=\"http://www.hancom.co.kr/hwpml/2016/meta/pkg#HeaderFile\"/></rdf:Description><rdf:Description rdf:about=\"\"><ns0:hasPart xmlns:ns0=\"http://www.hancom.co.kr/hwpml/2016/meta/pkg#\" rdf:resource=\"Contents/section0.xml\"/></rdf:Description><rdf:Description rdf:about=\"Contents/section0.xml\"><rdf:type rdf:resource=\"http://www.hancom.co.kr/hwpml/2016/meta/pkg#SectionFile\"/></rdf:Description><rdf:Description rdf:about=\"\"><rdf:type rdf:resource=\"http://www.hancom.co.kr/hwpml/2016/meta/pkg#Document\"/></rdf:Description></rdf:RDF>`;\n\nconst MANIFEST_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><odf:manifest xmlns:odf=\"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0\"/>`;\n\nconst SETTINGS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><ha:HWPApplicationSetting xmlns:ha=\"http://www.hancom.co.kr/hwpml/2011/app\" xmlns:config=\"urn:oasis:names:tc:opendocument:xmlns:config:1.0\"><ha:CaretPosition listIDRef=\"0\" paraIDRef=\"0\" pos=\"0\"/><config:config-item-set name=\"PrintInfo\"><config:config-item name=\"PrintMethod\" type=\"short\">0</config:config-item><config:config-item name=\"ZoomX\" type=\"short\">100</config:config-item><config:config-item name=\"ZoomY\" type=\"short\">100</config:config-item></config:config-item-set></ha:HWPApplicationSetting>`;\n\nfunction contentHpf(ctx: HwpxCtx, meta?: any): string {\n const title = esc(meta?.title ?? '');\n const now = new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n\n let items = `<opf:item id=\"header\" href=\"Contents/header.xml\" media-type=\"application/xml\"/>`\n + `<opf:item id=\"section0\" href=\"Contents/section0.xml\" media-type=\"application/xml\"/>`\n + `<opf:item id=\"settings\" href=\"settings.xml\" media-type=\"application/xml\"/>`;\n for (const bin of ctx.bins) {\n const ext = bin.name.split('.').pop()?.toLowerCase() ?? 'png';\n const ct = ext === 'png' ? 'image/png' : ext === 'jpg' || ext === 'jpeg' ? 'image/jpeg' : ext === 'gif' ? 'image/gif' : 'image/bmp';\n items += `<opf:item id=\"${bin.id}\" href=\"BinData/${bin.name}\" media-type=\"${ct}\" isEmbeded=\"1\"/>`;\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><opf:package ${NS} version=\"\" unique-identifier=\"\" id=\"\"><opf:metadata><opf:title>${title}</opf:title><opf:language>ko</opf:language><opf:meta name=\"creator\" content=\"text\"/><opf:meta name=\"subject\" content=\"text\"/><opf:meta name=\"description\" content=\"text\"/><opf:meta name=\"CreatedDate\" content=\"text\">${now}</opf:meta><opf:meta name=\"ModifiedDate\" content=\"text\">${now}</opf:meta><opf:meta name=\"keyword\" content=\"text\"/></opf:metadata><opf:manifest>${items}</opf:manifest><opf:spine><opf:itemref idref=\"header\" linear=\"no\"/><opf:itemref idref=\"section0\" linear=\"yes\"/></opf:spine></opf:package>`;\n}\n\n// ─── header.xml ─────────────────────────────────────────────\n\nfunction headerXml(dims: PageDims, meta: any, ctx: HwpxCtx): string {\n // Font face definitions — register all unique fonts per language group\n const fontCount = ctx.fonts.length || 1;\n const langs = ['HANGUL', 'LATIN', 'HANJA', 'JAPANESE', 'OTHER', 'SYMBOL', 'USER'];\n let fontFaces = `<hh:fontfaces itemCnt=\"${langs.length}\">`;\n for (const lang of langs) {\n fontFaces += `<hh:fontface lang=\"${lang}\" fontCnt=\"${fontCount}\">`;\n for (let fi = 0; fi < ctx.fonts.length; fi++) {\n fontFaces += `<hh:font id=\"${fi}\" face=\"${esc(ctx.fonts[fi])}\" type=\"TTF\" isEmbedded=\"0\"><hh:typeInfo familyType=\"FCAT_GOTHIC\" weight=\"6\" proportion=\"0\" contrast=\"0\" strokeVariation=\"1\" armStyle=\"1\" letterform=\"1\" midline=\"1\" xHeight=\"1\"/></hh:font>`;\n }\n if (ctx.fonts.length === 0) {\n fontFaces += `<hh:font id=\"0\" face=\"굴림체\" type=\"TTF\" isEmbedded=\"0\"><hh:typeInfo familyType=\"FCAT_GOTHIC\" weight=\"6\" proportion=\"0\" contrast=\"0\" strokeVariation=\"1\" armStyle=\"1\" letterform=\"1\" midline=\"1\" xHeight=\"1\"/></hh:font>`;\n }\n fontFaces += `</hh:fontface>`;\n }\n fontFaces += `</hh:fontfaces>`;\n\n // CharPr definitions\n let charPrXml = '';\n for (const cp of ctx.charPrs) {\n const bold = cp.bold ? '<hh:bold/>' : '';\n const italic = cp.italic ? '<hh:italic/>' : '';\n const fid = cp.fontId ?? 0;\n charPrXml += `<hh:charPr id=\"${cp.id}\" height=\"${cp.height}\" textColor=\"${cp.textColor}\" shadeColor=\"none\" useFontSpace=\"0\" useKerning=\"0\" symMark=\"NONE\" borderFillIDRef=\"3\"><hh:fontRef hangul=\"${fid}\" latin=\"${fid}\" hanja=\"${fid}\" japanese=\"${fid}\" other=\"${fid}\" symbol=\"${fid}\" user=\"${fid}\"/><hh:ratio hangul=\"100\" latin=\"100\" hanja=\"100\" japanese=\"100\" other=\"100\" symbol=\"100\" user=\"100\"/><hh:spacing hangul=\"0\" latin=\"0\" hanja=\"0\" japanese=\"0\" other=\"0\" symbol=\"0\" user=\"0\"/><hh:relSz hangul=\"100\" latin=\"100\" hanja=\"100\" japanese=\"100\" other=\"100\" symbol=\"100\" user=\"100\"/><hh:offset hangul=\"0\" latin=\"0\" hanja=\"0\" japanese=\"0\" other=\"0\" symbol=\"0\" user=\"0\"/>${bold}${italic}<hh:underline type=\"${cp.underline}\" shape=\"SOLID\" color=\"#000000\"/><hh:strikeout shape=\"${cp.strikeout}\" color=\"#000000\"/><hh:outline type=\"NONE\"/><hh:shadow type=\"NONE\" color=\"#C0C0C0\" offsetX=\"10\" offsetY=\"10\"/></hh:charPr>`;\n }\n\n // ParaPr definitions\n let paraPrXml = '';\n for (const pp of ctx.paraPrs) {\n paraPrXml += `<hh:paraPr id=\"${pp.id}\" tabPrIDRef=\"0\" condense=\"0\" fontLineHeight=\"0\" snapToGrid=\"0\" suppressLineNumbers=\"0\" checked=\"0\"><hh:align horizontal=\"${pp.align}\" vertical=\"BASELINE\"/><hh:heading type=\"NONE\" idRef=\"0\" level=\"0\"/><hh:breakSetting breakLatinWord=\"KEEP_WORD\" breakNonLatinWord=\"BREAK_WORD\" widowOrphan=\"0\" keepWithNext=\"0\" keepLines=\"0\" pageBreakBefore=\"0\" lineWrap=\"BREAK\"/><hh:autoSpacing eAsianEng=\"0\" eAsianNum=\"0\"/><hh:margin><hc:intent value=\"0\" unit=\"HWPUNIT\"/><hc:left value=\"0\" unit=\"HWPUNIT\"/><hc:right value=\"0\" unit=\"HWPUNIT\"/><hc:prev value=\"0\" unit=\"HWPUNIT\"/><hc:next value=\"0\" unit=\"HWPUNIT\"/></hh:margin><hh:lineSpacing type=\"PERCENT\" value=\"160\" unit=\"HWPUNIT\"/><hh:border borderFillIDRef=\"1\" offsetLeft=\"0\" offsetRight=\"0\" offsetTop=\"0\" offsetBottom=\"0\" connect=\"0\" ignoreMargin=\"0\"/></hh:paraPr>`;\n }\n\n // BorderFill definitions\n const borderFillXml = ctx.borderFills.map(bf => bf.xml).join('');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><hh:head ${NS} version=\"1.2\" secCnt=\"1\"><hh:beginNum page=\"1\" footnote=\"1\" endnote=\"1\" pic=\"1\" tbl=\"1\" equation=\"1\"/><hh:refList>${fontFaces}<hh:borderFills itemCnt=\"${ctx.borderFills.length}\">${borderFillXml}</hh:borderFills><hh:charProperties itemCnt=\"${ctx.charPrs.length}\">${charPrXml}</hh:charProperties><hh:paraProperties itemCnt=\"${ctx.paraPrs.length}\">${paraPrXml}</hh:paraProperties><hh:tabProperties itemCnt=\"1\"><hh:tabPr id=\"0\" autoTabLeft=\"0\" autoTabRight=\"0\"/></hh:tabProperties><hh:styles itemCnt=\"1\"><hh:style id=\"0\" type=\"PARA\" name=\"바탕글\" engName=\"Normal\" paraPrIDRef=\"0\" charPrIDRef=\"0\" nextStyleIDRef=\"0\" langID=\"1042\" lockForm=\"0\"/></hh:styles></hh:refList><hh:compatibleDocument targetProgram=\"HWP201X\"><hh:layoutCompatibility/></hh:compatibleDocument><hh:docOption><hh:linkinfo path=\"\" pageInherit=\"1\" footnoteInherit=\"0\"/></hh:docOption><hh:trackchageConfig flags=\"56\"/></hh:head>`;\n}\n\n// ─── section0.xml ───────────────────────────────────────────\n\nfunction sectionXml(sheet: SheetNode | undefined, dims: PageDims, ctx: HwpxCtx): string {\n const kids = sheet?.kids ?? [];\n\n // First paragraph includes secPr\n // WIDELY = portrait (standard), NARROWLY = landscape\n const secPr = `<hp:secPr id=\"\" textDirection=\"HORIZONTAL\" spaceColumns=\"1134\" tabStop=\"8000\" outlineShapeIDRef=\"0\" memoShapeIDRef=\"0\" textVerticalWidthHead=\"0\" masterPageCnt=\"0\"><hp:grid lineGrid=\"0\" charGrid=\"0\" wonggojiFormat=\"0\"/><hp:startNum pageStartsOn=\"BOTH\" page=\"0\" pic=\"0\" tbl=\"0\" equation=\"0\"/><hp:visibility hideFirstHeader=\"0\" hideFirstFooter=\"0\" hideFirstMasterPage=\"0\" border=\"SHOW_ALL\" fill=\"SHOW_ALL\" hideFirstPageNum=\"0\" hideFirstEmptyLine=\"0\" showLineNumber=\"0\"/><hp:lineNumberShape restartType=\"0\" countBy=\"0\" distance=\"0\" startNumber=\"0\"/><hp:pagePr landscape=\"${dims.orient === 'landscape' ? 'NARROWLY' : 'WIDELY'}\" width=\"${Metric.ptToHwp(dims.wPt)}\" height=\"${Metric.ptToHwp(dims.hPt)}\" gutterType=\"LEFT_ONLY\"><hp:margin header=\"2834\" footer=\"2834\" gutter=\"0\" left=\"${Metric.ptToHwp(dims.ml)}\" right=\"${Metric.ptToHwp(dims.mr)}\" top=\"${Metric.ptToHwp(dims.mt)}\" bottom=\"${Metric.ptToHwp(dims.mb)}\"/></hp:pagePr><hp:footNotePr><hp:autoNumFormat type=\"DIGIT\" userChar=\"\" prefixChar=\"\" suffixChar=\")\" supscript=\"0\"/><hp:noteLine length=\"-1\" type=\"SOLID\" width=\"0.12 mm\" color=\"#000000\"/><hp:noteSpacing betweenNotes=\"284\" belowLine=\"568\" aboveLine=\"852\"/><hp:numbering type=\"CONTINUOUS\" newNum=\"1\"/><hp:placement place=\"EACH_COLUMN\" beneathText=\"0\"/></hp:footNotePr><hp:endNotePr><hp:autoNumFormat type=\"DIGIT\" userChar=\"\" prefixChar=\"\" suffixChar=\")\" supscript=\"0\"/><hp:noteLine length=\"0\" type=\"NONE\" width=\"0.12 mm\" color=\"#000000\"/><hp:noteSpacing betweenNotes=\"0\" belowLine=\"576\" aboveLine=\"864\"/><hp:numbering type=\"CONTINUOUS\" newNum=\"1\"/><hp:placement place=\"END_OF_DOCUMENT\" beneathText=\"0\"/></hp:endNotePr><hp:pageBorderFill type=\"BOTH\" borderFillIDRef=\"1\" textBorder=\"PAPER\" headerInside=\"0\" footerInside=\"0\" fillArea=\"PAPER\"><hp:offset left=\"1417\" right=\"1417\" top=\"1417\" bottom=\"1417\"/></hp:pageBorderFill><hp:pageBorderFill type=\"EVEN\" borderFillIDRef=\"1\" textBorder=\"PAPER\" headerInside=\"0\" footerInside=\"0\" fillArea=\"PAPER\"><hp:offset left=\"1417\" right=\"1417\" top=\"1417\" bottom=\"1417\"/></hp:pageBorderFill><hp:pageBorderFill type=\"ODD\" borderFillIDRef=\"1\" textBorder=\"PAPER\" headerInside=\"0\" footerInside=\"0\" fillArea=\"PAPER\"><hp:offset left=\"1417\" right=\"1417\" top=\"1417\" bottom=\"1417\"/></hp:pageBorderFill></hp:secPr><hp:ctrl><hp:colPr id=\"\" type=\"NEWSPAPER\" layout=\"LEFT\" colCount=\"1\" sameSz=\"1\" sameGap=\"0\"/></hp:ctrl>`;\n\n let contentXml = '';\n let isFirst = true;\n\n const defaultLineseg = `<hp:linesegarray><hp:lineseg textpos=\"0\" vertpos=\"0\" vertsize=\"1000\" textheight=\"1000\" baseline=\"850\" spacing=\"600\" horzpos=\"0\" horzsize=\"${ctx.availableWidth}\" flags=\"393216\"/></hp:linesegarray>`;\n\n for (const kid of kids) {\n if (kid.tag === 'para') {\n contentXml += encodePara(kid, ctx, isFirst ? secPr : '');\n isFirst = false;\n } else if (kid.tag === 'grid') {\n // Grid is embedded inside a paragraph's run\n const gridXml = encodeGrid(kid, ctx);\n const prefix = isFirst ? secPr : '';\n contentXml += `<hp:p id=\"${ctx.nextElementId++}\" paraPrIDRef=\"0\" styleIDRef=\"0\" pageBreak=\"0\" columnBreak=\"0\" merged=\"0\"><hp:run charPrIDRef=\"0\">${prefix}${gridXml}</hp:run>${defaultLineseg}</hp:p>`;\n isFirst = false;\n }\n }\n\n // If empty, add one empty paragraph with secPr\n if (contentXml === '') {\n contentXml = `<hp:p id=\"${ctx.nextElementId++}\" paraPrIDRef=\"0\" styleIDRef=\"0\" pageBreak=\"0\" columnBreak=\"0\" merged=\"0\"><hp:run charPrIDRef=\"0\">${secPr}<hp:t></hp:t></hp:run>${defaultLineseg}</hp:p>`;\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?><hs:sec ${NS}>${contentXml}</hs:sec>`;\n}\n\nfunction encodePara(para: ParaNode, ctx: HwpxCtx, secPr: string = ''): string {\n const paraPrId = registerParaPr(para.props, ctx);\n\n let runs = '';\n for (const kid of para.kids) {\n if (kid.tag === 'span') {\n runs += encodeRun(kid, ctx);\n } else if (kid.tag === 'img') {\n runs += encodeImage(kid, ctx);\n }\n }\n\n // If no runs, add default empty run\n if (runs === '') {\n runs = `<hp:run charPrIDRef=\"0\"><hp:t></hp:t></hp:run>`;\n }\n\n // Inject secPr into first run\n if (secPr) {\n // Insert secPr after the first charPrIDRef attribute close\n const firstRunEnd = runs.indexOf('>');\n if (firstRunEnd > -1) {\n runs = runs.substring(0, firstRunEnd + 1) + secPr + runs.substring(firstRunEnd + 1);\n }\n }\n\n // Compute lineseg values based on font size\n const fontSize = getFontSizeForPara(para, ctx);\n const vertsize = fontSize;\n const textheight = fontSize;\n const baseline = Math.round(fontSize * 0.85);\n const spacing = Math.round(fontSize * 0.6);\n const linesegarray = `<hp:linesegarray><hp:lineseg textpos=\"0\" vertpos=\"0\" vertsize=\"${vertsize}\" textheight=\"${textheight}\" baseline=\"${baseline}\" spacing=\"${spacing}\" horzpos=\"0\" horzsize=\"${ctx.availableWidth}\" flags=\"393216\"/></hp:linesegarray>`;\n\n return `<hp:p id=\"${ctx.nextElementId++}\" paraPrIDRef=\"${paraPrId}\" styleIDRef=\"0\" pageBreak=\"0\" columnBreak=\"0\" merged=\"0\">${runs}${linesegarray}</hp:p>`;\n}\n\n/** Get the font size (in HWPX height units, 1000=10pt) for lineseg computation */\nfunction getFontSizeForPara(para: ParaNode, ctx: HwpxCtx): number {\n for (const kid of para.kids) {\n if (kid.tag === 'span') {\n const charPrId = ctx.charPrMap.get(charPrKey(kid.props));\n if (charPrId !== undefined && ctx.charPrs[charPrId]) {\n return ctx.charPrs[charPrId].height;\n }\n }\n }\n return 1000; // default 10pt\n}\n\nfunction encodeRun(span: SpanNode, ctx: HwpxCtx): string {\n const charPrId = registerCharPr(span.props, ctx);\n\n const parts: string[] = [];\n for (const kid of span.kids) {\n if (kid.tag === 'txt') {\n if (kid.content) {\n parts.push(`<hp:t>${esc(kid.content)}</hp:t>`);\n } else {\n parts.push(`<hp:t></hp:t>`);\n }\n } else if (kid.tag === 'pagenum') {\n const fmt = kid.format === 'roman' ? 'ROMAN_LOWER' : kid.format === 'romanCaps' ? 'ROMAN_UPPER' : 'DIGIT';\n parts.push(`<hp:pageNum pageStartsOn=\"BOTH\" formatType=\"${fmt}\"/>`);\n } else if (kid.tag === 'br') {\n parts.push(`<hp:t>\\n</hp:t>`);\n }\n }\n\n return `<hp:run charPrIDRef=\"${charPrId}\">${parts.join('')}</hp:run>`;\n}\n\nfunction encodeImage(img: ImgNode, ctx: HwpxCtx): string {\n const binId = (img as any)._binId;\n if (!binId) return '';\n\n const charPrId = registerCharPr({}, ctx);\n const w = Metric.ptToHwp(img.w);\n const h = Metric.ptToHwp(img.h);\n\n return `<hp:run charPrIDRef=\"${charPrId}\"><hp:pic id=\"${ctx.nextElementId++}\" zOrder=\"0\" numberingType=\"PICTURE\" textWrap=\"TOP_AND_BOTTOM\" textFlow=\"BOTH_SIDES\" lock=\"0\" dropcapstyle=\"None\" pageBreak=\"CELL\" treatAsChar=\"1\"><hp:sz width=\"${w}\" widthRelTo=\"ABSOLUTE\" height=\"${h}\" heightRelTo=\"ABSOLUTE\" protect=\"0\"/><hp:pos treatAsChar=\"1\" affectLSpacing=\"0\" flowWithText=\"1\" allowOverlap=\"0\" holdAnchorAndSO=\"0\" vertRelTo=\"PARA\" horzRelTo=\"PARA\" vertAlign=\"TOP\" horzAlign=\"LEFT\" vertOffset=\"0\" horzOffset=\"0\"/><hp:outMargin left=\"0\" right=\"0\" top=\"0\" bottom=\"0\"/><hp:imgRect x=\"0\" y=\"0\" w=\"${w}\" h=\"${h}\"/><hp:imgClip left=\"0\" right=\"0\" top=\"0\" bottom=\"0\"/><hp:img binaryItemIDRef=\"${binId}\" bright=\"0\" contrast=\"0\" effect=\"REAL_PIC\" alpha=\"0\"/></hp:pic></hp:run>`;\n}\n\nfunction encodeGrid(grid: GridNode, ctx: HwpxCtx): string {\n const rowCount = grid.kids.length;\n\n // Compute true column count: max total colSpan across all rows\n let colCount = 0;\n for (const row of grid.kids) {\n let rowCols = 0;\n for (const cell of row.kids) rowCols += cell.cs;\n if (rowCols > colCount) colCount = rowCols;\n }\n if (colCount === 0) colCount = grid.kids[0]?.kids.length ?? 1;\n\n // Calculate column widths in HWPUNIT\n const totalWidth = ctx.availableWidth;\n const defaultColW = Math.round(totalWidth / (colCount || 1));\n const colWidths: number[] = [];\n if (grid.props.colWidths && grid.props.colWidths.length === colCount) {\n // Fill zero-width columns by distributing remaining space\n const srcPt = [...grid.props.colWidths];\n const knownTotal = srcPt.filter(w => w > 0).reduce((s, w) => s + w, 0);\n const zeroCount = srcPt.filter(w => w <= 0).length;\n const remaining = Math.max(0, Metric.hwpToPt(totalWidth) - knownTotal);\n const zeroFill = zeroCount > 0 ? remaining / zeroCount : 0;\n for (let i = 0; i < srcPt.length; i++) {\n if (srcPt[i] <= 0) srcPt[i] = zeroFill > 0 ? zeroFill : Metric.hwpToPt(defaultColW);\n }\n for (const wPt of srcPt) colWidths.push(Metric.ptToHwp(wPt));\n } else {\n for (let c = 0; c < colCount; c++) colWidths.push(defaultColW);\n }\n // Scale to fit available width\n const rawTotal = colWidths.reduce((s, w) => s + w, 0);\n if (rawTotal > totalWidth * 1.05) {\n const scale = totalWidth / rawTotal;\n for (let i = 0; i < colWidths.length; i++) colWidths[i] = Math.round(colWidths[i] * scale);\n }\n const actualTotal = colWidths.reduce((s, w) => s + w, 0);\n\n // Table borderFillIDRef\n const tblBfId = grid.props.defaultStroke\n ? addBorderFill(ctx, grid.props.defaultStroke)\n : 2; // default table border\n\n // Rows\n let rowsXml = '';\n for (let ri = 0; ri < grid.kids.length; ri++) {\n const row = grid.kids[ri];\n let cellsXml = '';\n let colIdx = 0;\n for (let ci = 0; ci < row.kids.length; ci++) {\n const cell = row.kids[ci];\n\n // Cell borderFill\n let cellBfId = tblBfId;\n if (cell.props.bg) {\n cellBfId = addBorderFill(ctx, grid.props.defaultStroke ?? DEFAULT_STROKE, cell.props.bg);\n }\n\n // Encode cell paragraphs\n const parasXml = cell.kids.map(p => encodePara(p, ctx)).join('');\n\n // Calculate cell width from column widths\n let cellW = 0;\n for (let sc = colIdx; sc < colIdx + cell.cs && sc < colWidths.length; sc++) cellW += colWidths[sc];\n if (cellW === 0) cellW = defaultColW * cell.cs;\n\n cellsXml += `<hp:tc name=\"\" header=\"0\" hasMargin=\"1\" protect=\"0\" editable=\"0\" dirty=\"0\" borderFillIDRef=\"${cellBfId}\"><hp:subList id=\"\" textDirection=\"HORIZONTAL\" lineWrap=\"BREAK\" vertAlign=\"${cell.props.va === 'mid' ? 'CENTER' : cell.props.va === 'bot' ? 'BOTTOM' : 'TOP'}\" linkListIDRef=\"0\" linkListNextIDRef=\"0\" textWidth=\"0\" textHeight=\"0\" hasTextRef=\"0\" hasNumRef=\"0\">${parasXml}</hp:subList><hp:cellAddr colAddr=\"${colIdx}\" rowAddr=\"${ri}\"/><hp:cellSpan colSpan=\"${cell.cs}\" rowSpan=\"${cell.rs}\"/><hp:cellSz width=\"${cellW}\" height=\"1000\"/><hp:cellMargin left=\"141\" right=\"141\" top=\"141\" bottom=\"141\"/></hp:tc>`;\n colIdx += cell.cs;\n }\n rowsXml += `<hp:tr>${cellsXml}</hp:tr>`;\n }\n\n const headerRow = grid.props.headerRow ? ' repeatHeader=\"1\"' : '';\n\n return `<hp:tbl id=\"${ctx.nextElementId++}\" zOrder=\"0\" numberingType=\"TABLE\" textWrap=\"TOP_AND_BOTTOM\" textFlow=\"BOTH_SIDES\" lock=\"0\" dropcapstyle=\"None\" pageBreak=\"CELL\"${headerRow} rowCnt=\"${rowCount}\" colCnt=\"${colCount}\" cellSpacing=\"0\" borderFillIDRef=\"${tblBfId}\" noAdjust=\"0\"><hp:sz width=\"${actualTotal}\" widthRelTo=\"ABSOLUTE\" height=\"1000\" heightRelTo=\"ABSOLUTE\" protect=\"0\"/><hp:pos treatAsChar=\"1\" affectLSpacing=\"0\" flowWithText=\"1\" allowOverlap=\"0\" holdAnchorAndSO=\"0\" vertRelTo=\"PARA\" horzRelTo=\"PARA\" vertAlign=\"TOP\" horzAlign=\"LEFT\" vertOffset=\"0\" horzOffset=\"0\"/><hp:outMargin left=\"0\" right=\"0\" top=\"0\" bottom=\"0\"/><hp:inMargin left=\"138\" right=\"138\" top=\"138\" bottom=\"138\"/>${rowsXml}</hp:tbl>`;\n}\n\nfunction extractPreviewText(sheet?: SheetNode): string {\n if (!sheet) return '';\n const lines: string[] = [];\n for (const kid of sheet.kids) {\n if (kid.tag === 'para') {\n const text = kid.kids.map(k => {\n if (k.tag === 'span') return k.kids.map(c => c.tag === 'txt' ? c.content : '').join('');\n return '';\n }).join('');\n if (text) lines.push(text);\n } else if (kid.tag === 'grid') {\n for (const row of kid.kids) {\n const cells = row.kids.map(cell =>\n cell.kids.map(p => p.kids.map(k => {\n if (k.tag === 'span') return k.kids.map(c => c.tag === 'txt' ? c.content : '').join('');\n return '';\n }).join('')).join('')\n );\n lines.push(cells.join('\\t'));\n }\n }\n }\n return lines.join('\\r\\n');\n}\n\nfunction esc(s: string): string { return TextKit.escapeXml(s); }\n\nregistry.registerEncoder(new HwpxEncoder());\n","import type { Encoder } from '../../contract/encoder';\nimport type { DocRoot, ParaNode, SpanNode, GridNode, ContentNode, ImgNode, SheetNode } from '../../model/doc-tree';\nimport type { Outcome } from '../../contract/result';\nimport type { PageDims, GridProps, CellProps } from '../../model/doc-props';\nimport { A4 } from '../../model/doc-props';\nimport { succeed, fail } from '../../contract/result';\nimport { Metric } from '../../safety/StyleBridge';\nimport { ArchiveKit } from '../../toolkit/ArchiveKit';\nimport { TextKit } from '../../toolkit/TextKit';\nimport { registry } from '../../pipeline/registry';\n\ninterface ImageEntry { rId: string; name: string; data: Uint8Array; ext: string }\n\nexport class DocxEncoder implements Encoder {\n readonly format = 'docx';\n\n async encode(doc: DocRoot): Promise<Outcome<Uint8Array>> {\n try {\n const sheet = doc.kids[0];\n const dims = sheet?.dims ?? A4;\n const kids = sheet?.kids ?? [];\n\n const images: ImageEntry[] = [];\n const ctx: EncCtx = { images, nextId: 10, nextImgNum: 1, warns: [] };\n\n // Collect images from content\n collectImages(kids, ctx);\n\n // Header / footer\n let headerParas = sheet?.header;\n let footerParas = sheet?.footer;\n const hasHeader = headerParas && headerParas.length > 0;\n const hasFooter = footerParas && footerParas.length > 0;\n\n // Collect images from header/footer\n if (hasHeader) collectImagesFromParas(headerParas!, ctx);\n if (hasFooter) collectImagesFromParas(footerParas!, ctx);\n\n const headerRId = hasHeader ? `rId${ctx.nextId++}` : '';\n const footerRId = hasFooter ? `rId${ctx.nextId++}` : '';\n\n // Numbering: collect list info\n const numInfo = collectNumbering(kids);\n\n const entries: { name: string; data: Uint8Array }[] = [\n { name: '[Content_Types].xml', data: TextKit.encode(contentTypes(images, hasHeader, hasFooter)) },\n { name: '_rels/.rels', data: TextKit.encode(pkgRels()) },\n { name: 'word/document.xml', data: TextKit.encode(documentXml(kids, dims, ctx, headerRId, footerRId)) },\n { name: 'word/styles.xml', data: TextKit.encode(stylesXml()) },\n { name: 'word/settings.xml', data: TextKit.encode(settingsXml()) },\n { name: 'word/_rels/document.xml.rels', data: TextKit.encode(docRels(images, headerRId, footerRId, numInfo.hasLists)) },\n { name: 'docProps/app.xml', data: TextKit.encode(appXml()) },\n { name: 'docProps/core.xml', data: TextKit.encode(coreXml(doc.meta)) },\n ];\n\n // Add numbering.xml if needed\n if (numInfo.hasLists) {\n entries.push({ name: 'word/numbering.xml', data: TextKit.encode(numberingXml(numInfo)) });\n }\n\n // Add header/footer files\n if (hasHeader) {\n entries.push({ name: 'word/header1.xml', data: TextKit.encode(headerFooterXml('hdr', headerParas!, ctx)) });\n }\n if (hasFooter) {\n entries.push({ name: 'word/footer1.xml', data: TextKit.encode(headerFooterXml('ftr', footerParas!, ctx)) });\n }\n\n // Add image media files\n for (const img of images) {\n entries.push({ name: `word/media/${img.name}`, data: img.data });\n }\n\n return succeed(await ArchiveKit.zip(entries));\n } catch (e: any) {\n return fail(`DOCX encode error: ${e?.message ?? String(e)}`);\n }\n }\n}\n\n// ─── Context ────────────────────────────────────────────────\n\ninterface EncCtx {\n images: ImageEntry[];\n nextId: number;\n nextImgNum: number;\n warns: string[];\n}\n\n// ─── Image collection ───────────────────────────────────────\n\nfunction mimeToExt(mime: string): string {\n if (mime.includes('jpeg')) return 'jpeg';\n if (mime.includes('gif')) return 'gif';\n if (mime.includes('bmp')) return 'bmp';\n return 'png';\n}\n\nfunction collectImages(kids: ContentNode[], ctx: EncCtx): void {\n for (const kid of kids) {\n if (kid.tag === 'para') collectImagesFromPara(kid, ctx);\n else if (kid.tag === 'grid') {\n for (const row of kid.kids)\n for (const cell of row.kids)\n for (const p of cell.kids) collectImagesFromPara(p, ctx);\n }\n }\n}\n\nfunction collectImagesFromParas(paras: ParaNode[], ctx: EncCtx): void {\n for (const p of paras) collectImagesFromPara(p, ctx);\n}\n\nfunction collectImagesFromPara(para: ParaNode, ctx: EncCtx): void {\n for (const kid of para.kids) {\n if (kid.tag === 'img') registerImage(kid, ctx);\n }\n}\n\nfunction registerImage(img: ImgNode, ctx: EncCtx): void {\n // Check if already registered (by b64 reference)\n if ((img as any)._rId) return;\n const ext = mimeToExt(img.mime);\n const name = `image${ctx.nextImgNum++}.${ext}`;\n const rId = `rId${ctx.nextId++}`;\n const data = TextKit.base64Decode(img.b64);\n ctx.images.push({ rId, name, data, ext });\n (img as any)._rId = rId;\n}\n\n// ─── List/numbering collection ──────────────────────────────\n\ninterface NumInfo {\n hasLists: boolean;\n hasBullet: boolean;\n hasNumbered: boolean;\n}\n\nfunction collectNumbering(kids: ContentNode[]): NumInfo {\n let hasBullet = false;\n let hasNumbered = false;\n for (const kid of kids) {\n if (kid.tag === 'para') {\n if (kid.props.listOrd === true) hasNumbered = true;\n else if (kid.props.listOrd === false) hasBullet = true;\n }\n }\n return { hasLists: hasBullet || hasNumbered, hasBullet, hasNumbered };\n}\n\n// ─── OOXML boilerplate ──────────────────────────────────────\n\nfunction contentTypes(images: ImageEntry[], hasHeader?: boolean, hasFooter?: boolean): string {\n const imgDefaults = new Set<string>();\n for (const img of images) imgDefaults.add(img.ext);\n\n let defaults = `<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>`;\n\n for (const ext of imgDefaults) {\n const ct = ext === 'png' ? 'image/png' : ext === 'jpeg' ? 'image/jpeg' : ext === 'gif' ? 'image/gif' : 'image/bmp';\n defaults += `\\n <Default Extension=\"${ext}\" ContentType=\"${ct}\"/>`;\n }\n\n let overrides = `<Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\n <Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>\n <Override PartName=\"/word/settings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\"/>\n <Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>\n <Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>`;\n\n if (hasHeader) overrides += `\\n <Override PartName=\"/word/header1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\"/>`;\n if (hasFooter) overrides += `\\n <Override PartName=\"/word/footer1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\"/>`;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n ${defaults}\n ${overrides}\n</Types>`;\n}\n\nfunction pkgRels(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>\n</Relationships>`;\n}\n\nfunction docRels(images: ImageEntry[], headerRId?: string, footerRId?: string, hasLists?: boolean): string {\n let rels = `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\" Target=\"settings.xml\"/>`;\n\n // Numbering relationship — only when lists exist\n if (hasLists) {\n rels += `\\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\" Target=\"numbering.xml\"/>`;\n }\n\n for (const img of images) {\n rels += `\\n <Relationship Id=\"${img.rId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/${img.name}\"/>`;\n }\n\n if (headerRId) {\n rels += `\\n <Relationship Id=\"${headerRId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\" Target=\"header1.xml\"/>`;\n }\n if (footerRId) {\n rels += `\\n <Relationship Id=\"${footerRId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\" Target=\"footer1.xml\"/>`;\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n ${rels}\n</Relationships>`;\n}\n\nfunction appXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\">\n <Application>hwpkit</Application>\n</Properties>`;\n}\n\nfunction coreXml(meta: any): string {\n const now = new Date().toISOString();\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n <dc:title>${esc(meta.title ?? '')}</dc:title>\n <dc:creator>${esc(meta.author ?? '')}</dc:creator>\n <dcterms:created xsi:type=\"dcterms:W3CDTF\">${meta.created ?? now}</dcterms:created>\n <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${now}</dcterms:modified>\n</cp:coreProperties>`;\n}\n\nfunction stylesXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:docDefaults>\n <w:rPrDefault><w:rPr>\n <w:rFonts w:ascii=\"맑은 고딕\" w:eastAsia=\"맑은 고딕\" w:hAnsi=\"맑은 고딕\"/>\n <w:sz w:val=\"20\"/>\n <w:szCs w:val=\"20\"/>\n </w:rPr></w:rPrDefault>\n <w:pPrDefault><w:pPr>\n <w:spacing w:after=\"0\" w:line=\"384\" w:lineRule=\"auto\"/>\n <w:jc w:val=\"both\"/>\n </w:pPr></w:pPrDefault>\n </w:docDefaults>\n <w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/></w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading1\"><w:name w:val=\"heading 1\"/><w:basedOn w:val=\"Normal\"/><w:pPr><w:keepNext/><w:outlineLvl w:val=\"0\"/></w:pPr><w:rPr><w:b/><w:sz w:val=\"44\"/><w:szCs w:val=\"44\"/></w:rPr></w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading2\"><w:name w:val=\"heading 2\"/><w:basedOn w:val=\"Normal\"/><w:pPr><w:keepNext/><w:outlineLvl w:val=\"1\"/></w:pPr><w:rPr><w:b/><w:sz w:val=\"36\"/><w:szCs w:val=\"36\"/></w:rPr></w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Heading3\"><w:name w:val=\"heading 3\"/><w:basedOn w:val=\"Normal\"/><w:pPr><w:keepNext/><w:outlineLvl w:val=\"2\"/></w:pPr><w:rPr><w:b/><w:sz w:val=\"28\"/><w:szCs w:val=\"28\"/></w:rPr></w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Header\"><w:name w:val=\"header\"/><w:basedOn w:val=\"Normal\"/></w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"Footer\"><w:name w:val=\"footer\"/><w:basedOn w:val=\"Normal\"/></w:style>\n <w:style w:type=\"paragraph\" w:styleId=\"ListParagraph\"><w:name w:val=\"List Paragraph\"/><w:basedOn w:val=\"Normal\"/><w:pPr><w:ind w:left=\"720\"/></w:pPr></w:style>\n <w:style w:type=\"table\" w:styleId=\"TableGrid\"><w:name w:val=\"Table Grid\"/><w:tblPr><w:tblBorders><w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"000000\"/><w:left w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"000000\"/><w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"000000\"/><w:right w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"000000\"/><w:insideH w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"000000\"/><w:insideV w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"000000\"/></w:tblBorders></w:tblPr></w:style>\n</w:styles>`;\n}\n\nfunction settingsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:settings xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n <w:zoom w:percent=\"100\"/>\n <w:bordersDoNotSurroundHeader/>\n <w:bordersDoNotSurroundFooter/>\n <w:defaultTabStop w:val=\"800\"/>\n <w:compat>\n <w:spaceForUL/>\n <w:balanceSingleByteDoubleByteWidth/>\n <w:doNotLeaveBackslashAlone/>\n <w:ulTrailSpace/>\n <w:doNotExpandShiftReturn/>\n <w:adjustLineHeightInTable/>\n <w:useFELayout/>\n </w:compat>\n</w:settings>`;\n}\n\n// ─── numbering.xml ──────────────────────────────────────────\n\nfunction numberingXml(info: NumInfo): string {\n let abstractNums = '';\n let nums = '';\n\n // Bullet list: abstractNumId=0, numId=1\n if (info.hasBullet) {\n abstractNums += `<w:abstractNum w:abstractNumId=\"0\">`;\n for (let lvl = 0; lvl < 9; lvl++) {\n const marker = lvl === 0 ? '●' : lvl === 1 ? '○' : '■';\n const indent = (lvl + 1) * 720;\n abstractNums += `<w:lvl w:ilvl=\"${lvl}\"><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"${marker}\"/><w:pPr><w:ind w:left=\"${indent}\" w:hanging=\"360\"/></w:pPr></w:lvl>`;\n }\n abstractNums += `</w:abstractNum>`;\n nums += `<w:num w:numId=\"1\"><w:abstractNumId w:val=\"0\"/></w:num>`;\n }\n\n // Numbered list: abstractNumId=1, numId=2\n if (info.hasNumbered) {\n abstractNums += `<w:abstractNum w:abstractNumId=\"1\">`;\n for (let lvl = 0; lvl < 9; lvl++) {\n const fmt = lvl % 3 === 0 ? 'decimal' : lvl % 3 === 1 ? 'lowerLetter' : 'lowerRoman';\n const indent = (lvl + 1) * 720;\n abstractNums += `<w:lvl w:ilvl=\"${lvl}\"><w:start w:val=\"1\"/><w:numFmt w:val=\"${fmt}\"/><w:lvlText w:val=\"%${lvl + 1}.\"/><w:pPr><w:ind w:left=\"${indent}\" w:hanging=\"360\"/></w:pPr></w:lvl>`;\n }\n abstractNums += `</w:abstractNum>`;\n nums += `<w:num w:numId=\"2\"><w:abstractNumId w:val=\"1\"/></w:num>`;\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">\n ${abstractNums}\n ${nums}\n</w:numbering>`;\n}\n\n// ─── header / footer xml ────────────────────────────────────\n\nfunction headerFooterXml(type: 'hdr' | 'ftr', paras: ParaNode[], ctx: EncCtx): string {\n const tag = type === 'hdr' ? 'w:hdr' : 'w:ftr';\n const body = paras.map(p => encodeParaInner(p, ctx)).join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<${tag} xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">\n${body}\n</${tag}>`;\n}\n\n// ─── document.xml ───────────────────────────────────────────\n\nfunction documentXml(kids: ContentNode[], dims: PageDims, ctx: EncCtx, headerRId?: string, footerRId?: string): string {\n const body = kids.map(k => encodeContent(k, ctx, dims)).join('\\n');\n\n let sectRefs = '';\n if (headerRId) sectRefs += `\\n <w:headerReference w:type=\"default\" r:id=\"${headerRId}\"/>`;\n if (footerRId) sectRefs += `\\n <w:footerReference w:type=\"default\" r:id=\"${footerRId}\"/>`;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">\n <w:body>\n${body}\n <w:sectPr>${sectRefs}\n <w:pgSz w:w=\"${Metric.ptToDxa(dims.wPt)}\" w:h=\"${Metric.ptToDxa(dims.hPt)}\" w:orient=\"${dims.orient ?? 'portrait'}\"/>\n <w:pgMar w:top=\"${Metric.ptToDxa(dims.mt)}\" w:right=\"${Metric.ptToDxa(dims.mr)}\" w:bottom=\"${Metric.ptToDxa(dims.mb)}\" w:left=\"${Metric.ptToDxa(dims.ml)}\" w:header=\"709\" w:footer=\"709\" w:gutter=\"0\"/>\n </w:sectPr>\n </w:body>\n</w:document>`;\n}\n\nfunction encodeContent(node: ContentNode, ctx: EncCtx, dims?: PageDims): string {\n return node.tag === 'grid' ? encodeGrid(node, ctx, dims) : encodeParaInner(node, ctx);\n}\n\nfunction encodeParaInner(para: ParaNode, ctx: EncCtx): string {\n const align = para.props.align ?? 'left';\n const headStyle = para.props.heading ? `<w:pStyle w:val=\"Heading${para.props.heading}\"/>` : '';\n\n // List numbering\n let numPr = '';\n if (para.props.listOrd !== undefined) {\n const numId = para.props.listOrd ? 2 : 1;\n const ilvl = para.props.listLv ?? 0;\n numPr = `<w:pStyle w:val=\"ListParagraph\"/><w:numPr><w:ilvl w:val=\"${ilvl}\"/><w:numId w:val=\"${numId}\"/></w:numPr>`;\n }\n\n const runs = para.kids.map(k => {\n if (k.tag === 'span') return encodeRun(k, ctx);\n if (k.tag === 'img') return encodeImage(k, ctx);\n return '';\n }).join('');\n\n return ` <w:p>\n <w:pPr>${headStyle}${numPr}<w:jc w:val=\"${align === 'justify' ? 'both' : align}\"/></w:pPr>\n ${runs}\n </w:p>`;\n}\n\nfunction encodeRun(span: SpanNode, _ctx: EncCtx): string {\n const p = span.props;\n const rPr: string[] = [];\n if (p.b) rPr.push('<w:b/>');\n if (p.i) rPr.push('<w:i/>');\n if (p.u) rPr.push('<w:u w:val=\"single\"/>');\n if (p.s) rPr.push('<w:strike/>');\n if (p.sup) rPr.push('<w:vertAlign w:val=\"superscript\"/>');\n if (p.sub) rPr.push('<w:vertAlign w:val=\"subscript\"/>');\n if (p.pt) rPr.push(`<w:sz w:val=\"${Metric.ptToHalfPt(p.pt)}\"/><w:szCs w:val=\"${Metric.ptToHalfPt(p.pt)}\"/>`);\n if (p.color) rPr.push(`<w:color w:val=\"${p.color}\"/>`);\n if (p.font) rPr.push(`<w:rFonts w:ascii=\"${esc(p.font)}\" w:hAnsi=\"${esc(p.font)}\" w:eastAsia=\"${esc(p.font)}\"/>`);\n if (p.bg) rPr.push(`<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${p.bg}\"/>`);\n\n // Process kids — text and pagenum\n const parts: string[] = [];\n for (const kid of span.kids) {\n if (kid.tag === 'txt') {\n parts.push(`<w:r><w:rPr>${rPr.join('')}</w:rPr><w:t xml:space=\"preserve\">${esc(kid.content)}</w:t></w:r>`);\n } else if (kid.tag === 'pagenum') {\n parts.push(`<w:r><w:rPr>${rPr.join('')}</w:rPr><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r><w:rPr>${rPr.join('')}</w:rPr><w:instrText> PAGE </w:instrText></w:r><w:r><w:rPr>${rPr.join('')}</w:rPr><w:fldChar w:fldCharType=\"separate\"/></w:r><w:r><w:rPr>${rPr.join('')}</w:rPr><w:t>1</w:t></w:r><w:r><w:rPr>${rPr.join('')}</w:rPr><w:fldChar w:fldCharType=\"end\"/></w:r>`);\n } else if (kid.tag === 'br') {\n parts.push(`<w:r><w:br/></w:r>`);\n } else if (kid.tag === 'pb') {\n parts.push(`<w:r><w:br w:type=\"page\"/></w:r>`);\n }\n }\n\n return parts.join('');\n}\n\nfunction encodeImage(img: ImgNode, _ctx: EncCtx): string {\n const rId = (img as any)._rId;\n if (!rId) return '';\n\n const cx = Metric.ptToEmu(img.w);\n const cy = Metric.ptToEmu(img.h);\n const alt = esc(img.alt ?? '');\n\n return `<w:r><w:drawing><wp:inline distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\"><wp:extent cx=\"${cx}\" cy=\"${cy}\"/><wp:docPr id=\"${_ctx.nextId++}\" name=\"Image\" descr=\"${alt}\"/><a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"Image\"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"${rId}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>`;\n}\n\nfunction encodeGrid(grid: GridNode, ctx: EncCtx, dims?: PageDims): string {\n const gp = grid.props;\n const look = gp.look;\n\n // tblLook attributes\n const firstRow = look?.firstRow ? '1' : '0';\n const lastRow = look?.lastRow ? '1' : '0';\n const firstCol = look?.firstCol ? '1' : '0';\n const lastCol = look?.lastCol ? '1' : '0';\n const noHBand = look?.bandedRows ? '0' : '1';\n const noVBand = look?.bandedCols ? '0' : '1';\n\n // Determine actual grid column count from colWidths or by scanning all rows\n const d = dims ?? A4;\n const availDxa = Metric.ptToDxa(d.wPt - d.ml - d.mr);\n\n // Compute true column count: max total colSpan across all rows\n let colCount = 0;\n for (const row of grid.kids) {\n let rowCols = 0;\n for (const cell of row.kids) rowCols += cell.cs;\n if (rowCols > colCount) colCount = rowCols;\n }\n if (colCount === 0) colCount = grid.kids[0]?.kids.length ?? 1;\n\n const defaultColDxa = Math.round(availDxa / colCount);\n\n // Use actual column widths if available from source format\n const colWidthsDxa: number[] = [];\n if (grid.props.colWidths && grid.props.colWidths.length === colCount) {\n // Fill zero-width columns by distributing remaining space\n const srcPt = [...grid.props.colWidths];\n const knownTotal = srcPt.filter(w => w > 0).reduce((s, w) => s + w, 0);\n const zeroCount = srcPt.filter(w => w <= 0).length;\n const remaining = Math.max(0, Metric.dxaToPt(availDxa) - knownTotal);\n const zeroFill = zeroCount > 0 ? remaining / zeroCount : 0;\n for (let i = 0; i < srcPt.length; i++) {\n if (srcPt[i] <= 0) srcPt[i] = zeroFill > 0 ? zeroFill : Metric.dxaToPt(defaultColDxa);\n }\n const srcWidths = srcPt.map(w => Metric.ptToDxa(w));\n const srcTotal = srcWidths.reduce((s, w) => s + w, 0);\n // Normalize to fit available page width if source widths exceed it\n const scale = srcTotal > availDxa ? availDxa / srcTotal : 1;\n for (const w of srcWidths) colWidthsDxa.push(Math.round(w * scale));\n } else {\n for (let c = 0; c < colCount; c++) colWidthsDxa.push(defaultColDxa);\n }\n const totalDxa = colWidthsDxa.reduce((s, w) => s + w, 0);\n\n // Grid columns\n const gridCols = colWidthsDxa.map(w => `<w:gridCol w:w=\"${Math.round(w)}\"/>`).join('');\n\n // Pre-compute vMerge map: for each (ri, colIdx), track if a cell with rs>1 spans into this row\n // Key: \"ri,colIdx\", Value: 'restart' | 'continue'\n const vMergeMap = new Map<string, 'restart' | 'continue'>();\n for (let ri = 0; ri < grid.kids.length; ri++) {\n let colIdx = 0;\n for (const cell of grid.kids[ri].kids) {\n if (cell.rs > 1) {\n vMergeMap.set(`${ri},${colIdx}`, 'restart');\n for (let sr = 1; sr < cell.rs; sr++) {\n vMergeMap.set(`${ri + sr},${colIdx}`, 'continue');\n }\n }\n colIdx += cell.cs;\n }\n }\n\n const rows = grid.kids.map((row, ri) => {\n let colIdx = 0;\n\n // Build actual cells including continuation cells for vMerge\n const cellXmls: string[] = [];\n let srcCellIdx = 0;\n\n // Walk through grid columns, emitting either real cells or vMerge continue cells\n while (srcCellIdx < row.kids.length) {\n const cell = row.kids[srcCellIdx];\n const mergeType = vMergeMap.get(`${ri},${colIdx}`);\n\n const cp = cell.props;\n const tcPrParts: string[] = [];\n\n // Cell width in DXA (sum of spanned columns)\n let cellW = 0;\n for (let sc = colIdx; sc < colIdx + cell.cs && sc < colWidthsDxa.length; sc++) cellW += colWidthsDxa[sc];\n if (cellW === 0) cellW = defaultColDxa * cell.cs;\n tcPrParts.push(`<w:tcW w:w=\"${Math.round(cellW)}\" w:type=\"dxa\"/>`);\n\n if (cell.cs > 1) tcPrParts.push(`<w:gridSpan w:val=\"${cell.cs}\"/>`);\n\n // vMerge\n if (cell.rs > 1) {\n tcPrParts.push(`<w:vMerge w:val=\"restart\"/>`);\n }\n\n // Cell borders\n const borders = encodeCellBorders(cp);\n if (borders) tcPrParts.push(borders);\n\n // Cell background\n if (cp.bg) tcPrParts.push(`<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${cp.bg}\"/>`);\n\n // Vertical alignment\n if (cp.va) {\n const vaMap: Record<string, string> = { top: 'top', mid: 'center', bot: 'bottom' };\n tcPrParts.push(`<w:vAlign w:val=\"${vaMap[cp.va] ?? 'top'}\"/>`);\n }\n\n const tcPr = `<w:tcPr>${tcPrParts.join('')}</w:tcPr>`;\n cellXmls.push(` <w:tc>${tcPr}${cell.kids.map(p => encodeParaInner(p, ctx)).join('')}</w:tc>`);\n colIdx += cell.cs;\n srcCellIdx++;\n }\n\n // Now emit vMerge continue cells for rows that are spanned into\n // We need to check if any cells from rows above span into this row\n // Re-walk grid columns looking for continue cells not covered by this row's cells\n const finalCells: string[] = [];\n let finalColIdx = 0;\n let cellIter = 0;\n\n // Use the computed colCount (max across all rows)\n const totalGridCols = colCount;\n\n // Re-check: we need to interleave vMerge continue cells\n // The current row may have fewer cells because the model already skipped continuation cells\n // So we need to insert continuation cells where vMergeMap says 'continue' for this row\n finalColIdx = 0;\n cellIter = 0;\n for (let gc = 0; gc < totalGridCols; ) {\n const mergeType = vMergeMap.get(`${ri},${gc}`);\n if (mergeType === 'continue') {\n // Find the original cell's cs from the restart row\n let origCs = 1;\n for (let sr = ri - 1; sr >= 0; sr--) {\n const mt = vMergeMap.get(`${sr},${gc}`);\n if (mt === 'restart') {\n // Find the cell at this column in that row\n let col = 0;\n for (const c of grid.kids[sr].kids) {\n if (col === gc) { origCs = c.cs; break; }\n col += c.cs;\n }\n break;\n }\n }\n let cw = 0;\n for (let sc = gc; sc < gc + origCs && sc < colWidthsDxa.length; sc++) cw += colWidthsDxa[sc];\n if (cw === 0) cw = defaultColDxa * origCs;\n let contParts = `<w:tcW w:w=\"${Math.round(cw)}\" w:type=\"dxa\"/>`;\n if (origCs > 1) contParts += `<w:gridSpan w:val=\"${origCs}\"/>`;\n contParts += `<w:vMerge/>`;\n finalCells.push(` <w:tc><w:tcPr>${contParts}</w:tcPr><w:p><w:pPr/></w:p></w:tc>`);\n gc += origCs;\n } else {\n if (cellIter < cellXmls.length) {\n finalCells.push(cellXmls[cellIter]);\n gc += row.kids[cellIter]?.cs ?? 1;\n cellIter++;\n } else {\n gc++;\n }\n }\n }\n\n // Header row\n let trPr = '';\n if (ri === 0 && (gp.headerRow || look?.firstRow)) {\n trPr = '<w:trPr><w:tblHeader/></w:trPr>';\n }\n\n return ` <w:tr>${trPr}\\n${finalCells.join('\\n')}\\n </w:tr>`;\n }).join('\\n');\n\n // Table borders from defaultStroke\n let tblBorders = '';\n if (gp.defaultStroke) {\n const s = gp.defaultStroke;\n const strokeKindMap: Record<string, string> = { solid: 'single', dash: 'dashed', dot: 'dotted', double: 'double', none: 'none' };\n const val = strokeKindMap[s.kind] ?? 'single';\n const sz = Math.round(s.pt * 8);\n const bdr = `w:val=\"${val}\" w:sz=\"${sz}\" w:space=\"0\" w:color=\"${s.color}\"`;\n tblBorders = `<w:tblBorders><w:top ${bdr}/><w:left ${bdr}/><w:bottom ${bdr}/><w:right ${bdr}/><w:insideH ${bdr}/><w:insideV ${bdr}/></w:tblBorders>`;\n }\n\n return ` <w:tbl>\n <w:tblPr><w:tblStyle w:val=\"TableGrid\"/><w:tblW w:w=\"${Math.round(totalDxa)}\" w:type=\"dxa\"/><w:tblLayout w:type=\"fixed\"/><w:tblLook w:val=\"04A0\" w:firstRow=\"${firstRow}\" w:lastRow=\"${lastRow}\" w:firstColumn=\"${firstCol}\" w:lastColumn=\"${lastCol}\" w:noHBand=\"${noHBand}\" w:noVBand=\"${noVBand}\"/>${tblBorders}<w:tblCellMar><w:top w:w=\"28\" w:type=\"dxa\"/><w:left w:w=\"102\" w:type=\"dxa\"/><w:bottom w:w=\"28\" w:type=\"dxa\"/><w:right w:w=\"102\" w:type=\"dxa\"/></w:tblCellMar></w:tblPr>\n <w:tblGrid>${gridCols}</w:tblGrid>\n${rows}\n </w:tbl>`;\n}\n\nfunction encodeCellBorders(cp: CellProps): string {\n if (!cp.top && !cp.bot && !cp.left && !cp.right) return '';\n const strokeKindMap: Record<string, string> = { solid: 'single', dash: 'dashed', dot: 'dotted', double: 'double', none: 'none' };\n\n const encode = (s?: { kind: string; pt: number; color: string }, tag?: string) => {\n if (!s || !tag) return '';\n const val = strokeKindMap[s.kind] ?? 'single';\n return `<w:${tag} w:val=\"${val}\" w:sz=\"${Math.round(s.pt * 8)}\" w:space=\"0\" w:color=\"${s.color}\"/>`;\n };\n\n return `<w:tcBorders>${encode(cp.top, 'top')}${encode(cp.bot, 'bottom')}${encode(cp.left, 'left')}${encode(cp.right, 'right')}</w:tcBorders>`;\n}\n\nfunction esc(s: string): string { return TextKit.escapeXml(s); }\n\nregistry.registerEncoder(new DocxEncoder());\n","import type { Encoder } from '../../contract/encoder';\nimport type { DocRoot, ParaNode, SpanNode, GridNode, ContentNode, ImgNode } from '../../model/doc-tree';\nimport type { Outcome } from '../../contract/result';\nimport { succeed, fail } from '../../contract/result';\nimport { TextKit } from '../../toolkit/TextKit';\nimport { registry } from '../../pipeline/registry';\n\nexport class MdEncoder implements Encoder {\n readonly format = 'md';\n\n async encode(doc: DocRoot): Promise<Outcome<Uint8Array>> {\n try {\n const warns: string[] = [];\n const parts: string[] = [];\n for (const sheet of doc.kids) {\n // Warn about header/footer loss\n if (sheet.header && sheet.header.length > 0) warns.push('[SHIELD] MD: 머리글(header) 표현 불가 — 손실됨');\n if (sheet.footer && sheet.footer.length > 0) warns.push('[SHIELD] MD: 바닥글(footer) 표현 불가 — 손실됨');\n\n for (const kid of sheet.kids) parts.push(encodeContent(kid, warns));\n }\n return succeed(TextKit.encode(parts.join('\\n\\n')), warns);\n } catch (e: any) {\n return fail(`MD encode error: ${e?.message ?? String(e)}`);\n }\n }\n}\n\nfunction encodeContent(node: ContentNode, warns: string[]): string {\n return node.tag === 'grid' ? encodeGrid(node, warns) : encodePara(node, warns);\n}\n\nfunction encodePara(para: ParaNode, warns: string[]): string {\n const text = para.kids.map(k => {\n if (k.tag === 'span') return encodeSpan(k, warns);\n if (k.tag === 'img') return encodeImage(k);\n return '';\n }).join('');\n\n if (para.props.heading) return `${'#'.repeat(para.props.heading)} ${text}`;\n\n if (para.props.listOrd !== undefined) {\n const indent = ' '.repeat(para.props.listLv ?? 0);\n return `${indent}${para.props.listOrd ? '1.' : '-'} ${text}`;\n }\n\n // Alignment: use HTML fallback for non-left\n if (para.props.align && para.props.align !== 'left' && para.props.align !== 'justify') {\n return `<div align=\"${para.props.align}\">${text}</div>`;\n }\n\n return text;\n}\n\nfunction encodeSpan(span: SpanNode, warns: string[]): string {\n // Warn about properties that can't be represented in MD\n if (span.props.font) warns.push(`[SHIELD] MD: 글꼴(${span.props.font}) 표현 불가 — 손실됨`);\n if (span.props.pt) warns.push(`[SHIELD] MD: 글자 크기(${span.props.pt}pt) 표현 불가 — 손실됨`);\n if (span.props.color) warns.push(`[SHIELD] MD: 글자 색상(#${span.props.color}) 표현 불가 — 손실됨`);\n if (span.props.bg) warns.push(`[SHIELD] MD: 배경 색상(#${span.props.bg}) 표현 불가 — 손실됨`);\n\n let hasPageNum = false;\n const textParts: string[] = [];\n for (const kid of span.kids) {\n if (kid.tag === 'txt') textParts.push(kid.content);\n else if (kid.tag === 'pagenum') {\n hasPageNum = true;\n warns.push('[SHIELD] MD: 페이지 번호 표현 불가 — 손실됨');\n }\n }\n\n let r = textParts.join('');\n if (hasPageNum && r === '') r = '[페이지 번호]';\n\n if (span.props.b && span.props.i) r = `***${r}***`;\n else if (span.props.b) r = `**${r}**`;\n else if (span.props.i) r = `*${r}*`;\n if (span.props.s) r = `~~${r}~~`;\n if (span.props.u) r = `<u>${r}</u>`;\n if (span.props.sup) r = `<sup>${r}</sup>`;\n if (span.props.sub) r = `<sub>${r}</sub>`;\n\n return r;\n}\n\nfunction encodeImage(img: ImgNode): string {\n return `![${img.alt ?? ''}](data:${img.mime};base64,${img.b64})`;\n}\n\nfunction encodeGrid(grid: GridNode, warns: string[]): string {\n if (grid.kids.length === 0) return '';\n\n // Warn about table style loss\n if (grid.props.look) warns.push('[SHIELD] MD: 표 스타일(색상, 테두리, 머리행 강조) 표현 불가 — 손실됨');\n\n const rows = grid.kids.map(row =>\n `| ${row.kids.map(cell => cell.kids.map(p => encodePara(p, warns)).join(' ')).join(' | ')} |`,\n );\n\n if (rows.length > 0) {\n const cols = grid.kids[0].kids.length;\n rows.splice(1, 0, `| ${Array(cols).fill('---').join(' | ')} |`);\n }\n\n return rows.join('\\n');\n}\n\nregistry.registerEncoder(new MdEncoder());\n","import type { DocRoot } from '../model/doc-tree';\nimport type { Outcome } from '../contract/result';\nimport { fail } from '../contract/result';\nimport { registry } from './registry';\n\n// Side-effect imports: auto-register all decoders and encoders\nimport '../decoders/hwpx/HwpxDecoder';\nimport '../decoders/hwp/HwpScanner';\nimport '../decoders/docx/DocxDecoder';\nimport '../decoders/md/MdDecoder';\nimport '../encoders/hwpx/HwpxEncoder';\nimport '../encoders/docx/DocxEncoder';\nimport '../encoders/md/MdEncoder';\n\nexport class Pipeline {\n private constructor(private raw: Uint8Array, private srcFmt: string) {}\n\n /** 파일을 열고 포맷을 자동 감지하거나 명시 */\n static open(input: Uint8Array | string, fmt?: string): Pipeline {\n if (typeof input === 'string') {\n return new Pipeline(new TextEncoder().encode(input), fmt ?? 'md');\n }\n return new Pipeline(input, fmt ?? detectFormat(input));\n }\n\n /** File/Blob 비동기 입력 */\n static async openAsync(input: File | Blob | Uint8Array | string, fmt?: string): Promise<Pipeline> {\n if (input instanceof Uint8Array || typeof input === 'string') {\n return Pipeline.open(input, fmt);\n }\n const buf = await input.arrayBuffer();\n const data = new Uint8Array(buf);\n const detectedFmt = fmt ?? (input instanceof File ? getExt(input.name) : undefined) ?? detectFormat(data);\n return new Pipeline(data, detectedFmt);\n }\n\n /** 목표 포맷으로 변환 */\n async to(targetFmt: string): Promise<Outcome<Uint8Array>> {\n const decoder = registry.getDecoder(this.srcFmt);\n const encoder = registry.getEncoder(targetFmt);\n\n if (!decoder) return fail(`지원하지 않는 입력 포맷: ${this.srcFmt}`);\n if (!encoder) return fail(`지원하지 않는 출력 포맷: ${targetFmt}`);\n\n const docResult = await decoder.decode(this.raw);\n if (!docResult.ok) return docResult;\n\n const encResult = await encoder.encode(docResult.data);\n if (!encResult.ok) return { ...encResult, warns: [...docResult.warns, ...encResult.warns] };\n\n return { ...encResult, warns: [...docResult.warns, ...encResult.warns] };\n }\n\n /** DocRoot만 추출 (인코딩 없이) */\n async inspect(): Promise<Outcome<DocRoot>> {\n const decoder = registry.getDecoder(this.srcFmt);\n if (!decoder) return fail(`디코더 없음: ${this.srcFmt}`);\n return decoder.decode(this.raw);\n }\n}\n\nfunction detectFormat(data: Uint8Array): string {\n if (data[0] === 0x50 && data[1] === 0x4B) return 'zip';\n if (data[0] === 0xD0 && data[1] === 0xCF && data[2] === 0x11 && data[3] === 0xE0) return 'hwp';\n return 'md';\n}\n\nfunction getExt(name: string): string | undefined {\n const parts = name.split('.');\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : undefined;\n}\n","import type { AnyNode, DocRoot } from '../model/doc-tree';\n\nexport type WalkCallback = (node: AnyNode, parent: AnyNode | null, depth: number) => void | 'stop';\n\nexport function walkNode(\n node: AnyNode,\n cb: WalkCallback,\n parent: AnyNode | null = null,\n depth = 0,\n): boolean {\n const result = cb(node, parent, depth);\n if (result === 'stop') return false;\n\n if ('kids' in node && Array.isArray((node as any).kids)) {\n for (const kid of (node as any).kids) {\n if (!walkNode(kid as AnyNode, cb, node, depth + 1)) return false;\n }\n }\n return true;\n}\n\nexport class TreeWalker {\n walk(root: DocRoot, cb: WalkCallback): void {\n walkNode(root, cb);\n }\n\n findAll<T extends AnyNode>(root: DocRoot, predicate: (n: AnyNode) => n is T): T[] {\n const results: T[] = [];\n walkNode(root, (n) => { if (predicate(n)) results.push(n); });\n return results;\n }\n\n extractText(root: DocRoot): string {\n const parts: string[] = [];\n walkNode(root, (n) => {\n if (n.tag === 'txt') parts.push(n.content);\n if (n.tag === 'br') parts.push('\\n');\n if (n.tag === 'pb') parts.push('\\n\\n');\n });\n return parts.join('');\n }\n}\n","import type { DocRoot, GridNode } from '../model/doc-tree';\nimport { walkNode } from './TreeWalker';\n\nexport function countNodes(root: DocRoot): Record<string, number> {\n const counts: Record<string, number> = {};\n walkNode(root, (n) => { counts[n.tag] = (counts[n.tag] ?? 0) + 1; });\n return counts;\n}\n\nexport function validateRoot(root: DocRoot): string[] {\n const errors: string[] = [];\n if (root.tag !== 'root') errors.push('Root node must have tag \"root\"');\n if (!Array.isArray(root.kids)) errors.push('Root.kids must be an array');\n if (root.kids.length === 0) errors.push('Document has no sheets');\n\n walkNode(root, (n) => {\n if (n.tag === 'cell' && n.kids.length === 0) {\n errors.push('CellNode must have at least one ParaNode child');\n }\n if (n.tag === 'grid' && (n as GridNode).kids.length === 0) {\n errors.push('GridNode must have at least one RowNode');\n }\n });\n\n return errors;\n}\n"],"mappings":"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","names":["spanProps","pako","r","coreXml","extractDims","decodeHeaderFooter","toArr","decodePara","decodeGrid","decodeGridSimple","decodeGridFlat","decodeGridText","cellText","tableText","mimeToExt","registerImage","esc","encodeGrid","encodeRun","encodeImage","encodeContent","encodeGrid","encodePara","encodeImage"]}