@office-open/docx 0.10.3 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"parse-Dhuwrt2i.mjs","names":[],"sources":["../src/parts/alt-chunk/alt-chunk-parse.ts","../src/parts/custom-xml/custom-xml-parse.ts","../src/parts/sub-doc/sub-doc-parse.ts","../src/parts/textbox/textbox-parse.ts","../src/parse/body.ts","../src/parse.ts"],"sourcesContent":["/**\n * AltChunk parser for DOCX documents.\n *\n * Parses w:altChunk elements and extracts embedded content from the ZIP.\n *\n * @module\n */\nimport { attr } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport type { AltChunkOptions } from \"@parts/alt-chunk/alt-chunk\";\n\nimport type { DocxReadContext } from \"../../context\";\n\n/**\n * Parse a w:altChunk element into AltChunkOptions.\n * Reads the referenced data from the ZIP package.\n */\nexport function parseAltChunk(el: Element, ctx: DocxReadContext): AltChunkOptions {\n const rId = attr(el, \"r:id\");\n if (!rId) {\n throw new Error(\"w:altChunk missing r:id attribute\");\n }\n\n // Look up the path from relationships\n const path = ctx.docx.partRefs.afChunks.get(rId);\n if (!path) {\n throw new Error(`AltChunk relationship ${rId} not found`);\n }\n\n // Read raw data from ZIP\n const data = ctx.docx.doc.getRaw(path);\n if (!data) {\n throw new Error(`AltChunk data not found at ${path}`);\n }\n\n // Determine content type from extension\n const ext = path.split(\".\").pop() ?? \"txt\";\n let contentType: \"text/html\" | \"application/rtf\" | \"text/plain\";\n let extension: \"html\" | \"rtf\" | \"txt\";\n\n switch (ext) {\n case \"html\":\n contentType = \"text/html\";\n extension = \"html\";\n break;\n case \"rtf\":\n contentType = \"application/rtf\";\n extension = \"rtf\";\n break;\n default:\n contentType = \"text/plain\";\n extension = \"txt\";\n break;\n }\n\n return {\n data,\n contentType,\n extension,\n };\n}\n","/**\n * Parser for custom XML block elements (w:customXml).\n *\n * @module\n */\nimport { attr, findChild } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport type { SectionChild } from \"@shared/section\";\n\nimport type { DocxReadContext } from \"../../context\";\nimport { parseCustomXmlProperties } from \"../bodychildren\";\nimport type { CustomXmlBlockOptions } from \"./custom-xml\";\n\n/**\n * Parse w:customXml element into CustomXmlBlockOptions.\n *\n * Uses a callback for child parsing to avoid circular dependencies\n * (same pattern as parseTable).\n */\nexport function parseCustomXmlBlock(\n el: Element,\n ctx: DocxReadContext,\n parseChild: (el: Element, ctx: DocxReadContext) => SectionChild,\n): CustomXmlBlockOptions {\n const opts: Partial<CustomXmlBlockOptions> = {};\n\n // Required attribute\n const element = attr(el, \"w:element\");\n if (element) opts.element = element;\n\n // Optional URI\n const uri = attr(el, \"w:uri\");\n if (uri) opts.uri = uri;\n\n // Parse w:customXmlPr\n const xmlPr = findChild(el, \"w:customXmlPr\");\n if (xmlPr) {\n opts.customXmlPr = parseCustomXmlProperties(xmlPr);\n }\n\n // Parse block-level children\n const children: SectionChild[] = [];\n for (const child of el.elements ?? []) {\n if (child.name === \"w:customXmlPr\") continue;\n const parsed = parseChild(child, ctx);\n children.push(parsed);\n }\n if (children.length > 0) opts.children = children;\n\n return opts as CustomXmlBlockOptions;\n}\n","/**\n * SubDoc parser for DOCX documents.\n *\n * Parses w:subDoc elements and extracts embedded document data.\n *\n * @module\n */\nimport { attr } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport type { SubDocOptions } from \"@parts/sub-doc/sub-doc\";\n\nimport type { DocxReadContext } from \"../../context\";\n\n/**\n * Parse a w:subDoc element into SubDocOptions.\n * Reads the referenced document data from the ZIP package.\n */\nexport function parseSubDoc(el: Element, ctx: DocxReadContext): SubDocOptions {\n const rId = attr(el, \"r:id\");\n if (!rId) {\n throw new Error(\"w:subDoc missing r:id attribute\");\n }\n\n const path = ctx.docx.partRefs.subDocs.get(rId);\n if (!path) {\n throw new Error(`SubDoc relationship ${rId} not found`);\n }\n\n const data = ctx.docx.doc.getRaw(path);\n if (!data) {\n throw new Error(`SubDoc data not found at ${path}`);\n }\n\n return { data };\n}\n","/**\n * Textbox parser for DOCX documents.\n *\n * Parses w:pict → v:shape → v:textbox → w:txbxContent elements.\n *\n * @module\n */\nimport { attr, findChild, findFirst } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\n\nimport type { DocxReadContext } from \"../../context\";\n\n/**\n * Parse VML shape style string into VmlShapeStyle-like object.\n */\nfunction parseVmlStyle(styleStr: string): Record<string, string> {\n const style: Record<string, string> = {};\n for (const part of styleStr.split(\";\")) {\n const [key, val] = part.split(\":\").map((s) => s.trim());\n if (key && val) style[key] = val;\n }\n return style;\n}\n\n/**\n * Parse a w:pict element that contains a textbox.\n * Returns an object suitable for the { textbox: ... } SectionChild variant.\n */\nexport function parseTextbox(\n el: Element,\n ctx: DocxReadContext,\n parseChildren: (elements: Element[], ctx: DocxReadContext) => unknown[],\n): {\n style?: Record<string, string>;\n children?: unknown[];\n} {\n const shape = findFirst(el, \"v:shape\");\n if (!shape) return {};\n\n const opts: Record<string, unknown> = {};\n\n // Parse VML style\n const styleAttr = attr(shape, \"style\");\n if (styleAttr) {\n opts.style = parseVmlStyle(styleAttr);\n }\n\n // Parse textbox content\n const textbox = findFirst(shape, \"v:textbox\");\n if (textbox) {\n const txbxContent = findChild(textbox, \"w:txbxContent\");\n if (txbxContent) {\n const childList = parseChildren(txbxContent.elements ?? [], ctx);\n if (childList.length > 0) opts.children = childList;\n }\n }\n\n return opts as { style?: Record<string, string>; children?: unknown[] };\n}\n","/**\n * Body parser for DOCX documents.\n *\n * Parses w:body → SectionOptions[] by splitting at w:sectPr boundaries.\n *\n * @module\n */\nimport { attr, findChild, findDeep, findFirst, textOf } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { parseAltChunk } from \"@parts/alt-chunk/alt-chunk-parse\";\nimport { parseCustomXmlBlock } from \"@parts/custom-xml/custom-xml-parse\";\nimport { parseSectionPropertiesEl } from \"@parts/document/body/section-properties/descriptor\";\nimport type { SectionPropertiesOptions } from \"@parts/document/body/section-properties/section-properties\";\nimport type { MarkupRangeOptions, BookmarkStartOptions } from \"@parts/paragraph/links/bookmark\";\nimport { parseSdtBlock } from \"@parts/sdt/sdt-parse\";\nimport { parseSubDoc } from \"@parts/sub-doc/sub-doc-parse\";\nimport { parseToc, parseTocFieldFromElements } from \"@parts/table-of-contents/toc-parse\";\nimport { tableDesc } from \"@parts/table/descriptor\";\nimport type { TableOptions } from \"@parts/table/table\";\nimport { parseTextbox } from \"@parts/textbox/textbox-parse\";\nimport type { SectionOptions } from \"@shared/section\";\nimport type { SectionChild } from \"@shared/section\";\n\nimport { parseParagraph } from \"../body\";\nimport { DocxReadContext } from \"../context\";\nimport { setBodyParseChild } from \"../parts\";\nimport { stringifyElement } from \"../util/stringify-element\";\n\n// ── Section properties parser ────────────────────────────────────────────────\n\n/** Internal parse result: section properties with extracted header/footer refs. */\ntype ParsedSectionProperties = SectionPropertiesOptions & {\n parsedHeaders?: Record<string, SectionChild[]>;\n parsedFooters?: Record<string, SectionChild[]>;\n};\n\n/**\n * Parse w:sectPr element into SectionPropertiesOptions.\n * Delegates to the section properties descriptor's parse method.\n */\nfunction parseSectionProperties(el: Element, ctx: DocxReadContext): ParsedSectionProperties {\n const opts: ParsedSectionProperties = parseSectionPropertiesEl(el);\n\n // Headers/footers - parse from references and store in a separate field\n const headerRefs: Record<string, SectionChild[]> = {};\n const footerRefs: Record<string, SectionChild[]> = {};\n\n for (const child of el.elements ?? []) {\n if (child.name === \"w:headerReference\") {\n const rId = attr(child, \"r:id\");\n const type = attr(child, \"w:type\");\n if (rId && type) {\n const headerChildren = parseHeaderFooterRef(rId, ctx);\n if (headerChildren) headerRefs[type] = headerChildren;\n }\n }\n if (child.name === \"w:footerReference\") {\n const rId = attr(child, \"r:id\");\n const type = attr(child, \"w:type\");\n if (rId && type) {\n const footerChildren = parseHeaderFooterRef(rId, ctx);\n if (footerChildren) footerRefs[type] = footerChildren;\n }\n }\n }\n\n if (Object.keys(headerRefs).length > 0) {\n opts.parsedHeaders = headerRefs;\n }\n if (Object.keys(footerRefs).length > 0) {\n opts.parsedFooters = footerRefs;\n }\n\n return opts;\n}\n\n/**\n * Parse a header/footer reference by following the relationship to its XML part.\n */\nfunction parseHeaderFooterRef(rId: string, ctx: DocxReadContext): SectionChild[] | undefined {\n const path = ctx.docx.partRefs.headers.get(rId) ?? ctx.docx.partRefs.footers.get(rId);\n if (!path) return undefined;\n\n const partEl = ctx.docx.doc.get(path);\n if (!partEl) return undefined;\n\n // The header/footer XML root element contains w:p, w:tbl, etc. Parse under\n // the part's own relationship scope so its drawings resolve images correctly.\n const children: SectionChild[] = [];\n ctx.withPart(path, () => {\n for (const child of partEl.elements ?? []) {\n const sectionChild = parseSectionChild(child, ctx);\n if (sectionChild !== undefined) {\n children.push(sectionChild);\n }\n }\n });\n\n return children.length > 0 ? children : undefined;\n}\n\n// ── Section child dispatch ───────────────────────────────────────────────────\n\n/**\n * Parse a single body child element into a SectionChild.\n */\nexport function parseSectionChild(el: Element, ctx: DocxReadContext): SectionChild {\n switch (el.name) {\n case \"w:p\": {\n // Check for textbox (w:pict containing v:textbox)\n const pict = findChild(el, \"w:pict\");\n if (pict) {\n const textbox = findFirst(pict, \"v:textbox\");\n if (textbox) {\n const textboxOpts = parseTextbox(pict, ctx, parseSectionChildrenElements);\n return { textbox: textboxOpts as SectionChild extends { textbox: infer T } ? T : never };\n }\n }\n\n return { paragraph: parseParagraph(el, ctx) };\n }\n case \"w:tbl\":\n return { table: tableDesc.parse(el, ctx) as TableOptions };\n case \"w:sdt\": {\n // Try TOC first\n const tocResult = parseToc(el, ctx);\n if (tocResult) {\n return { toc: tocResult };\n }\n // Otherwise parse as generic SDT block\n const sdtResult = parseSdtBlock(el, ctx, parseSectionChildrenElements);\n return {\n sdt: {\n properties: sdtResult.properties,\n children: sdtResult.children as SectionChild[] | undefined,\n },\n };\n }\n case \"w:altChunk\":\n return { altChunk: parseAltChunk(el, ctx) };\n case \"w:subDoc\":\n return { subDoc: parseSubDoc(el, ctx) };\n case \"w:customXml\":\n return { customXml: parseCustomXmlBlock(el, ctx, parseSectionChild) };\n case \"w:bookmarkStart\": {\n // Body-level range markers sitting between paragraphs (e.g. _Toc bookmark\n // ends grouped after a heading). Carry them as first-class children so\n // they round-trip even though they are not wrapped in a paragraph.\n const idRaw = attr(el, \"w:id\");\n const name = attr(el, \"w:name\");\n if (idRaw !== undefined && name) {\n const bookmarkStart: Partial<BookmarkStartOptions> = { id: Number(idRaw), name };\n const disp = attr(el, \"w:displacedByCustomXml\");\n if (disp === \"before\" || disp === \"after\") bookmarkStart.displacedByCustomXml = disp;\n const colFirstRaw = attr(el, \"w:colFirst\");\n if (colFirstRaw !== undefined) bookmarkStart.colFirst = Number(colFirstRaw);\n const colLastRaw = attr(el, \"w:colLast\");\n if (colLastRaw !== undefined) bookmarkStart.colLast = Number(colLastRaw);\n return { bookmarkStart: bookmarkStart as BookmarkStartOptions };\n }\n return { rawXml: stringifyElement(el) };\n }\n case \"w:bookmarkEnd\": {\n const idRaw = attr(el, \"w:id\");\n if (idRaw !== undefined) {\n const bookmarkEnd: Partial<MarkupRangeOptions> = { id: Number(idRaw) };\n const disp = attr(el, \"w:displacedByCustomXml\");\n if (disp === \"before\" || disp === \"after\") bookmarkEnd.displacedByCustomXml = disp;\n return { bookmarkEnd: bookmarkEnd as MarkupRangeOptions };\n }\n return { rawXml: stringifyElement(el) };\n }\n default:\n return { rawXml: stringifyElement(el) };\n }\n}\n\n// ── Body parsing with section splitting ───────────────────────────────────────\n\n/**\n * Parse w:body element into SectionOptions[].\n *\n * Splits body content at w:sectPr boundaries to create sections.\n * The last w:sectPr (child of w:body directly) defines the last section.\n * Previous w:sectPr elements appear inside w:pPr elements.\n */\nexport function parseBody(body: Element, ctx: DocxReadContext): SectionOptions[] {\n // Register the body child parser for descriptor parse callbacks\n setBodyParseChild(parseSectionChild);\n\n // Collect body children and detect section breaks\n interface SectionBoundary {\n index: number;\n sectPr: Element;\n }\n\n const bodyChildren: Element[] = [];\n const boundaries: SectionBoundary[] = [];\n\n for (const child of body.elements ?? []) {\n if (child.name === \"w:sectPr\") {\n // Final section properties (last section)\n boundaries.push({ index: bodyChildren.length, sectPr: child });\n } else {\n bodyChildren.push(child);\n\n // Check for inline sectPr in paragraph properties\n if (child.name === \"w:p\") {\n const pPr = findChild(child, \"w:pPr\");\n if (pPr) {\n const sectPr = findChild(pPr, \"w:sectPr\");\n if (sectPr) {\n boundaries.push({ index: bodyChildren.length, sectPr });\n }\n }\n }\n }\n }\n\n // If no boundaries, the whole body is one section\n if (boundaries.length === 0) {\n return [\n {\n children: parseBodyChildren(bodyChildren, ctx),\n },\n ];\n }\n\n // Split into sections\n const sections: SectionOptions[] = [];\n let start = 0;\n\n for (let i = 0; i < boundaries.length; i++) {\n const boundary = boundaries[i];\n // For inline sectPr (inside w:pPr), the containing paragraph was pushed to\n // bodyChildren. Exclude it — it's a section break marker, not content.\n // The last boundary uses a body-level sectPr, so no paragraph to exclude.\n const isInlineSectPr = i < boundaries.length - 1;\n const endIdx = isInlineSectPr ? Math.max(start, boundary.index - 1) : boundary.index;\n const sectionElements = bodyChildren.slice(start, endIdx);\n const parsedProps = parseSectionProperties(boundary.sectPr, ctx);\n\n // Extract headers/footers that were stored as parsedHeaders/parsedFooters\n const { parsedHeaders, parsedFooters } = parsedProps;\n\n // Build clean properties without internal fields\n const cleanProps = { ...parsedProps };\n delete cleanProps.parsedHeaders;\n delete cleanProps.parsedFooters;\n\n const section = {\n children: parseBodyChildren(sectionElements, ctx),\n properties: cleanProps,\n ...(parsedHeaders ? { headers: parsedHeaders } : {}),\n ...(parsedFooters ? { footers: parsedFooters } : {}),\n } as SectionOptions;\n\n sections.push(section);\n start = boundary.index;\n }\n\n // If there are elements after the last boundary, they form the last section\n // with the body-level w:sectPr (already captured)\n // Actually the body-level sectPr IS the last boundary\n\n return sections;\n}\n\n// ── Cross-paragraph TOC field aggregation ───────────────────────────────────\n\n/**\n * Net field-nesting change across all descendant fldChar markers\n * (begin: +1, end: -1). Balances cross-paragraph field boundaries without a\n * stack — the running depth hits 0 exactly when the outermost field closes.\n */\nfunction countFieldDelta(el: Element): number {\n let delta = 0;\n const walk = (node: Element): void => {\n if (node.name === \"w:fldChar\") {\n const type = attr(node, \"w:fldCharType\");\n if (type === \"begin\") delta += 1;\n else if (type === \"end\") delta -= 1;\n }\n for (const c of node.elements ?? []) {\n if (c.type === \"element\") walk(c);\n }\n };\n walk(el);\n return delta;\n}\n\n/**\n * True when a w:p opens a bare TOC complex field: it carries a fldChar begin\n * whose instrText starts with \"TOC\". Such fields span multiple paragraphs and\n * defeat the per-paragraph field accumulator, so they are aggregated as rawXml.\n */\nfunction isTocFieldBegin(el: Element): boolean {\n if (el.name !== \"w:p\") return false;\n let hasBegin = false;\n let instr = \"\";\n const walk = (node: Element): void => {\n if (node.name === \"w:fldChar\" && attr(node, \"w:fldCharType\") === \"begin\") hasBegin = true;\n if (node.name === \"w:instrText\") instr += textOf(node);\n for (const c of node.elements ?? []) {\n if (c.type === \"element\") walk(c);\n }\n };\n walk(el);\n return hasBegin && instr.trim().toUpperCase().startsWith(\"TOC\");\n}\n\n/**\n * Parse a run of body-level elements into SectionChild[], aggregating any\n * cross-paragraph TOC complex field into a single rawXml child so its nested\n * HYPERLINK/PAGEREF fields and bookmark markers round-trip intact.\n */\nfunction parseBodyChildren(elements: Element[], ctx: DocxReadContext): SectionChild[] {\n const children: SectionChild[] = [];\n let tocBuffer: Element[] | null = null;\n let tocDepth = 0;\n\n const flushToc = (): void => {\n if (!tocBuffer) return;\n children.push(buildTocChild(tocBuffer));\n // The TOC field's closing paragraph often also carries a trailing page\n // break (the section break before the first heading). buildTocChild\n // discards the rendered result, so rescue that page break as a standalone\n // child to avoid silently dropping it on round-trip.\n const lastEl = tocBuffer[tocBuffer.length - 1];\n const pageBreakCount = findDeep(lastEl, \"w:br\").filter(\n (b) => attr(b, \"w:type\") === \"page\",\n ).length;\n for (let i = 0; i < pageBreakCount; i++) {\n children.push({ paragraph: { children: [{ pageBreak: true }] } });\n }\n tocBuffer = null;\n tocDepth = 0;\n };\n\n for (const el of elements) {\n if (tocBuffer !== null) {\n tocBuffer.push(el);\n tocDepth += countFieldDelta(el);\n if (tocDepth <= 0) flushToc();\n continue;\n }\n if (isTocFieldBegin(el)) {\n tocBuffer = [el];\n tocDepth = countFieldDelta(el);\n if (tocDepth <= 0) flushToc();\n continue;\n }\n children.push(parseSectionChild(el, ctx));\n }\n\n // Unclosed TOC field at end of content — flush what we have (best effort).\n flushToc();\n\n return children;\n}\n\n/**\n * Build a structured TOC SectionChild from a captured bare TOC field. Extracts\n * the field instruction (switches → TableOfContentsOptions) and discards the\n * rendered result (separate→end content) — Word regenerates it from headings on\n * open via the dirty flag emitted by stringifyTableOfContents.\n */\nfunction buildTocChild(els: Element[]): SectionChild {\n return { toc: parseTocFieldFromElements(els) };\n}\n\n/**\n * Parse a list of elements into SectionChild[].\n * Used by SDT and textbox parsers for their content.\n */\nfunction parseSectionChildrenElements(elements: Element[], ctx: DocxReadContext): SectionChild[] {\n return parseBodyChildren(elements, ctx);\n}\n","import type { ParsedArchive } from \"@office-open/core\";\nimport { parseArchive } from \"@office-open/core\";\nimport type { DataType } from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport { attr } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { appPropertiesDesc } from \"@parts/app-properties\";\nimport { bibliographyDesc } from \"@parts/bibliography\";\nimport { setBodyParseChild } from \"@parts/bodychildren\";\nimport { commentsDesc } from \"@parts/comments\";\nimport { contentTypesDesc } from \"@parts/contenttypes\";\nimport { corePropertiesDesc } from \"@parts/core-properties\";\nimport type { DocumentOptions } from \"@parts/core-properties\";\nimport { customPropertiesDesc } from \"@parts/custom-properties\";\nimport { endnotesDesc } from \"@parts/endnotes/descriptor\";\nimport { fontTableDesc } from \"@parts/fonts/descriptor\";\nimport type { EmbeddedFontOptionsWithKey } from \"@parts/fonts/font-wrapper\";\nimport { footnotesDesc } from \"@parts/footnotes/descriptor\";\nimport { glossaryDesc } from \"@parts/glossary-document\";\nimport { parseNumberingDefinitions } from \"@parts/numbering/numbering\";\nimport { settingsDesc } from \"@parts/settings/descriptor\";\nimport { buildStyleCache, buildNumberingCache, parseStyleDefinitions } from \"@parts/styles/styles\";\nimport { setTableParseChild } from \"@parts/table/descriptor\";\nimport { webSettingsDesc } from \"@parts/web-settings\";\n\nimport { parseParagraphProperties } from \"./body\";\nimport { DocxReadContext } from \"./context\";\nimport { parseBody, parseSectionChild } from \"./parse/body\";\nimport { replaceRelsWithPlaceholders } from \"./util/replace-media-placeholders\";\nimport { stringifyElement } from \"./util/stringify-element\";\n\nexport { parseArchive };\n\n/**\n * All part paths extracted from the DOCX package.\n * Field names correspond directly to the OOXML directory structure.\n */\nexport interface DocxPartRefs {\n /** word/headerN.xml keyed by rId */\n headers: Map<string, string>;\n /** word/footerN.xml keyed by rId */\n footers: Map<string, string>;\n /** word/footnotes.xml */\n footnotes?: string;\n /** word/endnotes.xml */\n endnotes?: string;\n /** word/comments.xml */\n comments?: string;\n /** Hyperlink targets keyed by rId (external URLs) */\n hyperlinks: Map<string, string>;\n /** word/charts/chartN.xml keyed by rId */\n charts: Map<string, string>;\n /** word/diagrams/dataN.xml keyed by rId */\n diagramData: Map<string, string>;\n /** word/media/* keyed by rId (from document.xml.rels) */\n media: Map<string, string>;\n /**\n * Per-part image/media relationships. Each part (document, headers, footers,\n * footnotes, …) has its own .rels with independent rId numbering, so drawings\n * inside a part must resolve images against that part's rels. Maps\n * partPath → (rId → mediaPath).\n */\n partMedia: Map<string, Map<string, string>>;\n /** Alternative format chunks (word/afchunkN.*) keyed by rId */\n afChunks: Map<string, string>;\n /** Sub-documents (word/subdocs/subdocN.docx) keyed by rId */\n subDocs: Map<string, string>;\n /** word/bibliography.xml */\n bibliography?: string;\n /** word/glossary/document.xml */\n glossary?: string;\n}\n\nexport interface DocxDocument {\n doc: ParsedArchive;\n /** word/document.xml → root w:document element */\n documentRoot: Element;\n /** word/document.xml → w:body element */\n body: Element;\n /** word/document.xml → w:background element */\n background?: Element;\n /** word/styles.xml */\n styles?: Element;\n /** word/numbering.xml */\n numbering?: Element;\n /** word/settings.xml */\n settings?: Element;\n /** word/fontTable.xml */\n fontTable?: Element;\n /** word/webSettings.xml */\n webSettings?: Element;\n partRefs: DocxPartRefs;\n /** docProps/core.xml */\n coreProps?: string;\n /** docProps/app.xml */\n appProps?: string;\n /** docProps/custom.xml */\n customProps?: string;\n /** [Content_Types].xml */\n contentTypes?: Element;\n}\n\nfunction resolveRelsPath(target: string): string {\n if (target.startsWith(\"/\")) return target.slice(1);\n if (target.startsWith(\"../\")) return target.replace(\"../\", \"\");\n return `word/${target}`;\n}\n\n/**\n * Resolve each embedded font's .odttf bytes through fontTable.xml.rels.\n * Reads the binary verbatim and flags it raw so the compiler copies it as-is\n * instead of re-obfuscating (the fontKey already matches the bytes).\n */\nfunction resolveEmbeddedFontData(fonts: EmbeddedFontOptionsWithKey[], doc: ParsedArchive): void {\n const relsEl = doc.get(\"word/_rels/fontTable.xml.rels\");\n if (!relsEl) return;\n const ridToPath = new Map<string, string>();\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n if (!type.includes(\"/font\")) continue;\n const id = attr(child, \"Id\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (id && target) ridToPath.set(id, resolveRelsPath(target));\n }\n for (const font of fonts) {\n if (!font.embedRid) continue;\n const odttfPath = ridToPath.get(font.embedRid);\n if (!odttfPath) continue;\n const bytes = doc.getRaw(odttfPath);\n if (bytes) {\n font.data = Buffer.from(bytes);\n font.rawOdttf = true;\n font.odttfPath = odttfPath;\n }\n }\n}\n\nfunction parseDocPartRefs(doc: ParsedArchive): DocxPartRefs {\n const refs: DocxPartRefs = {\n headers: new Map(),\n footers: new Map(),\n hyperlinks: new Map(),\n charts: new Map(),\n diagramData: new Map(),\n media: new Map(),\n partMedia: new Map(),\n afChunks: new Map(),\n subDocs: new Map(),\n };\n\n const relsEl = doc.get(\"word/_rels/document.xml.rels\");\n if (!relsEl) return refs;\n\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n const id = attr(child, \"Id\") ?? \"\";\n if (!target) continue;\n\n const path = resolveRelsPath(target);\n\n if (type.includes(\"/header\")) {\n refs.headers.set(id, path);\n } else if (type.includes(\"/footer\")) {\n refs.footers.set(id, path);\n } else if (type.includes(\"/footnotes\")) {\n refs.footnotes = path;\n } else if (type.includes(\"/endnotes\")) {\n refs.endnotes = path;\n } else if (type.includes(\"/comments\")) {\n refs.comments = path;\n } else if (type.includes(\"/chart\")) {\n refs.charts.set(id, path);\n } else if (type.includes(\"/diagramData\")) {\n refs.diagramData.set(id, path);\n } else if (type.includes(\"/image\") || type.includes(\"/media\")) {\n refs.media.set(id, path);\n } else if (type.includes(\"/aFChunk\")) {\n refs.afChunks.set(id, path);\n } else if (type.includes(\"/subDocument\")) {\n refs.subDocs.set(id, path);\n } else if (type.includes(\"/bibliography\")) {\n refs.bibliography = path;\n } else if (type.includes(\"/glossaryDocument\")) {\n refs.glossary = path;\n } else if (type.includes(\"/hyperlink\")) {\n refs.hyperlinks.set(id, target);\n }\n }\n\n // Per-part image relationships. Each part carries its own .rels with\n // independent rId numbering (document rId1 ≠ header rId1), so collect them\n // keyed by part path; drawings inside a part resolve images through its\n // own rels. Covers document, headers, footers, footnotes, endnotes, comments.\n for (const relsPath of doc.keys(\"word/_rels/\")) {\n if (!relsPath.endsWith(\".rels\")) continue;\n const relsEl = doc.get(relsPath);\n if (!relsEl) continue;\n const partPath = \"word/\" + relsPath.slice(\"word/_rels/\".length, -\".rels\".length);\n for (const rel of relsEl.elements ?? []) {\n if (rel.name !== \"Relationship\") continue;\n const type = attr(rel, \"Type\") ?? \"\";\n if (!type.includes(\"/image\") && !type.includes(\"/media\")) continue;\n const id = attr(rel, \"Id\") ?? \"\";\n const target = attr(rel, \"Target\") ?? \"\";\n if (!id || !target) continue;\n let partMap = refs.partMedia.get(partPath);\n if (!partMap) {\n partMap = new Map();\n refs.partMedia.set(partPath, partMap);\n }\n partMap.set(id, resolveRelsPath(target));\n }\n }\n\n return refs;\n}\n\nfunction parseRootRels(doc: ParsedArchive): {\n coreProps?: string;\n appProps?: string;\n customProps?: string;\n} {\n const relsEl = doc.get(\"_rels/.rels\");\n if (!relsEl) return {};\n\n let coreProps: string | undefined;\n let appProps: string | undefined;\n let customProps: string | undefined;\n\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n const path = target.startsWith(\"/\") ? target.slice(1) : target;\n\n if (type.includes(\"/core-properties\")) {\n coreProps = path;\n } else if (type.includes(\"/extended-properties\")) {\n appProps = path;\n } else if (type.includes(\"/custom-properties\")) {\n customProps = path;\n }\n }\n\n return { coreProps, appProps, customProps };\n}\n\n/**\n * Parse a .docx file and convert it into DocumentOptions.\n *\n * This is the main public API for parsing DOCX files.\n * The returned options can be passed directly to `new Document(parsed)`\n * to recreate the document.\n *\n * @param data - Raw bytes of a .docx file\n * @returns Document options including sections and metadata\n */\nexport function parseDocument(data: DataType): DocumentOptions {\n const docx = parseDocx(data);\n const ctx = new DocxReadContext(\n docx,\n buildStyleCache(docx.styles),\n buildNumberingCache(docx.numbering),\n );\n\n // Register the child parser for table and body child descriptors\n setTableParseChild(parseSectionChild);\n setBodyParseChild(parseSectionChild);\n\n const sections = parseBody(docx.body, ctx);\n\n const opts: Partial<DocumentOptions> = { sections };\n\n // Document conformance class (w:document/@w:conformance)\n const conformance = attr(docx.documentRoot, \"w:conformance\");\n if (conformance === \"strict\" || conformance === \"transitional\") opts.conformance = conformance;\n\n // Background (w:background in document.xml)\n if (docx.background) {\n const hasChildren = (docx.background.elements ?? []).some((e) => e.type === \"element\");\n if (hasChildren) {\n // VML/structured background (e.g. v:background/v:fill pattern with a\n // texture image) that doesn't fit the color/theme model: carry the\n // element verbatim, rewriting relationship refs to {fileName} placeholders\n // so the media round-trips via the compiler's placeholder pass.\n const { rawXml, rawMedia } = replaceRelsWithPlaceholders(\n stringifyElement(docx.background),\n ctx,\n \"background\",\n );\n opts.background = rawMedia.length > 0 ? { rawXml, rawMedia } : { rawXml };\n } else {\n const bg: NonNullable<DocumentOptions[\"background\"]> = {};\n const color = attr(docx.background, \"w:color\");\n if (color) bg.color = color;\n const themeColor = attr(docx.background, \"w:themeColor\");\n if (themeColor) bg.themeColor = themeColor;\n const themeShade = attr(docx.background, \"w:themeShade\");\n if (themeShade) bg.themeShade = themeShade;\n const themeTint = attr(docx.background, \"w:themeTint\");\n if (themeTint) bg.themeTint = themeTint;\n if (Object.keys(bg).length > 0) opts.background = bg;\n }\n }\n\n // Core properties\n if (docx.coreProps) {\n const corePropsEl = docx.doc.get(docx.coreProps);\n if (corePropsEl) {\n const cp = corePropertiesDesc.parse(corePropsEl, ctx);\n if (cp.title) opts.title = cp.title;\n if (cp.subject) opts.subject = cp.subject;\n if (cp.creator) opts.creator = cp.creator;\n if (cp.keywords) opts.keywords = cp.keywords;\n if (cp.description) opts.description = cp.description;\n if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n if (cp.revision) opts.revision = cp.revision;\n if (cp.lastPrinted) opts.lastPrinted = cp.lastPrinted;\n if (cp.created) opts.created = cp.created;\n if (cp.modified) opts.modified = cp.modified;\n }\n }\n\n // App (extended) properties\n if (docx.appProps) {\n const appPropsEl = docx.doc.get(docx.appProps);\n if (appPropsEl) {\n const ap = appPropertiesDesc.parse(appPropsEl, ctx);\n if (Object.keys(ap).length > 0) opts.appProperties = ap;\n }\n }\n\n // Settings — parse produces a structured SettingsOptions aligned with\n // generate (no verbatim rawXml fallback). Assign wholesale so context.ts\n // spreads it into _settingsOptions for the descriptor's stringify input.\n if (docx.settings) {\n opts.settings = settingsDesc.parse(docx.settings, ctx);\n }\n\n // Web settings\n if (docx.webSettings) {\n const wsOpts = webSettingsDesc.parse(docx.webSettings, ctx);\n if (Object.keys(wsOpts).length > 0) opts.webSettings = wsOpts;\n }\n\n // Custom properties\n if (docx.customProps) {\n const customPropsEl = docx.doc.get(docx.customProps);\n if (customPropsEl) {\n const cpResult = customPropertiesDesc.parse(customPropsEl, ctx);\n if (cpResult.properties && cpResult.properties.length > 0) {\n opts.customProperties = cpResult.properties;\n }\n }\n }\n\n // Comments content\n if (docx.partRefs.comments) {\n const commentsEl = docx.doc.get(docx.partRefs.comments);\n if (commentsEl) {\n const commentsResult = ctx.withPart(docx.partRefs.comments, () =>\n commentsDesc.parse(commentsEl, ctx),\n );\n const children = commentsResult.children;\n if (children && children.length > 0) {\n opts.comments = { children } as unknown as DocumentOptions[\"comments\"];\n }\n }\n }\n\n // Footnotes content\n if (docx.partRefs.footnotes) {\n const footnotesEl = docx.doc.get(docx.partRefs.footnotes);\n if (footnotesEl) {\n const fnResult = ctx.withPart(docx.partRefs.footnotes, () =>\n footnotesDesc.parse(footnotesEl, ctx),\n );\n const footnotesMap: Record<string, { children: unknown[] }> = {};\n for (const [id, paragraphs] of fnResult.notes) {\n footnotesMap[String(id)] = { children: paragraphs };\n }\n // Preserve round-tripped separators so the generated ids stay consistent\n // with settings.footnotePr (which references them).\n if (\n Object.keys(footnotesMap).length > 0 ||\n fnResult.separator ||\n fnResult.continuationSeparator\n ) {\n const fnOpts = footnotesMap as NonNullable<DocumentOptions[\"footnotes\"]>;\n if (fnResult.separator) fnOpts.separator = fnResult.separator;\n if (fnResult.continuationSeparator)\n fnOpts.continuationSeparator = fnResult.continuationSeparator;\n opts.footnotes = fnOpts;\n }\n }\n }\n\n // Endnotes content\n if (docx.partRefs.endnotes) {\n const endnotesEl = docx.doc.get(docx.partRefs.endnotes);\n if (endnotesEl) {\n const enResult = ctx.withPart(docx.partRefs.endnotes, () =>\n endnotesDesc.parse(endnotesEl, ctx),\n );\n const endnotesMap: Record<string, { children: unknown[] }> = {};\n for (const [id, paragraphs] of enResult.notes) {\n endnotesMap[String(id)] = { children: paragraphs };\n }\n if (\n Object.keys(endnotesMap).length > 0 ||\n enResult.separator ||\n enResult.continuationSeparator\n ) {\n const enOpts = endnotesMap as NonNullable<DocumentOptions[\"endnotes\"]>;\n if (enResult.separator) enOpts.separator = enResult.separator;\n if (enResult.continuationSeparator)\n enOpts.continuationSeparator = enResult.continuationSeparator;\n opts.endnotes = enOpts;\n }\n }\n }\n\n // Styles definitions\n if (docx.styles) {\n const styleOpts = parseStyleDefinitions(docx.styles, parseParagraphProperties, ctx);\n if (styleOpts) opts.styles = styleOpts;\n }\n\n // Numbering definitions\n if (docx.numbering) {\n const numOpts = parseNumberingDefinitions(docx.numbering, parseParagraphProperties, ctx);\n if (numOpts) opts.numbering = numOpts;\n }\n\n // Font table\n if (docx.fontTable) {\n const ftResult = fontTableDesc.parse(docx.fontTable, ctx);\n if (ftResult.fonts && ftResult.fonts.length > 0) {\n resolveEmbeddedFontData(ftResult.fonts, docx.doc);\n opts.fonts = ftResult.fonts;\n }\n }\n\n // Bibliography\n if (docx.partRefs.bibliography) {\n const bibEl = docx.doc.get(docx.partRefs.bibliography);\n if (bibEl) {\n const bibResult = bibliographyDesc.parse(bibEl, ctx);\n if (bibResult.sources && bibResult.sources.length > 0) opts.bibliography = bibResult;\n }\n }\n\n // Glossary document\n if (docx.partRefs.glossary) {\n const glossaryEl = docx.doc.get(docx.partRefs.glossary);\n if (glossaryEl) {\n const glossaryResult = ctx.withPart(docx.partRefs.glossary, () =>\n glossaryDesc.parse(glossaryEl, ctx),\n );\n if (glossaryResult.parts && glossaryResult.parts.length > 0) opts.glossary = glossaryResult;\n }\n }\n\n // Content types\n if (docx.contentTypes) {\n const ctResult = contentTypesDesc.parse(docx.contentTypes, ctx);\n if (ctResult) opts.contentTypes = ctResult;\n }\n\n // Raw passthrough: parts generate() doesn't rebuild (word/theme/*, customXml/*).\n // Carried verbatim so their [Content_Types] declarations stay valid and the\n // package opens in Word. (Media/fonts/headers/etc. are rebuilt by the compiler\n // and must NOT be passed through — they'd otherwise duplicate under renamed paths.)\n const rawParts: { path: string; data: Uint8Array }[] = [];\n for (const prefix of [\"word/theme/\", \"customXml/\"]) {\n for (const p of docx.doc.keys(prefix)) {\n if (p.endsWith(\"/\")) continue;\n const data = docx.doc.getRaw(p);\n if (data) rawParts.push({ path: p, data });\n }\n }\n if (rawParts.length > 0) opts.rawParts = rawParts;\n\n return opts as DocumentOptions;\n}\n\nexport function parseDocx(data: DataType): DocxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const documentEl = doc.get(\"word/document.xml\");\n if (!documentEl) throw new Error(\"word/document.xml not found\");\n const body = documentEl.elements?.find((e) => e.name === \"w:body\");\n if (!body) throw new Error(\"w:body not found in word/document.xml\");\n const background = documentEl.elements?.find((e) => e.name === \"w:background\");\n\n const styles = doc.get(\"word/styles.xml\");\n const numbering = doc.get(\"word/numbering.xml\");\n const settings = doc.get(\"word/settings.xml\");\n const fontTable = doc.get(\"word/fontTable.xml\");\n const webSettings = doc.get(\"word/webSettings.xml\");\n\n const partRefs = parseDocPartRefs(doc);\n const { coreProps, appProps, customProps } = parseRootRels(doc);\n\n const contentTypes = doc.get(\"[Content_Types].xml\");\n\n return {\n doc,\n documentRoot: documentEl,\n body,\n background,\n styles,\n numbering,\n settings,\n fontTable,\n webSettings,\n partRefs,\n coreProps,\n appProps,\n customProps,\n contentTypes,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"parse-D6c9kHXh.mjs","names":[],"sources":["../src/parts/alt-chunk/alt-chunk-parse.ts","../src/parts/custom-xml/custom-xml-parse.ts","../src/parts/sub-doc/sub-doc-parse.ts","../src/parts/textbox/textbox-parse.ts","../src/parse/body.ts","../src/parse.ts"],"sourcesContent":["/**\n * AltChunk parser for DOCX documents.\n *\n * Parses w:altChunk elements and extracts embedded content from the ZIP.\n *\n * @module\n */\nimport { attr } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport type { AltChunkOptions } from \"@parts/alt-chunk/alt-chunk\";\n\nimport type { DocxReadContext } from \"../../context\";\n\n/**\n * Parse a w:altChunk element into AltChunkOptions.\n * Reads the referenced data from the ZIP package.\n */\nexport function parseAltChunk(el: Element, ctx: DocxReadContext): AltChunkOptions {\n const rId = attr(el, \"r:id\");\n if (!rId) {\n throw new Error(\"w:altChunk missing r:id attribute\");\n }\n\n // Look up the path from relationships\n const path = ctx.docx.partRefs.afChunks.get(rId);\n if (!path) {\n throw new Error(`AltChunk relationship ${rId} not found`);\n }\n\n // Read raw data from ZIP\n const data = ctx.docx.doc.getRaw(path);\n if (!data) {\n throw new Error(`AltChunk data not found at ${path}`);\n }\n\n // Determine content type from extension\n const ext = path.split(\".\").pop() ?? \"txt\";\n let contentType: \"text/html\" | \"application/rtf\" | \"text/plain\";\n let extension: \"html\" | \"rtf\" | \"txt\";\n\n switch (ext) {\n case \"html\":\n contentType = \"text/html\";\n extension = \"html\";\n break;\n case \"rtf\":\n contentType = \"application/rtf\";\n extension = \"rtf\";\n break;\n default:\n contentType = \"text/plain\";\n extension = \"txt\";\n break;\n }\n\n return {\n data,\n contentType,\n extension,\n };\n}\n","/**\n * Parser for custom XML block elements (w:customXml).\n *\n * @module\n */\nimport { attr, findChild } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport type { SectionChild } from \"@shared/section\";\n\nimport type { DocxReadContext } from \"../../context\";\nimport { parseCustomXmlProperties } from \"../bodychildren\";\nimport type { CustomXmlBlockOptions } from \"./custom-xml\";\n\n/**\n * Parse w:customXml element into CustomXmlBlockOptions.\n *\n * Uses a callback for child parsing to avoid circular dependencies\n * (same pattern as parseTable).\n */\nexport function parseCustomXmlBlock(\n el: Element,\n ctx: DocxReadContext,\n parseChild: (el: Element, ctx: DocxReadContext) => SectionChild,\n): CustomXmlBlockOptions {\n const opts: Partial<CustomXmlBlockOptions> = {};\n\n // Required attribute\n const element = attr(el, \"w:element\");\n if (element) opts.element = element;\n\n // Optional URI\n const uri = attr(el, \"w:uri\");\n if (uri) opts.uri = uri;\n\n // Parse w:customXmlPr\n const xmlPr = findChild(el, \"w:customXmlPr\");\n if (xmlPr) {\n opts.customXmlPr = parseCustomXmlProperties(xmlPr);\n }\n\n // Parse block-level children\n const children: SectionChild[] = [];\n for (const child of el.elements ?? []) {\n if (child.name === \"w:customXmlPr\") continue;\n const parsed = parseChild(child, ctx);\n children.push(parsed);\n }\n if (children.length > 0) opts.children = children;\n\n return opts as CustomXmlBlockOptions;\n}\n","/**\n * SubDoc parser for DOCX documents.\n *\n * Parses w:subDoc elements and extracts embedded document data.\n *\n * @module\n */\nimport { attr } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport type { SubDocOptions } from \"@parts/sub-doc/sub-doc\";\n\nimport type { DocxReadContext } from \"../../context\";\n\n/**\n * Parse a w:subDoc element into SubDocOptions.\n * Reads the referenced document data from the ZIP package.\n */\nexport function parseSubDoc(el: Element, ctx: DocxReadContext): SubDocOptions {\n const rId = attr(el, \"r:id\");\n if (!rId) {\n throw new Error(\"w:subDoc missing r:id attribute\");\n }\n\n const path = ctx.docx.partRefs.subDocs.get(rId);\n if (!path) {\n throw new Error(`SubDoc relationship ${rId} not found`);\n }\n\n const data = ctx.docx.doc.getRaw(path);\n if (!data) {\n throw new Error(`SubDoc data not found at ${path}`);\n }\n\n return { data };\n}\n","/**\n * Textbox parser for DOCX documents.\n *\n * Parses w:pict → v:shape → v:textbox → w:txbxContent elements.\n *\n * @module\n */\nimport { attr, findChild, findFirst } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\n\nimport type { DocxReadContext } from \"../../context\";\n\n/**\n * Parse VML shape style string into VmlShapeStyle-like object.\n */\nfunction parseVmlStyle(styleStr: string): Record<string, string> {\n const style: Record<string, string> = {};\n for (const part of styleStr.split(\";\")) {\n const [key, val] = part.split(\":\").map((s) => s.trim());\n if (key && val) style[key] = val;\n }\n return style;\n}\n\n/**\n * Parse a w:pict element that contains a textbox.\n * Returns an object suitable for the { textbox: ... } SectionChild variant.\n */\nexport function parseTextbox(\n el: Element,\n ctx: DocxReadContext,\n parseChildren: (elements: Element[], ctx: DocxReadContext) => unknown[],\n): {\n style?: Record<string, string>;\n children?: unknown[];\n} {\n const shape = findFirst(el, \"v:shape\");\n if (!shape) return {};\n\n const opts: Record<string, unknown> = {};\n\n // Parse VML style\n const styleAttr = attr(shape, \"style\");\n if (styleAttr) {\n opts.style = parseVmlStyle(styleAttr);\n }\n\n // Parse textbox content\n const textbox = findFirst(shape, \"v:textbox\");\n if (textbox) {\n const txbxContent = findChild(textbox, \"w:txbxContent\");\n if (txbxContent) {\n const childList = parseChildren(txbxContent.elements ?? [], ctx);\n if (childList.length > 0) opts.children = childList;\n }\n }\n\n return opts as { style?: Record<string, string>; children?: unknown[] };\n}\n","/**\n * Body parser for DOCX documents.\n *\n * Parses w:body → SectionOptions[] by splitting at w:sectPr boundaries.\n *\n * @module\n */\nimport { attr, findChild, findDeep, findFirst, textOf } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { parseAltChunk } from \"@parts/alt-chunk/alt-chunk-parse\";\nimport { parseCustomXmlBlock } from \"@parts/custom-xml/custom-xml-parse\";\nimport { parseSectionPropertiesEl } from \"@parts/document/body/section-properties/descriptor\";\nimport type { SectionPropertiesOptions } from \"@parts/document/body/section-properties/section-properties\";\nimport type { MarkupRangeOptions, BookmarkStartOptions } from \"@parts/paragraph/links/bookmark\";\nimport { parseSdtBlock } from \"@parts/sdt/sdt-parse\";\nimport { parseSubDoc } from \"@parts/sub-doc/sub-doc-parse\";\nimport { parseToc, parseTocFieldFromElements } from \"@parts/table-of-contents/toc-parse\";\nimport { tableDesc } from \"@parts/table/descriptor\";\nimport type { TableOptions } from \"@parts/table/table\";\nimport { parseTextbox } from \"@parts/textbox/textbox-parse\";\nimport type { SectionOptions } from \"@shared/section\";\nimport type { SectionChild } from \"@shared/section\";\n\nimport { parseParagraph } from \"../body\";\nimport { DocxReadContext } from \"../context\";\nimport { setBodyParseChild } from \"../parts\";\nimport { stringifyElement } from \"../util/stringify-element\";\n\n// ── Section properties parser ────────────────────────────────────────────────\n\n/** Internal parse result: section properties with extracted header/footer refs. */\ntype ParsedSectionProperties = SectionPropertiesOptions & {\n parsedHeaders?: Record<string, SectionChild[]>;\n parsedFooters?: Record<string, SectionChild[]>;\n};\n\n/**\n * Parse w:sectPr element into SectionPropertiesOptions.\n * Delegates to the section properties descriptor's parse method.\n */\nfunction parseSectionProperties(el: Element, ctx: DocxReadContext): ParsedSectionProperties {\n const opts: ParsedSectionProperties = parseSectionPropertiesEl(el);\n\n // Headers/footers - parse from references and store in a separate field\n const headerRefs: Record<string, SectionChild[]> = {};\n const footerRefs: Record<string, SectionChild[]> = {};\n\n for (const child of el.elements ?? []) {\n if (child.name === \"w:headerReference\") {\n const rId = attr(child, \"r:id\");\n const type = attr(child, \"w:type\");\n if (rId && type) {\n const headerChildren = parseHeaderFooterRef(rId, ctx);\n if (headerChildren) headerRefs[type] = headerChildren;\n }\n }\n if (child.name === \"w:footerReference\") {\n const rId = attr(child, \"r:id\");\n const type = attr(child, \"w:type\");\n if (rId && type) {\n const footerChildren = parseHeaderFooterRef(rId, ctx);\n if (footerChildren) footerRefs[type] = footerChildren;\n }\n }\n }\n\n if (Object.keys(headerRefs).length > 0) {\n opts.parsedHeaders = headerRefs;\n }\n if (Object.keys(footerRefs).length > 0) {\n opts.parsedFooters = footerRefs;\n }\n\n return opts;\n}\n\n/**\n * Parse a header/footer reference by following the relationship to its XML part.\n */\nfunction parseHeaderFooterRef(rId: string, ctx: DocxReadContext): SectionChild[] | undefined {\n const path = ctx.docx.partRefs.headers.get(rId) ?? ctx.docx.partRefs.footers.get(rId);\n if (!path) return undefined;\n\n const partEl = ctx.docx.doc.get(path);\n if (!partEl) return undefined;\n\n // The header/footer XML root element contains w:p, w:tbl, etc. Parse under\n // the part's own relationship scope so its drawings resolve images correctly.\n const children: SectionChild[] = [];\n ctx.withPart(path, () => {\n for (const child of partEl.elements ?? []) {\n const sectionChild = parseSectionChild(child, ctx);\n if (sectionChild !== undefined) {\n children.push(sectionChild);\n }\n }\n });\n\n return children.length > 0 ? children : undefined;\n}\n\n// ── Section child dispatch ───────────────────────────────────────────────────\n\n/**\n * Parse a single body child element into a SectionChild.\n */\nexport function parseSectionChild(el: Element, ctx: DocxReadContext): SectionChild {\n switch (el.name) {\n case \"w:p\": {\n // Check for textbox (w:pict containing v:textbox)\n const pict = findChild(el, \"w:pict\");\n if (pict) {\n const textbox = findFirst(pict, \"v:textbox\");\n if (textbox) {\n const textboxOpts = parseTextbox(pict, ctx, parseSectionChildrenElements);\n return { textbox: textboxOpts as SectionChild extends { textbox: infer T } ? T : never };\n }\n }\n\n return { paragraph: parseParagraph(el, ctx) };\n }\n case \"w:tbl\":\n return { table: tableDesc.parse(el, ctx) as TableOptions };\n case \"w:sdt\": {\n // Try TOC first\n const tocResult = parseToc(el, ctx);\n if (tocResult) {\n return { toc: tocResult };\n }\n // Otherwise parse as generic SDT block\n const sdtResult = parseSdtBlock(el, ctx, parseSectionChildrenElements);\n return {\n sdt: {\n properties: sdtResult.properties,\n children: sdtResult.children as SectionChild[] | undefined,\n },\n };\n }\n case \"w:altChunk\":\n return { altChunk: parseAltChunk(el, ctx) };\n case \"w:subDoc\":\n return { subDoc: parseSubDoc(el, ctx) };\n case \"w:customXml\":\n return { customXml: parseCustomXmlBlock(el, ctx, parseSectionChild) };\n case \"w:bookmarkStart\": {\n // Body-level range markers sitting between paragraphs (e.g. _Toc bookmark\n // ends grouped after a heading). Carry them as first-class children so\n // they round-trip even though they are not wrapped in a paragraph.\n const idRaw = attr(el, \"w:id\");\n const name = attr(el, \"w:name\");\n if (idRaw !== undefined && name) {\n const bookmarkStart: Partial<BookmarkStartOptions> = { id: Number(idRaw), name };\n const disp = attr(el, \"w:displacedByCustomXml\");\n if (disp === \"before\" || disp === \"after\") bookmarkStart.displacedByCustomXml = disp;\n const colFirstRaw = attr(el, \"w:colFirst\");\n if (colFirstRaw !== undefined) bookmarkStart.colFirst = Number(colFirstRaw);\n const colLastRaw = attr(el, \"w:colLast\");\n if (colLastRaw !== undefined) bookmarkStart.colLast = Number(colLastRaw);\n return { bookmarkStart: bookmarkStart as BookmarkStartOptions };\n }\n return { rawXml: stringifyElement(el) };\n }\n case \"w:bookmarkEnd\": {\n const idRaw = attr(el, \"w:id\");\n if (idRaw !== undefined) {\n const bookmarkEnd: Partial<MarkupRangeOptions> = { id: Number(idRaw) };\n const disp = attr(el, \"w:displacedByCustomXml\");\n if (disp === \"before\" || disp === \"after\") bookmarkEnd.displacedByCustomXml = disp;\n return { bookmarkEnd: bookmarkEnd as MarkupRangeOptions };\n }\n return { rawXml: stringifyElement(el) };\n }\n default:\n return { rawXml: stringifyElement(el) };\n }\n}\n\n// ── Body parsing with section splitting ───────────────────────────────────────\n\n/**\n * Parse w:body element into SectionOptions[].\n *\n * Splits body content at w:sectPr boundaries to create sections.\n * The last w:sectPr (child of w:body directly) defines the last section.\n * Previous w:sectPr elements appear inside w:pPr elements.\n */\nexport function parseBody(body: Element, ctx: DocxReadContext): SectionOptions[] {\n // Register the body child parser for descriptor parse callbacks\n setBodyParseChild(parseSectionChild);\n\n // Collect body children and detect section breaks\n interface SectionBoundary {\n index: number;\n sectPr: Element;\n }\n\n const bodyChildren: Element[] = [];\n const boundaries: SectionBoundary[] = [];\n\n for (const child of body.elements ?? []) {\n if (child.name === \"w:sectPr\") {\n // Final section properties (last section)\n boundaries.push({ index: bodyChildren.length, sectPr: child });\n } else {\n bodyChildren.push(child);\n\n // Check for inline sectPr in paragraph properties\n if (child.name === \"w:p\") {\n const pPr = findChild(child, \"w:pPr\");\n if (pPr) {\n const sectPr = findChild(pPr, \"w:sectPr\");\n if (sectPr) {\n boundaries.push({ index: bodyChildren.length, sectPr });\n }\n }\n }\n }\n }\n\n // If no boundaries, the whole body is one section\n if (boundaries.length === 0) {\n return [\n {\n children: parseBodyChildren(bodyChildren, ctx),\n },\n ];\n }\n\n // Split into sections\n const sections: SectionOptions[] = [];\n let start = 0;\n\n for (let i = 0; i < boundaries.length; i++) {\n const boundary = boundaries[i];\n // For inline sectPr (inside w:pPr), the containing paragraph was pushed to\n // bodyChildren. Exclude it — it's a section break marker, not content.\n // The last boundary uses a body-level sectPr, so no paragraph to exclude.\n const isInlineSectPr = i < boundaries.length - 1;\n const endIdx = isInlineSectPr ? Math.max(start, boundary.index - 1) : boundary.index;\n const sectionElements = bodyChildren.slice(start, endIdx);\n const parsedProps = parseSectionProperties(boundary.sectPr, ctx);\n\n // Extract headers/footers that were stored as parsedHeaders/parsedFooters\n const { parsedHeaders, parsedFooters } = parsedProps;\n\n // Build clean properties without internal fields\n const cleanProps = { ...parsedProps };\n delete cleanProps.parsedHeaders;\n delete cleanProps.parsedFooters;\n\n const section = {\n children: parseBodyChildren(sectionElements, ctx),\n properties: cleanProps,\n ...(parsedHeaders ? { headers: parsedHeaders } : {}),\n ...(parsedFooters ? { footers: parsedFooters } : {}),\n } as SectionOptions;\n\n sections.push(section);\n start = boundary.index;\n }\n\n // If there are elements after the last boundary, they form the last section\n // with the body-level w:sectPr (already captured)\n // Actually the body-level sectPr IS the last boundary\n\n return sections;\n}\n\n// ── Cross-paragraph TOC field aggregation ───────────────────────────────────\n\n/**\n * Net field-nesting change across all descendant fldChar markers\n * (begin: +1, end: -1). Balances cross-paragraph field boundaries without a\n * stack — the running depth hits 0 exactly when the outermost field closes.\n */\nfunction countFieldDelta(el: Element): number {\n let delta = 0;\n const walk = (node: Element): void => {\n if (node.name === \"w:fldChar\") {\n const type = attr(node, \"w:fldCharType\");\n if (type === \"begin\") delta += 1;\n else if (type === \"end\") delta -= 1;\n }\n for (const c of node.elements ?? []) {\n if (c.type === \"element\") walk(c);\n }\n };\n walk(el);\n return delta;\n}\n\n/**\n * True when a w:p opens a bare TOC complex field: it carries a fldChar begin\n * whose instrText starts with \"TOC\". Such fields span multiple paragraphs and\n * defeat the per-paragraph field accumulator, so they are aggregated as rawXml.\n */\nfunction isTocFieldBegin(el: Element): boolean {\n if (el.name !== \"w:p\") return false;\n let hasBegin = false;\n let instr = \"\";\n const walk = (node: Element): void => {\n if (node.name === \"w:fldChar\" && attr(node, \"w:fldCharType\") === \"begin\") hasBegin = true;\n if (node.name === \"w:instrText\") instr += textOf(node);\n for (const c of node.elements ?? []) {\n if (c.type === \"element\") walk(c);\n }\n };\n walk(el);\n return hasBegin && instr.trim().toUpperCase().startsWith(\"TOC\");\n}\n\n/**\n * Parse a run of body-level elements into SectionChild[], aggregating any\n * cross-paragraph TOC complex field into a single rawXml child so its nested\n * HYPERLINK/PAGEREF fields and bookmark markers round-trip intact.\n */\nfunction parseBodyChildren(elements: Element[], ctx: DocxReadContext): SectionChild[] {\n const children: SectionChild[] = [];\n let tocBuffer: Element[] | null = null;\n let tocDepth = 0;\n\n const flushToc = (): void => {\n if (!tocBuffer) return;\n children.push(buildTocChild(tocBuffer));\n // The TOC field's closing paragraph often also carries a trailing page\n // break (the section break before the first heading). buildTocChild\n // discards the rendered result, so rescue that page break as a standalone\n // child to avoid silently dropping it on round-trip.\n const lastEl = tocBuffer[tocBuffer.length - 1];\n const pageBreakCount = findDeep(lastEl, \"w:br\").filter(\n (b) => attr(b, \"w:type\") === \"page\",\n ).length;\n for (let i = 0; i < pageBreakCount; i++) {\n children.push({ paragraph: { children: [{ pageBreak: true }] } });\n }\n tocBuffer = null;\n tocDepth = 0;\n };\n\n for (const el of elements) {\n if (tocBuffer !== null) {\n tocBuffer.push(el);\n tocDepth += countFieldDelta(el);\n if (tocDepth <= 0) flushToc();\n continue;\n }\n if (isTocFieldBegin(el)) {\n tocBuffer = [el];\n tocDepth = countFieldDelta(el);\n if (tocDepth <= 0) flushToc();\n continue;\n }\n children.push(parseSectionChild(el, ctx));\n }\n\n // Unclosed TOC field at end of content — flush what we have (best effort).\n flushToc();\n\n return children;\n}\n\n/**\n * Build a structured TOC SectionChild from a captured bare TOC field. Extracts\n * the field instruction (switches → TableOfContentsOptions) and discards the\n * rendered result (separate→end content) — Word regenerates it from headings on\n * open via the dirty flag emitted by stringifyTableOfContents.\n */\nfunction buildTocChild(els: Element[]): SectionChild {\n return { toc: parseTocFieldFromElements(els) };\n}\n\n/**\n * Parse a list of elements into SectionChild[].\n * Used by SDT and textbox parsers for their content.\n */\nfunction parseSectionChildrenElements(elements: Element[], ctx: DocxReadContext): SectionChild[] {\n return parseBodyChildren(elements, ctx);\n}\n","import type { ParsedArchive } from \"@office-open/core\";\nimport { parseArchive } from \"@office-open/core\";\nimport type { DataType } from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport { attr } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { appPropertiesDesc } from \"@parts/app-properties\";\nimport { bibliographyDesc } from \"@parts/bibliography\";\nimport { setBodyParseChild } from \"@parts/bodychildren\";\nimport { commentsDesc } from \"@parts/comments\";\nimport { contentTypesDesc } from \"@parts/contenttypes\";\nimport { corePropertiesDesc } from \"@parts/core-properties\";\nimport type { DocumentOptions } from \"@parts/core-properties\";\nimport { customPropertiesDesc } from \"@parts/custom-properties\";\nimport { endnotesDesc } from \"@parts/endnotes/descriptor\";\nimport { fontTableDesc } from \"@parts/fonts/descriptor\";\nimport type { EmbeddedFontOptionsWithKey } from \"@parts/fonts/font-wrapper\";\nimport { footnotesDesc } from \"@parts/footnotes/descriptor\";\nimport { glossaryDesc } from \"@parts/glossary-document\";\nimport { parseNumberingDefinitions } from \"@parts/numbering/numbering\";\nimport { settingsDesc } from \"@parts/settings/descriptor\";\nimport { buildStyleCache, buildNumberingCache, parseStyleDefinitions } from \"@parts/styles/styles\";\nimport { setTableParseChild } from \"@parts/table/descriptor\";\nimport { webSettingsDesc } from \"@parts/web-settings\";\n\nimport { parseParagraphProperties } from \"./body\";\nimport { DocxReadContext } from \"./context\";\nimport { parseBody, parseSectionChild } from \"./parse/body\";\nimport { replaceRelsWithPlaceholders } from \"./util/replace-media-placeholders\";\nimport { stringifyElement } from \"./util/stringify-element\";\n\nexport { parseArchive };\n\n/**\n * All part paths extracted from the DOCX package.\n * Field names correspond directly to the OOXML directory structure.\n */\nexport interface DocxPartRefs {\n /** word/headerN.xml keyed by rId */\n headers: Map<string, string>;\n /** word/footerN.xml keyed by rId */\n footers: Map<string, string>;\n /** word/footnotes.xml */\n footnotes?: string;\n /** word/endnotes.xml */\n endnotes?: string;\n /** word/comments.xml */\n comments?: string;\n /** Hyperlink targets keyed by rId (external URLs) */\n hyperlinks: Map<string, string>;\n /** word/charts/chartN.xml keyed by rId */\n charts: Map<string, string>;\n /** word/diagrams/dataN.xml keyed by rId */\n diagramData: Map<string, string>;\n /** word/media/* keyed by rId (from document.xml.rels) */\n media: Map<string, string>;\n /**\n * Per-part image/media relationships. Each part (document, headers, footers,\n * footnotes, …) has its own .rels with independent rId numbering, so drawings\n * inside a part must resolve images against that part's rels. Maps\n * partPath → (rId → mediaPath).\n */\n partMedia: Map<string, Map<string, string>>;\n /** Alternative format chunks (word/afchunkN.*) keyed by rId */\n afChunks: Map<string, string>;\n /** Sub-documents (word/subdocs/subdocN.docx) keyed by rId */\n subDocs: Map<string, string>;\n /** word/bibliography.xml */\n bibliography?: string;\n /** word/glossary/document.xml */\n glossary?: string;\n}\n\nexport interface DocxDocument {\n doc: ParsedArchive;\n /** word/document.xml → root w:document element */\n documentRoot: Element;\n /** word/document.xml → w:body element */\n body: Element;\n /** word/document.xml → w:background element */\n background?: Element;\n /** word/styles.xml */\n styles?: Element;\n /** word/numbering.xml */\n numbering?: Element;\n /** word/settings.xml */\n settings?: Element;\n /** word/fontTable.xml */\n fontTable?: Element;\n /** word/webSettings.xml */\n webSettings?: Element;\n partRefs: DocxPartRefs;\n /** docProps/core.xml */\n coreProps?: string;\n /** docProps/app.xml */\n appProps?: string;\n /** docProps/custom.xml */\n customProps?: string;\n /** [Content_Types].xml */\n contentTypes?: Element;\n}\n\nfunction resolveRelsPath(target: string): string {\n if (target.startsWith(\"/\")) return target.slice(1);\n if (target.startsWith(\"../\")) return target.replace(\"../\", \"\");\n return `word/${target}`;\n}\n\n/**\n * Resolve each embedded font's .odttf bytes through fontTable.xml.rels.\n * Reads the binary verbatim and flags it raw so the compiler copies it as-is\n * instead of re-obfuscating (the fontKey already matches the bytes).\n */\nfunction resolveEmbeddedFontData(fonts: EmbeddedFontOptionsWithKey[], doc: ParsedArchive): void {\n const relsEl = doc.get(\"word/_rels/fontTable.xml.rels\");\n if (!relsEl) return;\n const ridToPath = new Map<string, string>();\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n if (!type.includes(\"/font\")) continue;\n const id = attr(child, \"Id\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (id && target) ridToPath.set(id, resolveRelsPath(target));\n }\n for (const font of fonts) {\n if (!font.embedRid) continue;\n const odttfPath = ridToPath.get(font.embedRid);\n if (!odttfPath) continue;\n const bytes = doc.getRaw(odttfPath);\n if (bytes) {\n font.data = Buffer.from(bytes);\n font.rawOdttf = true;\n font.odttfPath = odttfPath;\n }\n }\n}\n\nfunction parseDocPartRefs(doc: ParsedArchive): DocxPartRefs {\n const refs: DocxPartRefs = {\n headers: new Map(),\n footers: new Map(),\n hyperlinks: new Map(),\n charts: new Map(),\n diagramData: new Map(),\n media: new Map(),\n partMedia: new Map(),\n afChunks: new Map(),\n subDocs: new Map(),\n };\n\n const relsEl = doc.get(\"word/_rels/document.xml.rels\");\n if (!relsEl) return refs;\n\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n const id = attr(child, \"Id\") ?? \"\";\n if (!target) continue;\n\n const path = resolveRelsPath(target);\n\n if (type.includes(\"/header\")) {\n refs.headers.set(id, path);\n } else if (type.includes(\"/footer\")) {\n refs.footers.set(id, path);\n } else if (type.includes(\"/footnotes\")) {\n refs.footnotes = path;\n } else if (type.includes(\"/endnotes\")) {\n refs.endnotes = path;\n } else if (type.includes(\"/comments\")) {\n refs.comments = path;\n } else if (type.includes(\"/chart\")) {\n refs.charts.set(id, path);\n } else if (type.includes(\"/diagramData\")) {\n refs.diagramData.set(id, path);\n } else if (type.includes(\"/image\") || type.includes(\"/media\")) {\n refs.media.set(id, path);\n } else if (type.includes(\"/aFChunk\")) {\n refs.afChunks.set(id, path);\n } else if (type.includes(\"/subDocument\")) {\n refs.subDocs.set(id, path);\n } else if (type.includes(\"/bibliography\")) {\n refs.bibliography = path;\n } else if (type.includes(\"/glossaryDocument\")) {\n refs.glossary = path;\n } else if (type.includes(\"/hyperlink\")) {\n refs.hyperlinks.set(id, target);\n }\n }\n\n // Per-part image relationships. Each part carries its own .rels with\n // independent rId numbering (document rId1 ≠ header rId1), so collect them\n // keyed by part path; drawings inside a part resolve images through its\n // own rels. Covers document, headers, footers, footnotes, endnotes, comments.\n for (const relsPath of doc.keys(\"word/_rels/\")) {\n if (!relsPath.endsWith(\".rels\")) continue;\n const relsEl = doc.get(relsPath);\n if (!relsEl) continue;\n const partPath = \"word/\" + relsPath.slice(\"word/_rels/\".length, -\".rels\".length);\n for (const rel of relsEl.elements ?? []) {\n if (rel.name !== \"Relationship\") continue;\n const type = attr(rel, \"Type\") ?? \"\";\n if (!type.includes(\"/image\") && !type.includes(\"/media\")) continue;\n const id = attr(rel, \"Id\") ?? \"\";\n const target = attr(rel, \"Target\") ?? \"\";\n if (!id || !target) continue;\n let partMap = refs.partMedia.get(partPath);\n if (!partMap) {\n partMap = new Map();\n refs.partMedia.set(partPath, partMap);\n }\n partMap.set(id, resolveRelsPath(target));\n }\n }\n\n return refs;\n}\n\nfunction parseRootRels(doc: ParsedArchive): {\n coreProps?: string;\n appProps?: string;\n customProps?: string;\n} {\n const relsEl = doc.get(\"_rels/.rels\");\n if (!relsEl) return {};\n\n let coreProps: string | undefined;\n let appProps: string | undefined;\n let customProps: string | undefined;\n\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n const path = target.startsWith(\"/\") ? target.slice(1) : target;\n\n if (type.includes(\"/core-properties\")) {\n coreProps = path;\n } else if (type.includes(\"/extended-properties\")) {\n appProps = path;\n } else if (type.includes(\"/custom-properties\")) {\n customProps = path;\n }\n }\n\n return { coreProps, appProps, customProps };\n}\n\n/**\n * Parse a .docx file and convert it into DocumentOptions.\n *\n * This is the main public API for parsing DOCX files.\n * The returned options can be passed directly to `new Document(parsed)`\n * to recreate the document.\n *\n * @param data - Raw bytes of a .docx file\n * @returns Document options including sections and metadata\n */\nexport function parseDocument(data: DataType): DocumentOptions {\n const docx = parseDocx(data);\n const ctx = new DocxReadContext(\n docx,\n buildStyleCache(docx.styles),\n buildNumberingCache(docx.numbering),\n );\n\n // Register the child parser for table and body child descriptors\n setTableParseChild(parseSectionChild);\n setBodyParseChild(parseSectionChild);\n\n const sections = parseBody(docx.body, ctx);\n\n const opts: Partial<DocumentOptions> = { sections };\n\n // Document conformance class (w:document/@w:conformance)\n const conformance = attr(docx.documentRoot, \"w:conformance\");\n if (conformance === \"strict\" || conformance === \"transitional\") opts.conformance = conformance;\n\n // Background (w:background in document.xml)\n if (docx.background) {\n const hasChildren = (docx.background.elements ?? []).some((e) => e.type === \"element\");\n if (hasChildren) {\n // VML/structured background (e.g. v:background/v:fill pattern with a\n // texture image) that doesn't fit the color/theme model: carry the\n // element verbatim, rewriting relationship refs to {fileName} placeholders\n // so the media round-trips via the compiler's placeholder pass.\n const { rawXml, rawMedia } = replaceRelsWithPlaceholders(\n stringifyElement(docx.background),\n ctx,\n \"background\",\n );\n opts.background = rawMedia.length > 0 ? { rawXml, rawMedia } : { rawXml };\n } else {\n const bg: NonNullable<DocumentOptions[\"background\"]> = {};\n const color = attr(docx.background, \"w:color\");\n if (color) bg.color = color;\n const themeColor = attr(docx.background, \"w:themeColor\");\n if (themeColor) bg.themeColor = themeColor;\n const themeShade = attr(docx.background, \"w:themeShade\");\n if (themeShade) bg.themeShade = themeShade;\n const themeTint = attr(docx.background, \"w:themeTint\");\n if (themeTint) bg.themeTint = themeTint;\n if (Object.keys(bg).length > 0) opts.background = bg;\n }\n }\n\n // Core properties\n if (docx.coreProps) {\n const corePropsEl = docx.doc.get(docx.coreProps);\n if (corePropsEl) {\n const cp = corePropertiesDesc.parse(corePropsEl, ctx);\n if (cp.title) opts.title = cp.title;\n if (cp.subject) opts.subject = cp.subject;\n if (cp.creator) opts.creator = cp.creator;\n if (cp.keywords) opts.keywords = cp.keywords;\n if (cp.description) opts.description = cp.description;\n if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n if (cp.revision) opts.revision = cp.revision;\n if (cp.lastPrinted) opts.lastPrinted = cp.lastPrinted;\n if (cp.created) opts.created = cp.created;\n if (cp.modified) opts.modified = cp.modified;\n }\n }\n\n // App (extended) properties\n if (docx.appProps) {\n const appPropsEl = docx.doc.get(docx.appProps);\n if (appPropsEl) {\n const ap = appPropertiesDesc.parse(appPropsEl, ctx);\n if (Object.keys(ap).length > 0) opts.appProperties = ap;\n }\n }\n\n // Settings — parse produces a structured SettingsOptions aligned with\n // generate (no verbatim rawXml fallback). Assign wholesale so context.ts\n // spreads it into _settingsOptions for the descriptor's stringify input.\n if (docx.settings) {\n opts.settings = settingsDesc.parse(docx.settings, ctx);\n }\n\n // Web settings\n if (docx.webSettings) {\n const wsOpts = webSettingsDesc.parse(docx.webSettings, ctx);\n if (Object.keys(wsOpts).length > 0) opts.webSettings = wsOpts;\n }\n\n // Custom properties\n if (docx.customProps) {\n const customPropsEl = docx.doc.get(docx.customProps);\n if (customPropsEl) {\n const cpResult = customPropertiesDesc.parse(customPropsEl, ctx);\n if (cpResult.properties && cpResult.properties.length > 0) {\n opts.customProperties = cpResult.properties;\n }\n }\n }\n\n // Comments content\n if (docx.partRefs.comments) {\n const commentsEl = docx.doc.get(docx.partRefs.comments);\n if (commentsEl) {\n const commentsResult = ctx.withPart(docx.partRefs.comments, () =>\n commentsDesc.parse(commentsEl, ctx),\n );\n const children = commentsResult.children;\n if (children && children.length > 0) {\n opts.comments = { children } as unknown as DocumentOptions[\"comments\"];\n }\n }\n }\n\n // Footnotes content\n if (docx.partRefs.footnotes) {\n const footnotesEl = docx.doc.get(docx.partRefs.footnotes);\n if (footnotesEl) {\n const fnResult = ctx.withPart(docx.partRefs.footnotes, () =>\n footnotesDesc.parse(footnotesEl, ctx),\n );\n const footnotesMap: Record<string, { children: unknown[] }> = {};\n for (const [id, paragraphs] of fnResult.notes) {\n footnotesMap[String(id)] = { children: paragraphs };\n }\n // Preserve round-tripped separators so the generated ids stay consistent\n // with settings.footnotePr (which references them).\n if (\n Object.keys(footnotesMap).length > 0 ||\n fnResult.separator ||\n fnResult.continuationSeparator\n ) {\n const fnOpts = footnotesMap as NonNullable<DocumentOptions[\"footnotes\"]>;\n if (fnResult.separator) fnOpts.separator = fnResult.separator;\n if (fnResult.continuationSeparator)\n fnOpts.continuationSeparator = fnResult.continuationSeparator;\n opts.footnotes = fnOpts;\n }\n }\n }\n\n // Endnotes content\n if (docx.partRefs.endnotes) {\n const endnotesEl = docx.doc.get(docx.partRefs.endnotes);\n if (endnotesEl) {\n const enResult = ctx.withPart(docx.partRefs.endnotes, () =>\n endnotesDesc.parse(endnotesEl, ctx),\n );\n const endnotesMap: Record<string, { children: unknown[] }> = {};\n for (const [id, paragraphs] of enResult.notes) {\n endnotesMap[String(id)] = { children: paragraphs };\n }\n if (\n Object.keys(endnotesMap).length > 0 ||\n enResult.separator ||\n enResult.continuationSeparator\n ) {\n const enOpts = endnotesMap as NonNullable<DocumentOptions[\"endnotes\"]>;\n if (enResult.separator) enOpts.separator = enResult.separator;\n if (enResult.continuationSeparator)\n enOpts.continuationSeparator = enResult.continuationSeparator;\n opts.endnotes = enOpts;\n }\n }\n }\n\n // Styles definitions\n if (docx.styles) {\n const styleOpts = parseStyleDefinitions(docx.styles, parseParagraphProperties, ctx);\n if (styleOpts) opts.styles = styleOpts;\n }\n\n // Numbering definitions\n if (docx.numbering) {\n const numOpts = parseNumberingDefinitions(docx.numbering, parseParagraphProperties, ctx);\n if (numOpts) opts.numbering = numOpts;\n }\n\n // Font table\n if (docx.fontTable) {\n const ftResult = fontTableDesc.parse(docx.fontTable, ctx);\n if (ftResult.fonts && ftResult.fonts.length > 0) {\n resolveEmbeddedFontData(ftResult.fonts, docx.doc);\n opts.fonts = ftResult.fonts;\n }\n }\n\n // Bibliography\n if (docx.partRefs.bibliography) {\n const bibEl = docx.doc.get(docx.partRefs.bibliography);\n if (bibEl) {\n const bibResult = bibliographyDesc.parse(bibEl, ctx);\n if (bibResult.sources && bibResult.sources.length > 0) opts.bibliography = bibResult;\n }\n }\n\n // Glossary document\n if (docx.partRefs.glossary) {\n const glossaryEl = docx.doc.get(docx.partRefs.glossary);\n if (glossaryEl) {\n const glossaryResult = ctx.withPart(docx.partRefs.glossary, () =>\n glossaryDesc.parse(glossaryEl, ctx),\n );\n if (glossaryResult.parts && glossaryResult.parts.length > 0) opts.glossary = glossaryResult;\n }\n }\n\n // Content types\n if (docx.contentTypes) {\n const ctResult = contentTypesDesc.parse(docx.contentTypes, ctx);\n if (ctResult) opts.contentTypes = ctResult;\n }\n\n // Raw passthrough: parts generate() doesn't rebuild (word/theme/*, customXml/*).\n // Carried verbatim so their [Content_Types] declarations stay valid and the\n // package opens in Word. (Media/fonts/headers/etc. are rebuilt by the compiler\n // and must NOT be passed through — they'd otherwise duplicate under renamed paths.)\n const rawParts: { path: string; data: Uint8Array }[] = [];\n for (const prefix of [\"word/theme/\", \"customXml/\"]) {\n for (const p of docx.doc.keys(prefix)) {\n if (p.endsWith(\"/\")) continue;\n const data = docx.doc.getRaw(p);\n if (data) rawParts.push({ path: p, data });\n }\n }\n if (rawParts.length > 0) opts.rawParts = rawParts;\n\n return opts as DocumentOptions;\n}\n\nexport function parseDocx(data: DataType): DocxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const documentEl = doc.get(\"word/document.xml\");\n if (!documentEl) throw new Error(\"word/document.xml not found\");\n const body = documentEl.elements?.find((e) => e.name === \"w:body\");\n if (!body) throw new Error(\"w:body not found in word/document.xml\");\n const background = documentEl.elements?.find((e) => e.name === \"w:background\");\n\n const styles = doc.get(\"word/styles.xml\");\n const numbering = doc.get(\"word/numbering.xml\");\n const settings = doc.get(\"word/settings.xml\");\n const fontTable = doc.get(\"word/fontTable.xml\");\n const webSettings = doc.get(\"word/webSettings.xml\");\n\n const partRefs = parseDocPartRefs(doc);\n const { coreProps, appProps, customProps } = parseRootRels(doc);\n\n const contentTypes = doc.get(\"[Content_Types].xml\");\n\n return {\n doc,\n documentRoot: documentEl,\n body,\n background,\n styles,\n numbering,\n settings,\n fontTable,\n webSettings,\n partRefs,\n coreProps,\n appProps,\n customProps,\n contentTypes,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/dist/parse.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { _ as parseArchive, g as DocxPartRefs, h as DocxDocument, v as parseDocument, y as parseDocx } from "./core-properties-DQWsBBjj.mjs";
1
+ import { _ as parseArchive, g as DocxPartRefs, h as DocxDocument, v as parseDocument, y as parseDocx } from "./core-properties-BuepeejJ.mjs";
2
2
  export { DocxDocument, DocxPartRefs, parseArchive, parseDocument, parseDocx };
package/dist/parse.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { n as parseDocument, r as parseDocx, t as parseArchive } from "./parse-Dhuwrt2i.mjs";
1
+ import { n as parseDocument, r as parseDocx, t as parseArchive } from "./parse-D6c9kHXh.mjs";
2
2
  export { parseArchive, parseDocument, parseDocx };
@@ -1,4 +1,4 @@
1
- import { DOCX_PARTS, Media, Relationships, TargetModeType, ThemeColor, appPropertiesDesc, blipDesc, buildContentTypeOverrides, convertEmuToPixels, convertInchesToTwip, convertPixelsToEmu, convertToEmu, convertToTwip, convertUniversalMeasureToEmu, customGeometryDesc, customPropertiesDesc, decimalNumber, derivePasswordHash, effectListDesc, eighthPointMeasureValue, fillDesc, hexColorValue, hpsMeasureValue, measurementOrPercentValue, outlineDesc, parseColorChoice, pointMeasureValue, presetGeometryDesc, signedTwipsMeasureValue, toUint8Array, twipsMeasureValue, uCharHexNumber, uniqueId, uniqueNumericIdCreator, uniqueUuid, xsdVerticalMergeRev } from "@office-open/core";
1
+ import { DOCX_PARTS, Media, Relationships, TargetModeType, ThemeColor, appPropertiesDesc, blipDesc, buildContentTypeOverrides, convertEmuToPixels, convertInchesToTwip, convertToEmu, convertToTwip, customGeometryDesc, customPropertiesDesc, decimalNumber, derivePasswordHash, effectListDesc, eighthPointMeasureValue, fillDesc, hexColorValue, hpsMeasureValue, measurementOrPercentValue, outlineDesc, parseColorChoice, pointMeasureValue, presetGeometryDesc, signedTwipsMeasureValue, toUint8Array, twipsMeasureValue, uCharHexNumber, uniqueId, uniqueNumericIdCreator, uniqueUuid, xsdVerticalMergeRev } from "@office-open/core";
2
2
  import { calculateEffectExtent, createColorElement, createEffectDag, createScene3D, createShape3D, customGeometryDesc as customGeometryDesc$1, effectListDesc as effectListDesc$1, fillDesc as fillDesc$1, outlineDesc as outlineDesc$1, presetGeometryDesc as presetGeometryDesc$1, scene3DDesc, shape3DDesc, transform2DDesc } from "@office-open/core/drawingml";
3
3
  import { attr, attrBool, attrMeasure, attrNum, children, colorAttr, element, escapeXml, findChild, findFirst, stringify, textOf } from "@office-open/xml";
4
4
  import { chartSpaceDesc } from "@office-open/core/chart";
@@ -266,35 +266,41 @@ const HighlightColor = {
266
266
  //#endregion
267
267
  //#region src/shared/media/media.ts
268
268
  /**
269
- * Converts user-facing transformation options (pixels or universal measure) to internal
269
+ * Converts user-facing transformation options (EMU or universal measure) to internal
270
270
  * transformation data (pixels + EMUs).
271
271
  *
272
- * @param options - User-facing transformation in pixels or universal measure
272
+ * @param options - User-facing transformation in EMU or universal measure
273
273
  * @returns Internal transformation data with both pixel and EMU values
274
274
  */
275
- const createTransformation = (options) => ({
276
- emus: {
277
- x: typeof options.width === "string" ? convertUniversalMeasureToEmu(options.width) : convertPixelsToEmu(options.width),
278
- y: typeof options.height === "string" ? convertUniversalMeasureToEmu(options.height) : convertPixelsToEmu(options.height)
279
- },
280
- flip: options.flip,
281
- offset: {
275
+ const createTransformation = (options) => {
276
+ const widthEmu = convertToEmu(options.width);
277
+ const heightEmu = convertToEmu(options.height);
278
+ const offsetLeftEmu = convertToEmu(options.offset?.left ?? 0);
279
+ const offsetTopEmu = convertToEmu(options.offset?.top ?? 0);
280
+ return {
282
281
  emus: {
283
- x: typeof options.offset?.left === "string" ? convertUniversalMeasureToEmu(options.offset.left) : convertPixelsToEmu(options.offset?.left ?? 0),
284
- y: typeof options.offset?.top === "string" ? convertUniversalMeasureToEmu(options.offset.top) : convertPixelsToEmu(options.offset?.top ?? 0)
282
+ x: widthEmu,
283
+ y: heightEmu
284
+ },
285
+ flip: options.flip,
286
+ offset: {
287
+ emus: {
288
+ x: offsetLeftEmu,
289
+ y: offsetTopEmu
290
+ },
291
+ pixels: {
292
+ x: Math.round(convertEmuToPixels(offsetLeftEmu)),
293
+ y: Math.round(convertEmuToPixels(offsetTopEmu))
294
+ }
285
295
  },
286
296
  pixels: {
287
- x: typeof options.offset?.left === "number" ? Math.round(options.offset.left) : 0,
288
- y: typeof options.offset?.top === "number" ? Math.round(options.offset.top) : 0
289
- }
290
- },
291
- pixels: {
292
- x: typeof options.width === "number" ? Math.round(options.width) : 0,
293
- y: typeof options.height === "number" ? Math.round(options.height) : 0
294
- },
295
- rotation: options.rotation ? options.rotation * 6e4 : void 0,
296
- ...options.effectExtent ? { effectExtent: options.effectExtent } : {}
297
- });
297
+ x: Math.round(convertEmuToPixels(widthEmu)),
298
+ y: Math.round(convertEmuToPixels(heightEmu))
299
+ },
300
+ rotation: options.rotation ? options.rotation * 6e4 : void 0,
301
+ ...options.effectExtent ? { effectExtent: options.effectExtent } : {}
302
+ };
303
+ };
298
304
  //#endregion
299
305
  //#region src/parts/paragraph/run/image-run.ts
300
306
  const createImageData$1 = (data, transformation, key, sourceRectangle, nonVisualProperties) => ({
@@ -3252,7 +3258,7 @@ const VerticalPositionRelativeFrom = {
3252
3258
  * ```
3253
3259
  */
3254
3260
  const createHorizontalPosition = ({ relative, align, offset }) => {
3255
- const child = align ? `<wp:align>${align}</wp:align>` : offset !== void 0 ? `<wp:posOffset>${offset}</wp:posOffset>` : `<wp:align>${HorizontalPositionAlign.LEFT}</wp:align>`;
3261
+ const child = align ? `<wp:align>${align}</wp:align>` : offset !== void 0 ? `<wp:posOffset>${convertToEmu(offset)}</wp:posOffset>` : `<wp:align>${HorizontalPositionAlign.LEFT}</wp:align>`;
3256
3262
  return element("wp:positionH", { relativeFrom: relative ?? HorizontalPositionRelativeFrom.PAGE }, [child]);
3257
3263
  };
3258
3264
  //#endregion
@@ -3305,7 +3311,7 @@ const createHorizontalPosition = ({ relative, align, offset }) => {
3305
3311
  * ```
3306
3312
  */
3307
3313
  const createVerticalPosition = ({ relative, align, offset }) => {
3308
- const child = align ? `<wp:align>${align}</wp:align>` : offset !== void 0 ? `<wp:posOffset>${offset}</wp:posOffset>` : `<wp:align>${VerticalPositionAlign.TOP}</wp:align>`;
3314
+ const child = align ? `<wp:align>${align}</wp:align>` : offset !== void 0 ? `<wp:posOffset>${convertToEmu(offset)}</wp:posOffset>` : `<wp:align>${VerticalPositionAlign.TOP}</wp:align>`;
3309
3315
  return element("wp:positionV", { relativeFrom: relative ?? VerticalPositionRelativeFrom.PAGE }, [child]);
3310
3316
  };
3311
3317
  //#endregion
@@ -5877,8 +5883,8 @@ function parseAnchorOrInline(el) {
5877
5883
  if (extent) {
5878
5884
  const cxEmu = attrNum(extent, "cx");
5879
5885
  const cyEmu = attrNum(extent, "cy");
5880
- if (cxEmu !== void 0) info.width = convertEmuToPixels(cxEmu);
5881
- if (cyEmu !== void 0) info.height = convertEmuToPixels(cyEmu);
5886
+ if (cxEmu !== void 0) info.width = cxEmu;
5887
+ if (cyEmu !== void 0) info.height = cyEmu;
5882
5888
  }
5883
5889
  const ee = findChild(parent, "wp:effectExtent");
5884
5890
  if (ee) info.effectExtent = {
@@ -6408,8 +6414,8 @@ function getDrawingExtent(el) {
6408
6414
  const cxEmu = attrNum(extent, "cx");
6409
6415
  const cyEmu = attrNum(extent, "cy");
6410
6416
  return {
6411
- ...cxEmu !== void 0 ? { width: convertEmuToPixels(cxEmu) } : {},
6412
- ...cyEmu !== void 0 ? { height: convertEmuToPixels(cyEmu) } : {}
6417
+ ...cxEmu !== void 0 ? { width: cxEmu } : {},
6418
+ ...cyEmu !== void 0 ? { height: cyEmu } : {}
6413
6419
  };
6414
6420
  }
6415
6421
  /**
@@ -6919,10 +6925,10 @@ function stringifyGraphicDataContent(mediaData, opts, hlIds, ctx) {
6919
6925
  return `<a:graphicData uri="${PIC_URI}"><pic:pic xmlns:pic="${PIC_URI}">` + stringifyNvPicPr(hlIds, md.nonVisualProperties) + stringifyBlipFill(md, blipEffects, tile) + stringifyShapeProps(transform, outline, fill, effects) + `</pic:pic></a:graphicData>`;
6920
6926
  }
6921
6927
  function stringifyPositionH(opts) {
6922
- return `<wp:positionH relativeFrom="${opts.relative ?? HorizontalPositionRelativeFrom.PAGE}">${opts.align ? `<wp:align>${opts.align}</wp:align>` : opts.offset !== void 0 ? `<wp:posOffset>${opts.offset}</wp:posOffset>` : "<wp:align>left</wp:align>"}</wp:positionH>`;
6928
+ return `<wp:positionH relativeFrom="${opts.relative ?? HorizontalPositionRelativeFrom.PAGE}">${opts.align ? `<wp:align>${opts.align}</wp:align>` : opts.offset !== void 0 ? `<wp:posOffset>${convertToEmu(opts.offset)}</wp:posOffset>` : "<wp:align>left</wp:align>"}</wp:positionH>`;
6923
6929
  }
6924
6930
  function stringifyPositionV(opts) {
6925
- return `<wp:positionV relativeFrom="${opts.relative ?? VerticalPositionRelativeFrom.PAGE}">${opts.align ? `<wp:align>${opts.align}</wp:align>` : opts.offset !== void 0 ? `<wp:posOffset>${opts.offset}</wp:posOffset>` : "<wp:align>top</wp:align>"}</wp:positionV>`;
6931
+ return `<wp:positionV relativeFrom="${opts.relative ?? VerticalPositionRelativeFrom.PAGE}">${opts.align ? `<wp:align>${opts.align}</wp:align>` : opts.offset !== void 0 ? `<wp:posOffset>${convertToEmu(opts.offset)}</wp:posOffset>` : "<wp:align>top</wp:align>"}</wp:positionV>`;
6926
6932
  }
6927
6933
  function wrapPolygonStr(cx, cy) {
6928
6934
  return `<wp:wrapPolygon edited="0"><wp:start x="0" y="0"/><wp:lineTo x="0" y="${-cy}"/><wp:lineTo x="${cx}" y="${-cy}"/><wp:lineTo x="${cx}" y="0"/><wp:lineTo x="0" y="0"/></wp:wrapPolygon>`;
@@ -6932,27 +6938,27 @@ function wrapSquareStr(textWrapping, margins) {
6932
6938
  const m = margins ?? {};
6933
6939
  return `<wp:wrapSquare ${[
6934
6940
  `wrapText="${side}"`,
6935
- ...m.top != null ? [`distT="${m.top}"`] : [],
6936
- ...m.bottom != null ? [`distB="${m.bottom}"`] : [],
6937
- ...m.left != null ? [`distL="${m.left}"`] : [],
6938
- ...m.right != null ? [`distR="${m.right}"`] : []
6941
+ ...m.top != null ? [`distT="${convertToEmu(m.top)}"`] : [],
6942
+ ...m.bottom != null ? [`distB="${convertToEmu(m.bottom)}"`] : [],
6943
+ ...m.left != null ? [`distL="${convertToEmu(m.left)}"`] : [],
6944
+ ...m.right != null ? [`distR="${convertToEmu(m.right)}"`] : []
6939
6945
  ].join(" ")}/>`;
6940
6946
  }
6941
6947
  function wrapTightStr(textWrapping, margins, cx, cy) {
6942
6948
  const a = [`wrapText="${textWrapping.side ?? TextWrappingSide.BOTH_SIDES}"`];
6943
- if (margins.left != null) a.push(`distL="${margins.left}"`);
6944
- if (margins.right != null) a.push(`distR="${margins.right}"`);
6949
+ if (margins.left != null) a.push(`distL="${convertToEmu(margins.left)}"`);
6950
+ if (margins.right != null) a.push(`distR="${convertToEmu(margins.right)}"`);
6945
6951
  return `<wp:wrapTight ${a.join(" ")}>${wrapPolygonStr(cx, cy)}</wp:wrapTight>`;
6946
6952
  }
6947
6953
  function wrapThroughStr(textWrapping, margins, cx, cy) {
6948
6954
  const a = [`wrapText="${textWrapping.side ?? TextWrappingSide.BOTH_SIDES}"`];
6949
- if (margins.left != null) a.push(`distL="${margins.left}"`);
6950
- if (margins.right != null) a.push(`distR="${margins.right}"`);
6955
+ if (margins.left != null) a.push(`distL="${convertToEmu(margins.left)}"`);
6956
+ if (margins.right != null) a.push(`distR="${convertToEmu(margins.right)}"`);
6951
6957
  return `<wp:wrapThrough ${a.join(" ")}>${wrapPolygonStr(cx, cy)}</wp:wrapThrough>`;
6952
6958
  }
6953
6959
  function wrapTopAndBottomStr(margins) {
6954
6960
  const m = margins ?? {};
6955
- const a = [...m.top != null ? [`distT="${m.top}"`] : [], ...m.bottom != null ? [`distB="${m.bottom}"`] : []].join(" ");
6961
+ const a = [...m.top != null ? [`distT="${convertToEmu(m.top)}"`] : [], ...m.bottom != null ? [`distB="${convertToEmu(m.bottom)}"`] : []].join(" ");
6956
6962
  return a ? `<wp:wrapTopAndBottom ${a}/>` : "<wp:wrapTopAndBottom/>";
6957
6963
  }
6958
6964
  /** Render wp:cNvGraphicFramePr. Undefined → authoring default (noChangeAspect=1);
@@ -7013,10 +7019,10 @@ function stringifyAnchor(opts, hlIds, ctx) {
7013
7019
  ...rawFloating
7014
7020
  };
7015
7021
  const attrParts = [
7016
- `distT="${floating.margins?.top ?? 0}"`,
7017
- `distB="${floating.margins?.bottom ?? 0}"`,
7018
- `distL="${floating.margins?.left ?? 0}"`,
7019
- `distR="${floating.margins?.right ?? 0}"`,
7022
+ `distT="${convertToEmu(floating.margins?.top ?? 0)}"`,
7023
+ `distB="${convertToEmu(floating.margins?.bottom ?? 0)}"`,
7024
+ `distL="${convertToEmu(floating.margins?.left ?? 0)}"`,
7025
+ `distR="${convertToEmu(floating.margins?.right ?? 0)}"`,
7020
7026
  "simplePos=\"0\"",
7021
7027
  `allowOverlap="${floating.allowOverlap ? 1 : 0}"`,
7022
7028
  `behindDoc="${floating.behindDocument ? 1 : 0}"`,
@@ -7410,10 +7416,10 @@ function stringifyChildDispatch(child, ctx) {
7410
7416
  }
7411
7417
  if ("image" in child) {
7412
7418
  const opts = child.image;
7413
- const rawData = toUint8Array(opts.data);
7419
+ const rawData = toUint8Array(opts.data, { encoding: "base64" });
7414
7420
  let mediaData;
7415
7421
  if (opts.type === "svg") {
7416
- const fallbackData = toUint8Array(opts.fallback.data);
7422
+ const fallbackData = toUint8Array(opts.fallback.data, { encoding: "base64" });
7417
7423
  const fallbackType = opts.fallback.type;
7418
7424
  const fallback = ctx.file.media.addMedia(fallbackData, fallbackType, (fileName) => ({
7419
7425
  type: fallbackType,
@@ -13558,4 +13564,4 @@ const webSettingsDesc = {
13558
13564
  //#endregion
13559
13565
  export { DocumentGridType as $, stringifySdtPr as $t, settingsDesc as A, parseBodyProperties as An, PageTextDirectionType as At, stringifyParagraphStyle as B, HeadingLevel as Bn, SpaceType as Bt, footnotesDesc as C, UnderlineType as Cn, parseSdtProperties as Ct, SdtDateMappingType as D, TextVerticalType as Dn, stringifySectionPropertiesXml as Dt, parseTocFieldInstruction as E, TextVertOverflowType as En, sectionPropertiesDesc as Et, parseStyleDefinitions as F, TextEffect as Fn, createHorizontalPosition as Ft, SectionType as G, TextWrappingType as Gt, HeaderFooterReferenceType as H, AlignmentType as Hn, createWrapThrough as Ht, DefaultStylesFactory as I, PageNumber as In, HorizontalPositionRelativeFrom as It, createLineNumberType as J, customXmlBlockDesc as Jt, createSectionType as K, altChunkDesc as Kt, stringifyCharacterStyle as L, breakXml as Ln, VerticalPositionRelativeFrom as Lt, buildNumberingCache as M, Media as Mn, PageNumberSeparator as Mt, buildStyleCache as N, createTransformation as Nn, createPageNumberType as Nt, SdtLock as O, VerticalAnchor as On, sectionMarginDefaults as Ot, extractStyleId as P, HighlightColor as Pn, createVerticalPosition as Pt, PageBorderZOrder as Q, stringifyCustomXmlShell as Qt, stringifyConditionalTableStyle as R, TextAlignmentType as Rn, HorizontalPositionAlign as Rt, endnotesDesc as S, EmphasisMarkType as Sn, parseSdtBlock as St, parseTocFieldFromElements as T, TextHorzOverflowType as Tn, parseSectionPropertiesEl as Tt, HeaderFooterType as U, createWrapTight as Ut, stringifyTableStyle as V, LineRuleType as Vn, VerticalPositionAlign as Vt, createHeaderFooterReference as W, TextWrappingSide as Wt, PageBorderDisplay as X, sdtBlockDesc as Xt, createPageMargin as Y, parseCustomXmlProperties as Yt, PageBorderOffsetFrom as Z, setBodyParseChild as Zt, glossaryDesc as _, parseFormFieldData as _n, parseParagraphProperties as _t, appPropertiesDesc as a, TABLE_BORDERS_NONE as an, LevelSuffix as at, CharacterSet as b, PositionalTabLeader as bn, replaceRelsWithPlaceholders as bt, relationshipsDesc as c, OverlapType as cn, parseTableRowPropertiesEl as ct, withAltChunkOverrides as d, TableAnchorType as dn, stringifyChildDispatch as dt, stringifySdtShell as en, createDocumentGrid as et, withMediaDefaults as f, TextDirection as fn, stringifyParagraphInline as ft, DocPartType as g, createFormFieldData as gn, parseParagraph as gt, DocPartGallery as h, FormFieldTextType as hn, resetDrawingIdGen as ht, webSettingsDesc as i, WidthType as in, LevelFormat as it, Styles as j, createImageData$1 as jn, PageOrientation as jt, StyleLevel as k, createBodyProperties as kn, sectionPageSizeDefaults as kt, buildContentTypesFromRegistry as l, RelativeHorizontalPosition as ln, setTableParseChild as lt, DocPartBehavior as m, ProofErrorType as mn, drawingDesc as mt, frameXml as n, stringifyElement as nn, Numbering as nt, customPropertiesDesc as o, BorderStyle as on, parseTableCellPropertiesEl as ot, commentsDesc as p, VerticalMergeType as pn, stringifyRunInline as pt, LineNumberRestartFormat as q, checkboxSymbolRunInner as qt, framesetXml as r, objectDesc as rn, parseNumberingDefinitions as rt, corePropertiesDesc as s, TableLayoutType as sn, parseTablePropertiesEl as st, TargetScreenSize as t, subDocDesc as tn, DocumentAttributeNamespaces as tt, contentTypesDesc as u, RelativeVerticalPosition as un, tableDesc as ut, bibliographyDesc as v, RubyAlign as vn, stringifyBodyChild as vt, parseToc as w, TextBodyWrappingType as wn, FontWrapper as wt, EditGroupType as x, PositionalTabRelativeTo as xn, stringifyTableOfContents as xt, fontTableDesc as y, PositionalTabAlignment as yn, stringifyDocumentXml as yt, stringifyNumberingStyle as z, TextboxTightWrapType as zn, NumberFormat as zt };
13560
13566
 
13561
- //# sourceMappingURL=parts-BXGYKB-u.mjs.map
13567
+ //# sourceMappingURL=parts-DgrmHznM.mjs.map