@adeu/core 1.7.1 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/docx/bridge.ts","../src/docx/dom.ts","../src/docx/primitives.ts","../src/comments.ts","../src/utils/docx.ts","../src/mapper.ts","../src/diff.ts","../src/markup.ts","../src/engine.ts","../src/pagination.ts","../src/domain.ts","../src/ingest.ts","../src/outline.ts","../src/sanitize/report.ts","../src/sanitize/transforms.ts","../src/sanitize/core.ts","../src/index.ts"],"sourcesContent":["import JSZip from \"jszip\";\nimport {\n parseXml,\n findChild,\n findAllDescendants,\n serializeXml,\n} from \"./dom.js\";\n\nexport class Relationship {\n constructor(\n public id: string,\n public type: string,\n public target: string,\n public isExternal: boolean,\n ) {}\n}\n\nexport class Part {\n public rels: Map<string, Relationship> = new Map();\n public _element: Element;\n public package?: DocxPackage;\n constructor(\n public partname: string,\n public blob: string,\n element: Element,\n public contentType: string,\n ) {\n this._element = element;\n }\n\n public addRelationship(\n id: string,\n type: string,\n target: string,\n isExternal: boolean = false,\n ) {\n this.rels.set(id, new Relationship(id, type, target, isExternal));\n\n // Directly append the relationship element to the document structure\n if (this.partname.endsWith(\".rels\")) {\n const doc = this._element.ownerDocument;\n if (doc) {\n // Use strict namespace to ensure it parses successfully on reload\n const relEl = doc.createElementNS(\n \"http://schemas.openxmlformats.org/package/2006/relationships\",\n \"Relationship\",\n );\n relEl.setAttribute(\"Id\", id);\n relEl.setAttribute(\"Type\", type);\n relEl.setAttribute(\"Target\", target);\n if (isExternal) relEl.setAttribute(\"TargetMode\", \"External\");\n this._element.appendChild(relEl);\n }\n }\n }\n}\n\nexport class DocxPackage {\n public parts: Part[] = [];\n public mainDocumentPart!: Part;\n\n constructor(public zip: JSZip) {}\n\n public getPartByPath(path: string): Part | undefined {\n // Strip leading slash for jszip compat\n const searchPath = path.startsWith(\"/\") ? path.substring(1) : path;\n return this.parts.find(\n (p) => p.partname === searchPath || p.partname === \"/\" + searchPath,\n );\n }\n\n public nextPartname(pattern: string): string {\n let i = 1;\n while (true) {\n const candidate = pattern.replace(\"%d\", i === 1 ? \"\" : i.toString());\n if (!this.getPartByPath(candidate)) return candidate;\n i++;\n }\n }\n\n public addPart(\n partname: string,\n contentType: string,\n xmlString: string,\n ): Part {\n const doc = parseXml(xmlString);\n const part = new Part(\n partname,\n xmlString,\n doc.documentElement,\n contentType,\n );\n part.package = this;\n this.parts.push(part);\n\n // Update [Content_Types].xml\n const ctPart = this.getPartByPath(\"[Content_Types].xml\");\n if (ctPart) {\n const docCT = ctPart._element.ownerDocument;\n if (docCT) {\n const override = docCT.createElement(\"Override\");\n override.setAttribute(\"PartName\", partname);\n override.setAttribute(\"ContentType\", contentType);\n ctPart._element.appendChild(override);\n }\n }\n return part;\n }\n\n public getOrCreateRelsPart(sourcePartname: string): Part {\n // e.g., /word/document.xml -> /word/_rels/document.xml.rels\n const parts = sourcePartname.split(\"/\");\n const file = parts.pop();\n const relsPath = parts.join(\"/\") + \"/_rels/\" + file + \".rels\";\n\n let relsPart = this.getPartByPath(relsPath);\n if (!relsPart) {\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`;\n relsPart = this.addPart(\n relsPath,\n \"application/vnd.openxmlformats-package.relationships+xml\",\n xml,\n );\n }\n return relsPart;\n }\n}\n\nexport class DocumentObject {\n public part: Part;\n public settings: { oddAndEvenPagesHeaderFooter: boolean } = {\n oddAndEvenPagesHeaderFooter: false,\n };\n // Simplification for the TS port: sections hold header/footer refs\n public sections: any[] = [];\n\n constructor(\n public pkg: DocxPackage,\n part: Part,\n ) {\n this.part = part;\n }\n\n public get element(): Element {\n return findChild(this.part._element, \"w:body\") || this.part._element;\n }\n\n /**\n * Main entrypoint for loading a DOCX buffer into the DOM wrapper.\n */\n public static async load(\n buffer: Buffer | ArrayBuffer,\n ): Promise<DocumentObject> {\n const zip = await JSZip.loadAsync(buffer);\n const pkg = new DocxPackage(zip);\n\n // 1. Load Content Types\n const ctFile = zip.file(\"[Content_Types].xml\");\n let contentTypes: Record<string, string> = {};\n if (ctFile) {\n const ctXml = parseXml(await ctFile.async(\"text\"));\n const overrides = findAllDescendants(ctXml.documentElement, \"Override\");\n for (const override of overrides) {\n contentTypes[override.getAttribute(\"PartName\") || \"\"] =\n override.getAttribute(\"ContentType\") || \"\";\n }\n }\n\n // 2. Pre-load all XML parts to allow synchronous traversal later\n for (const [path, file] of Object.entries(zip.files)) {\n if (!file.dir && (path.endsWith(\".xml\") || path.endsWith(\".rels\"))) {\n const text = await file.async(\"text\");\n const doc = parseXml(text);\n const cType = contentTypes[\"/\" + path] || \"application/xml\";\n const part = new Part(\"/\" + path, text, doc.documentElement, cType);\n part.package = pkg;\n pkg.parts.push(part);\n }\n }\n\n // 3. Resolve Relationships for the main document\n const mainPart = pkg.getPartByPath(\"word/document.xml\");\n if (!mainPart) throw new Error(\"Invalid DOCX: Missing word/document.xml\");\n pkg.mainDocumentPart = mainPart;\n\n const relsPart = pkg.getPartByPath(\"word/_rels/document.xml.rels\");\n if (relsPart) {\n const relElements = findAllDescendants(relsPart._element, \"Relationship\");\n for (const rel of relElements) {\n const rId = rel.getAttribute(\"Id\");\n const target = rel.getAttribute(\"Target\");\n const type = rel.getAttribute(\"Type\");\n const targetMode = rel.getAttribute(\"TargetMode\");\n\n if (rId && target && type) {\n mainPart.rels.set(\n rId,\n new Relationship(rId, type, target, targetMode === \"External\"),\n );\n }\n }\n }\n\n return new DocumentObject(pkg, mainPart);\n }\n\n public relateTo(part: Part, relType: string) {\n let rId = 1;\n while (this.part.rels.has(`rId${rId}`)) rId++;\n const id = `rId${rId}`;\n\n // In DOCX, targets in .rels are relative to the source part's directory.\n // /word/document.xml relating to /word/comments.xml -> target is \"comments.xml\"\n const target = part.partname.split(\"/\").pop()!;\n\n this.part.rels.set(id, new Relationship(id, relType, target, false));\n const relsPart = this.pkg.getOrCreateRelsPart(this.part.partname);\n relsPart.addRelationship(id, relType, target, false);\n }\n\n public relateToExternal(target: string, relType: string): string {\n let rId = 1;\n while (this.part.rels.has(`rId${rId}`)) rId++;\n const id = `rId${rId}`;\n\n this.part.rels.set(id, new Relationship(id, relType, target, true));\n const relsPart = this.pkg.getOrCreateRelsPart(this.part.partname);\n relsPart.addRelationship(id, relType, target, true);\n return id;\n }\n\n public async save(): Promise<Buffer> {\n for (const part of this.pkg.parts) {\n let xmlStr = serializeXml(part._element.ownerDocument || part._element);\n if (!xmlStr.startsWith(\"<?xml\")) {\n xmlStr =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' + xmlStr;\n }\n this.pkg.zip.file(part.partname.substring(1), xmlStr); // Strip leading slash for JSZip\n }\n return this.pkg.zip.generateAsync({ type: \"nodebuffer\" });\n }\n}\n","import { DOMParser, XMLSerializer } from \"@xmldom/xmldom\";\n\n/**\n * Simulates docx.oxml.ns.qn. In xmldom, namespaces are preserved in tagName.\n */\nexport const qn = (name: string) => name;\n\n/**\n * Simulates lxml element.find(\"w:tag\") - strictly searches DIRECT children only.\n */\nexport function findChild(element: Element, tagName: string): Element | null {\n for (let i = 0; i < element.childNodes.length; i++) {\n const child = element.childNodes[i];\n if (\n child.nodeType === 1 /* ELEMENT_NODE */ &&\n (child as Element).tagName === tagName\n ) {\n return child as Element;\n }\n }\n return null;\n}\n\n/**\n * Simulates lxml element.findall(\"w:tag\") - strictly searches DIRECT children only.\n */\nexport function findChildren(element: Element, tagName: string): Element[] {\n const result: Element[] = [];\n for (let i = 0; i < element.childNodes.length; i++) {\n const child = element.childNodes[i];\n if (child.nodeType === 1 && (child as Element).tagName === tagName) {\n result.push(child as Element);\n }\n }\n return result;\n}\n\n/**\n * Simulates lxml element.findall(\".//w:tag\") - searches ALL descendants.\n */\nexport function findAllDescendants(\n element: Element,\n tagName: string,\n): Element[] {\n return Array.from(element.getElementsByTagName(tagName));\n}\n\n/**\n * Parses raw XML strings into xmldom Documents.\n */\nexport function parseXml(xmlString: string): Document {\n return new DOMParser().parseFromString(xmlString, \"text/xml\");\n}\n\n/**\n * Serializes an xmldom Document or Element back to a string,\n * enforcing deterministic attribute ordering on the root element.\n */\nexport function serializeXml(node: Node): string {\n let xml = new XMLSerializer().serializeToString(node);\n\n // BUG-11: Deterministic namespace ordering on root elements.\n const rootTagRegex = /<([a-zA-Z0-9_:]+)(\\s+[^>]+?)(>|\\/>)/;\n const match = rootTagRegex.exec(xml);\n\n if (match && !match[1].startsWith(\"?\")) {\n const index = match.index;\n const textBefore = xml.substring(0, index);\n\n // Ensure this is the absolute root tag (only <?xml...?> allowed before it)\n const isRoot =\n !textBefore.includes(\"<\") ||\n (textBefore.trim().startsWith(\"<?xml\") &&\n (textBefore.match(/</g) || []).length === 1);\n\n if (isRoot) {\n const fullTag = match[0];\n const elemStart = `<${match[1]}`;\n const attrsStr = match[2];\n const tagEnd = match[3];\n\n // Robust extraction matching any quote style and internal spacing\n const attrRegex = /([a-zA-Z0-9_:]+)\\s*=\\s*([\"'])(.*?)\\2/g;\n const attrs: string[] = [];\n let m;\n while ((m = attrRegex.exec(attrsStr)) !== null) {\n attrs.push(m[0].trim());\n }\n\n // Sort attributes: xmlns definitions first, then standard attributes\n attrs.sort((a, b) => {\n const aName = a.split(\"=\")[0].trim();\n const bName = b.split(\"=\")[0].trim();\n const aIsXmlns = aName.startsWith(\"xmlns\");\n const bIsXmlns = bName.startsWith(\"xmlns\");\n if (aIsXmlns && !bIsXmlns) return -1;\n if (!aIsXmlns && bIsXmlns) return 1;\n return aName < bName ? -1 : aName > bName ? 1 : 0;\n });\n\n const newTag =\n attrs.length > 0\n ? `${elemStart} ${attrs.join(\" \")}${tagEnd}`\n : `${elemStart}${tagEnd}`;\n xml =\n xml.substring(0, index) +\n newTag +\n xml.substring(index + fullTag.length);\n }\n }\n\n return xml;\n}\n","import { findChild } from './dom.js';\n\nexport class Paragraph {\n constructor(public _element: Element, public _parent: any) {}\n \n get text(): string {\n let t = '';\n const texts = this._element.getElementsByTagName('w:t');\n for (let i = 0; i < texts.length; i++) {\n t += texts[i].textContent || '';\n }\n return t;\n }\n}\n\nexport class Run {\n constructor(public _element: Element, public _parent: any) {}\n}\n\nexport class Cell {\n constructor(public _element: Element, public _parent: any) {}\n}\n\nexport class Row {\n public cells: Cell[] = [];\n constructor(public _element: Element, public _parent: any) {\n const tcs = this._element.getElementsByTagName('w:tc');\n for (let i = 0; i < tcs.length; i++) {\n this.cells.push(new Cell(tcs[i], this));\n }\n }\n}\n\nexport class Table {\n public rows: Row[] = [];\n constructor(public _element: Element, public _parent: any) {\n const trs = this._element.getElementsByTagName('w:tr');\n for (let i = 0; i < trs.length; i++) {\n this.rows.push(new Row(trs[i], this));\n }\n }\n}\n\nexport class NotesPart {\n public _element: Element;\n constructor(public part: any, public note_type: 'fn' | 'en') {\n this._element = part._element;\n }\n}\n\nexport class FootnoteItem {\n public id: string;\n public part: any;\n constructor(public _element: Element, public _parent: any, public note_type: 'fn' | 'en') {\n this.id = _element.getAttribute('w:id') || '';\n this.part = _parent.part;\n }\n}\n\nexport interface DocxEvent {\n type: string;\n id: string;\n author?: string;\n date?: string;\n}","import { DocxPackage, Part, DocumentObject } from './docx/bridge.js';\nimport { findAllDescendants, findChild, parseXml } from './docx/dom.js';\n\nconst NS = {\n w: 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n w14: 'http://schemas.microsoft.com/office/word/2010/wordml',\n w15: 'http://schemas.microsoft.com/office/word/2012/wordml',\n w16cid: 'http://schemas.microsoft.com/office/word/2016/wordml/cid',\n w16cex: 'http://schemas.microsoft.com/office/word/2018/wordml/cex',\n mc: 'http://schemas.openxmlformats.org/markup-compatibility/2006'\n};\n\nconst CT = {\n COMMENTS: 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml',\n EXTENDED: 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml',\n IDS: 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml',\n EXTENSIBLE: 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml'\n};\n\nconst RT = {\n COMMENTS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',\n EXTENDED: 'http://schemas.microsoft.com/office/2011/relationships/commentsExtended',\n IDS: 'http://schemas.microsoft.com/office/2016/09/relationships/commentsIds',\n EXTENSIBLE: 'http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible'\n};\n\nexport class CommentsManager {\n private _commentsPart: Part | null = null;\n private _extendedPart: Part | null = null;\n private _idsPart: Part | null = null;\n private _extensiblePart: Part | null = null;\n private _nextId: number | null = null;\n\n constructor(public doc: DocumentObject) {}\n\n public get commentsPart() {\n if (!this._commentsPart) {\n this._commentsPart = this._getOrCreateCommentsPart();\n this._ensureNamespaces();\n }\n return this._commentsPart;\n }\n\n public get extendedPart() {\n if (!this._extendedPart) this._extendedPart = this._getOrCreateExtendedPart();\n return this._extendedPart;\n }\n\n public get idsPart() {\n if (!this._idsPart) this._idsPart = this._getOrCreateIdsPart();\n return this._idsPart;\n }\n\n public get extensiblePart() {\n if (!this._extensiblePart) this._extensiblePart = this._getOrCreateExtensiblePart();\n return this._extensiblePart;\n }\n\n public get nextId(): number {\n if (this._nextId === null) this._nextId = this._getNextCommentId();\n return this._nextId;\n }\n\n public set nextId(value: number) {\n this._nextId = value;\n }\n\n private _getExistingPartByType(contentType: string): Part | null {\n return this.doc.pkg.parts.find(p => p.contentType === contentType) || null;\n }\n\n private _linkPart(part: Part, relType: string): Part {\n for (const rel of this.doc.part.rels.values()) {\n if (!rel.isExternal && rel.target === part.partname.split('/').pop()) {\n return part;\n }\n }\n this.doc.relateTo(part, relType);\n return part;\n }\n\n private _getOrCreateCommentsPart(): Part {\n let part = this._getExistingPartByType(CT.COMMENTS);\n if (part) return this._linkPart(part, RT.COMMENTS);\n\n const partname = this.doc.pkg.nextPartname('/word/comments%d.xml');\n const xml = `<w:comments xmlns:w=\"${NS.w}\" xmlns:w14=\"${NS.w14}\" xmlns:w15=\"${NS.w15}\" xmlns:w16cid=\"${NS.w16cid}\" xmlns:w16cex=\"${NS.w16cex}\" xmlns:mc=\"${NS.mc}\" mc:Ignorable=\"w14 w15 w16cid w16cex\"></w:comments>`;\n part = this.doc.pkg.addPart(partname, CT.COMMENTS, xml);\n this.doc.relateTo(part, RT.COMMENTS);\n return part;\n }\n\n private _getOrCreateExtendedPart(): Part {\n let part = this._getExistingPartByType(CT.EXTENDED);\n if (part) return this._linkPart(part, RT.EXTENDED);\n\n const partname = this.doc.pkg.nextPartname('/word/commentsExtended%d.xml');\n const xml = `<w15:commentsEx xmlns:w15=\"${NS.w15}\"></w15:commentsEx>`;\n part = this.doc.pkg.addPart(partname, CT.EXTENDED, xml);\n this.doc.relateTo(part, RT.EXTENDED);\n return part;\n }\n\n private _getOrCreateIdsPart(): Part {\n let part = this._getExistingPartByType(CT.IDS);\n if (part) return this._linkPart(part, RT.IDS);\n\n const partname = this.doc.pkg.nextPartname('/word/commentsIds%d.xml');\n const xml = `<w16cid:commentsIds xmlns:w16cid=\"${NS.w16cid}\"></w16cid:commentsIds>`;\n part = this.doc.pkg.addPart(partname, CT.IDS, xml);\n this.doc.relateTo(part, RT.IDS);\n return part;\n }\n\n private _getOrCreateExtensiblePart(): Part {\n let part = this._getExistingPartByType(CT.EXTENSIBLE);\n if (part) return this._linkPart(part, RT.EXTENSIBLE);\n\n const partname = this.doc.pkg.nextPartname('/word/commentsExtensible%d.xml');\n const xml = `<w16cex:commentsExtensible xmlns:w16cex=\"${NS.w16cex}\"></w16cex:commentsExtensible>`;\n part = this.doc.pkg.addPart(partname, CT.EXTENSIBLE, xml);\n this.doc.relateTo(part, RT.EXTENSIBLE);\n return part;\n }\n\n private _ensureNamespaces() {\n // In TS we use full xml reconstruction if attributes are missing, but xmldom generally tolerates\n // runtime attributes if the namespace is declared. For absolute safety, if it's completely missing,\n // we would rebuild. Assuming the parser caught them if they existed.\n }\n\n private _getNextCommentId(): number {\n const ids = [0];\n const part = this._getExistingPartByType(CT.COMMENTS);\n if (part) {\n const comments = findAllDescendants(part._element, 'w:comment');\n for (const c of comments) {\n const idStr = c.getAttribute('w:id');\n if (idStr) ids.push(parseInt(idStr, 10) || 0);\n }\n }\n return Math.max(...ids) + 1;\n }\n\n private _generateHexId(): string {\n return Math.floor(Math.random() * 0xFFFFFFFF).toString(16).toUpperCase().padStart(8, '0');\n }\n\n private _getInitials(author: string): string {\n if (!author) return '';\n return author.split(' ').filter(Boolean).map(p => p[0]).join('').toUpperCase();\n }\n\n private _findParaIdForComment(commentId: string): string | null {\n if (!this._commentsPart) return null;\n for (const c of findAllDescendants(this._commentsPart._element, 'w:comment')) {\n if (c.getAttribute('w:id') === commentId) {\n for (const p of findAllDescendants(c, 'w:p')) {\n const pid = p.getAttribute('w14:paraId');\n if (pid) return pid;\n }\n }\n }\n return null;\n }\n\n private _findThreadRootParaId(commentId: string): string | null {\n const directParaId = this._findParaIdForComment(commentId);\n const extPart = this._getExistingPartByType(CT.EXTENDED);\n if (!directParaId || !extPart) return directParaId;\n\n for (let i = 0; i < extPart._element.childNodes.length; i++) {\n const child = extPart._element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n if (child.getAttribute('w15:paraId') === directParaId) {\n const parent = child.getAttribute('w15:paraIdParent');\n if (parent) return parent;\n }\n }\n return directParaId;\n }\n\n public addComment(author: string, text: string, parentId: string | null = null): string {\n const commentId = this.nextId.toString();\n this.nextId++;\n const now = new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n\n const doc = this.commentsPart._element.ownerDocument!;\n const comment = doc.createElement('w:comment');\n comment.setAttribute('w:id', commentId);\n comment.setAttribute('w:author', author);\n comment.setAttribute('w:date', now);\n \n const initials = this._getInitials(author);\n if (initials) comment.setAttribute('w:initials', initials);\n\n const extPart = this._getExistingPartByType(CT.EXTENDED);\n if (parentId && !extPart) {\n comment.setAttribute('w15:p', parentId);\n }\n\n const paraId = this._generateHexId();\n const rsid = this._generateHexId();\n\n const p = doc.createElement('w:p');\n p.setAttribute('w14:paraId', paraId);\n p.setAttribute('w14:textId', '77777777');\n p.setAttribute('w:rsidR', rsid);\n p.setAttribute('w:rsidRDefault', rsid);\n p.setAttribute('w:rsidP', rsid);\n\n const pPr = doc.createElement('w:pPr');\n const pStyle = doc.createElement('w:pStyle');\n pStyle.setAttribute('w:val', 'CommentText');\n pPr.appendChild(pStyle);\n p.appendChild(pPr);\n\n const rRef = doc.createElement('w:r');\n const rPrRef = doc.createElement('w:rPr');\n const rStyleRef = doc.createElement('w:rStyle');\n rStyleRef.setAttribute('w:val', 'CommentReference');\n rPrRef.appendChild(rStyleRef);\n rRef.appendChild(rPrRef);\n rRef.appendChild(doc.createElement('w:annotationRef'));\n p.appendChild(rRef);\n\n const r = doc.createElement('w:r');\n const t = doc.createElement('w:t');\n t.textContent = text;\n r.appendChild(t);\n p.appendChild(r);\n comment.appendChild(p);\n\n this.commentsPart._element.appendChild(comment);\n\n if (this.extendedPart) {\n const parentParaId = parentId ? this._findThreadRootParaId(parentId) : null;\n const exDoc = this.extendedPart._element.ownerDocument!;\n const commentEx = exDoc.createElement('w15:commentEx');\n commentEx.setAttribute('w15:paraId', paraId);\n if (parentParaId) commentEx.setAttribute('w15:paraIdParent', parentParaId);\n commentEx.setAttribute('w15:done', '0');\n this.extendedPart._element.appendChild(commentEx);\n }\n\n if (this.idsPart) {\n const idsDoc = this.idsPart._element.ownerDocument!;\n const commentIdEl = idsDoc.createElement('w16cid:commentId');\n commentIdEl.setAttribute('w16cid:paraId', paraId);\n commentIdEl.setAttribute('w16cid:durableId', this._generateHexId());\n this.idsPart._element.appendChild(commentIdEl);\n }\n\n if (this.extensiblePart) {\n let durableId: string | null = null;\n for (let i = 0; i < this.idsPart._element.childNodes.length; i++) {\n const child = this.idsPart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w16cid:paraId') === paraId) {\n durableId = child.getAttribute('w16cid:durableId');\n break;\n }\n }\n if (durableId) {\n const cexDoc = this.extensiblePart._element.ownerDocument!;\n const extEl = cexDoc.createElement('w16cex:commentExtensible');\n extEl.setAttribute('w16cex:durableId', durableId);\n extEl.setAttribute('w16cex:dateUtc', now);\n this.extensiblePart._element.appendChild(extEl);\n }\n }\n\n return commentId;\n }\n\n public deleteComment(commentId: string) {\n if (!this._commentsPart) return;\n\n let commentEl: Element | null = null;\n for (const c of findAllDescendants(this._commentsPart._element, 'w:comment')) {\n if (c.getAttribute('w:id') === commentId) {\n commentEl = c;\n break;\n }\n }\n\n if (!commentEl) return;\n\n let paraId: string | null = null;\n for (const p of findAllDescendants(commentEl, 'w:p')) {\n const pid = p.getAttribute('w14:paraId');\n if (pid) {\n paraId = pid;\n break;\n }\n }\n\n if (paraId) {\n const repliesToDelete: string[] = [];\n if (this.extendedPart) {\n for (let i = 0; i < this.extendedPart._element.childNodes.length; i++) {\n const child = this.extendedPart._element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n \n if (child.getAttribute('w15:paraIdParent') === paraId) {\n const childParaId = child.getAttribute('w15:paraId');\n if (childParaId) {\n for (const c of findAllDescendants(this._commentsPart._element, 'w:comment')) {\n for (const p of findAllDescendants(c, 'w:p')) {\n if (p.getAttribute('w14:paraId') === childParaId) {\n const cid = c.getAttribute('w:id');\n if (cid) repliesToDelete.push(cid);\n break;\n }\n }\n }\n }\n }\n }\n }\n\n for (const repId of repliesToDelete) {\n this.deleteComment(repId);\n }\n\n let durableId: string | null = null;\n\n if (this.idsPart) {\n const toRemove: Element[] = [];\n for (let i = 0; i < this.idsPart._element.childNodes.length; i++) {\n const child = this.idsPart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w16cid:paraId') === paraId) {\n durableId = child.getAttribute('w16cid:durableId');\n toRemove.push(child);\n }\n }\n toRemove.forEach(c => this.idsPart!._element.removeChild(c));\n }\n\n if (this.extendedPart) {\n const toRemove: Element[] = [];\n for (let i = 0; i < this.extendedPart._element.childNodes.length; i++) {\n const child = this.extendedPart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w15:paraId') === paraId) {\n toRemove.push(child);\n }\n }\n toRemove.forEach(c => this.extendedPart!._element.removeChild(c));\n }\n\n if (durableId && this.extensiblePart) {\n const toRemove: Element[] = [];\n for (let i = 0; i < this.extensiblePart._element.childNodes.length; i++) {\n const child = this.extensiblePart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w16cex:durableId') === durableId) {\n toRemove.push(child);\n }\n }\n toRemove.forEach(c => this.extensiblePart!._element.removeChild(c));\n }\n }\n\n if (commentEl.parentNode) {\n commentEl.parentNode.removeChild(commentEl);\n }\n }\n}\n\n// Keep the global extraction function matching Python behavior\nexport function extract_comments_data(pkg: DocxPackage): Record<string, any> {\n // Temporary bridge to use the new class\n const docObj = {\n pkg,\n part: pkg.mainDocumentPart,\n relateTo: () => {} // Mock since extraction is read-only\n } as unknown as DocumentObject;\n \n const mgr = new CommentsManager(docObj);\n const data: Record<string, any> = {};\n \n const part = pkg.parts.find(p => p.contentType === CT.COMMENTS);\n if (!part) return data;\n\n const para_id_to_cid: Record<string, string> = {};\n const comments = findAllDescendants(part._element, 'w:comment');\n\n for (const c of comments) {\n const c_id = c.getAttribute('w:id');\n if (!c_id) continue;\n\n const c_author = c.getAttribute('w:author') || 'Unknown';\n const c_date = c.getAttribute('w:date') || '';\n \n let is_resolved = false;\n const val = c.getAttribute('w15:done');\n if (val === '1' || val === 'true' || val === 'on') is_resolved = true;\n\n let parent_id = c.getAttribute('w15:p') || null;\n\n const p_elems = findAllDescendants(c, 'w:p');\n for (const p of p_elems) {\n const pid = p.getAttribute('w14:paraId');\n if (pid) para_id_to_cid[pid] = c_id;\n }\n\n const text_parts: string[] = [];\n for (const p of p_elems) {\n const t_elems = findAllDescendants(p, 'w:t');\n for (const t of t_elems) {\n if (t.textContent) text_parts.push(t.textContent);\n }\n text_parts.push('\\n');\n }\n const full_text = text_parts.join('').trim();\n\n data[c_id] = {\n author: c_author,\n text: full_text,\n date: c_date,\n resolved: is_resolved,\n parent_id: parent_id,\n };\n }\n\n const extPart = pkg.parts.find(p => p.contentType === CT.EXTENDED);\n if (extPart) {\n const children = extPart._element.childNodes;\n for (let i = 0; i < children.length; i++) {\n const child = children[i] as Element;\n if (child.nodeType !== 1) continue;\n\n const para_id = child.getAttribute('w15:paraId');\n const parent_para_id = child.getAttribute('w15:paraIdParent');\n const done_val = child.getAttribute('w15:done');\n\n if (para_id) {\n const c_id = para_id_to_cid[para_id];\n if (c_id && data[c_id]) {\n if (parent_para_id) {\n const p_id = para_id_to_cid[parent_para_id];\n if (p_id) data[c_id].parent_id = p_id;\n }\n if (done_val === '1' || done_val === 'true' || done_val === 'on') {\n data[c_id].resolved = true;\n }\n }\n }\n }\n }\n\n return data;\n}","import { qn, findChild, findAllDescendants } from \"../docx/dom.js\";\nimport {\n Paragraph,\n Table,\n Run,\n NotesPart,\n FootnoteItem,\n DocxEvent,\n} from \"../docx/primitives.js\";\n\nexport const QN_W_P = \"w:p\";\nexport const QN_W_R = \"w:r\";\nexport const QN_W_T = \"w:t\";\nexport const QN_W_DELTEXT = \"w:delText\";\nexport const QN_W_TAB = \"w:tab\";\nexport const QN_W_BR = \"w:br\";\nexport const QN_W_CR = \"w:cr\";\nexport const QN_W_RPR = \"w:rPr\";\nexport const QN_W_RPRCHANGE = \"w:rPrChange\";\nexport const QN_W_COMMENTREFERENCE = \"w:commentReference\";\nexport const QN_W_FOOTNOTEREFERENCE = \"w:footnoteReference\";\nexport const QN_W_ENDNOTEREFERENCE = \"w:endnoteReference\";\nexport const QN_W_FLDCHAR = \"w:fldChar\";\nexport const QN_W_FLDCHARTYPE = \"w:fldCharType\";\nexport const QN_W_INSTRTEXT = \"w:instrText\";\nexport const QN_W_INS = \"w:ins\";\nexport const QN_W_DEL = \"w:del\";\nexport const QN_W_ID = \"w:id\";\nexport const QN_W_AUTHOR = \"w:author\";\nexport const QN_W_DATE = \"w:date\";\nexport const QN_W_COMMENTRANGESTART = \"w:commentRangeStart\";\nexport const QN_W_COMMENTRANGEEND = \"w:commentRangeEnd\";\nexport const QN_W_HYPERLINK = \"w:hyperlink\";\nexport const QN_R_ID = \"r:id\";\nexport const QN_W_FLDSIMPLE = \"w:fldSimple\";\nexport const QN_W_INSTR = \"w:instr\";\nexport const QN_W_BOOKMARKSTART = \"w:bookmarkStart\";\nexport const QN_W_NAME = \"w:name\";\nexport const QN_W_SDT = \"w:sdt\";\nexport const QN_W_SMARTTAG = \"w:smartTag\";\nexport const QN_W_SDTCONTENT = \"w:sdtContent\";\nexport const QN_W_B = \"w:b\";\nexport const QN_W_I = \"w:i\";\nexport const QN_W_VAL = \"w:val\";\nexport const QN_W_PPR = \"w:pPr\";\nexport const QN_W_PSTYLE = \"w:pStyle\";\nexport const QN_W_OUTLINELVL = \"w:outlineLvl\";\nexport const QN_W_NUMPR = \"w:numPr\";\nexport const QN_W_NUMID = \"w:numId\";\nexport const QN_W_ILVL = \"w:ilvl\";\n\nconst _CUSTOM_HEADING_NAME_RE = /Heading[ ]?([1-6])(?![0-9])/;\n\nexport function _get_style_cache(\n part: any,\n): [Record<string, any>, string | null] {\n const pkg = part.package || part.pkg || (part.part ? part.part.pkg : null);\n if (pkg && pkg._adeu_style_cache) {\n return pkg._adeu_style_cache;\n }\n\n const cache: Record<string, any> = {};\n let default_pstyle: string | null = null;\n const raw_styles: Record<string, any> = {};\n\n const stylesPart = pkg?.getPartByPath(\"word/styles.xml\");\n if (!stylesPart) {\n const result: [Record<string, any>, string | null] = [cache, null];\n if (pkg) pkg._adeu_style_cache = result;\n return result;\n }\n\n const styles = findAllDescendants(stylesPart._element, \"w:style\");\n for (const s of styles) {\n const s_id = s.getAttribute(\"w:styleId\");\n if (!s_id) continue;\n\n const s_type = s.getAttribute(\"w:type\");\n const is_default =\n s.getAttribute(\"w:default\") === \"1\" ||\n s.getAttribute(\"w:default\") === \"true\";\n\n if (s_type === \"paragraph\" && is_default) default_pstyle = s_id;\n\n const name_el = findChild(s, \"w:name\");\n let name = name_el ? name_el.getAttribute(\"w:val\") : s_id;\n\n if (name && typeof name === \"string\") {\n if (name.toLowerCase().startsWith(\"heading\")) {\n name = name.replace(/^heading/i, \"Heading\");\n } else if (name.toLowerCase() === \"title\") {\n name = \"Title\";\n }\n }\n\n const based_on_el = findChild(s, \"w:basedOn\");\n const based_on = based_on_el ? based_on_el.getAttribute(\"w:val\") : null;\n\n let outline_lvl: number | null = null;\n const pPr = findChild(s, \"w:pPr\");\n if (pPr) {\n const oLvl = findChild(pPr, \"w:outlineLvl\");\n if (oLvl) {\n const val = oLvl.getAttribute(\"w:val\");\n if (val && /^\\d+$/.test(val)) outline_lvl = parseInt(val, 10);\n }\n }\n\n let bold: boolean | null = null;\n const rPr = findChild(s, \"w:rPr\");\n if (rPr) {\n const b = findChild(rPr, \"w:b\");\n if (b) {\n const val = b.getAttribute(\"w:val\");\n bold = val !== \"0\" && val !== \"false\" && val !== \"off\";\n }\n }\n\n raw_styles[s_id] = { name, based_on, outline_level: outline_lvl, bold };\n }\n\n const resolve_style = (s_id: string, visited: Set<string>): any => {\n if (cache[s_id]) return cache[s_id];\n if (visited.has(s_id) || !raw_styles[s_id])\n return { name: s_id, outline_level: null, bold: false };\n\n visited.add(s_id);\n const raw = raw_styles[s_id];\n const based_on_id = raw.based_on;\n\n let o_lvl = raw.outline_level;\n let bold_val = raw.bold !== null ? raw.bold : false;\n\n if (based_on_id) {\n const parent = resolve_style(based_on_id, visited);\n if (o_lvl === null) o_lvl = parent.outline_level;\n if (raw.bold === null) bold_val = parent.bold;\n }\n\n const resolved = { name: raw.name, outline_level: o_lvl, bold: bold_val };\n cache[s_id] = resolved;\n return resolved;\n };\n\n for (const s_id in raw_styles) resolve_style(s_id, new Set());\n\n const result: [Record<string, any>, string | null] = [cache, default_pstyle];\n if (pkg) pkg._adeu_style_cache = result;\n return result;\n}\n\nfunction _detect_heading_level_from_name(name: string): number | null {\n if (!name) return null;\n const match = name.match(_CUSTOM_HEADING_NAME_RE);\n return match ? parseInt(match[1], 10) : null;\n}\n\nexport function is_native_heading(\n paragraph: Paragraph,\n style_cache?: Record<string, any>,\n default_pstyle?: string | null,\n): boolean {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(\n paragraph._parent.part || paragraph._parent,\n );\n }\n const pPr = findChild(paragraph._element, QN_W_PPR);\n\n if (pPr) {\n const oLvl = findChild(pPr, QN_W_OUTLINELVL);\n if (oLvl) {\n const val = oLvl.getAttribute(QN_W_VAL);\n if (val && /^\\d+$/.test(val)) {\n const lvl = parseInt(val, 10);\n if (lvl >= 0 && lvl <= 8) return true;\n }\n }\n }\n\n let style_id = default_pstyle;\n if (pPr) {\n const pStyle = findChild(pPr, QN_W_PSTYLE);\n if (pStyle) style_id = pStyle.getAttribute(QN_W_VAL) || default_pstyle;\n }\n\n const style_info = style_id && style_cache ? style_cache[style_id] : null;\n if (\n style_info &&\n style_info.outline_level !== null &&\n style_info.outline_level >= 0 &&\n style_info.outline_level <= 8\n ) {\n return true;\n }\n\n let style_name = style_info ? style_info.name : style_id; // FALLBACK TO ID\n if (style_name && typeof style_name === \"string\" && style_name.toLowerCase().startsWith(\"heading\")) {\n style_name = style_name.replace(/^heading/i, \"Heading\");\n }\n if (style_name?.startsWith(\"Heading\")) return true;\n if (style_name === \"Title\") return true;\n if (style_name && style_name !== \"Normal\") {\n if (_detect_heading_level_from_name(style_name) !== null) return true;\n }\n\n return false;\n}\nexport function get_paragraph_prefix(\n paragraph: Paragraph,\n style_cache?: Record<string, any>,\n default_pstyle?: string | null,\n): string {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(\n paragraph._parent.part || paragraph._parent,\n );\n }\n const pPr = findChild(paragraph._element, QN_W_PPR);\n\n if (pPr) {\n const oLvl = findChild(pPr, QN_W_OUTLINELVL);\n if (oLvl) {\n const val = oLvl.getAttribute(QN_W_VAL);\n if (val && /^\\d+$/.test(val)) {\n const lvl = parseInt(val, 10);\n if (lvl >= 0 && lvl <= 8) return \"#\".repeat(lvl + 1) + \" \";\n }\n }\n }\n\n let style_id = default_pstyle;\n if (pPr) {\n const pStyle = findChild(pPr, QN_W_PSTYLE);\n if (pStyle) style_id = pStyle.getAttribute(QN_W_VAL) || default_pstyle;\n }\n\n const style_info = style_id && style_cache ? style_cache[style_id] : null;\n if (\n style_info &&\n style_info.outline_level !== null &&\n style_info.outline_level >= 0 &&\n style_info.outline_level <= 8\n ) {\n return \"#\".repeat(style_info.outline_level + 1) + \" \";\n }\n\n let style_name = style_info ? style_info.name : style_id; // FALLBACK TO ID\n if (style_name && typeof style_name === \"string\" && style_name.toLowerCase().startsWith(\"heading\")) {\n style_name = style_name.replace(/^heading/i, \"Heading\");\n }\n if (style_name?.startsWith(\"Heading\")) {\n const match = style_name.replace(\"Heading\", \"\").trim();\n if (/^\\d+$/.test(match)) return \"#\".repeat(parseInt(match, 10)) + \" \";\n }\n\n if (style_name === \"Title\") return \"# \";\n\n if (pPr) {\n const numPr = findChild(pPr, QN_W_NUMPR);\n if (numPr) {\n const numId = findChild(numPr, QN_W_NUMID);\n if (numId && numId.getAttribute(QN_W_VAL) !== \"0\") {\n let level = 0;\n const ilvl = findChild(numPr, QN_W_ILVL);\n if (ilvl) {\n const valAttr = ilvl.getAttribute(QN_W_VAL);\n if (valAttr) level = parseInt(valAttr, 10) || 0;\n }\n return \" \".repeat(level) + \"* \";\n }\n }\n }\n\n if (style_name && style_name !== \"Normal\") {\n const custom_level = _detect_heading_level_from_name(style_name);\n if (custom_level !== null) return \"#\".repeat(custom_level) + \" \";\n }\n\n if (!style_name || style_name === \"Normal\") {\n const text = paragraph.text.trim();\n if (text && text.length < 100 && text === text.toUpperCase()) {\n let is_bold = false;\n if (style_info?.bold) {\n is_bold = true;\n } else {\n const runs = findAllDescendants(paragraph._element, QN_W_R);\n for (const r of runs) {\n const tList = findAllDescendants(r, QN_W_T);\n const tText = tList.map((t) => t.textContent || \"\").join(\"\");\n if (tText.trim()) {\n const rPr_run = findChild(r, QN_W_RPR);\n if (rPr_run) {\n const b = findChild(rPr_run, QN_W_B);\n if (\n b &&\n b.getAttribute(QN_W_VAL) !== \"0\" &&\n b.getAttribute(QN_W_VAL) !== \"false\"\n ) {\n is_bold = true;\n }\n }\n break;\n }\n }\n }\n if (is_bold) return \"## \";\n }\n }\n\n return \"\";\n}\n\nexport function is_heading_paragraph(\n paragraph: Paragraph,\n style_cache?: Record<string, any>,\n default_pstyle?: string | null,\n): boolean {\n const prefix = get_paragraph_prefix(paragraph, style_cache, default_pstyle);\n if (!prefix) return false;\n const stripped = prefix.trimEnd();\n return stripped.length > 0 && stripped === \"#\".repeat(stripped.length);\n}\n\nexport function get_run_style_markers(\n run: Run,\n is_heading: boolean | null = null,\n): [string, string] {\n let prefix = \"\";\n let suffix = \"\";\n\n const rPr = findChild(run._element, QN_W_RPR);\n let is_bold = false;\n let is_italic = false;\n\n if (rPr) {\n const b = findChild(rPr, QN_W_B);\n if (\n b &&\n b.getAttribute(QN_W_VAL) !== \"0\" &&\n b.getAttribute(QN_W_VAL) !== \"false\"\n )\n is_bold = true;\n\n const i = findChild(rPr, QN_W_I);\n if (\n i &&\n i.getAttribute(QN_W_VAL) !== \"0\" &&\n i.getAttribute(QN_W_VAL) !== \"false\"\n )\n is_italic = true;\n }\n\n if (is_heading === null) {\n const parent = run._parent;\n is_heading =\n parent instanceof Paragraph ? is_native_heading(parent) : false;\n }\n\n if (is_bold && !is_heading) {\n prefix += \"**\";\n suffix = \"**\" + suffix;\n }\n\n if (is_italic) {\n prefix += \"_\";\n suffix = \"_\" + suffix;\n }\n\n return [prefix, suffix];\n}\n\nexport function apply_formatting_to_segments(\n text: string,\n prefix: string,\n suffix: string,\n): string {\n if (!prefix && !suffix) return text;\n if (!text) return \"\";\n if (!text.includes(\"\\n\")) return `${prefix}${text}${suffix}`;\n\n const parts = text.split(\"\\n\");\n return parts.map((p) => (p ? `${prefix}${p}${suffix}` : \"\")).join(\"\\n\");\n}\n\nexport function get_run_text(run: Run): string {\n let text = \"\";\n for (let i = 0; i < run._element.childNodes.length; i++) {\n const child = run._element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n if (child.tagName === QN_W_T || child.tagName === QN_W_DELTEXT) {\n const raw = child.textContent || \"\";\n text += raw.replace(/\\t/g, \" \");\n } else if (child.tagName === QN_W_TAB) {\n text += \" \";\n } else if (child.tagName === QN_W_BR || child.tagName === QN_W_CR) {\n text += \"\\n\";\n }\n }\n return text;\n}\n\nexport function* iter_block_items(\n parent: any,\n): Generator<Paragraph | Table | FootnoteItem> {\n const parent_elm = parent._element || parent.element || parent;\n\n if (parent.constructor.name === \"NotesPart\") {\n const tag = parent.note_type === \"fn\" ? \"w:footnote\" : \"w:endnote\";\n const notes = findAllDescendants(parent_elm, tag);\n for (const child of notes) {\n if (\n child.getAttribute(\"w:type\") === \"separator\" ||\n child.getAttribute(\"w:type\") === \"continuationSeparator\"\n )\n continue;\n yield new FootnoteItem(child, parent, parent.note_type);\n }\n return;\n }\n\n for (let i = 0; i < parent_elm.childNodes.length; i++) {\n const child = parent_elm.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n if (child.tagName === QN_W_P) {\n yield new Paragraph(child, parent);\n } else if (child.tagName === \"w:tbl\") {\n yield new Table(child, parent);\n }\n }\n}\n\nexport function* iter_document_parts(doc: any): Generator<any> {\n // 1. Headers\n const headers = doc.pkg.parts.filter(\n (p: any) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\",\n );\n for (const h of headers) yield h;\n\n // 2. Main Document Body\n yield doc;\n\n // 3. Footers\n const footers = doc.pkg.parts.filter(\n (p: any) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\",\n );\n for (const f of footers) yield f;\n\n // 4. Notes\n const fnPart = doc.pkg.getPartByPath(\"word/footnotes.xml\");\n const enPart = doc.pkg.getPartByPath(\"word/endnotes.xml\");\n\n if (fnPart) yield new NotesPart(fnPart, \"fn\");\n if (enPart) yield new NotesPart(enPart, \"en\");\n}\n\nfunction _is_page_instr(instr: string): boolean {\n if (!instr) return false;\n const parts = instr.toUpperCase().trim().split(/\\s+/);\n return parts.length > 0 && (parts[0] === \"PAGE\" || parts[0] === \"NUMPAGES\");\n}\n\nexport function _get_part(parent: any): any {\n if (!parent) return null;\n if (parent.part) return parent.part;\n if (parent.pkg && parent.pkg.mainDocumentPart)\n return parent.pkg.mainDocumentPart;\n if (parent._parent) return _get_part(parent._parent);\n return null;\n}\n\nexport function* iter_paragraph_content(\n paragraph: Paragraph,\n): Generator<Run | DocxEvent> {\n let in_complex_field = false;\n let current_instr = \"\";\n let hide_result = false;\n\n function* process_run_element(\n r_element: Element,\n ): Generator<Run | DocxEvent> {\n let c_id: string | null = null;\n const rPr = findChild(r_element, QN_W_RPR);\n if (rPr) {\n const rPrChange = findChild(rPr, QN_W_RPRCHANGE);\n if (rPrChange) {\n c_id = rPrChange.getAttribute(QN_W_ID);\n yield {\n type: \"fmt_start\",\n id: c_id!,\n author: rPrChange.getAttribute(QN_W_AUTHOR) || undefined,\n date: rPrChange.getAttribute(QN_W_DATE) || undefined,\n };\n }\n }\n\n for (let i = 0; i < r_element.childNodes.length; i++) {\n const child = r_element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n const tag = child.tagName;\n if (tag === QN_W_COMMENTREFERENCE) {\n const ref_id = child.getAttribute(QN_W_ID);\n if (ref_id) yield { type: \"ref\", id: ref_id };\n } else if (tag === QN_W_FOOTNOTEREFERENCE) {\n const f_id = child.getAttribute(QN_W_ID);\n if (f_id) yield { type: \"footnote\", id: f_id };\n } else if (tag === QN_W_ENDNOTEREFERENCE) {\n const e_id = child.getAttribute(QN_W_ID);\n if (e_id) yield { type: \"endnote\", id: e_id };\n } else if (tag === QN_W_FLDCHAR) {\n const fld_type = child.getAttribute(QN_W_FLDCHARTYPE);\n if (fld_type === \"begin\") {\n in_complex_field = true;\n current_instr = \"\";\n } else if (fld_type === \"separate\") {\n if (_is_page_instr(current_instr)) hide_result = true;\n else {\n const parts = current_instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === \"REF\")\n yield { type: \"xref_start\", id: parts[1] };\n }\n } else if (fld_type === \"end\") {\n if (!hide_result) {\n const parts = current_instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === \"REF\")\n yield { type: \"xref_end\", id: parts[1] };\n }\n in_complex_field = false;\n current_instr = \"\";\n hide_result = false;\n }\n } else if (tag === QN_W_INSTRTEXT && in_complex_field && !hide_result) {\n current_instr += child.textContent || \"\";\n }\n }\n\n if (!hide_result) yield new Run(r_element, paragraph);\n if (c_id !== null) yield { type: \"fmt_end\", id: c_id };\n }\n\n function* traverse_node(node: Element): Generator<Run | DocxEvent> {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n const tag = child.tagName;\n if (tag === QN_W_R) yield* process_run_element(child);\n else if (tag === QN_W_INS) {\n const i_id = child.getAttribute(QN_W_ID)!;\n yield {\n type: \"ins_start\",\n id: i_id,\n author: child.getAttribute(QN_W_AUTHOR) || undefined,\n date: child.getAttribute(QN_W_DATE) || undefined,\n };\n yield* traverse_node(child);\n yield { type: \"ins_end\", id: i_id };\n } else if (tag === QN_W_DEL) {\n const d_id = child.getAttribute(QN_W_ID)!;\n yield {\n type: \"del_start\",\n id: d_id,\n author: child.getAttribute(QN_W_AUTHOR) || undefined,\n date: child.getAttribute(QN_W_DATE) || undefined,\n };\n yield* traverse_node(child);\n yield { type: \"del_end\", id: d_id };\n } else if (tag === QN_W_COMMENTRANGESTART)\n yield { type: \"start\", id: child.getAttribute(QN_W_ID)! };\n else if (tag === QN_W_COMMENTRANGEEND)\n yield { type: \"end\", id: child.getAttribute(QN_W_ID)! };\n else if (tag === QN_W_HYPERLINK) {\n const rId = child.getAttribute(QN_R_ID) || child.getAttribute(\"id\");\n let url = \"\";\n const part = _get_part(paragraph._parent);\n if (rId && part) {\n const rel = part.rels.get(rId);\n if (rel && rel.isExternal) url = rel.target;\n }\n if (url) yield { type: \"hyperlink_start\", id: rId!, date: url };\n yield* traverse_node(child);\n if (url) yield { type: \"hyperlink_end\", id: rId!, date: url };\n } else if (tag === QN_W_FLDSIMPLE) {\n const instr = child.getAttribute(QN_W_INSTR) || \"\";\n const parts = instr.trim().split(/\\s+/);\n const target = parts.length > 1 && parts[0] === \"REF\" ? parts[1] : \"\";\n if (target) yield { type: \"xref_start\", id: target };\n yield* traverse_node(child);\n if (target) yield { type: \"xref_end\", id: target };\n } else if (tag === QN_W_BOOKMARKSTART) {\n const b_name = child.getAttribute(QN_W_NAME);\n if (b_name && (!b_name.startsWith(\"_\") || b_name.startsWith(\"_Ref\")))\n yield { type: \"bookmark\", id: b_name };\n } else if (\n tag === QN_W_SDT ||\n tag === QN_W_SMARTTAG ||\n tag === QN_W_SDTCONTENT\n ) {\n yield* traverse_node(child);\n }\n }\n }\n\n yield* traverse_node(paragraph._element);\n}\n","import { DocumentObject } from './docx/bridge.js';\nimport { Paragraph, Table, Run, DocxEvent } from './docx/primitives.js';\nimport { findAllDescendants, findChild } from './docx/dom.js';\nimport { extract_comments_data } from './comments.js';\nimport {\n _get_style_cache,\n get_paragraph_prefix,\n get_run_style_markers,\n get_run_text,\n is_heading_paragraph,\n is_native_heading,\n iter_block_items,\n iter_document_parts,\n iter_paragraph_content,\n} from './utils/docx.js';\n\nexport interface TextSpan {\n start: number;\n end: number;\n text: string;\n run: Run | null;\n paragraph: Paragraph | null;\n ins_id?: string | null;\n del_id?: string | null;\n hyperlink_id?: string | null;\n}\n\nexport function renumber_snapshot_ids(doc: DocumentObject): [Record<string, string>, Record<string, string>] {\n const chg_remap: Record<string, string> = {};\n let next_chg = 1;\n const body_root = doc.element;\n\n const chg_elements: Element[] = [];\n const all_elements = findAllDescendants(body_root, '*');\n for (const el of all_elements) {\n if (el.tagName === 'w:ins' || el.tagName === 'w:del') {\n chg_elements.push(el);\n }\n }\n\n for (const elem of chg_elements) {\n const old_id = elem.getAttribute('w:id');\n if (!old_id) continue;\n if (chg_remap[old_id]) {\n elem.setAttribute('w:id', chg_remap[old_id]);\n continue;\n }\n const new_id = next_chg.toString();\n chg_remap[old_id] = new_id;\n elem.setAttribute('w:id', new_id);\n next_chg++;\n }\n\n const com_remap: Record<string, string> = {};\n let next_com = 1;\n const comments_part = doc.pkg.parts.find(p => p.contentType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml');\n\n if (comments_part) {\n const comments_root = comments_part._element;\n for (const c of findAllDescendants(comments_root, 'w:comment')) {\n const old_id = c.getAttribute('w:id');\n if (!old_id) continue;\n if (com_remap[old_id]) {\n c.setAttribute('w:id', com_remap[old_id]);\n continue;\n }\n const new_id = next_com.toString();\n com_remap[old_id] = new_id;\n c.setAttribute('w:id', new_id);\n next_com++;\n }\n }\n\n for (const elem of all_elements) {\n if (['w:commentReference', 'w:commentRangeStart', 'w:commentRangeEnd'].includes(elem.tagName)) {\n const old_id = elem.getAttribute('w:id');\n if (old_id && com_remap[old_id]) {\n elem.setAttribute('w:id', com_remap[old_id]);\n }\n }\n }\n\n if (comments_part) {\n for (const c of findAllDescendants(comments_part._element, 'w:comment')) {\n const parent_id = c.getAttribute('w15:p');\n if (parent_id && com_remap[parent_id]) {\n c.setAttribute('w15:p', com_remap[parent_id]);\n }\n }\n }\n\n return [chg_remap, com_remap];\n}\n\nexport class DocumentMapper {\n public doc: DocumentObject;\n public clean_view: boolean;\n public comments_map: Record<string, any>;\n public full_text: string = '';\n public spans: TextSpan[] = [];\n public appendix_start_index: number = -1;\n private _text_chunks: string[] = [];\n\n constructor(doc: DocumentObject, clean_view: boolean = false) {\n this.doc = doc;\n this.clean_view = clean_view;\n this.comments_map = extract_comments_data(doc.pkg);\n this._build_map();\n }\n\n private _build_map() {\n let current_offset = 0;\n this.spans = [];\n this._text_chunks = [];\n this.full_text = '';\n\n for (const part of iter_document_parts(this.doc)) {\n current_offset = this._map_blocks(part, current_offset);\n\n if (this.spans.length > 0 && this.spans[this.spans.length - 1].text !== '\\n\\n') {\n this._add_virtual_text('\\n\\n', current_offset, null);\n current_offset += 2;\n }\n }\n\n while (this.spans.length > 0 && this.spans[this.spans.length - 1].text === '\\n\\n') {\n this.spans.pop();\n this._text_chunks.pop();\n }\n\n this.full_text = this._text_chunks.join('');\n this.appendix_start_index = -1;\n }\n\n private _map_blocks(container: any, offset: number): number {\n let current = offset;\n const c_type = container.constructor.name;\n const part = container.part || container;\n const [style_cache, default_pstyle] = _get_style_cache(part);\n\n if (c_type === 'NotesPart') {\n const header = container.note_type === 'fn' ? '## Footnotes' : '## Endnotes';\n const sep = `---\\n${header}`;\n this._add_virtual_text(sep, current, null);\n current += sep.length;\n this._add_virtual_text('\\n\\n', current, null);\n current += 2;\n }\n\n let is_first_para = true;\n let previous_item: any = null;\n\n for (const item of iter_block_items(container)) {\n const i_type = item.constructor.name;\n\n if (i_type === 'FootnoteItem') {\n current = this._map_blocks(item, current);\n } else if (item instanceof Paragraph) {\n if (!is_first_para) {\n const prev_para = previous_item instanceof Paragraph ? previous_item : null;\n this._add_virtual_text('\\n\\n', current, prev_para);\n current += 2;\n }\n\n let prefix = get_paragraph_prefix(item, style_cache, default_pstyle);\n if (is_first_para && c_type === 'FootnoteItem') {\n prefix = `[^${container.note_type}-${container.id}]: ` + prefix;\n }\n if (prefix) {\n this._add_virtual_text(prefix, current, item);\n current += prefix.length;\n }\n\n current = this._map_paragraph_content(item, current, style_cache, default_pstyle);\n is_first_para = false;\n previous_item = item;\n } else if (item instanceof Table) {\n if (!is_first_para) {\n const prev_para = previous_item instanceof Paragraph ? previous_item : null;\n this._add_virtual_text('\\n\\n', current, prev_para);\n current += 2;\n }\n current = this._map_table(item, current);\n is_first_para = false;\n previous_item = item;\n }\n }\n\n return current;\n }\n\n private _map_table(table: Table, offset: number): number {\n let current = offset;\n let rows_processed = 0;\n\n for (const row of table.rows) {\n const tr = row._element;\n const trPr = findChild(tr, 'w:trPr');\n const ins = trPr ? findChild(trPr, 'w:ins') : null;\n const del_node = trPr ? findChild(trPr, 'w:del') : null;\n\n if (this.clean_view && del_node) continue;\n\n if (rows_processed > 0) {\n this._add_virtual_text('\\n', current, null);\n current += 1;\n }\n\n if (ins && !this.clean_view) {\n this._add_virtual_text('{++ ', current, null);\n current += 4;\n } else if (del_node && !this.clean_view) {\n this._add_virtual_text('{-- ', current, null);\n current += 4;\n }\n\n const seen_cells = new Set();\n let cells_processed = 0;\n\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n if (cells_processed > 0) {\n this._add_virtual_text(' | ', current, null);\n current += 3;\n }\n\n current = this._map_blocks(cell, current);\n cells_processed += 1;\n }\n\n if (ins && !this.clean_view) {\n const suffix = ` |Chg:${ins.getAttribute('w:id')}++}`;\n this._add_virtual_text(suffix, current, null);\n current += suffix.length;\n } else if (del_node && !this.clean_view) {\n const suffix = ` |Chg:${del_node.getAttribute('w:id')}--}`;\n this._add_virtual_text(suffix, current, null);\n current += suffix.length;\n }\n\n rows_processed += 1;\n }\n\n return current;\n }\n\n private _strip_markdown_formatting(text: string): string {\n let result = text;\n result = result.replace(/^#+\\s*/gm, '');\n result = result.replace(/\\*\\*(\\w[\\w\\s]*\\w|\\w{2,})\\*\\*/g, '$1');\n result = result.replace(/__(\\w[\\w\\s]*\\w|\\w{2,})__/g, '$1');\n result = result.replace(/(?<!\\w)_(\\w[\\w\\s]*\\w|\\w{2,})_(?!\\w)/g, '$1');\n result = result.replace(/(?<!\\w)\\*(\\w[\\w\\s]*\\w|\\w{2,})\\*(?!\\w)/g, '$1');\n return result;\n }\n\n private _map_paragraph_content(\n paragraph: Paragraph,\n start_offset: number,\n style_cache?: any,\n default_pstyle?: string | null\n ): number {\n let current = start_offset;\n\n const span: TextSpan = { start: current, end: current, text: '', run: null, paragraph };\n this.spans.push(span);\n\n const active_ids = new Set<string>();\n const active_ins: Record<string, DocxEvent> = {};\n const active_del: Record<string, DocxEvent> = {};\n const active_fmt: Record<string, DocxEvent> = {};\n\n let deferred_meta_states: any[] = [];\n let current_wrappers: [string, string] = ['', ''];\n let current_style: [string, string] = ['', ''];\n let active_hyperlink_id: string | null = null;\n let pending_runs: [string, string, Run | null, string | null, string | null][] = [];\n\n const flush_pending_runs = () => {\n if (pending_runs.length === 0) return;\n const [s_tok, e_tok] = current_wrappers;\n if (s_tok) {\n this._add_virtual_text(s_tok, current, paragraph);\n current += s_tok.length;\n }\n for (const [kind, txt, r_obj, i_id, d_id] of pending_runs) {\n if (kind === 'virtual') {\n this._add_virtual_text(txt, current, paragraph, active_hyperlink_id);\n } else {\n const s: TextSpan = {\n start: current, end: current + txt.length, text: txt,\n run: r_obj, paragraph, ins_id: i_id || undefined, del_id: d_id || undefined,\n hyperlink_id: active_hyperlink_id || undefined\n };\n this.spans.push(s);\n this._text_chunks.push(txt);\n }\n current += txt.length;\n }\n if (e_tok) {\n this._add_virtual_text(e_tok, current, paragraph);\n current += e_tok.length;\n }\n pending_runs = [];\n };\n\n const items = Array.from(iter_paragraph_content(paragraph));\n const is_heading = is_heading_paragraph(paragraph, style_cache, default_pstyle);\n const native_heading = is_native_heading(paragraph, style_cache, default_pstyle);\n let leading_strip_active = is_heading;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n if (item instanceof Run) {\n const [prefix, suffix] = get_run_style_markers(item, native_heading);\n const run_parts: [string, string, Run | null][] = [];\n const text = get_run_text(item);\n\n if (leading_strip_active) {\n if (text === '' || /^\\s*$/.test(text)) continue;\n leading_strip_active = false;\n }\n\n if (text.includes('\\n') && (prefix || suffix)) {\n const parts = text.split('\\n');\n for (let idx = 0; idx < parts.length; idx++) {\n if (idx > 0) run_parts.push(['real', '\\n', item]);\n if (parts[idx]) {\n if (prefix) run_parts.push(['virtual', prefix, null]);\n run_parts.push(['real', parts[idx], item]);\n if (suffix) run_parts.push(['virtual', suffix, null]);\n }\n }\n } else {\n if (prefix) run_parts.push(['virtual', prefix, null]);\n if (text) run_parts.push(['real', text, item]);\n if (suffix) run_parts.push(['virtual', suffix, null]);\n }\n\n if (this.clean_view && Object.keys(active_del).length > 0) {\n // pass\n }\n\n const full_seg_text = run_parts.map(x => x[1]).join('');\n const curr_ins_id = Object.keys(active_ins).pop() || null;\n const curr_del_id = Object.keys(active_del).pop() || null;\n\n if (full_seg_text && !(this.clean_view && curr_del_id)) {\n const new_wrappers = this.clean_view ? ['', ''] as [string, string] : this._get_wrappers(curr_ins_id, curr_del_id, active_ids, active_fmt);\n const new_style: [string, string] = [prefix, suffix];\n\n if (pending_runs.length > 0 && new_wrappers[0] === current_wrappers[0] && new_wrappers[1] === current_wrappers[1]) {\n let skip_leading_prefix = false;\n if (new_style[0] === current_style[0] && new_style[1] === current_style[1] && current_style[0] !== '' &&\n pending_runs[pending_runs.length - 1][0] === 'virtual' &&\n pending_runs[pending_runs.length - 1][1] === current_style[1]) {\n pending_runs.pop();\n skip_leading_prefix = true;\n }\n\n for (const [kind, txt, r_obj] of run_parts) {\n if (skip_leading_prefix && kind === 'virtual' && txt === new_style[0]) {\n skip_leading_prefix = false;\n continue;\n }\n pending_runs.push([kind, txt, r_obj, curr_ins_id, curr_del_id]);\n }\n current_style = new_style;\n } else {\n flush_pending_runs();\n current_wrappers = new_wrappers;\n current_style = new_style;\n for (const [kind, txt, r_obj] of run_parts) {\n pending_runs.push([kind, txt, r_obj, curr_ins_id, curr_del_id]);\n }\n }\n }\n\n if (!this.clean_view) {\n const has_meta = Object.keys(active_ins).length > 0 || Object.keys(active_del).length > 0 || active_ids.size > 0 || Object.keys(active_fmt).length > 0;\n if (has_meta) {\n deferred_meta_states.push([{...active_ins}, {...active_del}, new Set(active_ids), {...active_fmt}]);\n }\n\n let should_defer = false;\n const is_redline = curr_ins_id !== null || curr_del_id !== null || Object.keys(active_fmt).length > 0;\n\n if (is_redline) {\n let j = i + 1;\n let next_is_redline = false;\n let temp_ins_count = Object.keys(active_ins).length;\n let temp_del_count = Object.keys(active_del).length;\n let temp_fmt_count = Object.keys(active_fmt).length;\n\n while (j < items.length) {\n const next_item = items[j];\n if (next_item instanceof Run) {\n if (!get_run_text(next_item)) {\n j++; continue;\n }\n if (temp_ins_count > 0 || temp_del_count > 0 || temp_fmt_count > 0) {\n next_is_redline = true;\n }\n break;\n } else {\n const ev = next_item as DocxEvent;\n if (ev.type === 'ins_start') temp_ins_count++;\n else if (ev.type === 'ins_end') temp_ins_count = Math.max(0, temp_ins_count - 1);\n else if (ev.type === 'del_start') temp_del_count++;\n else if (ev.type === 'del_end') temp_del_count = Math.max(0, temp_del_count - 1);\n else if (ev.type === 'fmt_start') temp_fmt_count++;\n else if (ev.type === 'fmt_end') temp_fmt_count = Math.max(0, temp_fmt_count - 1);\n }\n j++;\n }\n\n if (next_is_redline) should_defer = true;\n }\n\n if (!should_defer && deferred_meta_states.length > 0) {\n const meta_block = this._build_merged_meta_block(deferred_meta_states);\n if (meta_block) {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const full_meta = `{>>${meta_block}<<}`;\n this._add_virtual_text(full_meta, current, paragraph);\n current += full_meta.length;\n }\n deferred_meta_states = [];\n }\n }\n } else {\n const ev = item as DocxEvent;\n leading_strip_active = false;\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n\n if (ev.type === 'start') active_ids.add(ev.id);\n else if (ev.type === 'end') active_ids.delete(ev.id);\n else if (ev.type === 'ins_start') active_ins[ev.id] = ev;\n else if (ev.type === 'ins_end') delete active_ins[ev.id];\n else if (ev.type === 'del_start') active_del[ev.id] = ev;\n else if (ev.type === 'del_end') delete active_del[ev.id];\n else if (ev.type === 'fmt_start') active_fmt[ev.id] = ev;\n else if (ev.type === 'fmt_end') delete active_fmt[ev.id];\n else if (ev.type === 'footnote' || ev.type === 'endnote') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const prefix_str = ev.type === 'footnote' ? 'fn' : 'en';\n const txt = `[^${prefix_str}-${ev.id}]`;\n this._add_virtual_text(txt, current, paragraph);\n current += txt.length;\n } else if (ev.type === 'hyperlink_start') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n this._add_virtual_text('[', current, paragraph, ev.id);\n current += 1;\n active_hyperlink_id = ev.id;\n } else if (ev.type === 'hyperlink_end') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const txt = `](${ev.date})`;\n this._add_virtual_text(txt, current, paragraph, ev.id);\n current += txt.length;\n active_hyperlink_id = null;\n } else if (ev.type === 'xref_start') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n this._add_virtual_text('[~', current, paragraph);\n current += 2;\n } else if (ev.type === 'xref_end') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const txt = `~](#${ev.id})`;\n this._add_virtual_text(txt, current, paragraph);\n current += txt.length;\n } else if (ev.type === 'bookmark') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const txt = `{#${ev.id}}`;\n this._add_virtual_text(txt, current, paragraph);\n current += txt.length;\n }\n }\n }\n\n flush_pending_runs();\n\n if (deferred_meta_states.length > 0) {\n const meta_block = this._build_merged_meta_block(deferred_meta_states);\n if (meta_block) {\n const full_meta = `{>>${meta_block}<<}`;\n this._add_virtual_text(full_meta, current, paragraph);\n current += full_meta.length;\n }\n }\n\n return current;\n }\n\n private _get_wrappers(ins_id: string | null, del_id: string | null, active_ids: Set<string>, active_fmt: Record<string, DocxEvent>): [string, string] {\n if (del_id) return ['{--', '--}'];\n if (ins_id) return ['{++', '++}'];\n if (active_ids.size > 0 || Object.keys(active_fmt).length > 0) return ['{==', '==}'];\n return ['', ''];\n }\n\n private _build_merged_meta_block(states_list: any[]): string {\n const change_lines: string[] = [];\n const comment_lines: string[] = [];\n const seen_sigs = new Set<string>();\n\n for (const [ins_map, del_map, comments_set, fmt_map] of states_list) {\n for (const [uid, meta] of Object.entries(ins_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n const auth = meta.author || 'Unknown';\n change_lines.push(`[${sig} insert] ${auth}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(del_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n const auth = meta.author || 'Unknown';\n change_lines.push(`[${sig} delete] ${auth}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(fmt_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n const auth = meta.author || 'Unknown';\n change_lines.push(`[${sig} format] ${auth}`);\n seen_sigs.add(sig);\n }\n }\n\n const sorted_ids = Array.from(comments_set as Set<string>).sort();\n for (const c_id of sorted_ids) {\n if (!this.comments_map[c_id]) continue;\n const sig = `Com:${c_id}`;\n if (!seen_sigs.has(sig)) {\n const data = this.comments_map[c_id];\n let header = `[${sig}] ${data.author}`;\n if (data.date) header += ` @ ${data.date}`;\n if (data.resolved) header += `(RESOLVED)`;\n comment_lines.push(`${header}: ${data.text}`);\n seen_sigs.add(sig);\n }\n }\n }\n\n return [...change_lines, ...comment_lines].join('\\n');\n }\n\n private _add_virtual_text(text: string, offset: number, context_paragraph: Paragraph | null, hyperlink_id: string | null = null) {\n const span: TextSpan = {\n start: offset,\n end: offset + text.length,\n text,\n run: null,\n paragraph: context_paragraph,\n hyperlink_id: hyperlink_id || undefined\n };\n this.spans.push(span);\n this._text_chunks.push(text);\n }\n\n private _replace_smart_quotes(text: string): string {\n return text.replace(/“/g, '\"').replace(/”/g, '\"').replace(/‘/g, \"'\").replace(/’/g, \"'\");\n }\n\n private _make_fuzzy_regex(target_text: string): string {\n target_text = this._strip_markdown_formatting(target_text);\n target_text = this._replace_smart_quotes(target_text);\n\n const parts: string[] = [];\n const token_pattern = /(\\[_+\\])|(\\s+)|(['\"])|([.,;:\\/])/g;\n \n let last_idx = 0;\n let match;\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n while ((match = token_pattern.exec(target_text)) !== null) {\n const literal = target_text.substring(last_idx, match.index);\n if (literal) parts.push(escapeRegExp(literal));\n\n const g_placeholder = match[1];\n const g_space = match[2];\n const g_quote = match[3];\n const g_punct = match[4];\n\n if (g_placeholder) {\n parts.push('\\\\[_+\\\\]');\n } else if (g_space) {\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n parts.push('\\\\s+');\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n } else if (g_quote) {\n if (g_quote === \"'\") parts.push('[\\u2018\\u2019\\']');\n else parts.push('[\"\\u201c\\u201d]');\n } else if (g_punct) {\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n parts.push(escapeRegExp(g_punct));\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n }\n\n last_idx = token_pattern.lastIndex;\n }\n\n const remaining = target_text.substring(last_idx);\n if (remaining) parts.push(escapeRegExp(remaining));\n\n return parts.join('');\n }\n\n public find_match_index(target_text: string): [number, number] {\n let start_idx = this.full_text.indexOf(target_text);\n if (start_idx !== -1) return [start_idx, target_text.length];\n\n const norm_full = this._replace_smart_quotes(this.full_text);\n const norm_target = this._replace_smart_quotes(target_text);\n start_idx = norm_full.indexOf(norm_target);\n if (start_idx !== -1) return [start_idx, target_text.length];\n\n const stripped_target = this._strip_markdown_formatting(target_text);\n if (this.full_text.includes(stripped_target)) {\n start_idx = this.full_text.indexOf(stripped_target);\n return [start_idx, stripped_target.length];\n }\n\n try {\n const pattern = new RegExp(this._make_fuzzy_regex(target_text));\n const match = pattern.exec(this.full_text);\n if (match) return [match.index, match[0].length];\n } catch (e) {}\n\n return [-1, 0];\n }\n\n public find_all_match_indices(target_text: string): [number, number][] {\n if (!target_text) return [];\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n let matches = [...this.full_text.matchAll(new RegExp(escapeRegExp(target_text), 'g'))];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n\n const norm_full = this._replace_smart_quotes(this.full_text);\n const norm_target = this._replace_smart_quotes(target_text);\n matches = [...norm_full.matchAll(new RegExp(escapeRegExp(norm_target), 'g'))];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n\n const stripped_target = this._strip_markdown_formatting(target_text);\n matches = [...this.full_text.matchAll(new RegExp(escapeRegExp(stripped_target), 'g'))];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n\n try {\n const pattern = new RegExp(this._make_fuzzy_regex(target_text), 'g');\n matches = [...this.full_text.matchAll(pattern)];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n } catch (e) {}\n\n return [];\n }\n\n public find_target_runs(target_text: string): Run[] {\n const [start_idx, length] = this.find_match_index(target_text);\n if (start_idx === -1) return [];\n return this._resolve_runs_at_range(start_idx, start_idx + length);\n }\n\n public find_target_runs_by_index(start_index: number, length: number, rebuild_map = true): Run[] {\n return this._resolve_runs_at_range(start_index, start_index + length, rebuild_map);\n }\n\n public get_virtual_spans_in_range(start_index: number, length: number): TextSpan[] {\n const end_index = start_index + length;\n return this.spans.filter(s => s.run === null && s.text === '\\n\\n' && s.start >= start_index && s.end <= end_index);\n }\n\n private _resolve_runs_at_range(start_idx: number, end_idx: number, rebuild_map = true): Run[] {\n const affected_spans = this.spans.filter(s => s.end > start_idx && s.start < end_idx);\n if (affected_spans.length === 0) return [];\n\n const working_runs = affected_spans.filter(s => s.run !== null).map(s => s.run!);\n if (working_runs.length === 0) return [];\n\n let dom_modified = false;\n\n const first_real_span = affected_spans.find(s => s.run !== null);\n let start_split_adjustment = 0;\n\n if (first_real_span) {\n const local_start = start_idx - first_real_span.start;\n if (local_start > 0) {\n const idx_in_working = 0;\n const [, right_run] = this._split_run_at_index(working_runs[idx_in_working], local_start);\n working_runs[idx_in_working] = right_run;\n dom_modified = true;\n start_split_adjustment = local_start;\n }\n }\n\n const last_real_span = [...affected_spans].reverse().find(s => s.run !== null);\n\n if (last_real_span) {\n const is_same_run = first_real_span === last_real_span;\n const run_to_split = working_runs[working_runs.length - 1];\n let overlap_end = Math.min(last_real_span.end, end_idx);\n let local_end = overlap_end - last_real_span.start;\n\n if (is_same_run && start_split_adjustment > 0) {\n local_end -= start_split_adjustment;\n }\n\n const run_text = get_run_text(run_to_split);\n if (local_end > 0 && local_end < run_text.length) {\n const [left_run] = this._split_run_at_index(run_to_split, local_end);\n working_runs[working_runs.length - 1] = left_run;\n dom_modified = true;\n }\n }\n\n if (dom_modified && rebuild_map) {\n this._build_map();\n }\n\n return working_runs;\n }\n\n public get_insertion_anchor(index: number, rebuild_map = true): [Run | null, Paragraph | null] {\n const preceding = this.spans.filter(s => s.end === index);\n if (preceding.length > 0) {\n for (let i = preceding.length - 1; i >= 0; i--) {\n if (preceding[i].run) return [preceding[i].run, preceding[i].paragraph];\n }\n for (let i = preceding.length - 1; i >= 0; i--) {\n if (preceding[i].paragraph) return [null, preceding[i].paragraph];\n }\n }\n\n const containing = this.spans.filter(s => s.start < index && index < s.end);\n if (containing.length > 0) {\n const span = containing[0];\n if (span.run === null) {\n if (span.paragraph === null) {\n return this.get_insertion_anchor(span.end, rebuild_map);\n }\n return [null, span.paragraph];\n } else {\n const offset = index - span.start;\n const [left, ] = this._split_run_at_index(span.run, offset);\n if (rebuild_map) this._build_map();\n return [left, span.paragraph];\n }\n }\n\n if (index === 0 && this.spans.length > 0) {\n for (const s of this.spans) if (s.run) return [s.run, s.paragraph];\n for (const s of this.spans) if (s.paragraph) return [null, s.paragraph];\n return [null, null];\n }\n\n const preceding_gap = this.spans.filter(s => s.end < index);\n if (preceding_gap.length > 0) {\n for (let i = preceding_gap.length - 1; i >= 0; i--) {\n if (preceding_gap[i].run) return [preceding_gap[i].run, preceding_gap[i].paragraph];\n }\n for (let i = preceding_gap.length - 1; i >= 0; i--) {\n if (preceding_gap[i].paragraph) return [null, preceding_gap[i].paragraph];\n }\n }\n \n return [null, null];\n }\n\n private _split_run_at_index(run: Run, split_index: number): [Run, Run] {\n const text = get_run_text(run);\n const left_text = text.substring(0, split_index);\n const right_text = text.substring(split_index);\n\n this._set_run_text_elements(run._element, left_text);\n\n const new_r_element = run._element.cloneNode(true) as Element;\n this._set_run_text_elements(new_r_element, right_text);\n\n if (run._element.parentNode) {\n run._element.parentNode.insertBefore(new_r_element, run._element.nextSibling);\n }\n\n const new_run = new Run(new_r_element, run._parent);\n return [run, new_run];\n }\n\n private _set_run_text_elements(r_element: Element, new_text: string) {\n const to_remove: Element[] = [];\n for (let i = 0; i < r_element.childNodes.length; i++) {\n const child = r_element.childNodes[i] as Element;\n if (child.nodeType === 1 && ['w:t', 'w:delText', 'w:br', 'w:cr', 'w:tab'].includes(child.tagName)) {\n to_remove.push(child);\n }\n }\n for (const child of to_remove) {\n r_element.removeChild(child);\n }\n\n const doc = r_element.ownerDocument;\n if (doc) {\n const new_t = doc.createElement('w:t');\n new_t.textContent = new_text;\n if (new_text.trim() !== new_text) {\n new_t.setAttribute('xml:space', 'preserve');\n }\n r_element.appendChild(new_t);\n }\n }\n\n public get_context_at_range(start_idx: number, end_idx: number): TextSpan | null {\n const real_spans = this.spans.filter(s => s.run && s.end > start_idx && s.start < end_idx);\n if (real_spans.length > 0) return real_spans[0];\n return null;\n }\n}","import diff_match_patch from \"diff-match-patch\";\nimport { ModifyText } from \"./models.js\";\n\nexport function trim_common_context(\n target: string,\n new_val: string,\n): [number, number] {\n if (!target || !new_val) return [0, 0];\n\n const isSpace = (char: string) => /\\s/.test(char);\n\n // 1. Prefix with Word Boundary Check\n let prefix_len = 0;\n let limit = Math.min(target.length, new_val.length);\n while (prefix_len < limit && target[prefix_len] === new_val[prefix_len]) {\n prefix_len++;\n }\n\n // Backtrack to nearest whitespace if we split a word\n if (prefix_len < target.length && prefix_len < new_val.length) {\n while (prefix_len > 0) {\n const target_split =\n !isSpace(target[prefix_len - 1]) && !isSpace(target[prefix_len]);\n const new_split =\n !isSpace(new_val[prefix_len - 1]) && !isSpace(new_val[prefix_len]);\n if (target_split || new_split) {\n prefix_len--;\n } else {\n break;\n }\n }\n }\n\n // Backtrack prefix to avoid splitting markdown markers\n while (prefix_len > 0) {\n if (prefix_len < target.length) {\n const charSeq = target.substring(prefix_len - 1, prefix_len + 1);\n if (charSeq === \"**\" || charSeq === \"__\") {\n prefix_len--;\n continue;\n }\n }\n\n const left = target.substring(0, prefix_len);\n const b_count = (left.match(/\\*\\*/g) || []).length;\n const u2_count = (left.match(/__/g) || []).length;\n const u1_count = (left.replace(/__/g, \"\").match(/_/g) || []).length;\n\n if (b_count % 2 !== 0) {\n prefix_len = left.lastIndexOf(\"**\");\n continue;\n }\n if (u2_count % 2 !== 0) {\n prefix_len = left.lastIndexOf(\"__\");\n continue;\n }\n if (u1_count % 2 !== 0) {\n let idx = left.length - 1;\n while (idx >= 0) {\n if (\n left[idx] === \"_\" &&\n (idx === 0 || left[idx - 1] !== \"_\") &&\n (idx === left.length - 1 || left[idx + 1] !== \"_\")\n ) {\n prefix_len = idx;\n break;\n }\n idx--;\n }\n continue;\n }\n\n // Safety: Backtrack if we consumed a Markdown Header marker (#)\n let temp_len = prefix_len;\n let hit_header = false;\n while (temp_len > 0) {\n const char = target[temp_len - 1];\n if (char === \"#\") {\n prefix_len = temp_len - 1;\n while (prefix_len > 0 && target[prefix_len - 1] !== \"\\n\") {\n prefix_len--;\n }\n hit_header = true;\n break;\n }\n if (char === \"\\n\") break;\n temp_len--;\n }\n if (hit_header) continue;\n\n break;\n }\n\n // 2. Suffix with Word Boundary Check\n let suffix_len = 0;\n const target_rem_len = target.length - prefix_len;\n const new_rem_len = new_val.length - prefix_len;\n const limit_suffix = Math.min(target_rem_len, new_rem_len);\n\n while (\n suffix_len < limit_suffix &&\n target[target.length - 1 - suffix_len] ===\n new_val[new_val.length - 1 - suffix_len]\n ) {\n suffix_len++;\n }\n\n if (suffix_len > 0) {\n while (suffix_len > 0) {\n let target_split = false;\n if (suffix_len < target.length) {\n target_split =\n !isSpace(target[target.length - 1 - suffix_len]) &&\n !isSpace(target[target.length - suffix_len]);\n }\n let new_split = false;\n if (suffix_len < new_val.length) {\n new_split =\n !isSpace(new_val[new_val.length - 1 - suffix_len]) &&\n !isSpace(new_val[new_val.length - suffix_len]);\n }\n if (target_split || new_split) {\n suffix_len--;\n } else {\n break;\n }\n }\n }\n\n while (suffix_len > 0) {\n const idx = target.length - suffix_len;\n if (idx > 0) {\n const charSeq = target.substring(idx - 1, idx + 1);\n if (charSeq === \"**\" || charSeq === \"__\") {\n suffix_len--;\n continue;\n }\n }\n\n const right = target.substring(target.length - suffix_len);\n const b_count = (right.match(/\\*\\*/g) || []).length;\n const u2_count = (right.match(/__/g) || []).length;\n const u1_count = (right.replace(/__/g, \"\").match(/_/g) || []).length;\n\n if (b_count % 2 !== 0) {\n suffix_len -= right.indexOf(\"**\") + 2;\n continue;\n }\n if (u2_count % 2 !== 0) {\n suffix_len -= right.indexOf(\"__\") + 2;\n continue;\n }\n if (u1_count % 2 !== 0) {\n let idx_in_right = 0;\n while (idx_in_right < right.length) {\n if (\n right[idx_in_right] === \"_\" &&\n (idx_in_right === 0 || right[idx_in_right - 1] !== \"_\") &&\n (idx_in_right === right.length - 1 || right[idx_in_right + 1] !== \"_\")\n ) {\n suffix_len -= idx_in_right + 1;\n break;\n }\n idx_in_right++;\n }\n continue;\n }\n break;\n }\n\n if (\n suffix_len > 0 &&\n /^\\s+$/.test(target.substring(target.length - suffix_len))\n ) {\n suffix_len = 0;\n }\n\n // Absorb balanced wrappers\n for (const marker of [\"**\", \"__\", \"_\"]) {\n const mlen = marker.length;\n const tgt_rem = target.substring(prefix_len, target.length - suffix_len);\n const new_rem = new_val.substring(prefix_len, new_val.length - suffix_len);\n\n if (\n tgt_rem.startsWith(marker) &&\n new_rem.startsWith(marker) &&\n tgt_rem.endsWith(marker) &&\n new_rem.endsWith(marker) &&\n tgt_rem.length >= 2 * mlen &&\n new_rem.length >= 2 * mlen\n ) {\n prefix_len += mlen;\n suffix_len += mlen;\n }\n }\n\n return [prefix_len, suffix_len];\n}\n\nfunction _words_to_chars(\n text1: string,\n text2: string,\n): [string, string, string[]] {\n const token_array: string[] = [];\n const token_hash: Record<string, number> = {};\n\n // RegExp equivalent to Python's r\"(\\s+|\\w+|[^\\w\\s])\" with unicode support\n const split_pattern = /(\\s+|[\\p{L}\\p{N}_]+|[^\\p{L}\\p{N}_\\s])/gu;\n\n const encode_text = (text: string) => {\n // Keep delimiters via capture group in split\n const tokens = text.split(split_pattern).filter(Boolean);\n let encoded_chars = \"\";\n for (const token of tokens) {\n if (token in token_hash) {\n encoded_chars += String.fromCharCode(token_hash[token]);\n } else {\n const code = token_array.length;\n token_hash[token] = code;\n token_array.push(token);\n encoded_chars += String.fromCharCode(code);\n }\n }\n return encoded_chars;\n };\n\n return [encode_text(text1), encode_text(text2), token_array];\n}\n\nexport function generate_edits_from_text(\n original_text: string,\n modified_text: string,\n): ModifyText[] {\n const dmp = new diff_match_patch.diff_match_patch();\n dmp.Diff_Timeout = 2.0; // Enforce strict 2-second timeout to prevent deep recursion hangs\n\n const [chars1, chars2, token_array] = _words_to_chars(\n original_text,\n modified_text,\n );\n const diffs = dmp.diff_main(chars1, chars2, false);\n dmp.diff_cleanupSemantic(diffs);\n\n // Manually map characters back to words to bypass prototype volatility (diff_charsToLines_)\n for (let i = 0; i < diffs.length; i++) {\n const chars = diffs[i][1];\n let text = \"\";\n for (let j = 0; j < chars.length; j++)\n text += token_array[chars.charCodeAt(j)];\n diffs[i][1] = text;\n }\n\n const edits: ModifyText[] = [];\n let current_original_index = 0;\n let pending_delete: [number, string] | null = null;\n\n for (const [op, text] of diffs) {\n if (op === 0) {\n // Equal\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({\n type: \"modify\",\n target_text: del_txt,\n new_text: \"\",\n comment: \"Diff: Text deleted\",\n _match_start_index: idx,\n });\n pending_delete = null;\n }\n current_original_index += text.length;\n } else if (op === -1) {\n // Delete\n pending_delete = [current_original_index, text];\n current_original_index += text.length;\n } else if (op === 1) {\n // Insert\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({\n type: \"modify\",\n target_text: del_txt,\n new_text: text,\n comment: \"Diff: Replacement\",\n _match_start_index: idx,\n });\n pending_delete = null;\n } else {\n edits.push({\n type: \"modify\",\n target_text: \"\",\n new_text: text,\n comment: \"Diff: Text inserted\",\n _match_start_index: current_original_index,\n });\n }\n }\n }\n\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({\n type: \"modify\",\n target_text: del_txt,\n new_text: \"\",\n comment: \"Diff: Text deleted\",\n _match_start_index: idx,\n });\n }\n\n return edits;\n}\nexport function create_unified_diff(\n original_text: string,\n modified_text: string,\n context_lines: number = 3,\n): string {\n const dmp = new diff_match_patch.diff_match_patch();\n dmp.Diff_Timeout = 2.0;\n\n const a = dmp.diff_linesToChars_(original_text, modified_text);\n const diffs = dmp.diff_main(a.chars1, a.chars2, false);\n dmp.diff_charsToLines_(diffs, a.lineArray);\n\n const output: string[] = [];\n output.push(\"--- Original\");\n output.push(\"+++ Modified\");\n\n let i = 0;\n while (i < diffs.length) {\n while (i < diffs.length && diffs[i][0] === 0) i++;\n if (i >= diffs.length) break;\n\n let start = i;\n let preContext: string[] = [];\n if (start > 0 && diffs[start - 1][0] === 0) {\n const lines = diffs[start - 1][1].replace(/\\n$/, \"\").split(\"\\n\");\n preContext = lines.slice(-context_lines);\n }\n\n const chunk: string[] = [];\n chunk.push(...preContext.map((l) => ` ${l}`));\n\n while (i < diffs.length) {\n const [op, text] = diffs[i];\n const lines = text.replace(/\\n$/, \"\").split(\"\\n\");\n\n if (op === 0) {\n if (lines.length > context_lines * 2) break;\n chunk.push(...lines.map((l) => ` ${l}`));\n } else {\n const prefix = op === -1 ? \"-\" : \"+\";\n chunk.push(...lines.map((l) => `${prefix}${l}`));\n }\n i++;\n }\n\n let postContext: string[] = [];\n if (i < diffs.length && diffs[i][0] === 0) {\n const lines = diffs[i][1].replace(/\\n$/, \"\").split(\"\\n\");\n postContext = lines.slice(0, context_lines);\n }\n chunk.push(...postContext.map((l) => ` ${l}`));\n\n output.push(\"@@ ... @@\");\n output.push(...chunk);\n }\n\n if (output.length === 2) return \"\"; // No changes\n return output.join(\"\\n\");\n}\n\nexport function create_word_patch_diff(\n original_text: string,\n modified_text: string,\n original_path: string = \"Original\",\n modified_path: string = \"Modified\"\n): string {\n const edits = generate_edits_from_text(original_text, modified_text);\n const output: string[] = [\n `--- ${original_path}`,\n `+++ ${modified_path}`,\n \"\"\n ];\n \n const CONTEXT_SIZE = 40;\n\n for (const edit of edits) {\n const raw_start = edit._match_start_index || 0;\n const raw_target = edit.target_text || \"\";\n const raw_new = edit.new_text || \"\";\n\n const [prefix_len, suffix_len] = trim_common_context(raw_target, raw_new);\n\n const target_end_in_target = raw_target.length - suffix_len;\n const new_end_in_new = raw_new.length - suffix_len;\n\n const display_target = raw_target.substring(prefix_len, target_end_in_target);\n const display_new = raw_new.substring(prefix_len, new_end_in_new);\n\n const change_start = raw_start + prefix_len;\n const change_end = change_start + display_target.length;\n\n let pre_start = Math.max(0, change_start - CONTEXT_SIZE);\n let pre_context = original_text.substring(pre_start, change_start);\n if (pre_start > 0) pre_context = \"...\" + pre_context;\n\n let post_end = Math.min(original_text.length, change_end + CONTEXT_SIZE);\n let post_context = original_text.substring(change_end, post_end);\n if (post_end < original_text.length) post_context = post_context + \"...\";\n\n pre_context = pre_context.replace(/\\n/g, \" \").replace(/\\r/g, \"\");\n post_context = post_context.replace(/\\n/g, \" \").replace(/\\r/g, \"\");\n\n output.push(\"@@ Word Patch @@\");\n output.push(` ${pre_context}`);\n if (display_target) output.push(`- ${display_target}`);\n if (display_new) output.push(`+ ${display_new}`);\n output.push(` ${post_context}`);\n output.push(\"\");\n }\n\n return output.join(\"\\n\");\n}\n","import { trim_common_context } from \"./diff.js\";\nimport { ModifyText } from \"./models.js\";\nexport const AMBIGUITY_EXAMPLES_CAP = 5;\nexport const AMBIGUITY_CONTEXT_CHARS = 50;\nfunction _should_strip_markers(text: string, marker: string): boolean {\n if (!text.startsWith(marker) || !text.endsWith(marker)) return false;\n if (text.length < marker.length * 2) return false;\n\n const inner = text.substring(marker.length, text.length - marker.length);\n if (!inner) return false;\n\n if (inner.includes(marker)) return false;\n if (!/[a-zA-Z]/.test(inner)) return false;\n\n if (marker === \"__\" && /^\\w+$/.test(inner)) return false;\n if (marker === \"_\") {\n if (inner.includes(\"_\")) return false;\n if (/^[0-9_]+$/.test(inner)) return false;\n }\n\n return true;\n}\n\nfunction _strip_balanced_markers(text: string): [string, string, string] {\n let prefix_markup = \"\";\n let suffix_markup = \"\";\n let clean_text = text;\n\n const markers = [\"**\", \"__\", \"_\", \"*\"];\n\n for (const marker of markers) {\n if (_should_strip_markers(clean_text, marker)) {\n prefix_markup += marker;\n suffix_markup = marker + suffix_markup;\n clean_text = clean_text.substring(\n marker.length,\n clean_text.length - marker.length,\n );\n break;\n }\n }\n\n return [prefix_markup, clean_text, suffix_markup];\n}\n\nexport function _replace_smart_quotes(text: string): string {\n return text\n .replace(/“/g, '\"')\n .replace(/”/g, '\"')\n .replace(/‘/g, \"'\")\n .replace(/’/g, \"'\");\n}\n\nfunction _find_safe_boundaries(\n text: string,\n start: number,\n end: number,\n): [number, number] {\n let new_start = start;\n let new_end = end;\n\n const expand_if_unbalanced = (marker: string) => {\n const current_match = text.substring(new_start, new_end);\n const count = (\n current_match.match(new RegExp(marker.replace(/\\*/g, \"\\\\*\"), \"g\")) || []\n ).length;\n\n if (count % 2 !== 0) {\n const suffix = text.substring(new_end);\n if (suffix.startsWith(marker)) {\n new_end += marker.length;\n return;\n }\n const prefix = text.substring(0, new_start);\n if (prefix.endsWith(marker)) {\n new_start -= marker.length;\n return;\n }\n }\n };\n\n for (let i = 0; i < 2; i++) {\n expand_if_unbalanced(\"**\");\n expand_if_unbalanced(\"__\");\n expand_if_unbalanced(\"_\");\n expand_if_unbalanced(\"*\");\n }\n\n return [new_start, new_end];\n}\n\nfunction _refine_match_boundaries(\n text: string,\n start: number,\n end: number,\n): [number, number] {\n const markers = [\"**\", \"__\", \"*\", \"_\"];\n let current_text = text.substring(start, end);\n let best_start = start;\n let best_end = end;\n\n const countMarker = (str: string, mk: string) =>\n (str.match(new RegExp(mk.replace(/\\*/g, \"\\\\*\"), \"g\")) || []).length;\n\n for (const marker of markers) {\n if (current_text.startsWith(marker)) {\n const current_score = countMarker(current_text, marker) % 2;\n const trimmed_text = current_text.substring(marker.length);\n const trimmed_score = countMarker(trimmed_text, marker) % 2;\n\n if (current_score === 1 && trimmed_score === 0) {\n best_start += marker.length;\n current_text = trimmed_text;\n }\n }\n }\n\n for (const marker of markers) {\n if (current_text.endsWith(marker)) {\n const current_score = countMarker(current_text, marker) % 2;\n const trimmed_text = current_text.substring(\n 0,\n current_text.length - marker.length,\n );\n const trimmed_score = countMarker(trimmed_text, marker) % 2;\n\n if (current_score === 1 && trimmed_score === 0) {\n best_end -= marker.length;\n current_text = trimmed_text;\n }\n }\n }\n\n return [best_start, best_end];\n}\n\nexport function _make_fuzzy_regex(target_text: string): string {\n target_text = _replace_smart_quotes(target_text);\n\n const parts: string[] = [];\n const token_pattern = /(_+)|(\\s+)|(['\"])|([.,;:\\/])/g;\n\n // Note: JS does not support atomic groups (?>...).\n // However, because we only match markdown characters * and _,\n // we can use a character class `[*_]*` which is mathematically equivalent\n // to `(?:\\*\\*|__|\\*|_)*` but fundamentally immune to catastrophic backtracking!\n const md_noise = \"[*_]*\";\n const structural_noise = \"(?:\\\\s*(?:[*+\\\\->]|\\\\d+\\\\.)\\\\s+|\\\\s*\\\\n\\\\s*)\";\n\n const start_list_marker = \"(?:[ \\\\t]*(?:[*+\\\\->]|\\\\d+\\\\.)\\\\s+)?\";\n parts.push(start_list_marker);\n parts.push(md_noise);\n\n let last_idx = 0;\n let match;\n\n const escapeRegExp = (str: string) =>\n str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n while ((match = token_pattern.exec(target_text)) !== null) {\n const literal = target_text.substring(last_idx, match.index);\n if (literal) {\n parts.push(escapeRegExp(literal));\n parts.push(md_noise);\n }\n\n const g_underscore = match[1];\n const g_space = match[2];\n const g_quote = match[3];\n const g_punct = match[4];\n\n if (g_underscore) {\n parts.push(\"_+\");\n } else if (g_space) {\n if (g_space.includes(\"\\n\")) {\n parts.push(`(?:${structural_noise}|\\\\s+)+`);\n } else {\n parts.push(\"\\\\s+\");\n }\n } else if (g_quote) {\n if (g_quote === \"'\") parts.push(\"[\\u2018\\u2019']\");\n else parts.push('[\"\\u201c\\u201d]');\n } else if (g_punct) {\n parts.push(escapeRegExp(g_punct));\n }\n\n parts.push(md_noise);\n last_idx = token_pattern.lastIndex;\n }\n\n const remaining = target_text.substring(last_idx);\n if (remaining) parts.push(escapeRegExp(remaining));\n\n return parts.join(\"\");\n}\n\nexport function _find_match_in_text(\n text: string,\n target: string,\n): [number, number] {\n if (!target) return [-1, -1];\n\n let idx = text.indexOf(target);\n if (idx !== -1) return _find_safe_boundaries(text, idx, idx + target.length);\n\n const norm_text = _replace_smart_quotes(text);\n const norm_target = _replace_smart_quotes(target);\n idx = norm_text.indexOf(norm_target);\n if (idx !== -1)\n return _find_safe_boundaries(text, idx, idx + norm_target.length);\n\n try {\n const pattern = new RegExp(_make_fuzzy_regex(target));\n const match = pattern.exec(text);\n if (match) {\n const raw_start = match.index;\n const raw_end = match.index + match[0].length;\n const [refined_start, refined_end] = _refine_match_boundaries(\n text,\n raw_start,\n raw_end,\n );\n return _find_safe_boundaries(text, refined_start, refined_end);\n }\n } catch (e) {\n // Ignore regex compilation errors from edge cases\n }\n\n return [-1, -1];\n}\n\nexport function _build_critic_markup(\n target_text: string,\n new_text: string,\n comment: string | null | undefined,\n edit_index: number,\n include_index: boolean,\n highlight_only: boolean,\n): string {\n const parts: string[] = [];\n\n let [prefix_markup, clean_target, suffix_markup] =\n _strip_balanced_markers(target_text);\n\n let clean_new = new_text;\n if (prefix_markup && new_text) {\n if (\n new_text.startsWith(prefix_markup) &&\n new_text.endsWith(suffix_markup)\n ) {\n const inner_len = prefix_markup.length;\n clean_new =\n new_text.length > inner_len * 2\n ? new_text.substring(inner_len, new_text.length - inner_len)\n : new_text;\n }\n }\n\n parts.push(prefix_markup);\n\n if (highlight_only) {\n parts.push(`{==${clean_target}==}`);\n } else {\n const has_target = Boolean(clean_target);\n const has_new = Boolean(clean_new);\n\n if (has_target && !has_new) parts.push(`{--${clean_target}--}`);\n else if (!has_target && has_new) parts.push(`{++${clean_new}++}`);\n else if (has_target && has_new)\n parts.push(`{--${clean_target}--}{++${clean_new}++}`);\n }\n\n parts.push(suffix_markup);\n\n const meta_parts: string[] = [];\n if (comment) meta_parts.push(comment);\n if (include_index) meta_parts.push(`[Edit:${edit_index}]`);\n\n if (meta_parts.length > 0) {\n parts.push(`{>>${meta_parts.join(\" \")}<<}`);\n }\n\n return parts.join(\"\");\n}\n\nexport function apply_edits_to_markdown(\n markdown_text: string,\n edits: ModifyText[],\n include_index = false,\n highlight_only = false,\n): string {\n if (!edits || edits.length === 0) return markdown_text;\n\n const matched_edits: [number, number, string, ModifyText, number][] = [];\n\n for (let idx = 0; idx < edits.length; idx++) {\n const edit = edits[idx];\n const target = edit.target_text || \"\";\n\n if (!target) {\n continue;\n }\n\n const [start, end] = _find_match_in_text(markdown_text, target);\n if (start === -1) continue;\n\n const actual_matched_text = markdown_text.substring(start, end);\n matched_edits.push([start, end, actual_matched_text, edit, idx]);\n }\n\n const matched_edits_filtered: [number, number, string, ModifyText, number][] =\n [];\n const occupied_ranges: [number, number][] = [];\n\n matched_edits.sort((a, b) => a[4] - b[4]);\n\n for (const [start, end, actual_text, edit, orig_idx] of matched_edits) {\n let overlaps = false;\n for (const [occ_start, occ_end] of occupied_ranges) {\n if (start < occ_end && end > occ_start) {\n overlaps = true;\n break;\n }\n }\n\n if (!overlaps) {\n matched_edits_filtered.push([start, end, actual_text, edit, orig_idx]);\n occupied_ranges.push([start, end]);\n }\n }\n\n matched_edits_filtered.sort((a, b) => b[0] - a[0]);\n\n let result = markdown_text;\n\n for (const [\n start,\n end,\n actual_text,\n edit,\n orig_idx,\n ] of matched_edits_filtered) {\n const new_txt = edit.new_text || \"\";\n const [prefix_len, suffix_len] = trim_common_context(actual_text, new_txt);\n\n const unmodified_prefix =\n prefix_len > 0 ? actual_text.substring(0, prefix_len) : \"\";\n const unmodified_suffix =\n suffix_len > 0\n ? actual_text.substring(actual_text.length - suffix_len)\n : \"\";\n\n const t_end = actual_text.length - suffix_len;\n const n_end = new_txt.length - suffix_len;\n\n const isolated_target = actual_text.substring(prefix_len, t_end);\n const isolated_new = new_txt.substring(prefix_len, n_end);\n\n const markup = _build_critic_markup(\n isolated_target,\n isolated_new,\n edit.comment,\n orig_idx,\n include_index,\n highlight_only,\n );\n\n const full_replacement = unmodified_prefix + markup + unmodified_suffix;\n result =\n result.substring(0, start) + full_replacement + result.substring(end);\n }\n\n return result;\n}\nexport function format_ambiguity_error(\n edit_index: number,\n target_text: string,\n haystack: string,\n match_positions: [number, number][],\n): string {\n const total = match_positions.length;\n if (total < 2) {\n throw new Error(\n `format_ambiguity_error requires at least 2 matches, got ${total}`,\n );\n }\n\n const shown = match_positions.slice(0, AMBIGUITY_EXAMPLES_CAP);\n const remaining = total - shown.length;\n\n const lines: string[] = [\n `- Edit ${edit_index} Failed: Ambiguous match. Target text appears ${total} times. First ${shown.length} occurrences:`,\n ];\n\n for (let i = 0; i < shown.length; i++) {\n const [start, end] = shown[i];\n const pre_start = Math.max(0, start - AMBIGUITY_CONTEXT_CHARS);\n const post_end = Math.min(haystack.length, end + AMBIGUITY_CONTEXT_CHARS);\n\n const pre_context = haystack\n .substring(pre_start, start)\n .replace(/\\n/g, \" \");\n const post_context = haystack.substring(end, post_end).replace(/\\n/g, \" \");\n let match_text = haystack.substring(start, end).replace(/\\n/g, \" \");\n\n if (match_text.length > 50) {\n match_text =\n match_text.substring(0, 25) +\n \"...\" +\n match_text.substring(match_text.length - 20);\n }\n\n const prefix_marker = pre_start > 0 ? \"...\" : \"\";\n const suffix_marker = post_end < haystack.length ? \"...\" : \"\";\n\n lines.push(\n ` ${i + 1}. \"${prefix_marker}${pre_context}[${match_text}]${post_context}${suffix_marker}\"`,\n );\n }\n\n if (remaining > 0) {\n lines.push(` ... and ${remaining} more occurrence(s) not shown.`);\n }\n\n lines.push(\n \" Please provide more surrounding context in your target_text to uniquely identify the location.\",\n );\n\n return lines.join(\"\\n\");\n}\n","import { DocumentObject } from \"./docx/bridge.js\";\nimport { Paragraph, Table, Run, DocxEvent } from \"./docx/primitives.js\";\nimport { DocumentMapper, TextSpan } from \"./mapper.js\";\nimport { CommentsManager } from \"./comments.js\";\nimport {\n ModifyText,\n InsertTableRow,\n DeleteTableRow,\n AcceptChange,\n RejectChange,\n ReplyComment,\n DocumentChange,\n} from \"./models.js\";\nimport { trim_common_context } from \"./diff.js\";\nimport { findChild, findAllDescendants, serializeXml } from \"./docx/dom.js\";\nimport {\n is_heading_paragraph,\n is_native_heading,\n get_run_style_markers,\n get_run_text,\n apply_formatting_to_segments,\n} from \"./utils/docx.js\";\nimport { format_ambiguity_error } from \"./markup.js\";\n\n// --- DOM Mutation Helpers for xmldom ---\nfunction getNextElement(el: Element): Element | null {\n let next = el.nextSibling;\n while (next) {\n if (next.nodeType === 1) return next as Element;\n next = next.nextSibling;\n }\n return null;\n}\n\nfunction getPreviousElement(el: Element): Element | null {\n let prev = el.previousSibling;\n while (prev) {\n if (prev.nodeType === 1) return prev as Element;\n prev = prev.previousSibling;\n }\n return null;\n}\n\nfunction insertAfter(newNode: Node, refNode: Element) {\n if (refNode.parentNode) {\n refNode.parentNode.insertBefore(newNode, refNode.nextSibling);\n }\n}\n\nfunction insertBefore(newNode: Node, refNode: Element) {\n if (refNode.parentNode) {\n refNode.parentNode.insertBefore(newNode, refNode);\n }\n}\n\nfunction insertAtIndex(parent: Element, index: number, child: Node) {\n const children = Array.from(parent.childNodes).filter(\n (n) => n.nodeType === 1,\n );\n if (index >= children.length) {\n parent.appendChild(child);\n } else {\n parent.insertBefore(child, children[index]);\n }\n}\n\n// --- Validation ---\nexport class BatchValidationError extends Error {\n public errors: string[];\n constructor(errors: string[]) {\n super(\"Batch validation failed:\\n\" + errors.join(\"\\n\"));\n this.name = \"BatchValidationError\";\n this.errors = errors;\n }\n}\n\nexport function validate_edit_strings(edits: any[]): string[] {\n const errors: string[] = [];\n\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i];\n const t_text = edit.target_text || \"\";\n const n_text = edit.new_text || \"\";\n\n if (\n n_text.includes(\"{++\") ||\n n_text.includes(\"{--\") ||\n n_text.includes(\"{>>\") ||\n n_text.includes(\"{==\")\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Do not manually write CriticMarkup tags ({++, {--, {>>, {==) in \\`new_text\\`. The engine handles redlining automatically. To add a comment, use the \\`comment\\` parameter.`,\n );\n }\n\n if (t_text.includes(\"[^\") || n_text.includes(\"[^\")) {\n const t_fns = (t_text.match(/\\[\\^(?:fn|en)-[^\\]]+\\]/g) || []).sort();\n const n_fns = (n_text.match(/\\[\\^(?:fn|en)-[^\\]]+\\]/g) || []).sort();\n if (JSON.stringify(t_fns) !== JSON.stringify(n_fns)) {\n if (\n n_fns.length > t_fns.length ||\n n_fns.some(\n (f: string) =>\n n_fns.filter((x: string) => x === f).length >\n t_fns.filter((x: string) => x === f).length,\n )\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot insert footnote/endnote markers via text replace. Markers like \\`[^fn-N]\\` are read-only projections. Use Word's References menu.`,\n );\n } else {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot delete footnote/endnote references via text replace. The marker corresponds to a structural XML element.`,\n );\n }\n }\n }\n\n if (t_text.includes(\"](\") || n_text.includes(\"](\")) {\n const t_links = (t_text.match(/\\[(?!~)[^\\]]+\\]\\([^)]+\\)/g) || []).sort();\n const n_links = (n_text.match(/\\[(?!~)[^\\]]+\\]\\([^)]+\\)/g) || []).sort();\n if (t_links.length !== n_links.length) {\n if (n_links.length > t_links.length) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot insert hyperlinks via text replace. Use a dedicated structural operation.`,\n );\n } else {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot delete hyperlinks via text replace. The marker corresponds to a structural XML element.`,\n );\n }\n } else if (\n t_links.length > 1 &&\n JSON.stringify(t_links) !== JSON.stringify(n_links)\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Can only edit or retarget one hyperlink per text replacement. Please split into multiple edits.`,\n );\n }\n }\n\n if (t_text.includes(\"[~\") || n_text.includes(\"[~\")) {\n const t_xrefs = t_text.match(/\\[~[^~]+~\\]\\(#[^\\)]+\\)/g) || [];\n const n_xrefs = n_text.match(/\\[~[^~]+~\\]\\(#[^\\)]+\\)/g) || [];\n if (t_xrefs.length !== n_xrefs.length) {\n if (n_xrefs.length > t_xrefs.length) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot insert cross-references via text replace. Markers are read-only projections.`,\n );\n } else {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot delete cross-references via text replace. The marker corresponds to a structural XML element.`,\n );\n }\n } else {\n // Advanced XREF validation simplified for port scope\n if (JSON.stringify(t_xrefs) !== JSON.stringify(n_xrefs)) {\n errors.push(\n `- Edit ${i + 1} Failed: Modifying or retargeting cross-reference markers is disallowed to prevent dependency corruption.`,\n );\n }\n }\n }\n\n if (t_text.includes(\"{#\") || n_text.includes(\"{#\")) {\n const t_anchors = t_text.match(/\\{#[^\\}]+\\}/g) || [];\n const n_anchors = n_text.match(/\\{#[^\\}]+\\}/g) || [];\n for (const a of n_anchors) {\n if (\n n_anchors.filter((x: string) => x === a).length >\n t_anchors.filter((x: string) => x === a).length\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot modify or insert internal anchor markers (\\`{#...}\\`). These represent structural XML bookmarks.`,\n );\n break;\n }\n }\n }\n\n if (edit.type === \"modify\" && n_text) {\n const lines = n_text.split(/[\\r\\n]+/);\n for (const line of lines) {\n const stripped = line.trimStart();\n if (stripped.startsWith(\"#######\")) {\n const level = stripped.length - stripped.replace(/^#+/, \"\").length;\n if (\n stripped.substring(level).startsWith(\" \") ||\n stripped.substring(level) === \"\"\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Heading level ${level} is not supported (maximum is 6).`,\n );\n break;\n }\n }\n }\n }\n\n if (\n t_text.includes(\"READONLY_BOUNDARY_START\") ||\n n_text.includes(\"READONLY_BOUNDARY_START\") ||\n t_text.includes(\"# Document Structure (Read-Only)\") ||\n n_text.includes(\"# Document Structure (Read-Only)\")\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Modification targets the read-only boundary (Structural Appendix). This section cannot be edited.`,\n );\n }\n }\n\n return errors;\n}\n\n// --- Engine ---\nexport class RedlineEngine {\n public doc: DocumentObject;\n public author: string;\n public timestamp: string;\n public current_id: number;\n public mapper: DocumentMapper;\n public comments_manager: CommentsManager;\n public clean_mapper: DocumentMapper | null = null;\n public skipped_details: string[] = [];\n\n constructor(doc: DocumentObject, author: string = \"Adeu AI (TS)\") {\n this.doc = doc;\n this.author = author;\n this.timestamp = new Date().toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n\n const w16du_ns =\n \"http://schemas.microsoft.com/office/word/2023/wordml/word16du\";\n for (const part of this.doc.pkg.parts) {\n if (\n part === this.doc.part ||\n (part.contentType.includes(\"wordprocessingml\") &&\n part.contentType.endsWith(\"+xml\"))\n ) {\n if (!part._element.hasAttribute(\"xmlns:w16du\")) {\n part._element.setAttribute(\"xmlns:w16du\", w16du_ns);\n }\n }\n }\n\n this.current_id = this._scan_existing_ids();\n this.mapper = new DocumentMapper(this.doc);\n this.comments_manager = new CommentsManager(this.doc);\n }\n\n private _scan_existing_ids(): number {\n let maxId = 0;\n for (const tag of [\"w:ins\", \"w:del\"]) {\n const elements = findAllDescendants(this.doc.element, tag);\n for (const el of elements) {\n const val = parseInt(el.getAttribute(\"w:id\") || \"0\", 10);\n if (!isNaN(val) && val > maxId) maxId = val;\n }\n }\n return maxId;\n }\n\n public accept_all_revisions() {\n const parts_to_process: Element[] = [this.doc.element];\n\n for (const part of this.doc.pkg.parts) {\n if (part === this.doc.part) continue;\n if (\n part.contentType.includes(\"wordprocessingml\") &&\n part.contentType.endsWith(\"+xml\")\n ) {\n parts_to_process.push(part._element);\n }\n }\n\n for (const root_element of parts_to_process) {\n const insNodes = findAllDescendants(root_element, \"w:ins\");\n for (const ins of insNodes) {\n this._clean_wrapping_comments(ins);\n const parent = ins.parentNode as Element | null;\n if (!parent) continue;\n\n if (parent.tagName === \"w:trPr\") {\n parent.removeChild(ins);\n continue;\n }\n\n while (ins.firstChild) {\n parent.insertBefore(ins.firstChild, ins);\n }\n parent.removeChild(ins);\n }\n\n const pNodes = findAllDescendants(root_element, \"w:p\");\n for (const p of pNodes) {\n const pPr = findChild(p, \"w:pPr\");\n if (pPr) {\n const rPr = findChild(pPr, \"w:rPr\");\n const delMark = rPr ? findChild(rPr, \"w:del\") : null;\n if (rPr && delMark) {\n let has_content = false;\n for (const tag of [\"w:t\", \"w:tab\", \"w:br\"]) {\n for (const child of findAllDescendants(p, tag)) {\n if (tag === \"w:t\" && !child.textContent) continue;\n \n let is_deleted = false;\n let curr = child.parentNode as Element | null;\n while (curr && curr !== p) {\n if (curr.tagName === \"w:del\") {\n is_deleted = true;\n break;\n }\n curr = curr.parentNode as Element | null;\n }\n if (!is_deleted) {\n has_content = true;\n break;\n }\n }\n if (has_content) {\n break;\n }\n }\n if (has_content) {\n rPr.removeChild(delMark);\n } else {\n this._clean_wrapping_comments(p);\n this._delete_comments_in_element(p);\n if (p.parentNode) {\n p.parentNode.removeChild(p);\n }\n }\n }\n }\n }\n\n const delNodes = findAllDescendants(root_element, \"w:del\");\n for (const d of delNodes) {\n this._clean_wrapping_comments(d);\n this._delete_comments_in_element(d);\n const parent = d.parentNode as Element | null;\n if (parent) {\n if (parent.tagName === \"w:trPr\") {\n const row = parent.parentNode as Element | null;\n if (row && row.parentNode) {\n row.parentNode.removeChild(row);\n }\n } else {\n parent.removeChild(d);\n }\n }\n }\n }\n\n // Final pass: remove any free-standing comments\n const comment_ids = new Set<string>();\n for (const tag of [\n \"w:commentRangeStart\",\n \"w:commentRangeEnd\",\n \"w:commentReference\",\n ]) {\n for (const node of findAllDescendants(this.doc.element, tag)) {\n const cid = node.getAttribute(\"w:id\");\n if (cid) comment_ids.add(cid);\n }\n }\n\n const comments_part = this.doc.pkg.parts.find(\n (p) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\",\n );\n if (comments_part) {\n for (const c of findAllDescendants(comments_part._element, \"w:comment\")) {\n const cid = c.getAttribute(\"w:id\");\n if (cid) comment_ids.add(cid);\n }\n }\n\n for (const cid of comment_ids) {\n this.comments_manager.deleteComment(cid);\n }\n }\n private _getNextId(): string {\n this.current_id++;\n return this.current_id.toString();\n }\n\n private _create_track_change_tag(\n tagName: string,\n author: string = \"\",\n reuseId: string | null = null,\n ): Element {\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const tag = xmlDoc.createElement(tagName);\n const wid = reuseId !== null ? reuseId : this._getNextId();\n tag.setAttribute(\"w:id\", wid);\n tag.setAttribute(\"w:author\", author || this.author);\n tag.setAttribute(\"w:date\", this.timestamp);\n tag.setAttribute(\"w16du:dateUtc\", this.timestamp);\n return tag;\n }\n\n private _set_text_content(element: Element, text: string) {\n element.textContent = text;\n if (text.trim() !== text) {\n element.setAttribute(\"xml:space\", \"preserve\");\n }\n }\n\n /**\n * Attaches a comment that wraps a contiguous range within a single paragraph.\n * start_element and end_element must both be direct children of parent_element\n * and start_element must come before (or equal) end_element in document order.\n * Ported from Python `RedlineEngine._attach_comment`.\n */\n private _attach_comment(\n parent_element: Element,\n start_element: Element,\n end_element: Element,\n text: string,\n ) {\n if (!text) return;\n\n const comment_id = this.comments_manager.addComment(this.author, text);\n const xmlDoc = parent_element.ownerDocument!;\n\n const range_start = xmlDoc.createElement(\"w:commentRangeStart\");\n range_start.setAttribute(\"w:id\", comment_id);\n\n const range_end = xmlDoc.createElement(\"w:commentRangeEnd\");\n range_end.setAttribute(\"w:id\", comment_id);\n\n const ref_run = xmlDoc.createElement(\"w:r\");\n const rPr = xmlDoc.createElement(\"w:rPr\");\n const rStyle = xmlDoc.createElement(\"w:rStyle\");\n rStyle.setAttribute(\"w:val\", \"CommentReference\");\n rPr.appendChild(rStyle);\n ref_run.appendChild(rPr);\n\n const ref = xmlDoc.createElement(\"w:commentReference\");\n ref.setAttribute(\"w:id\", comment_id);\n ref_run.appendChild(ref);\n\n // Insert <w:commentRangeStart> immediately before start_element.\n // Insert <w:commentRangeEnd> immediately after end_element.\n // Insert <w:r><w:commentReference/></w:r> immediately after the range end.\n parent_element.insertBefore(range_start, start_element);\n\n // After insertBefore above, sibling positions shifted. Re-find end_element's next sibling.\n const after_end = end_element.nextSibling;\n if (after_end) {\n parent_element.insertBefore(range_end, after_end);\n parent_element.insertBefore(ref_run, range_end.nextSibling);\n } else {\n parent_element.appendChild(range_end);\n parent_element.appendChild(ref_run);\n }\n }\n\n /**\n * Attaches a comment that spans across two different paragraphs (or other block\n * containers). start_element lives inside start_p, end_element lives inside end_p,\n * and the comment is open from start_element through end_element.\n * Ported from Python `RedlineEngine._attach_comment_spanning`.\n */\n private _attach_comment_spanning(\n start_p: Element,\n start_el: Element,\n end_p: Element,\n end_el: Element,\n text: string,\n ) {\n if (!text) return;\n\n const comment_id = this.comments_manager.addComment(this.author, text);\n const xmlDocStart = start_p.ownerDocument!;\n const xmlDocEnd = end_p.ownerDocument!;\n\n const range_start = xmlDocStart.createElement(\"w:commentRangeStart\");\n range_start.setAttribute(\"w:id\", comment_id);\n\n const range_end = xmlDocEnd.createElement(\"w:commentRangeEnd\");\n range_end.setAttribute(\"w:id\", comment_id);\n\n const ref_run = xmlDocEnd.createElement(\"w:r\");\n const rPr = xmlDocEnd.createElement(\"w:rPr\");\n const rStyle = xmlDocEnd.createElement(\"w:rStyle\");\n rStyle.setAttribute(\"w:val\", \"CommentReference\");\n rPr.appendChild(rStyle);\n ref_run.appendChild(rPr);\n\n const ref = xmlDocEnd.createElement(\"w:commentReference\");\n ref.setAttribute(\"w:id\", comment_id);\n ref_run.appendChild(ref);\n\n // Place range start before start_el.\n start_p.insertBefore(range_start, start_el);\n\n // Place range end + reference run after end_el.\n const after_end = end_el.nextSibling;\n if (after_end) {\n end_p.insertBefore(range_end, after_end);\n end_p.insertBefore(ref_run, range_end.nextSibling);\n } else {\n end_p.appendChild(range_end);\n end_p.appendChild(ref_run);\n }\n } /**\n * Inserts `text` as one or more tracked paragraphs anchored relative to\n * either an existing run or a paragraph. Returns:\n * { first_node, last_p, last_ins, used_block_mode }\n * where:\n * - first_node: the first <w:ins> (for inline mode) OR the first new <w:p>\n * (for block mode). The caller uses this for splicing into the DOM and\n * for anchoring comments.\n * - last_p: the last new <w:p> created, if any. null when entirely inline.\n * - last_ins: the last <w:ins> created (inside the last new <w:p>, or the\n * sole inline ins). Used as the comment's end anchor.\n * - used_block_mode: true when the first line carried a heading/list style\n * marker and we created a new paragraph for it (rather than inlining it).\n *\n * Multi-paragraph rules (only when text contains '\\n'):\n * - Each additional line becomes a new <w:p>, inserted after the anchor\n * paragraph in document order.\n * - Each new <w:p> gets a copy of the anchor paragraph's <w:pPr> (so list\n * numbering / indentation are preserved) unless the line itself starts\n * with a markdown heading or list marker, which overrides the style.\n * - Each new <w:p> carries a tracked paragraph-break marker\n * (<w:pPr><w:rPr><w:ins/></w:rPr></w:pPr>) so Word natively tracks the\n * paragraph break.\n * - Each new <w:p>'s content is wrapped in a <w:ins>, with inline bold/\n * italic markdown parsed via _parse_inline_markdown.\n *\n * The first line:\n * - If it carries a heading / list marker AND we have a paragraph anchor,\n * we drop into \"block mode\": no inline <w:ins>; the first line itself\n * becomes the first new <w:p>.\n * - Otherwise we emit a single inline <w:ins> for the first line (current\n * behaviour) and treat the remaining lines as block extensions.\n *\n * Does NOT attach comments; callers handle that.\n */\n private _track_insert_multiline(\n text: string,\n anchor_run: Run | null,\n anchor_paragraph: Paragraph | null,\n reuse_id: string,\n ): {\n first_node: Element | null;\n last_p: Element | null;\n last_ins: Element | null;\n used_block_mode: boolean;\n } {\n if (!text) {\n return {\n first_node: null,\n last_p: null,\n last_ins: null,\n used_block_mode: false,\n };\n }\n\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const lines = text.split(/[\\r\\n]+/);\n\n // Resolve the containing <w:p> (current_p) for the anchor.\n let current_p: Element | null = null;\n if (anchor_paragraph !== null) {\n current_p = anchor_paragraph._element;\n } else if (anchor_run !== null) {\n let walker: Element | null = anchor_run._element;\n while (walker && walker.tagName !== \"w:p\") {\n walker = walker.parentNode as Element | null;\n }\n current_p = walker;\n }\n\n // Drop trailing empty line. \"foo\\n\\nbar\\n\\n\" splits to\n // ['foo', '', 'bar', '']; that trailing empty is just a terminator, not\n // a real empty paragraph.\n while (lines.length > 1 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n if (lines.length === 0) {\n return {\n first_node: null,\n last_p: null,\n last_ins: null,\n used_block_mode: false,\n };\n }\n\n // Inspect the first line for heading/list markers.\n const [first_clean, first_style] = this._parse_markdown_style(lines[0]);\n const have_paragraph_context = current_p !== null;\n const block_mode = first_style !== null && have_paragraph_context;\n\n let first_node: Element | null = null;\n let inline_ins: Element | null = null;\n\n // ---- INLINE PATH for the first line (when NOT in block mode) ----\n if (!block_mode) {\n inline_ins = this._build_tracked_ins_for_line(\n first_clean === lines[0] ? lines[0] : lines[0],\n anchor_run,\n reuse_id,\n xmlDoc,\n );\n first_node = inline_ins;\n // Caller will attach `inline_ins` to the DOM later — keep it for now.\n }\n\n // ---- BLOCK PATH for the first line (when in block mode) ----\n // Block-mode first line is just the first extension paragraph below.\n const remaining_lines = block_mode ? lines : lines.slice(1);\n\n // If there's nothing to do beyond inline, we're done.\n if (remaining_lines.length === 0) {\n return {\n first_node,\n last_p: null,\n last_ins: inline_ins,\n used_block_mode: false,\n };\n }\n\n if (!current_p) {\n // Multi-paragraph insertion needs a paragraph context. Without one, fall\n // back to the inline result we already built.\n return {\n first_node,\n last_p: null,\n last_ins: inline_ins,\n used_block_mode: false,\n };\n }\n\n const parent_body = current_p.parentNode as Element | null;\n if (!parent_body) {\n return {\n first_node,\n last_p: null,\n last_ins: inline_ins,\n used_block_mode: false,\n };\n }\n\n const insertAfterEl = (newNode: Element, ref: Element) => {\n parent_body.insertBefore(newNode, ref.nextSibling);\n };\n\n let last_p: Element | null = null;\n let last_ins: Element | null = null;\n let after: Element = current_p;\n\n for (let i = 0; i < remaining_lines.length; i++) {\n const raw_line = remaining_lines[i];\n const [clean_text, style_name] = this._parse_markdown_style(raw_line);\n\n const new_p = xmlDoc.createElement(\"w:p\");\n\n if (style_name) {\n // Heading or list style was explicitly authored: replace pPr entirely.\n this._set_paragraph_style(new_p, style_name);\n } else {\n // Inherit pPr from the anchor paragraph (preserves list numbering).\n const existing_pPr = findChild(current_p, \"w:pPr\");\n if (existing_pPr) {\n new_p.appendChild(existing_pPr.cloneNode(true));\n }\n }\n\n // Track the paragraph break itself as an insertion.\n let pPr = findChild(new_p, \"w:pPr\");\n if (!pPr) {\n pPr = xmlDoc.createElement(\"w:pPr\");\n new_p.insertBefore(pPr, new_p.firstChild);\n }\n let rPr = findChild(pPr, \"w:rPr\");\n if (!rPr) {\n rPr = xmlDoc.createElement(\"w:rPr\");\n pPr.appendChild(rPr);\n }\n const ins_mark = this._create_track_change_tag(\"w:ins\", \"\", reuse_id);\n rPr.appendChild(ins_mark);\n\n // Build the content <w:ins>.\n const content_ins = this._build_tracked_ins_for_line(\n clean_text,\n anchor_run,\n reuse_id,\n xmlDoc,\n );\n if (content_ins) {\n new_p.appendChild(content_ins);\n }\n\n insertAfterEl(new_p, after);\n after = new_p;\n last_p = new_p;\n last_ins = content_ins;\n\n // In block mode (or if the inline line was completely empty), the first new paragraph IS first_node.\n if (!first_node) {\n first_node = new_p;\n }\n }\n\n return { first_node, last_p, last_ins, used_block_mode: block_mode };\n }\n\n /**\n * Builds a single tracked-insert wrapper (<w:ins>) containing one or more\n * <w:r> elements representing the inline markdown segments of `line_text`.\n * Returns null if line_text is empty.\n */\n private _build_tracked_ins_for_line(\n line_text: string,\n anchor_run: Run | null,\n reuse_id: string,\n xmlDoc: Document,\n ): Element | null {\n if (!line_text && line_text !== \"\") return null;\n const ins = this._create_track_change_tag(\"w:ins\", \"\", reuse_id);\n const segments = this._parse_inline_markdown(line_text);\n if (segments.length === 0) {\n return null;\n }\n for (const [segText, segProps] of segments) {\n const r = xmlDoc.createElement(\"w:r\");\n // Inherit run formatting (e.g. bold from a heading style) only when we\n // have an anchor run AND we are not overriding via segment props.\n if (anchor_run && anchor_run._element) {\n const anchor_rPr = findChild(anchor_run._element, \"w:rPr\");\n if (anchor_rPr) {\n const clone = anchor_rPr.cloneNode(true) as Element;\n // Strip vanish / strike to avoid invisible inserts.\n for (const tag of [\"w:vanish\", \"w:strike\", \"w:dstrike\"]) {\n const found = findChild(clone, tag);\n if (found) clone.removeChild(found);\n }\n r.appendChild(clone);\n }\n }\n this._apply_run_props(r, segProps, false);\n const t = xmlDoc.createElement(\"w:t\");\n this._set_text_content(t, segText);\n r.appendChild(t);\n ins.appendChild(r);\n }\n return ins;\n }\n private _parse_markdown_style(text: string): [string, string | null] {\n const stripped_text = text.trimStart();\n\n if (stripped_text.startsWith(\"#\")) {\n let level = 0;\n let temp = stripped_text;\n while (temp.startsWith(\"#\")) {\n level++;\n temp = temp.substring(1);\n }\n if (temp.startsWith(\" \")) return [temp.trim(), `Heading ${level}`];\n }\n\n if (stripped_text.startsWith(\"* \") || stripped_text.startsWith(\"- \")) {\n return [stripped_text.substring(2).trim(), \"List Paragraph\"];\n }\n\n const match = stripped_text.match(/^\\d+\\.\\s+/);\n if (match) {\n return [stripped_text.substring(match[0].length).trim(), \"List Number\"];\n }\n\n return [text, null];\n }\n\n private _parse_inline_markdown(\n text: string,\n baseStyle: any = {},\n ): [string, any][] {\n if (!text) return [];\n\n const tokenPattern = /(\\*\\*.*?\\*\\*)|(_.*?_)/;\n const match = text.match(tokenPattern);\n\n if (!match) return [[text, baseStyle]];\n\n const start = match.index!;\n const raw = match[0];\n const end = start + raw.length;\n\n const isBold = raw.startsWith(\"**\");\n const innerContent = isBold\n ? raw.substring(2, raw.length - 2)\n : raw.substring(1, raw.length - 1);\n\n const preText = text.substring(0, start);\n const postText = text.substring(end);\n\n const results: [string, any][] = [];\n if (preText) results.push([preText, baseStyle]);\n\n const newStyle = { ...baseStyle };\n if (isBold) newStyle.bold = true;\n else newStyle.italic = true;\n\n results.push(...this._parse_inline_markdown(innerContent, newStyle));\n results.push(...this._parse_inline_markdown(postText, baseStyle));\n\n return results;\n }\n\n private _apply_run_props(\n runElement: Element,\n props: any,\n suppressInherited: boolean = false,\n ) {\n if (!props) {\n if (!suppressInherited) return;\n props = {};\n }\n\n let rPr = findChild(runElement, \"w:rPr\");\n if (!rPr && (props.bold || props.italic || suppressInherited)) {\n const doc = runElement.ownerDocument!;\n rPr = doc.createElement(\"w:rPr\");\n runElement.appendChild(rPr);\n }\n\n if (rPr) {\n const doc = runElement.ownerDocument!;\n if (props.bold) {\n let b = findChild(rPr, \"w:b\");\n if (!b) {\n b = doc.createElement(\"w:b\");\n rPr.appendChild(b);\n }\n b.setAttribute(\"w:val\", \"1\");\n } else if (suppressInherited) {\n const b = findChild(rPr, \"w:b\");\n if (b) rPr.removeChild(b);\n }\n\n if (props.italic) {\n let i = findChild(rPr, \"w:i\");\n if (!i) {\n i = doc.createElement(\"w:i\");\n rPr.appendChild(i);\n }\n i.setAttribute(\"w:val\", \"1\");\n } else if (suppressInherited) {\n const i = findChild(rPr, \"w:i\");\n if (i) rPr.removeChild(i);\n }\n }\n }\n /**\n * Replaces (or creates) a paragraph's <w:pPr> with a single <w:pStyle> entry\n * pointing at `style_name`. Strips any existing pPr to avoid layering a new\n * heading style on top of a previous list/heading configuration.\n *\n * In Python, the style id is resolved via doc.styles[style_name].style_id and\n * falls back to stripping spaces. Node has no equivalent style cache exposed\n * on `doc`, so we always use the simple \"strip spaces\" fallback: \"Heading 1\"\n * becomes the style id \"Heading1\", \"List Number\" becomes \"ListNumber\", etc.\n * This matches python-docx's default style-id convention for the built-in\n * paragraph styles and is what Word writes by default.\n */\n private _set_paragraph_style(p_element: Element, style_name: string) {\n const xmlDoc = p_element.ownerDocument!;\n\n const existing_pPr = findChild(p_element, \"w:pPr\");\n if (existing_pPr) {\n p_element.removeChild(existing_pPr);\n }\n\n const pPr = xmlDoc.createElement(\"w:pPr\");\n const pStyle = xmlDoc.createElement(\"w:pStyle\");\n const style_id = style_name.replace(/\\s+/g, \"\");\n pStyle.setAttribute(\"w:val\", style_id);\n pPr.appendChild(pStyle);\n\n // pPr is the first child of <w:p> per OOXML schema.\n p_element.insertBefore(pPr, p_element.firstChild);\n }\n private _anchor_reply_comment(parent_id: string, new_id: string) {\n const docEl = this.doc.part._element.ownerDocument!;\n\n const starts = findAllDescendants(\n this.doc.element,\n \"w:commentRangeStart\",\n ).filter((n) => n.getAttribute(\"w:id\") === parent_id);\n if (starts.length === 0) return;\n const parent_start = starts[0];\n\n const new_start = docEl.createElement(\"w:commentRangeStart\");\n new_start.setAttribute(\"w:id\", new_id);\n insertAfter(new_start, parent_start);\n\n const ends = findAllDescendants(\n this.doc.element,\n \"w:commentRangeEnd\",\n ).filter((n) => n.getAttribute(\"w:id\") === parent_id);\n if (ends.length === 0) return;\n const parent_end = ends[0];\n\n const parent_refs = findAllDescendants(\n this.doc.element,\n \"w:commentReference\",\n ).filter((n) => n.getAttribute(\"w:id\") === parent_id);\n\n let insertion_point = parent_end;\n if (parent_refs.length > 0) {\n const ref_el = parent_refs[0];\n if (\n ref_el.parentNode &&\n (ref_el.parentNode as Element).tagName === \"w:r\"\n ) {\n insertion_point = ref_el.parentNode as Element;\n }\n }\n\n const new_end = docEl.createElement(\"w:commentRangeEnd\");\n new_end.setAttribute(\"w:id\", new_id);\n insertAfter(new_end, insertion_point);\n\n const ref_run = docEl.createElement(\"w:r\");\n const rPr = docEl.createElement(\"w:rPr\");\n const rStyle = docEl.createElement(\"w:rStyle\");\n rStyle.setAttribute(\"w:val\", \"CommentReference\");\n rPr.appendChild(rStyle);\n ref_run.appendChild(rPr);\n\n const ref = docEl.createElement(\"w:commentReference\");\n ref.setAttribute(\"w:id\", new_id);\n ref_run.appendChild(ref);\n\n insertAfter(ref_run, new_end);\n }\n private _clean_wrapping_comments(element: Element) {\n let first_node: Element = element;\n while (true) {\n const prev = getPreviousElement(first_node);\n if (prev && (prev.tagName === \"w:ins\" || prev.tagName === \"w:del\")) {\n first_node = prev;\n } else {\n break;\n }\n }\n\n let last_node: Element = element;\n while (true) {\n const nxt = getNextElement(last_node);\n if (nxt && (nxt.tagName === \"w:ins\" || nxt.tagName === \"w:del\")) {\n last_node = nxt;\n } else {\n break;\n }\n }\n\n const starts_to_remove: Element[] = [];\n let prev = getPreviousElement(first_node);\n while (prev) {\n if (prev.tagName === \"w:commentRangeStart\") {\n starts_to_remove.push(prev);\n prev = getPreviousElement(prev);\n } else if (prev.tagName === \"w:rPr\" || prev.tagName === \"w:pPr\") {\n prev = getPreviousElement(prev);\n } else {\n break;\n }\n }\n\n const ends_to_remove: Element[] = [];\n let nxt = getNextElement(last_node);\n while (nxt) {\n if (nxt.tagName === \"w:commentRangeEnd\") {\n ends_to_remove.push(nxt);\n nxt = getNextElement(nxt);\n } else if (\n nxt.tagName === \"w:r\" &&\n findAllDescendants(nxt, \"w:commentReference\").length > 0\n ) {\n ends_to_remove.push(nxt);\n nxt = getNextElement(nxt);\n } else if (nxt.tagName === \"w:commentReference\") {\n ends_to_remove.push(nxt);\n nxt = getNextElement(nxt);\n } else {\n break;\n }\n }\n\n const end_ids = new Set<string>();\n for (const e of ends_to_remove) {\n if (e.tagName === \"w:commentRangeEnd\") {\n const eid = e.getAttribute(\"w:id\");\n if (eid) end_ids.add(eid);\n } else {\n let ref = findAllDescendants(e, \"w:commentReference\")[0];\n if (!ref && e.tagName === \"w:commentReference\") ref = e;\n if (ref) {\n const eid = ref.getAttribute(\"w:id\");\n if (eid) end_ids.add(eid);\n }\n }\n }\n\n for (const s of starts_to_remove) {\n const c_id = s.getAttribute(\"w:id\");\n if (c_id && end_ids.has(c_id)) {\n this.comments_manager.deleteComment(c_id);\n if (s.parentNode) s.parentNode.removeChild(s);\n for (const e of ends_to_remove) {\n let e_id: string | null = null;\n if (e.tagName === \"w:commentRangeEnd\") {\n e_id = e.getAttribute(\"w:id\");\n } else {\n let ref = findAllDescendants(e, \"w:commentReference\")[0];\n if (!ref && e.tagName === \"w:commentReference\") ref = e;\n if (ref) e_id = ref.getAttribute(\"w:id\");\n }\n if (e_id === c_id && e.parentNode) {\n e.parentNode.removeChild(e);\n }\n }\n }\n }\n }\n\n private _delete_comments_in_element(element: Element) {\n const refs = findAllDescendants(element, \"w:commentReference\");\n for (const ref of refs) {\n const c_id = ref.getAttribute(\"w:id\");\n if (c_id) {\n this.comments_manager.deleteComment(c_id);\n for (const tag of [\"w:commentRangeStart\", \"w:commentRangeEnd\"]) {\n const nodes = findAllDescendants(this.doc.element, tag);\n for (const node of nodes) {\n if (node.getAttribute(\"w:id\") === c_id && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n }\n }\n }\n }\n public validate_edits(edits: any[]): string[] {\n const errors: string[] = [];\n if (!this.mapper.full_text) this.mapper[\"_build_map\"]();\n\n errors.push(...validate_edit_strings(edits));\n\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i];\n if (!edit.target_text) continue;\n\n let matches = this.mapper.find_all_match_indices(edit.target_text);\n let activeText = this.mapper.full_text;\n\n if (matches.length === 0) {\n if (!this.clean_mapper)\n this.clean_mapper = new DocumentMapper(this.doc, true);\n matches = this.clean_mapper.find_all_match_indices(edit.target_text);\n if (matches.length > 0) activeText = this.clean_mapper.full_text;\n }\n\n if (matches.length === 0) {\n errors.push(\n `- Edit ${i + 1} Failed: Target text not found in document:\\n \"${edit.target_text}\"`,\n );\n } else if (matches.length > 1) {\n const positions: [number, number][] = matches.map(([start, length]) => [\n start,\n start + length,\n ]);\n errors.push(\n format_ambiguity_error(\n i + 1,\n edit.target_text,\n activeText,\n positions,\n ),\n );\n }\n\n for (const [start, length] of matches) {\n const spans = this.mapper.spans.filter(\n (s) => s.end > start && s.start < start + length,\n );\n const nestedAuthors = new Set<string>();\n for (const s of spans) {\n if (s.ins_id) {\n const insNodes = findAllDescendants(\n this.doc.element,\n \"w:ins\",\n ).filter((n) => n.getAttribute(\"w:id\") === s.ins_id);\n if (insNodes.length > 0) {\n const auth = insNodes[0].getAttribute(\"w:author\");\n if (auth && auth !== this.author) nestedAuthors.add(auth);\n }\n }\n }\n if (nestedAuthors.size > 0) {\n errors.push(\n `- Edit ${i + 1} Failed: Modification targets an active insertion from another author (${Array.from(nestedAuthors).join(\", \")}). Accept that change first or scope your edit outside of it.`,\n );\n }\n }\n }\n return errors;\n }\n public validate_review_actions(actions: any[]): string[] {\n const errors: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const type = action.type;\n\n if (type === \"reply\") {\n const cid = action.target_id.replace(\"Com:\", \"\");\n let found = false;\n const part = this.doc.pkg.parts.find(\n (p) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\",\n );\n if (part) {\n const comments = findAllDescendants(part._element, \"w:comment\");\n found = comments.some((c) => c.getAttribute(\"w:id\") === cid);\n }\n if (!found) {\n errors.push(\n `- Action ${i + 1} Failed: Target comment ID ${action.target_id} not found.`,\n );\n }\n } else if (type === \"accept\" || type === \"reject\") {\n const target_id = action.target_id.replace(\"Chg:\", \"\");\n const all_ins = findAllDescendants(this.doc.element, \"w:ins\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n const all_del = findAllDescendants(this.doc.element, \"w:del\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n if (all_ins.length === 0 && all_del.length === 0) {\n errors.push(\n `- Action ${i + 1} Failed: Target ID ${action.target_id} not found.`,\n );\n }\n }\n }\n return errors;\n }\n public process_batch(changes: DocumentChange[]): any {\n this.skipped_details = [];\n const actions = changes.filter((c) =>\n [\"accept\", \"reject\", \"reply\"].includes(c.type),\n );\n const edits = changes.filter(\n (c) => ![\"accept\", \"reject\", \"reply\"].includes(c.type),\n );\n\n const all_errors: string[] = [];\n\n if (actions.length > 0) {\n all_errors.push(...this.validate_review_actions(actions));\n }\n if (edits.length > 0) {\n all_errors.push(...this.validate_edits(edits));\n }\n\n if (all_errors.length > 0) {\n throw new BatchValidationError(all_errors);\n }\n\n let applied_actions = 0,\n skipped_actions = 0;\n if (actions.length > 0) {\n const res = this.apply_review_actions(actions);\n applied_actions = res[0];\n skipped_actions = res[1];\n if (applied_actions > 0) {\n this.mapper[\"_build_map\"]();\n if (this.clean_mapper) this.clean_mapper[\"_build_map\"]();\n }\n }\n\n let applied_edits = 0,\n skipped_edits = 0;\n if (edits.length > 0) {\n const res = this.apply_edits(edits as any[]);\n applied_edits = res[0];\n skipped_edits = res[1];\n }\n\n return {\n actions_applied: applied_actions,\n actions_skipped: skipped_actions,\n edits_applied: applied_edits,\n edits_skipped: skipped_edits,\n skipped_details: this.skipped_details,\n };\n }\n\n public apply_edits(edits: any[]): [number, number] {\n let applied = 0;\n let skipped = 0;\n const resolved_edits: [any, string | null][] = [];\n\n for (const edit of edits) {\n if (\n edit._match_start_index !== undefined &&\n edit._match_start_index !== null\n ) {\n resolved_edits.push([edit, edit.new_text || null]);\n } else if (edit.type === \"insert_row\" || edit.type === \"delete_row\") {\n const [idx] = this.mapper.find_match_index(edit.target_text);\n if (idx !== -1) {\n edit._match_start_index = idx;\n resolved_edits.push([edit, null]);\n } else {\n skipped++;\n this.skipped_details.push(\n `- Failed to locate row target: '${(edit.target_text || \"\").substring(0, 40)}...'`,\n );\n }\n } else {\n const resolved = this._pre_resolve_heuristic_edit(edit);\n if (resolved) {\n if (Array.isArray(resolved)) {\n for (const r of resolved) resolved_edits.push([r, r.new_text]);\n } else {\n resolved_edits.push([resolved, (resolved as any).new_text]);\n }\n } else {\n skipped++;\n this.skipped_details.push(\n `- Failed to apply edit targeting: '${(edit.target_text || \"insertion\").substring(0, 40)}...'`,\n );\n }\n }\n }\n\n resolved_edits.sort(\n (a, b) => (b[0]._match_start_index || 0) - (a[0]._match_start_index || 0),\n );\n const occupied_ranges: [number, number][] = [];\n\n for (const [edit, orig_new] of resolved_edits) {\n const start = edit._match_start_index || 0;\n const end = start + (edit.target_text ? edit.target_text.length : 0);\n\n const overlaps = occupied_ranges.some(\n ([occ_start, occ_end]) => start < occ_end && end > occ_start,\n );\n if (overlaps) {\n skipped++;\n this.skipped_details.push(\n `- Skipped overlapping edit targeting: '${(edit.target_text || \"insertion\").substring(0, 40)}...'`,\n );\n continue;\n }\n\n let success = false;\n if (edit.type === \"modify\") {\n success = this._apply_single_edit_indexed(edit, orig_new, false);\n } else if (edit.type === \"insert_row\" || edit.type === \"delete_row\") {\n success = this._apply_table_edit(edit, false);\n }\n\n if (success) {\n applied++;\n occupied_ranges.push([start, end]);\n } else {\n skipped++;\n this.skipped_details.push(\n `- Failed to apply edit targeting: '${(edit.target_text || \"insertion\").substring(0, 40)}...'`,\n );\n }\n }\n\n return [applied, skipped];\n }\n\n public apply_review_actions(actions: any[]): [number, number] {\n let applied = 0;\n let skipped = 0;\n\n for (const action of actions) {\n const type = action.type;\n if (type === \"reply\") {\n const cid = action.target_id.replace(\"Com:\", \"\");\n const new_id = this.comments_manager.addComment(\n this.author,\n action.text,\n cid,\n );\n this._anchor_reply_comment(cid, new_id);\n applied++;\n continue;\n }\n\n const target_id = action.target_id.replace(\"Chg:\", \"\");\n const all_ins = findAllDescendants(this.doc.element, \"w:ins\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n const all_del = findAllDescendants(this.doc.element, \"w:del\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n const all_nodes = [...all_ins, ...all_del];\n\n if (all_nodes.length === 0) {\n skipped++;\n this.skipped_details.push(\n `- Failed to apply action: Target ID ${action.target_id} not found.`,\n );\n continue;\n }\n\n for (const node of all_nodes) {\n const is_ins = node.tagName === \"w:ins\";\n const parent_tag = node.parentNode\n ? (node.parentNode as Element).tagName\n : \"\";\n const is_trPr = parent_tag === \"w:trPr\";\n\n if (type === \"accept\") {\n if (is_ins) {\n this._clean_wrapping_comments(node);\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n while (node.firstChild)\n node.parentNode?.insertBefore(node.firstChild, node);\n node.parentNode?.removeChild(node);\n }\n } else {\n this._clean_wrapping_comments(node);\n this._delete_comments_in_element(node);\n if (is_trPr) {\n const tr = node.parentNode?.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else {\n node.parentNode?.removeChild(node);\n }\n }\n } else if (type === \"reject\") {\n if (is_ins) {\n this._clean_wrapping_comments(node);\n this._delete_comments_in_element(node);\n if (is_trPr) {\n const tr = node.parentNode?.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else node.parentNode?.removeChild(node);\n } else {\n this._clean_wrapping_comments(node);\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n const delTexts = Array.from(\n node.getElementsByTagName(\"w:delText\"),\n );\n for (const dt of delTexts) {\n const t = dt.ownerDocument!.createElement(\"w:t\");\n t.textContent = dt.textContent;\n if (dt.hasAttribute(\"xml:space\"))\n t.setAttribute(\"xml:space\", \"preserve\");\n dt.parentNode?.replaceChild(t, dt);\n }\n while (node.firstChild)\n node.parentNode?.insertBefore(node.firstChild, node);\n node.parentNode?.removeChild(node);\n }\n }\n }\n }\n applied++;\n }\n return [applied, skipped];\n }\n\n private _apply_table_edit(edit: any, rebuild_map: boolean): boolean {\n const start_idx = edit._match_start_index || 0;\n const [anchor_run, anchor_para] = this.mapper.get_insertion_anchor(\n start_idx,\n rebuild_map,\n );\n\n let target_element: Element | null = null;\n if (anchor_run) target_element = anchor_run._element;\n else if (anchor_para) target_element = anchor_para._element;\n\n if (!target_element) return false;\n\n let tr: Element | null = target_element;\n while (tr && tr.tagName !== \"w:tr\") tr = tr.parentNode as Element;\n if (!tr) return false;\n\n if (edit.type === \"delete_row\") {\n let trPr = findChild(tr, \"w:trPr\");\n if (!trPr) {\n trPr = tr.ownerDocument!.createElement(\"w:trPr\");\n tr.insertBefore(trPr, tr.firstChild);\n }\n trPr.appendChild(this._create_track_change_tag(\"w:del\"));\n return true;\n } else if (edit.type === \"insert_row\") {\n const new_tr = tr.ownerDocument!.createElement(\"w:tr\");\n const trPr = tr.ownerDocument!.createElement(\"w:trPr\");\n new_tr.appendChild(trPr);\n trPr.appendChild(this._create_track_change_tag(\"w:ins\"));\n for (const cellText of edit.cells) {\n const tc = tr.ownerDocument!.createElement(\"w:tc\");\n const p = tr.ownerDocument!.createElement(\"w:p\");\n const r = tr.ownerDocument!.createElement(\"w:r\");\n const t = tr.ownerDocument!.createElement(\"w:t\");\n t.textContent = cellText;\n if (cellText.trim() !== cellText)\n t.setAttribute(\"xml:space\", \"preserve\");\n r.appendChild(t);\n p.appendChild(r);\n tc.appendChild(p);\n new_tr.appendChild(tc);\n }\n if (edit.position === \"above\") tr.parentNode?.insertBefore(new_tr, tr);\n else insertAfter(new_tr, tr);\n return true;\n }\n return false;\n }\n\n private _pre_resolve_heuristic_edit(edit: any): any {\n if (!edit.target_text) return null;\n\n let [start_idx, match_len] = this.mapper.find_match_index(edit.target_text);\n let use_clean_map = false;\n\n if (start_idx === -1) {\n if (!this.clean_mapper)\n this.clean_mapper = new DocumentMapper(this.doc, true);\n [start_idx, match_len] = this.clean_mapper.find_match_index(\n edit.target_text,\n );\n if (start_idx !== -1) use_clean_map = true;\n else return null;\n }\n\n const active_mapper = use_clean_map ? this.clean_mapper! : this.mapper;\n const effective_new_text = edit.new_text || \"\";\n const actual_doc_text = this.mapper.full_text.substring(\n start_idx,\n start_idx + match_len,\n );\n\n if (\n actual_doc_text === effective_new_text ||\n edit.target_text === effective_new_text\n ) {\n return {\n type: \"modify\",\n target_text: actual_doc_text,\n new_text: actual_doc_text,\n comment: edit.comment,\n _match_start_index: start_idx,\n _internal_op: \"COMMENT_ONLY\",\n _active_mapper_ref: active_mapper,\n };\n }\n\n let effective_op = \"\";\n let final_target = \"\";\n let final_new = \"\";\n let effective_start_idx = start_idx;\n\n if (effective_new_text.startsWith(actual_doc_text)) {\n effective_op = \"INSERTION\";\n final_new = effective_new_text.substring(actual_doc_text.length);\n effective_start_idx = start_idx + match_len;\n } else {\n const [prefix_len, suffix_len] = trim_common_context(\n actual_doc_text,\n effective_new_text,\n );\n const t_end = actual_doc_text.length - suffix_len;\n const n_end = effective_new_text.length - suffix_len;\n\n final_target = actual_doc_text.substring(prefix_len, t_end);\n final_new = effective_new_text.substring(prefix_len, n_end);\n effective_start_idx = start_idx + prefix_len;\n\n if (!final_target && final_new) effective_op = \"INSERTION\";\n else if (final_target && !final_new) effective_op = \"DELETION\";\n else if (final_target && final_new) effective_op = \"MODIFICATION\";\n else effective_op = \"COMMENT_ONLY\";\n }\n\n return {\n type: \"modify\",\n target_text: final_target,\n new_text: final_new,\n comment: edit.comment,\n _match_start_index: effective_start_idx,\n _internal_op: effective_op,\n _active_mapper_ref: active_mapper,\n };\n }\n\n private _apply_single_edit_indexed(\n edit: any,\n orig_new: string | null,\n rebuild_map: boolean,\n ): boolean {\n let op = edit._internal_op;\n const active_mapper = edit._active_mapper_ref || this.mapper;\n const start_idx = edit._match_start_index || 0;\n const length = edit.target_text ? edit.target_text.length : 0;\n\n const del_id = [\"DELETION\", \"MODIFICATION\"].includes(op)\n ? this._getNextId()\n : null;\n const ins_id = [\"INSERTION\", \"MODIFICATION\"].includes(op)\n ? this._getNextId()\n : null;\n\n if (op === \"COMMENT_ONLY\") {\n // Resolve the runs covering [start_idx, start_idx+length) and attach a\n // comment around them. No tracked-change is produced.\n const target_runs = active_mapper.find_target_runs_by_index(\n start_idx,\n length,\n rebuild_map,\n );\n if (target_runs.length === 0) return false;\n if (!edit.comment) return true;\n\n const first_el = target_runs[0]._element;\n const last_el = target_runs[target_runs.length - 1]._element;\n\n // Walk up from the first/last run to their containing <w:p>.\n let start_p: Element | null = first_el;\n while (start_p && start_p.tagName !== \"w:p\")\n start_p = start_p.parentNode as Element;\n let end_p: Element | null = last_el;\n while (end_p && end_p.tagName !== \"w:p\")\n end_p = end_p.parentNode as Element;\n if (!start_p || !end_p) return false;\n\n // first_el / last_el may live inside a <w:ins> or <w:del>. We need their\n // top-level child-of-paragraph ancestor so the comment markers become\n // siblings of those wrappers, not children.\n const ascend_to_paragraph_child = (el: Element, p: Element): Element => {\n let cur: Element = el;\n while (cur.parentNode && cur.parentNode !== p) {\n cur = cur.parentNode as Element;\n }\n return cur;\n };\n const first_anchor = ascend_to_paragraph_child(first_el, start_p);\n const last_anchor = ascend_to_paragraph_child(last_el, end_p);\n\n if (start_p === end_p) {\n this._attach_comment(start_p, first_anchor, last_anchor, edit.comment);\n } else {\n this._attach_comment_spanning(\n start_p,\n first_anchor,\n end_p,\n last_anchor,\n edit.comment,\n );\n }\n return true;\n }\n if (op === \"INSERTION\") {\n const [anchor_run, anchor_para] = active_mapper.get_insertion_anchor(\n start_idx,\n rebuild_map,\n );\n if (!anchor_run && !anchor_para) return false;\n\n const result = this._track_insert_multiline(\n edit.new_text || \"\",\n anchor_run,\n anchor_para,\n ins_id!,\n );\n\n if (!result.first_node) return false;\n\n // Place the inline <w:ins> (or block-mode first paragraph) into the DOM.\n // Block-mode first_node is already a freshly-inserted <w:p>; only the\n // inline case needs DOM splicing here.\n const is_inline_first = result.first_node.tagName === \"w:ins\";\n if (is_inline_first) {\n if (anchor_run) {\n insertAfter(result.first_node, anchor_run._element);\n } else if (anchor_para) {\n anchor_para._element.appendChild(result.first_node);\n }\n }\n\n // Attach the comment if requested. Anchor depends on whether we created\n // additional paragraphs.\n if (edit.comment) {\n const ascend_to_paragraph_child = (\n el: Element,\n p: Element,\n ): Element => {\n let cur: Element = el;\n while (cur.parentNode && cur.parentNode !== p) {\n cur = cur.parentNode as Element;\n }\n return cur;\n };\n\n if (result.last_p && result.last_ins) {\n // Multi-paragraph: anchor from first_node (in its host paragraph)\n // through last_ins (inside last_p).\n let start_p: Element | null = result.first_node;\n while (start_p && start_p.tagName !== \"w:p\")\n start_p = start_p.parentNode as Element;\n if (start_p) {\n let first_anchor_target = result.first_node;\n if (result.first_node.tagName === \"w:p\") {\n first_anchor_target = findAllDescendants(result.first_node, \"w:ins\")[0] || result.first_node;\n }\n const start_anchor = ascend_to_paragraph_child(\n first_anchor_target,\n start_p,\n );\n const end_anchor = ascend_to_paragraph_child(\n result.last_ins,\n result.last_p,\n );\n this._attach_comment_spanning(\n start_p,\n start_anchor,\n result.last_p,\n end_anchor,\n edit.comment,\n );\n }\n } else {\n // Inline only: anchor around first_node in its host paragraph.\n let host_p: Element | null = result.first_node;\n while (host_p && host_p.tagName !== \"w:p\")\n host_p = host_p.parentNode as Element;\n if (host_p) {\n let first_anchor_target = result.first_node;\n if (result.first_node.tagName === \"w:p\") {\n first_anchor_target = findAllDescendants(result.first_node, \"w:ins\")[0] || result.first_node;\n }\n const anchor = ascend_to_paragraph_child(first_anchor_target, host_p);\n this._attach_comment(host_p, anchor, anchor, edit.comment);\n }\n }\n }\n return true;\n }\n\n // DELETION / MODIFICATION\n const target_runs = active_mapper.find_target_runs_by_index(\n start_idx,\n length,\n rebuild_map,\n );\n const virtual_spans = active_mapper.get_virtual_spans_in_range(start_idx, length);\n\n if (target_runs.length === 0 && virtual_spans.length === 0) return false;\n\n const affected_ps = new Set<Element>();\n for (const run of target_runs) {\n let p: Element | null = run._element.parentNode as Element;\n while (p && p.tagName !== \"w:p\") p = p.parentNode as Element;\n if (p) affected_ps.add(p);\n }\n\n let first_del: Element | null = null;\n let last_del: Element | null = null;\n for (const run of target_runs) {\n const del_tag = this._create_track_change_tag(\"w:del\", \"\", del_id);\n const new_run = run._element.cloneNode(true) as Element;\n\n const tNodes = Array.from(new_run.getElementsByTagName(\"w:t\"));\n tNodes.forEach((t) => {\n const delText = new_run.ownerDocument!.createElement(\"w:delText\");\n delText.textContent = t.textContent;\n if (t.hasAttribute(\"xml:space\"))\n delText.setAttribute(\"xml:space\", \"preserve\");\n new_run.replaceChild(delText, t);\n });\n\n del_tag.appendChild(new_run);\n run._element.parentNode?.replaceChild(del_tag, run._element);\n if (first_del === null) first_del = del_tag;\n last_del = del_tag;\n }\n\n let ins_elem: Element | null = null;\n let mod_last_p: Element | null = null;\n let mod_last_ins: Element | null = null;\n\n if (op === \"MODIFICATION\" && edit.new_text && last_del) {\n // Resolve a paragraph anchor: the <w:p> hosting last_del.\n let mod_anchor_para_el: Element | null = last_del;\n while (mod_anchor_para_el && mod_anchor_para_el.tagName !== \"w:p\") {\n mod_anchor_para_el = mod_anchor_para_el.parentNode as Element | null;\n }\n const mod_anchor_para: Paragraph | null = mod_anchor_para_el\n ? new Paragraph(mod_anchor_para_el, null)\n : null;\n\n // The \"anchor run\" for style inheritance is the run we just deleted; reuse\n // the deleted run's rPr by sourcing the original target run if available.\n const style_source_run: Run | null =\n target_runs.length > 0 ? target_runs[target_runs.length - 1] : null;\n\n const result = this._track_insert_multiline(\n edit.new_text,\n style_source_run,\n mod_anchor_para,\n ins_id!,\n );\n\n if (result.first_node) {\n const is_inline_first = result.first_node.tagName === \"w:ins\";\n if (is_inline_first) {\n // Inline: place the first <w:ins> immediately after last_del.\n insertAfter(result.first_node, last_del);\n ins_elem = result.first_node;\n } else {\n // Block-mode first paragraph was already inserted after the anchor\n // paragraph by the helper. We still need ins_elem for comment fallback.\n ins_elem = result.last_ins;\n }\n mod_last_p = result.last_p;\n mod_last_ins = result.last_ins;\n }\n }\n\n // PHASE 2: OOXML Paragraph Merge Protocol\n if (op === \"DELETION\" || op === \"MODIFICATION\") {\n if (op === \"MODIFICATION\" && target_runs.length === 0 && virtual_spans.length > 0 && edit.new_text) {\n const first_span = virtual_spans[0];\n if (first_span.paragraph) {\n const p1_el = first_span.paragraph._element;\n const last_runs = findAllDescendants(p1_el, \"w:r\");\n const anchor = last_runs.length > 0 ? new Run(last_runs[last_runs.length - 1], first_span.paragraph) : null;\n \n const result = this._track_insert_multiline(\n edit.new_text,\n anchor,\n first_span.paragraph,\n ins_id!\n );\n if (result.first_node) {\n p1_el.appendChild(result.first_node);\n }\n }\n }\n\n for (const span of [...virtual_spans].reverse()) {\n if (span.paragraph) {\n const p1_element = span.paragraph._element;\n let p2_element = getNextElement(p1_element);\n while (p2_element && p2_element.tagName !== \"w:p\") {\n p2_element = getNextElement(p2_element);\n }\n\n if (p2_element && p2_element.tagName === \"w:p\") {\n let pPr = findChild(p1_element, \"w:pPr\");\n if (!pPr) {\n pPr = p1_element.ownerDocument!.createElement(\"w:pPr\") as Element;\n p1_element.insertBefore(pPr, p1_element.firstChild as Node | null);\n }\n let rPr = findChild(pPr!, \"w:rPr\");\n if (!rPr) {\n rPr = p1_element.ownerDocument!.createElement(\"w:rPr\") as Element;\n pPr!.appendChild(rPr);\n }\n const del_mark = this._create_track_change_tag(\"w:del\");\n rPr!.appendChild(del_mark);\n\n const children = Array.from(p2_element.childNodes);\n for (const child of children) {\n if (child.nodeType === 1 && (child as Element).tagName === \"w:pPr\") {\n continue;\n }\n p1_element.appendChild(child);\n }\n\n if (p2_element.parentNode) {\n p2_element.parentNode.removeChild(p2_element);\n }\n }\n }\n }\n }\n\n // Attach comment around the modification or deletion if requested.\n if (edit.comment && first_del !== null) {\n // Resolve the comment END anchor. For multi-paragraph modifications,\n // the end anchor lives in the LAST inserted paragraph (mod_last_p);\n // otherwise it's the inline ins/del in the source paragraph.\n let end_anchor_el: Element;\n let end_p: Element | null;\n\n if (mod_last_p && mod_last_ins) {\n end_anchor_el = mod_last_ins;\n end_p = mod_last_p;\n } else {\n const final_anchor: Element = ins_elem !== null ? ins_elem : last_del!;\n end_anchor_el = final_anchor;\n end_p = final_anchor;\n while (end_p && end_p.tagName !== \"w:p\")\n end_p = end_p.parentNode as Element | null;\n }\n\n let start_p: Element | null = first_del;\n while (start_p && start_p.tagName !== \"w:p\")\n start_p = start_p.parentNode as Element | null;\n if (!start_p || !end_p) return true;\n\n const ascend_to_paragraph_child = (el: Element, p: Element): Element => {\n let cur: Element = el;\n while (cur.parentNode && cur.parentNode !== p) {\n cur = cur.parentNode as Element;\n }\n return cur;\n };\n const start_anchor = ascend_to_paragraph_child(first_del, start_p);\n const end_anchor = ascend_to_paragraph_child(end_anchor_el, end_p);\n\n if (start_p === end_p) {\n this._attach_comment(start_p, start_anchor, end_anchor, edit.comment);\n } else {\n this._attach_comment_spanning(\n start_p,\n start_anchor,\n end_p,\n end_anchor,\n edit.comment,\n );\n }\n }\n\n // PHASE 2: Check for orphaned paragraphs with zero visible content remaining\n for (const p_elem of affected_ps) {\n let has_visible = false;\n for (const tag of [\"w:t\", \"w:tab\", \"w:br\"]) {\n const nodes = findAllDescendants(p_elem, tag);\n for (const node of nodes) {\n let is_deleted = false;\n let curr = node.parentNode as Element | null;\n while (curr && curr !== p_elem.parentNode) {\n if (curr.tagName === \"w:del\") {\n is_deleted = true;\n break;\n }\n curr = curr.parentNode as Element | null;\n }\n if (!is_deleted) {\n if (tag === \"w:t\" && !node.textContent) continue;\n has_visible = true;\n break;\n }\n }\n if (has_visible) break;\n }\n\n if (!has_visible) {\n let pPr = findChild(p_elem, \"w:pPr\");\n if (!pPr) {\n pPr = p_elem.ownerDocument!.createElement(\"w:pPr\") as Element;\n p_elem.insertBefore(pPr, p_elem.firstChild as Node | null);\n }\n let rPr = findChild(pPr!, \"w:rPr\");\n if (!rPr) {\n rPr = p_elem.ownerDocument!.createElement(\"w:rPr\") as Element;\n pPr!.appendChild(rPr);\n }\n if (!findChild(rPr!, \"w:del\")) {\n const del_mark = this._create_track_change_tag(\"w:del\");\n rPr!.appendChild(del_mark);\n }\n }\n }\n\n return true;\n }\n}\n","/**\n * Stateless paginator for projected DOCX Markdown.\n */\n\nconst PAGE_TARGET_CHARS = 19_000;\nconst APPENDIX_MARKER = '<!-- READONLY_BOUNDARY_START -->';\n\nconst _CRITIC_TOKENS: Record<string, string> = {\n '{++': '++}',\n '{--': '--}',\n '{==': '==}',\n '{>>': '<<}',\n};\n\nconst _CHG_ID_PATTERN = /\\bChg:(\\d+)\\b/g;\n\nexport interface PageInfo {\n page: number;\n total_pages: number;\n has_next: boolean;\n has_prev: boolean;\n tracked_change_count: number;\n page_content: string;\n}\n\nexport interface PaginationResult {\n pages: PageInfo[];\n total_pages: number;\n body_pages: string[];\n body_page_offsets: number[];\n}\n\nexport function split_structural_appendix(markdown: string): [string, string] {\n if (!markdown) return ['', ''];\n\n const idx = markdown.indexOf(APPENDIX_MARKER);\n if (idx === -1) return [markdown, ''];\n\n const line_start = markdown.lastIndexOf('\\n', idx) + 1;\n const body = markdown.substring(0, line_start).trimEnd();\n const appendix = markdown.substring(line_start);\n\n return [body, appendix];\n}\n\nexport function paginate(markdown_body: string, structural_appendix: string = ''): PaginationResult {\n if (!markdown_body) {\n const appendix_clean = structural_appendix ? structural_appendix.trim() : '';\n const content = appendix_clean;\n return {\n pages: [{\n page: 1,\n total_pages: 1,\n has_next: false,\n has_prev: false,\n tracked_change_count: _count_tracked_changes(content),\n page_content: content,\n }],\n total_pages: 1,\n body_pages: [''],\n body_page_offsets: [0],\n };\n }\n\n const block_records = _tokenize_into_atomic_blocks(markdown_body);\n const [body_pages, body_page_offsets] = _assemble_pages(block_records);\n\n let final_pages: string[];\n if (structural_appendix && structural_appendix.trim()) {\n const appendix = structural_appendix.trim();\n final_pages = body_pages.map(bp => bp ? `${bp}\\n\\n${appendix}` : appendix);\n } else {\n final_pages = [...body_pages];\n }\n\n const total = final_pages.length;\n const page_infos: PageInfo[] = final_pages.map((content, i) => ({\n page: i + 1,\n total_pages: total,\n has_next: (i + 1 < total),\n has_prev: (i + 1 > 1),\n tracked_change_count: _count_tracked_changes(content),\n page_content: content,\n }));\n\n return {\n pages: page_infos,\n total_pages: total,\n body_pages,\n body_page_offsets,\n };\n}\n\nfunction _tokenize_into_atomic_blocks(markdown_body: string): [string, number][] {\n const raw_blocks = _split_on_safe_paragraph_breaks(markdown_body);\n return _merge_footnote_sections(raw_blocks);\n}\n\nfunction _split_on_safe_paragraph_breaks(text: string): [string, number][] {\n const counters: Record<string, number> = { '++}': 0, '--}': 0, '==}': 0, '<<}': 0 };\n const blocks: [string, number][] = [];\n let block_start = 0;\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n let matched_open = false;\n for (const [open_tok, close_tok] of Object.entries(_CRITIC_TOKENS)) {\n if (text.startsWith(open_tok, i)) {\n counters[close_tok]++;\n i += open_tok.length;\n matched_open = true;\n break;\n }\n }\n if (matched_open) continue;\n\n let matched_close = false;\n for (const close_tok of Object.values(_CRITIC_TOKENS)) {\n if (text.startsWith(close_tok, i)) {\n if (counters[close_tok] > 0) counters[close_tok]--;\n i += close_tok.length;\n matched_close = true;\n break;\n }\n }\n if (matched_close) continue;\n\n if (text[i] === '\\n' && i + 1 < n && text[i + 1] === '\\n') {\n if (Object.values(counters).every(c => c === 0)) {\n const block_text = text.substring(block_start, i);\n if (block_text) blocks.push([block_text, block_start]);\n\n let j = i;\n while (j < n && text[j] === '\\n') j++;\n i = j;\n block_start = i;\n continue;\n }\n }\n\n i++;\n }\n\n if (block_start < n) {\n const block_text = text.substring(block_start, n);\n if (block_text) blocks.push([block_text, block_start]);\n }\n\n return blocks;\n}\n\nfunction _merge_footnote_sections(blocks: [string, number][]): [string, number][] {\n if (!blocks.length) return blocks;\n\n const merged: [string, number][] = [];\n let i = 0;\n\n while (i < blocks.length) {\n const [block_text, block_offset] = blocks[i];\n const stripped = block_text.trimStart();\n const is_section_header = stripped.startsWith('## Footnotes') || stripped.startsWith('## Endnotes');\n\n if (!is_section_header) {\n merged.push([block_text, block_offset]);\n i++;\n continue;\n }\n\n let accumulated_text = block_text;\n let j = i + 1;\n while (j < blocks.length) {\n const [next_text] = blocks[j];\n const next_stripped = next_text.trimStart();\n if (next_stripped.startsWith('[^fn-') || next_stripped.startsWith('[^en-')) {\n accumulated_text = `${accumulated_text}\\n\\n${next_text}`;\n j++;\n } else {\n break;\n }\n }\n\n merged.push([accumulated_text, block_offset]);\n i = j;\n }\n\n return merged;\n}\n\nfunction _assemble_pages(block_records: [string, number][]): [string[], number[]] {\n if (!block_records.length) return [[''], [0]];\n\n const pages: string[] = [];\n const page_starts: number[] = [];\n\n let current_blocks: string[] = [];\n let current_size = 0;\n let current_start = -1;\n\n const flush_current = () => {\n if (current_blocks.length > 0) {\n pages.push(current_blocks.join('\\n\\n'));\n page_starts.push(current_start);\n }\n current_blocks = [];\n current_size = 0;\n current_start = -1;\n };\n\n for (const [block_text, block_offset] of block_records) {\n const block_size = block_text.length;\n const added_size = block_size + (current_blocks.length > 0 ? 2 : 0);\n\n if (current_blocks.length > 0 && current_size + added_size > PAGE_TARGET_CHARS) {\n flush_current();\n }\n\n if (current_blocks.length === 0 && block_size > PAGE_TARGET_CHARS) {\n pages.push(block_text);\n page_starts.push(block_offset);\n continue;\n }\n\n if (current_blocks.length === 0) current_start = block_offset;\n current_blocks.push(block_text);\n current_size += current_size > 0 ? added_size : block_size;\n }\n\n flush_current();\n\n if (!pages.length) return [[''], [0]];\n return [pages, page_starts];\n}\n\nfunction _count_tracked_changes(page_content: string): number {\n const matches = [...page_content.matchAll(_CHG_ID_PATTERN)];\n const distinct = new Set(matches.map(m => m[1]));\n return distinct.size;\n}","import { DocumentObject } from './docx/bridge.js';\nimport { Paragraph, Run } from './docx/primitives.js';\nimport { iter_block_items, get_run_text } from './utils/docx.js';\nimport { findAllDescendants } from './docx/dom.js';\n\nfunction boundedLevenshtein(a: string, b: string, maxDist: number = 2): number {\n if (a === b) return 0;\n if (Math.abs(a.length - b.length) > maxDist) return maxDist + 1;\n if (a.length === 0) return b.length <= maxDist ? b.length : maxDist + 1;\n if (b.length === 0) return a.length <= maxDist ? a.length : maxDist + 1;\n\n if (a.length > b.length) {\n const temp = a;\n a = b;\n b = temp;\n }\n\n let row = Array.from({ length: a.length + 1 }, (_, i) => i);\n\n for (let i = 1; i <= b.length; i++) {\n const newRow = [i];\n let minInRow = i;\n for (let j = 1; j <= a.length; j++) {\n const cost = a[j - 1] === b[i - 1] ? 0 : 1;\n const val = Math.min(\n row[j] + 1,\n newRow[j - 1] + 1,\n row[j - 1] + cost\n );\n newRow.push(val);\n if (val < minInRow) minInRow = val;\n }\n if (minInRow > maxDist) return maxDist + 1;\n row = newRow;\n }\n return row[a.length] <= maxDist ? row[a.length] : maxDist + 1;\n}\n\nfunction _get_paragraph_text(p: Paragraph): string {\n let text = '';\n const runs = findAllDescendants(p._element, 'w:r');\n for (const r of runs) {\n text += get_run_text(new Run(r, p));\n }\n return text;\n}\n\nexport function extract_all_domain_metadata(\n doc: DocumentObject,\n base_text: string\n): [Record<string, { count: number }>, string[], Record<string, { anchored_to: string; referenced_from: string[] }>] {\n const definitions: Record<string, { count: number }> = {};\n const duplicates = new Set<string>();\n const raw_anchors: Record<string, { anchored_to: string; referenced_from: string[] }> = {};\n const raw_references: [string, string][] = [];\n\n const leading_re = /^(?:[\\d.\\-()a-zA-Z]+\\s*)?[\"“]([A-Z][A-Za-z0-9\\s\\-&'’]{1,60})[\"”]/;\n const inline_re = /\\([^)]*?[\"“]([A-Z][A-Za-z0-9\\s\\-&'’]{1,60})[\"”][^)]*?\\)/g;\n\n for (const item of iter_block_items(doc)) {\n if (!(item instanceof Paragraph)) continue;\n\n const text = _get_paragraph_text(item).trim();\n if (!text) continue;\n\n const extracted_terms: string[] = [];\n const leading_match = text.match(leading_re);\n if (leading_match) extracted_terms.push(leading_match[1].trim());\n\n const inline_matches = text.matchAll(inline_re);\n for (const m of inline_matches) {\n extracted_terms.push(m[1].trim());\n }\n\n for (const term of extracted_terms) {\n if (definitions[term]) duplicates.add(term);\n else definitions[term] = { count: 0 };\n }\n\n const short_text = text.length > 60 ? text.substring(0, 60) + '...' : text;\n\n const nodes = findAllDescendants(item._element, '*');\n for (const node of nodes) {\n if (node.tagName === 'w:bookmarkStart') {\n const b_name = node.getAttribute('w:name');\n if (b_name && (!b_name.startsWith('_') || b_name.startsWith('_Ref'))) {\n if (!raw_anchors[b_name]) {\n raw_anchors[b_name] = { anchored_to: short_text, referenced_from: [] };\n }\n }\n }\n\n let target: string | null = null;\n if (node.tagName === 'w:fldSimple') {\n const instr = node.getAttribute('w:instr') || '';\n const parts = instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === 'REF') target = parts[1];\n } else if (node.tagName === 'w:instrText') {\n const instr = node.textContent || '';\n const parts = instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === 'REF') target = parts[1];\n }\n\n if (target) raw_references.push([target, short_text]);\n }\n }\n\n for (const [target, ref_text] of raw_references) {\n if (raw_anchors[target]) {\n raw_anchors[target].referenced_from.push(ref_text);\n }\n }\n\n const diagnostics: string[] = [];\n\n const def_keys = Object.keys(definitions);\n if (def_keys.length > 0) {\n const sorted_terms = def_keys.sort((a, b) => b.length - a.length);\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const alt = sorted_terms.map(escapeRegExp).join('|');\n const usage_pattern = new RegExp(`(?<![\"“])\\\\b(${alt})\\\\b(?![”\"])`, 'g');\n\n for (const m of base_text.matchAll(usage_pattern)) {\n const matched_term = m[1];\n if (definitions[matched_term]) definitions[matched_term].count++;\n }\n\n for (const term of def_keys) {\n if (definitions[term].count === 0) {\n delete definitions[term];\n duplicates.delete(term);\n }\n }\n }\n\n for (const term of duplicates) {\n diagnostics.push(`[Error] Duplicate Definition: '${term}' is defined multiple times.`);\n }\n\n const stop_words = new Set([\n \"The\", \"This\", \"That\", \"Such\", \"A\", \"An\", \"Any\", \"All\", \"Some\", \"No\",\n \"Every\", \"Each\", \"As\", \"In\", \"Of\", \"For\", \"To\", \"On\", \"By\", \"With\"\n ]);\n\n const all_cap_pattern = /\\b[A-Z][a-zA-Z]*(?:\\s+[A-Z][a-zA-Z]*)*\\b/g;\n const all_caps = new Set(base_text.match(all_cap_pattern) || []);\n\n const valid_terms = new Set(Object.keys(definitions));\n const terms_by_first_letter: Record<string, string[]> = {};\n for (const term of valid_terms) {\n const fl = term[0].toLowerCase();\n if (!terms_by_first_letter[fl]) terms_by_first_letter[fl] = [];\n terms_by_first_letter[fl].push(term);\n }\n\n const candidates_by_term: Record<string, string[]> = {};\n\n for (const raw_candidate of all_caps) {\n let candidate = raw_candidate.trim();\n const words = candidate.split(/\\s+/);\n while (words.length > 0) {\n const first = words[0];\n const title = first.charAt(0).toUpperCase() + first.slice(1).toLowerCase();\n if (stop_words.has(title)) words.shift();\n else break;\n }\n candidate = words.join(' ');\n\n if (candidate.length < 4) continue;\n if (valid_terms.has(candidate)) continue;\n\n const first_letter = candidate[0].toLowerCase();\n let candidate_terms = terms_by_first_letter[first_letter] || [];\n\n if (candidate.length > 5) {\n for (const [k, v] of Object.entries(terms_by_first_letter)) {\n if (k !== first_letter) candidate_terms = candidate_terms.concat(v);\n }\n }\n\n for (const term of candidate_terms) {\n if (Math.abs(candidate.length - term.length) > 2) continue;\n if (candidate === term + 's' || candidate === term + 'es') continue;\n if (term === candidate + 's' || term === candidate + 'es') continue;\n\n const dist = boundedLevenshtein(candidate, term, 2);\n if (dist === 0 || dist > 2) continue;\n\n if (term.length <= 5) {\n if (dist > 1) continue;\n if (candidate[0].toLowerCase() !== term[0].toLowerCase()) continue;\n }\n\n if (!candidates_by_term[term]) candidates_by_term[term] = [];\n if (!candidates_by_term[term].includes(candidate)) candidates_by_term[term].push(candidate);\n }\n }\n\n for (const [term, candidates] of Object.entries(candidates_by_term)) {\n candidates.sort();\n const c_str = candidates.map(c => `'${c}'`).join(', ');\n diagnostics.push(`[Info] Possible Typos for '${term}': Found ${c_str}`);\n }\n\n function diag_sort_key(msg: string) {\n if (msg.startsWith('[Error]')) return 0;\n if (msg.startsWith('[Warning]')) return 1;\n return 2;\n }\n\n diagnostics.sort((a, b) => {\n const keyA = diag_sort_key(a);\n const keyB = diag_sort_key(b);\n if (keyA !== keyB) return keyA - keyB;\n return a.localeCompare(b);\n });\n\n return [definitions, diagnostics, raw_anchors];\n}\n\nexport function build_structural_appendix(doc: DocumentObject, base_text: string): string {\n const [defs, diagnostics, anchors] = extract_all_domain_metadata(doc, base_text);\n\n const lines: string[] = [\n \"\\n\\n---\",\n \"\",\n \"<!-- READONLY_BOUNDARY_START -->\",\n \"# Document Structure (Read-Only)\",\n \"The content below is metadata describing the document's reference structure. Do not include this section in any tracked changes or edits \\u2014 it is for your context only and will be discarded on write.\"\n ];\n\n let has_content = false;\n\n if (Object.keys(defs).length > 0) {\n has_content = true;\n lines.push(\"\\n## Defined Terms\");\n for (const [term, data] of Object.entries(defs)) {\n lines.push(`- \"${term}\" \\u2014 used ${data.count} times.`);\n }\n }\n\n if (diagnostics.length > 0) {\n has_content = true;\n lines.push(\"\\n## Semantic Diagnostics\");\n for (const diag of diagnostics) {\n lines.push(`- ${diag}`);\n }\n }\n\n if (Object.keys(anchors).length > 0) {\n has_content = true;\n lines.push(\"\\n## Named Anchors\");\n for (const [b_name, data] of Object.entries(anchors)) {\n lines.push(`- ${b_name} \\u2192 Anchored to: \"${data.anchored_to}\"`);\n for (const ref of data.referenced_from) {\n lines.push(` - Referenced from: \"${ref}\"`);\n }\n }\n }\n\n if (has_content) {\n return lines.join('\\n');\n }\n return \"\";\n}","import { DocumentObject } from './docx/bridge.js';\nimport { Paragraph, Table, Run, DocxEvent } from './docx/primitives.js';\nimport { \n _get_style_cache, get_paragraph_prefix, is_heading_paragraph, is_native_heading, \n get_run_style_markers, get_run_text, apply_formatting_to_segments, \n iter_block_items, iter_document_parts, iter_paragraph_content\n} from './utils/docx.js';\nimport { findChild } from './docx/dom.js';\nimport { build_structural_appendix } from './domain.js';\nimport { extract_comments_data } from './comments.js';\n\nexport async function extractTextFromBuffer(buffer: Buffer, cleanView = false): Promise<string> {\n const doc = await DocumentObject.load(buffer);\n return _extractTextFromDoc(doc, cleanView);\n}\n\nexport function _extractTextFromDoc(doc: DocumentObject, cleanView = false, includeAppendix = true): string {\n const comments_map = extract_comments_data(doc.pkg);\n\n const full_text: string[] = [];\n let cursor = 0;\n\n for (const part of iter_document_parts(doc)) {\n const part_cursor = full_text.length > 0 ? cursor + 2 : cursor;\n const part_text = _extract_blocks(part, comments_map, cleanView, part_cursor);\n if (part_text) {\n if (full_text.length > 0) cursor += 2;\n full_text.push(part_text);\n cursor += part_text.length;\n }\n }\n\n let base_text = full_text.join('\\n\\n');\n\n if (includeAppendix) {\n const appendix = build_structural_appendix(doc, base_text);\n if (appendix) base_text += appendix;\n }\n\n return base_text;\n}\n\nfunction _extract_blocks(container: any, comments_map: any, cleanView: boolean, cursor: number): string {\n const part = container.part || container;\n const [style_cache, default_pstyle] = _get_style_cache(part);\n\n const blocks: string[] = [];\n let local_cursor = cursor;\n let is_first_block = true;\n let is_first_para = true;\n\n if (container.constructor && container.constructor.name === 'NotesPart') {\n const header = container.note_type === 'fn' ? '## Footnotes' : '## Endnotes';\n const sep = `---\\n${header}`;\n blocks.push(sep);\n local_cursor += sep.length;\n is_first_block = false;\n }\n\n for (const item of iter_block_items(container)) {\n if (!is_first_block) local_cursor += 2;\n const block_start = local_cursor;\n\n if (item.constructor.name === 'FootnoteItem') {\n const fn_text = _extract_blocks(item, comments_map, cleanView, block_start);\n if (fn_text) {\n blocks.push(fn_text);\n local_cursor = block_start + fn_text.length;\n is_first_block = false;\n } else if (!is_first_block) {\n local_cursor -= 2;\n }\n } else if (item instanceof Paragraph) {\n let prefix = get_paragraph_prefix(item, style_cache, default_pstyle);\n if (is_first_para && container.constructor.name === 'FootnoteItem') {\n prefix = `[^${container.note_type}-${container.id}]: ` + prefix;\n }\n const p_text = build_paragraph_text(item, comments_map, cleanView, style_cache, default_pstyle);\n const full_block = prefix + p_text;\n blocks.push(full_block);\n local_cursor = block_start + full_block.length;\n is_first_para = false;\n is_first_block = false;\n } else if (item instanceof Table) {\n const table_text = extract_table(item, comments_map, cleanView, block_start);\n if (table_text) {\n blocks.push(table_text);\n local_cursor = block_start + table_text.length;\n is_first_block = false;\n } else if (!is_first_block) {\n local_cursor -= 2;\n }\n is_first_para = false;\n }\n }\n\n return blocks.join('\\n\\n');\n}\n\nexport function extract_table(table: Table, comments_map: any, cleanView: boolean, cursor: number): string {\n const rows_text: string[] = [];\n let rows_processed = 0;\n let local_cursor = cursor;\n\n for (const row of table.rows) {\n const cell_texts: string[] = [];\n const seen_cells = new Set();\n\n const trPr = findChild(row._element, 'w:trPr');\n const ins = trPr ? findChild(trPr, 'w:ins') : null;\n const del_node = trPr ? findChild(trPr, 'w:del') : null;\n\n if (cleanView && del_node) continue;\n\n const row_start = local_cursor + (rows_processed > 0 ? 1 : 0);\n const wrapper_prefix_len = (!cleanView && ins) ? 4 : (!cleanView && del_node) ? 4 : 0;\n \n let cell_cursor = row_start + wrapper_prefix_len;\n let first_cell = true;\n\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n if (!first_cell) cell_cursor += 3;\n \n const cell_content = _extract_blocks(cell, comments_map, cleanView, cell_cursor);\n cell_texts.push(cell_content);\n cell_cursor += cell_content.length;\n first_cell = false;\n }\n\n let row_str = cell_texts.join(' | ');\n\n if (!cleanView) {\n if (ins) row_str = `{++ ${row_str} |Chg:${ins.getAttribute('w:id')}++}`;\n else if (del_node) row_str = `{-- ${row_str} |Chg:${del_node.getAttribute('w:id')}--}`;\n }\n\n rows_text.push(row_str);\n local_cursor = row_start + row_str.length;\n rows_processed++;\n }\n\n return rows_text.join('\\n');\n}\n\nexport function build_paragraph_text(\n paragraph: Paragraph, comments_map: any, cleanView: boolean,\n style_cache?: any, default_pstyle?: string | null\n): string {\n const parts: string[] = [];\n const active_ins: Record<string, DocxEvent> = {};\n const active_del: Record<string, DocxEvent> = {};\n const active_comments: Set<string> = new Set();\n const active_fmt: Record<string, DocxEvent> = {};\n const deferred_meta_states: any[] = [];\n\n let pending_text = '';\n let current_wrappers: [string, string] = ['', ''];\n let current_style: [string, string] = ['', ''];\n\n const items = Array.from(iter_paragraph_content(paragraph));\n const is_heading = is_heading_paragraph(paragraph, style_cache, default_pstyle);\n const native_heading = is_native_heading(paragraph, style_cache, default_pstyle);\n let leading_strip_active = is_heading;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n if (item instanceof Run) {\n const [prefix, suffix] = get_run_style_markers(item, native_heading);\n const text = get_run_text(item);\n\n if (cleanView && Object.keys(active_del).length > 0) continue;\n\n if (leading_strip_active) {\n if (!text || !text.trim()) continue;\n leading_strip_active = false;\n }\n\n const seg = apply_formatting_to_segments(text, prefix, suffix);\n if (seg) {\n const new_wrappers = cleanView ? ['', ''] as [string, string] : _get_wrappers(active_ins, active_del, active_comments, active_fmt);\n const new_style: [string, string] = [prefix, suffix];\n\n if (pending_text && new_wrappers[0] === current_wrappers[0] && new_wrappers[1] === current_wrappers[1]) {\n if (new_style[0] === current_style[0] && new_style[1] === current_style[1] && current_style[0] !== '' && \n pending_text.endsWith(current_style[1]) && seg.startsWith(new_style[0])) {\n pending_text = pending_text.slice(0, -current_style[1].length) + seg.slice(new_style[0].length);\n } else {\n pending_text += seg;\n }\n current_style = new_style;\n } else {\n if (pending_text) parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = seg;\n current_wrappers = new_wrappers;\n current_style = new_style;\n }\n\n if (!cleanView) {\n const has_meta = Object.keys(active_ins).length > 0 || Object.keys(active_del).length > 0 || active_comments.size > 0 || Object.keys(active_fmt).length > 0;\n if (has_meta) {\n deferred_meta_states.push([{...active_ins}, {...active_del}, new Set(active_comments), {...active_fmt}]);\n }\n\n let should_defer = false;\n const is_redline = Object.keys(active_ins).length > 0 || Object.keys(active_del).length > 0 || Object.keys(active_fmt).length > 0;\n\n if (is_redline) {\n let j = i + 1;\n let next_is_redline = false;\n let temp_ins = Object.keys(active_ins).length;\n let temp_del = Object.keys(active_del).length;\n let temp_fmt = Object.keys(active_fmt).length;\n\n while (j < items.length) {\n const next_item = items[j];\n if (next_item instanceof Run) {\n if (!get_run_text(next_item)) { j++; continue; }\n if (temp_ins > 0 || temp_del > 0 || temp_fmt > 0) next_is_redline = true;\n break;\n } else {\n const ev = next_item as DocxEvent;\n if (ev.type === 'ins_start') temp_ins++;\n else if (ev.type === 'ins_end') temp_ins = Math.max(0, temp_ins - 1);\n else if (ev.type === 'del_start') temp_del++;\n else if (ev.type === 'del_end') temp_del = Math.max(0, temp_del - 1);\n else if (ev.type === 'fmt_start') temp_fmt++;\n else if (ev.type === 'fmt_end') temp_fmt = Math.max(0, temp_fmt - 1);\n }\n j++;\n }\n if (next_is_redline) should_defer = true;\n }\n\n if (!should_defer && deferred_meta_states.length > 0) {\n const meta_block = _build_merged_meta_block(deferred_meta_states, comments_map);\n if (meta_block) {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`{>>${meta_block}<<}`);\n }\n deferred_meta_states.length = 0; // clear\n }\n }\n }\n } else {\n const ev = item as DocxEvent;\n leading_strip_active = false;\n \n if (!['ins_start', 'ins_end', 'del_start', 'del_end', 'fmt_start', 'fmt_end'].includes(ev.type)) {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n }\n\n if (ev.type === 'start') active_comments.add(ev.id);\n else if (ev.type === 'end') active_comments.delete(ev.id);\n else if (ev.type === 'ins_start') active_ins[ev.id] = ev;\n else if (ev.type === 'ins_end') delete active_ins[ev.id];\n else if (ev.type === 'del_start') active_del[ev.id] = ev;\n else if (ev.type === 'del_end') delete active_del[ev.id];\n else if (ev.type === 'fmt_start') active_fmt[ev.id] = ev;\n else if (ev.type === 'fmt_end') delete active_fmt[ev.id];\n else if (ev.type === 'footnote' || ev.type === 'endnote') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`[^${ev.type === 'footnote' ? 'fn' : 'en'}-${ev.id}]`);\n } else if (ev.type === 'hyperlink_start') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push('[');\n } else if (ev.type === 'hyperlink_end') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`](${ev.date})`);\n } else if (ev.type === 'xref_start') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push('[~');\n } else if (ev.type === 'xref_end') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`~](#${ev.id})`);\n } else if (ev.type === 'bookmark') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`{#${ev.id}}`);\n }\n }\n }\n\n if (pending_text) parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n\n if (deferred_meta_states.length > 0) {\n const meta_block = _build_merged_meta_block(deferred_meta_states, comments_map);\n if (meta_block) parts.push(`{>>${meta_block}<<}`);\n }\n\n return parts.join('');\n}\n\nfunction _get_wrappers(ins: any, del: any, comments: Set<string>, fmt: any): [string, string] {\n if (Object.keys(del).length > 0) return ['{--', '--}'];\n if (Object.keys(ins).length > 0) return ['{++', '++}'];\n if (comments.size > 0 || Object.keys(fmt).length > 0) return ['{==', '==}'];\n return ['', ''];\n}\n\nfunction _build_merged_meta_block(states_list: any[], comments_map: any): string {\n const change_lines: string[] = [];\n const comment_lines: string[] = [];\n const seen_sigs = new Set<string>();\n\n for (const [ins_map, del_map, comments_set, fmt_map] of states_list) {\n for (const [uid, meta] of Object.entries(ins_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n change_lines.push(`[${sig} insert] ${meta.author || 'Unknown'}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(del_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n change_lines.push(`[${sig} delete] ${meta.author || 'Unknown'}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(fmt_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n change_lines.push(`[${sig} format] ${meta.author || 'Unknown'}`);\n seen_sigs.add(sig);\n }\n }\n\n // Threaded Comment Resolution Tree\n const children_map: Record<string, string[]> = {};\n for (const [c_id, data] of Object.entries(comments_map as Record<string, any>)) {\n const p_id = data.parent_id;\n if (p_id) {\n if (!children_map[p_id]) children_map[p_id] = [];\n children_map[p_id].push(c_id);\n }\n }\n\n function render_comment(cid: string) {\n if (!comments_map[cid]) return;\n const sig = `Com:${cid}`;\n if (seen_sigs.has(sig)) return;\n\n const data = comments_map[cid];\n let header = `[${sig}] ${data.author}`;\n if (data.date) header += ` @ ${data.date}`;\n if (data.resolved) header += `(RESOLVED)`;\n comment_lines.push(`${header}: ${data.text}`);\n seen_sigs.add(sig);\n\n if (children_map[cid]) {\n const children = children_map[cid].sort((a, b) => (comments_map[a]?.date || '').localeCompare(comments_map[b]?.date || ''));\n for (const child_id of children) {\n render_comment(child_id);\n }\n }\n }\n\n const sorted_ids = Array.from(comments_set as Set<string>).sort();\n for (const c_id of sorted_ids) {\n render_comment(c_id);\n }\n }\n\n return [...change_lines, ...comment_lines].join('\\n');\n}","/**\n * Structural outline extractor.\n */\n\nimport { DocumentObject } from \"./docx/bridge.js\";\nimport { Paragraph, Table, DocxEvent } from \"./docx/primitives.js\";\nimport { build_paragraph_text, extract_table } from \"./ingest.js\";\nimport { extract_comments_data } from \"./comments.js\";\nimport { findChild } from \"./docx/dom.js\";\nimport {\n _get_style_cache,\n get_paragraph_prefix,\n iter_block_items,\n iter_document_parts,\n iter_paragraph_content,\n} from \"./utils/docx.js\";\n\nconst _HEADING_PREFIX_RE = /^(#{1,6}) /;\nconst _HEURISTIC_MIN_WORDS = 3;\n\nexport interface OutlineNode {\n level: number;\n text: string;\n page: number;\n style: string;\n has_table: boolean;\n footnote_ids: string[];\n}\n\ninterface _BlockRecord {\n item: any;\n is_paragraph: boolean;\n is_table: boolean;\n start_offset: number;\n projected_length: number;\n}\n\nexport function extract_outline(\n doc: DocumentObject,\n projected_body: string,\n body_pages: string[],\n body_page_offsets: number[],\n paragraph_offsets: Record<string, [number, number]> | null = null,\n): OutlineNode[] {\n if (body_pages.length !== body_page_offsets.length) {\n throw new Error(\"body_pages and body_page_offsets length mismatch\");\n }\n\n const comments_map = extract_comments_data(doc.pkg);\n const block_records = _walk_doc_body(doc, comments_map);\n\n const heading_indices: number[] = [];\n for (let idx = 0; idx < block_records.length; idx++) {\n const rec = block_records[idx];\n if (!(rec.is_paragraph && _is_heading(rec.item))) continue;\n if (!_heading_passes_quality_filter(rec.item, comments_map)) continue;\n heading_indices.push(idx);\n }\n\n if (heading_indices.length === 0) return [];\n\n const nodes: OutlineNode[] = [];\n for (let h_pos = 0; h_pos < heading_indices.length; h_pos++) {\n const rec_idx = heading_indices[h_pos];\n const rec = block_records[rec_idx];\n const paragraph = rec.item as Paragraph;\n\n const level = _heading_level(paragraph);\n const text = _heading_text(paragraph, comments_map);\n const style = _determine_heading_style(paragraph);\n\n const owned_end = _find_owned_end(\n block_records,\n heading_indices,\n h_pos,\n level,\n );\n const owned_blocks = block_records.slice(rec_idx + 1, owned_end);\n\n const has_table = _direct_has_table(block_records, rec_idx + 1, owned_end);\n const footnote_ids = _collect_footnote_ids(owned_blocks);\n\n const page_num = _offset_to_page(rec.start_offset, body_page_offsets);\n\n nodes.push({ level, text, page: page_num, style, has_table, footnote_ids });\n }\n\n return nodes;\n}\n\nfunction _direct_has_table(\n block_records: _BlockRecord[],\n range_start: number,\n range_end: number,\n): boolean {\n for (let idx = range_start; idx < range_end; idx++) {\n const rec = block_records[idx];\n if (rec.is_paragraph && _is_heading(rec.item)) return false;\n if (rec.is_table) return true;\n }\n return false;\n}\n\nfunction _walk_doc_body(\n doc: DocumentObject,\n comments_map: any,\n): _BlockRecord[] {\n const parts = Array.from(iter_document_parts(doc));\n let body_start_offset = 0;\n let body_part: any = null;\n\n for (const part of parts) {\n if (part === doc) {\n body_part = part;\n break;\n }\n const part_text = _project_part(part, comments_map);\n if (part_text) {\n if (body_start_offset > 0) body_start_offset += 2;\n body_start_offset += part_text.length;\n }\n }\n\n if (!body_part) {\n body_part = doc;\n body_start_offset = 0;\n } else {\n if (body_start_offset > 0) body_start_offset += 2;\n }\n\n const records: _BlockRecord[] = [];\n let cursor = body_start_offset;\n let is_first_block = true;\n\n for (const item of iter_block_items(body_part)) {\n if (item instanceof Paragraph) {\n const prefix = get_paragraph_prefix(item);\n const p_text = build_paragraph_text(item, comments_map, false);\n const block_len = (prefix + p_text).length;\n\n if (!is_first_block) cursor += 2;\n\n records.push({\n item,\n is_paragraph: true,\n is_table: false,\n start_offset: cursor,\n projected_length: block_len,\n });\n cursor += block_len;\n is_first_block = false;\n } else if (item instanceof Table) {\n const table_text = extract_table(item, comments_map, false, 0);\n const block_len = table_text ? table_text.length : 0;\n\n if (!is_first_block) cursor += 2;\n\n const table_start = cursor;\n records.push({\n item,\n is_paragraph: false,\n is_table: true,\n start_offset: table_start,\n projected_length: block_len,\n });\n _record_table_inner_blocks_lite(item, table_start, records, comments_map);\n cursor += block_len;\n is_first_block = false;\n }\n }\n\n return records;\n}\n\nfunction _compute_inner_block_offset(\n table: Table,\n target_paragraph: Paragraph,\n table_start_offset: number,\n comments_map: any,\n): number {\n const target_el = target_paragraph._element;\n let cursor = table_start_offset;\n let rows_processed = 0;\n\n for (const row of table.rows) {\n if (rows_processed > 0) cursor += 1;\n\n const seen_cells = new Set();\n let cells_in_row = 0;\n\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n if (cells_in_row > 0) cursor += 3;\n\n const [new_cursor, found] = _walk_cell_for_offset(\n cell,\n target_el,\n cursor,\n comments_map,\n );\n if (found) return new_cursor;\n cursor = new_cursor;\n\n cells_in_row++;\n }\n rows_processed++;\n }\n\n return table_start_offset;\n}\n\nfunction _walk_cell_for_offset(\n cell: any,\n target_el: any,\n cell_start_cursor: number,\n comments_map: any,\n): [number, boolean] {\n let cursor = cell_start_cursor;\n let is_first_block = true;\n\n for (const inner_item of iter_block_items(cell)) {\n if (!is_first_block) cursor += 2;\n\n if (inner_item instanceof Paragraph) {\n if (inner_item._element === target_el) return [cursor, true];\n const prefix = get_paragraph_prefix(inner_item);\n const p_text = build_paragraph_text(inner_item, comments_map, false);\n cursor += (prefix + p_text).length;\n } else if (inner_item instanceof Table) {\n const nested_offset = _compute_inner_block_offset(\n inner_item,\n new Paragraph(target_el, null),\n cursor,\n comments_map,\n );\n if (nested_offset !== cursor) {\n if (_element_is_descendant(target_el, inner_item._element))\n return [nested_offset, true];\n }\n const table_text = extract_table(inner_item, comments_map, false, 0);\n cursor += table_text ? table_text.length : 0;\n }\n is_first_block = false;\n }\n return [cursor, false];\n}\n\nfunction _element_is_descendant(\n target_el: Element,\n ancestor_el: Element,\n): boolean {\n let cur: Node | null = target_el.parentNode;\n while (cur) {\n if (cur === ancestor_el) return true;\n cur = cur.parentNode;\n }\n return false;\n}\n\nfunction _record_table_inner_blocks_lite(\n table: Table,\n inherited_offset: number,\n records: _BlockRecord[],\n comments_map: any,\n) {\n const seen_cells = new Set();\n for (const row of table.rows) {\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n for (const inner_item of iter_block_items(cell)) {\n if (inner_item instanceof Paragraph) {\n const true_offset = _is_heading(inner_item)\n ? _compute_inner_block_offset(\n table,\n inner_item,\n inherited_offset,\n comments_map,\n )\n : inherited_offset;\n records.push({\n item: inner_item,\n is_paragraph: true,\n is_table: false,\n start_offset: true_offset,\n projected_length: 0,\n });\n } else if (inner_item instanceof Table) {\n records.push({\n item: inner_item,\n is_paragraph: false,\n is_table: true,\n start_offset: inherited_offset,\n projected_length: 0,\n });\n _record_table_inner_blocks_lite(\n inner_item,\n inherited_offset,\n records,\n comments_map,\n );\n }\n }\n }\n }\n}\n\nfunction _project_part(part: any, comments_map: any): string {\n const blocks: string[] = [];\n const c_type = part.constructor.name;\n\n if (c_type === \"NotesPart\") {\n const header = part.note_type === \"fn\" ? \"## Footnotes\" : \"## Endnotes\";\n blocks.push(`---\\n${header}`);\n }\n\n let is_first_para = true;\n for (const item of iter_block_items(part)) {\n if (item.constructor.name === \"FootnoteItem\") {\n const fn_text = _project_part(item, comments_map);\n if (fn_text) blocks.push(fn_text);\n } else if (item instanceof Paragraph) {\n let prefix = get_paragraph_prefix(item);\n if (is_first_para && c_type === \"FootnoteItem\")\n prefix = `[^${part.note_type}-${part.id}]: ${prefix}`;\n const p_text = build_paragraph_text(item, comments_map, false);\n blocks.push(prefix + p_text);\n is_first_para = false;\n } else if (item instanceof Table) {\n const table_text = extract_table(item, comments_map, false, 0);\n if (table_text) blocks.push(table_text);\n is_first_para = false;\n }\n }\n\n return blocks.join(\"\\n\\n\");\n}\n\nfunction _is_heading(paragraph: Paragraph): boolean {\n return _HEADING_PREFIX_RE.test(get_paragraph_prefix(paragraph));\n}\n\nfunction _heading_passes_quality_filter(\n paragraph: Paragraph,\n comments_map: any,\n): boolean {\n const style = _determine_heading_style(paragraph);\n if (style !== \"(heuristic)\") return true;\n const text = _heading_text(paragraph, comments_map);\n if (!text) return false;\n const word_count = (text.match(/\\w+/g) || []).length;\n return word_count >= _HEURISTIC_MIN_WORDS;\n}\n\nfunction _heading_level(paragraph: Paragraph): number {\n const match = _HEADING_PREFIX_RE.exec(get_paragraph_prefix(paragraph));\n return match ? Math.min(match[1].length, 6) : 1;\n}\n\nfunction _heading_text(paragraph: Paragraph, comments_map: any): string {\n const p_text = build_paragraph_text(paragraph, comments_map, false);\n let cleaned = _strip_critic_markup(p_text);\n cleaned = _strip_inline_formatting(cleaned);\n return cleaned.trim();\n}\n\nfunction _strip_critic_markup(text: string): string {\n if (!text) return \"\";\n text = text.replace(/\\{--[\\s\\S]*?--\\}/g, \"\");\n text = text.replace(/\\{>>[\\s\\S]*?<<\\}/g, \"\");\n text = text.replace(/\\{\\+\\+([\\s\\S]*?)\\+\\+\\}/g, \"$1\");\n text = text.replace(/\\{==([\\s\\S]*?)==\\}/g, \"$1\");\n return text;\n}\n\nfunction _strip_inline_formatting(text: string): string {\n if (!text) return \"\";\n text = text.replace(/\\*\\*(.+?)\\*\\*/g, \"$1\");\n text = text.replace(/__(.+?)__/g, \"$1\");\n text = text.replace(/(?<!\\w)_(\\S(?:.*?\\S)?)_(?!\\w)/g, \"$1\");\n return text;\n}\n\nfunction _determine_heading_style(paragraph: Paragraph): string {\n const [style_cache, default_pstyle] = _get_style_cache(\n paragraph._parent.part || paragraph._parent,\n );\n const pPr = findChild(paragraph._element, \"w:pPr\");\n let style_id = default_pstyle;\n\n if (pPr) {\n const pStyle = findChild(pPr, \"w:pStyle\");\n if (pStyle) style_id = pStyle.getAttribute(\"w:val\") || default_pstyle;\n }\n\n let outline_level: number | null = null;\n if (pPr) {\n const oLvl = findChild(pPr, \"w:outlineLvl\");\n if (oLvl && /^\\d+$/.test(oLvl.getAttribute(\"w:val\") || \"\")) {\n outline_level = parseInt(oLvl.getAttribute(\"w:val\") as string, 10);\n }\n }\n \n if (outline_level === null && style_id && style_cache && style_cache[style_id]) {\n outline_level = style_cache[style_id].outline_level;\n }\n\n const style_name =\n style_id && style_cache && style_cache[style_id]\n ? style_cache[style_id].name\n : style_id;\n\n let normalized_style_name = style_name;\n if (normalized_style_name && typeof normalized_style_name === \"string\") {\n if (normalized_style_name.toLowerCase().startsWith(\"heading\")) {\n normalized_style_name = normalized_style_name.replace(/^heading/i, \"Heading\");\n } else if (normalized_style_name.toLowerCase() === \"title\") {\n normalized_style_name = \"Title\";\n }\n }\n\n if (outline_level !== null && outline_level >= 0 && outline_level <= 8) {\n if (normalized_style_name && (normalized_style_name.startsWith(\"Heading\") || normalized_style_name === \"Title\")) {\n return normalized_style_name;\n }\n return \"(outline_level)\";\n }\n\n if (\n normalized_style_name &&\n (normalized_style_name.startsWith(\"Heading\") || normalized_style_name === \"Title\")\n )\n return normalized_style_name;\n\n if (normalized_style_name && /Heading[ ]?([1-6])(?![0-9])/.test(normalized_style_name))\n return normalized_style_name;\n\n return \"(heuristic)\";\n}\n\nfunction _safe_style_name(\n paragraph: Paragraph,\n style_cache: any,\n default_pstyle: any,\n): string | null {\n const pPr = findChild(paragraph._element, \"w:pPr\");\n let style_id = default_pstyle;\n if (pPr) {\n const pStyle = findChild(pPr, \"w:pStyle\");\n if (pStyle) style_id = pStyle.getAttribute(\"w:val\") || default_pstyle;\n }\n return style_id && style_cache && style_cache[style_id]\n ? style_cache[style_id].name\n : style_id;\n}\n\nfunction _find_owned_end(\n block_records: _BlockRecord[],\n heading_indices: number[],\n current_h_pos: number,\n current_level: number,\n): number {\n for (\n let next_h_pos = current_h_pos + 1;\n next_h_pos < heading_indices.length;\n next_h_pos++\n ) {\n const next_idx = heading_indices[next_h_pos];\n if (_heading_level(block_records[next_idx].item) <= current_level)\n return next_idx;\n }\n return block_records.length;\n}\n\nfunction _collect_footnote_ids(owned_blocks: _BlockRecord[]): string[] {\n const seen = new Set<string>();\n const ordered: string[] = [];\n for (const rec of owned_blocks) {\n if (!rec.is_paragraph) continue;\n for (const event of iter_paragraph_content(rec.item)) {\n if (!(\"type\" in event)) continue;\n let fn_id = \"\";\n if (event.type === \"footnote\") fn_id = `fn-${event.id}`;\n else if (event.type === \"endnote\") fn_id = `en-${event.id}`;\n else continue;\n\n if (!seen.has(fn_id)) {\n seen.add(fn_id);\n ordered.push(fn_id);\n }\n }\n }\n return ordered;\n}\n\nfunction _offset_to_page(offset: number, body_page_offsets: number[]): number {\n if (!body_page_offsets || body_page_offsets.length === 0) return 1;\n let page = 1;\n for (let i = 0; i < body_page_offsets.length; i++) {\n if (offset >= body_page_offsets[i]) page = i + 1;\n else break;\n }\n return page;\n}\n","export class SanitizeReport {\n public filename: string;\n public mode: string;\n public author: string | null;\n\n public tracked_changes_found: number = 0;\n public tracked_changes_accepted: number = 0;\n public tracked_changes_kept: number = 0;\n public change_lines: string[] = [];\n\n public comments_removed: number = 0;\n public comments_kept: number = 0;\n public removed_comment_lines: string[] = [];\n public kept_comment_lines: string[] = [];\n\n public metadata_lines: string[] = [];\n public structural_lines: string[] = [];\n public warnings: string[] = [];\n\n public status: string = \"clean\";\n public blocked_reason: string | null = null;\n\n constructor(filename: string, mode: string = \"full\", author: string | null = null) {\n this.filename = filename;\n this.mode = mode;\n this.author = author;\n }\n\n public add_transform_lines(lines: string[]) {\n for (const line of lines) {\n const lower = line.toLowerCase();\n if (lower.includes(\"tracked change\") || lower.includes(\"insertion\") || lower.includes(\"deletion\") || lower.includes(\"accepted\")) {\n this.change_lines.push(line);\n } else if (lower.includes(\"comment\") || lower.includes(\"[open]\") || lower.includes(\"[resolved]\")) {\n if (lower.includes(\"kept\") || lower.includes(\"visible\")) {\n this.kept_comment_lines.push(line);\n } else {\n this.removed_comment_lines.push(line);\n }\n } else if (\n lower.includes(\"author\") || lower.includes(\"template\") || lower.includes(\"company\") || \n lower.includes(\"manager\") || lower.includes(\"metadata\") || lower.includes(\"timestamp\") || \n lower.includes(\"custom xml\") || lower.includes(\"last modified by\") || lower.includes(\"revision count\") || lower.includes(\"last printed\")\n ) {\n this.metadata_lines.push(line);\n } else if (lower.includes(\"hyperlink\") || lower.includes(\"warning\")) {\n this.warnings.push(line);\n } else {\n this.structural_lines.push(line);\n }\n }\n }\n\n public render(): string {\n const sep = \"═\".repeat(50);\n const lines: string[] = [sep, `Finalization Report: ${this.filename}`];\n\n const flags: string[] = [];\n if (this.mode === \"keep-markup\") flags.push(\"--keep-markup\");\n if (this.author) flags.push(`--author \"${this.author}\"`);\n if (this.tracked_changes_accepted > 0) flags.push(\"--accept-all\");\n\n if (flags.length > 0) lines.push(flags.join(\" \"));\n lines.push(sep);\n\n if (this.status === \"blocked\") {\n lines.push(\"\");\n lines.push(`BLOCKED: ${this.blocked_reason}`);\n lines.push(sep);\n return lines.join(\"\\n\");\n }\n\n if (this.mode === \"keep-markup\" && (this.tracked_changes_kept > 0 || this.comments_kept > 0)) {\n lines.push(\"\");\n lines.push(\"VISIBLE TO COUNTERPARTY\");\n if (this.tracked_changes_kept > 0) lines.push(` Tracked changes: ${this.tracked_changes_kept}`);\n if (this.comments_kept > 0) {\n lines.push(` Open comments: ${this.comments_kept}`);\n for (const cl of this.kept_comment_lines) lines.push(` ${cl}`);\n }\n if (this.author) lines.push(` Author on all markup: \"${this.author}\"`);\n }\n\n if (this.change_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"TRACKED CHANGES\");\n for (const cl of this.change_lines) lines.push(` ${cl}`);\n }\n\n if (this.removed_comment_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"COMMENTS (stripped)\");\n for (const cl of this.removed_comment_lines) lines.push(` ${cl}`);\n }\n\n if (this.metadata_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"METADATA\");\n for (const ml of this.metadata_lines) lines.push(` ${ml}`);\n }\n\n if (this.structural_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"STRUCTURAL & PROTECTION\");\n for (const sl of this.structural_lines) lines.push(` ${sl}`);\n }\n\n if (this.warnings.length > 0) {\n lines.push(\"\");\n lines.push(\"WARNINGS\");\n for (const w of this.warnings) lines.push(` ⚠ ${w}`);\n }\n\n lines.push(\"\");\n lines.push(sep);\n if (this.warnings.length > 0) {\n lines.push(`Result: CLEAN WITH WARNINGS (${this.warnings.length} warning${this.warnings.length > 1 ? 's' : ''})`);\n } else {\n lines.push(`Result: CLEAN (${this.tracked_changes_found} changes resolved, ${this.comments_removed} comments removed)`);\n }\n lines.push(sep);\n\n return lines.join(\"\\n\");\n }\n}","import { DocumentObject, Part } from '../docx/bridge.js';\nimport { findAllDescendants, findChild, findChildren } from '../docx/dom.js';\nimport { extract_comments_data, CommentsManager } from '../comments.js';\nimport { RedlineEngine } from '../engine.js';\n\nexport function findDescendantsByLocalName(element: Element, localName: string): Element[] {\n const result: Element[] = [];\n const all = element.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) {\n const tag = all[i].tagName;\n if (tag === localName || tag.endsWith(':' + localName)) {\n result.push(all[i]);\n }\n }\n return result;\n}\n\nexport function coalesce_runs(doc: DocumentObject): string[] {\n let count = 0;\n\n function areRunsIdentical(rPr1: Element | null, rPr2: Element | null): boolean {\n const xml1 = rPr1 ? rPr1.toString() : '';\n const xml2 = rPr2 ? rPr2.toString() : '';\n return xml1 === xml2;\n }\n\n function hasSpecialContent(run: Element): boolean {\n const safeTags = ['w:t', 'w:tab', 'w:br', 'w:cr', 'w:delText', 'w:rPr'];\n for (let i = 0; i < run.childNodes.length; i++) {\n const child = run.childNodes[i];\n if (child.nodeType === 1) {\n const tag = (child as Element).tagName;\n if (!safeTags.includes(tag)) return true;\n }\n }\n return false;\n }\n\n function coalesceContainer(container: Element) {\n const children = Array.from(container.childNodes).filter(n => n.nodeType === 1) as Element[];\n let i = 0;\n while (i < children.length - 1) {\n const curr = children[i];\n const nxt = children[i + 1];\n\n if (curr.tagName === 'w:r' && nxt.tagName === 'w:r') {\n if (!hasSpecialContent(curr) && !hasSpecialContent(nxt)) {\n const rPr1 = findChild(curr, 'w:rPr');\n const rPr2 = findChild(nxt, 'w:rPr');\n if (areRunsIdentical(rPr1, rPr2)) {\n let last_t: Element | null = null;\n for (let c = 0; c < curr.childNodes.length; c++) {\n const child = curr.childNodes[c];\n if (child.nodeType === 1 && ((child as Element).tagName === 'w:t' || (child as Element).tagName === 'w:delText')) {\n last_t = child as Element;\n }\n }\n\n const nxtChildren = Array.from(nxt.childNodes).filter(n => n.nodeType === 1) as Element[];\n for (const child of nxtChildren) {\n if (child.tagName === 'w:rPr') continue;\n if ((child.tagName === 'w:t' || child.tagName === 'w:delText') && last_t && last_t.tagName === child.tagName) {\n const t1 = last_t.textContent || '';\n const t2 = child.textContent || '';\n const combined = t1 + t2;\n last_t.textContent = combined;\n if (combined.trim() !== combined) {\n last_t.setAttribute('xml:space', 'preserve');\n }\n } else {\n curr.appendChild(child);\n if (child.tagName === 'w:t' || child.tagName === 'w:delText') {\n last_t = child;\n }\n }\n }\n container.removeChild(nxt);\n children.splice(i + 1, 1);\n count++;\n continue; \n }\n }\n }\n\n if (['w:ins', 'w:del', 'w:hyperlink', 'w:sdt', 'w:smartTag', 'w:fldSimple', 'w:sdtContent'].includes(curr.tagName)) {\n coalesceContainer(curr);\n }\n i++;\n }\n \n if (children.length > 0) {\n const last = children[children.length - 1];\n if (['w:ins', 'w:del', 'w:hyperlink', 'w:sdt', 'w:smartTag', 'w:fldSimple', 'w:sdtContent'].includes(last.tagName)) {\n coalesceContainer(last);\n }\n }\n }\n\n const paragraphs = findAllDescendants(doc.element, 'w:p');\n for (const p of paragraphs) coalesceContainer(p);\n\n return count ? [`Adjacent identical runs coalesced: ${count}`] : [];\n}\n\nexport function strip_rsid(doc: DocumentObject): string[] {\n let count = 0;\n const rsidAttrs = ['w:rsidR', 'w:rsidRPr', 'w:rsidRDefault', 'w:rsidP', 'w:rsidDel', 'w:rsidSect', 'w:rsidTr'];\n \n const all = doc.element.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) {\n for (const attr of rsidAttrs) {\n if (all[i].hasAttribute(attr)) {\n all[i].removeAttribute(attr);\n count++;\n }\n }\n }\n \n const rsidsElements = findAllDescendants(doc.element, 'w:rsids');\n for (const el of rsidsElements) {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n count++;\n }\n }\n \n return count ? [`rsid attributes: ${count} removed`] : [];\n}\n\nexport function strip_para_ids(doc: DocumentObject): string[] {\n let count = 0;\n const attrs = ['w14:paraId', 'w14:textId'];\n const all = doc.element.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) {\n for (const attr of attrs) {\n if (all[i].hasAttribute(attr)) {\n all[i].removeAttribute(attr);\n count++;\n }\n }\n }\n return count ? [`Paragraph/text IDs: ${count} removed`] : [];\n}\n\nexport function strip_proof_errors(doc: DocumentObject): string[] {\n const elements = findAllDescendants(doc.element, 'w:proofErr');\n elements.forEach(el => el.parentNode?.removeChild(el));\n return elements.length ? [`Spell check markers: ${elements.length} removed`] : [];\n}\n\nexport function strip_empty_properties(doc: DocumentObject): string[] {\n let count = 0;\n for (const tag of ['w:rPr', 'w:pPr']) {\n const elements = findAllDescendants(doc.element, tag);\n for (const el of elements) {\n if (el.childNodes.length === 0 || (el.childNodes.length === 1 && el.childNodes[0].nodeType === 3 && !el.childNodes[0].textContent?.trim())) {\n el.parentNode?.removeChild(el);\n count++;\n }\n }\n }\n return count ? [`Empty property elements: ${count} removed`] : [];\n}\n\nexport function strip_hidden_text(doc: DocumentObject): string[] {\n let count = 0;\n const elements = findAllDescendants(doc.element, 'w:rPr');\n for (const rPr of elements) {\n if (findChild(rPr, 'w:vanish') || findChild(rPr, 'w:webHidden')) {\n const run = rPr.parentNode as Element;\n if (run && run.tagName === 'w:r' && run.parentNode) {\n run.parentNode.removeChild(run);\n count++;\n }\n }\n }\n return count ? [`Hidden text runs: ${count} removed`] : [];\n}\n\nexport function count_tracked_changes(doc: DocumentObject): [number, number, number] {\n const ins = findAllDescendants(doc.element, 'w:ins').length;\n const del = findAllDescendants(doc.element, 'w:del').length;\n const fmt = findAllDescendants(doc.element, 'w:rPrChange').length +\n findAllDescendants(doc.element, 'w:pPrChange').length +\n findAllDescendants(doc.element, 'w:sectPrChange').length;\n return [ins, del, fmt];\n}\n\nexport function get_track_change_authors(doc: DocumentObject): Set<string> {\n const authors = new Set<string>();\n for (const tag of ['w:ins', 'w:del', 'w:rPrChange', 'w:pPrChange', 'w:sectPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n const author = el.getAttribute('w:author');\n if (author) authors.add(author);\n }\n }\n return authors;\n}\n\nfunction _getElementText(el: Element): string {\n const texts: string[] = [];\n const ts = findAllDescendants(el, 'w:t');\n for (const t of ts) if (t.textContent) texts.push(t.textContent);\n const dts = findAllDescendants(el, 'w:delText');\n for (const dt of dts) if (dt.textContent) texts.push(dt.textContent);\n return texts.join('');\n}\n\nexport function _truncate(text: string, maxLen: number = 60): string {\n const clean = text.replace(/\\n/g, ' ').trim();\n if (clean.length <= maxLen) return clean;\n return clean.substring(0, maxLen - 3) + \"...\";\n}\n\nexport function accept_all_tracked_changes(doc: DocumentObject): string[] {\n const lines: string[] = [];\n const insEls = findAllDescendants(doc.element, 'w:ins');\n const delEls = findAllDescendants(doc.element, 'w:del');\n \n for (const ins of insEls) {\n const text = _getElementText(ins).trim();\n if (text) lines.push(` Accepted insertion: \"${_truncate(text, 60)}\"`);\n }\n for (const del of delEls) {\n const text = _getElementText(del).trim();\n if (text) lines.push(` Accepted deletion of: \"${_truncate(text, 60)}\"`);\n }\n\n const engine = new RedlineEngine(doc);\n engine.accept_all_revisions();\n\n for (const tag of ['w:rPrChange', 'w:pPrChange', 'w:sectPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n el.parentNode?.removeChild(el);\n }\n }\n\n const total = insEls.length + delEls.length;\n if (total) {\n return [`Tracked changes auto-accepted: ${total}`].concat(lines);\n }\n return [];\n}\n\nexport function get_comments_summary(doc: DocumentObject): any {\n const data = extract_comments_data(doc.pkg);\n const comments = [];\n let openCount = 0;\n let resolvedCount = 0;\n\n for (const [cId, info] of Object.entries(data)) {\n if (info.resolved) resolvedCount++;\n else openCount++;\n comments.push({ id: cId, ...info });\n }\n\n return { total: comments.length, open: openCount, resolved: resolvedCount, comments };\n}\n\nexport function remove_all_comments(doc: DocumentObject): string[] {\n const data = extract_comments_data(doc.pkg);\n const keys = Object.keys(data);\n if (keys.length === 0) return [];\n\n const lines: string[] = [];\n const cm = new CommentsManager(doc);\n\n for (const [cId, info] of Object.entries(data)) {\n const status = info.resolved ? \"[Resolved]\" : \"[Open]\";\n lines.push(` ${status} \"${_truncate(info.text || '', 60)}\" (${info.author || 'Unknown'})`);\n cm.deleteComment(cId);\n }\n\n for (const tag of ['w:commentRangeStart', 'w:commentRangeEnd', 'w:commentReference']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n el.parentNode?.removeChild(el);\n }\n }\n\n const resolvedCount = Object.values(data).filter(c => c.resolved).length;\n const openCount = Object.values(data).filter(c => !c.resolved).length;\n return [`Comments removed: ${keys.length} (${resolvedCount} resolved, ${openCount} open)`].concat(lines);\n}\n\nexport function replace_comment_authors(doc: DocumentObject, newAuthor: string): string[] {\n const cm = new CommentsManager(doc);\n if (!cm.commentsPart) return [];\n\n const original = new Set<string>();\n const comments = findAllDescendants(cm.commentsPart._element, 'w:comment');\n for (const c of comments) {\n const author = c.getAttribute('w:author');\n if (author) {\n original.add(author);\n c.setAttribute('w:author', newAuthor);\n }\n if (c.hasAttribute('w:initials')) {\n const initials = newAuthor.split(' ').filter(Boolean).map(p => p[0]).join('').toUpperCase();\n c.setAttribute('w:initials', initials);\n }\n }\n return original.size ? [`Comment authors replaced: ${Array.from(original).sort().join(', ')} → \"${newAuthor}\"`] : [];\n}\n\nexport function replace_change_authors(doc: DocumentObject, newAuthor: string): string[] {\n const original = new Set<string>();\n for (const tag of ['w:ins', 'w:del', 'w:rPrChange', 'w:pPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n const author = el.getAttribute('w:author');\n if (author) {\n original.add(author);\n el.setAttribute('w:author', newAuthor);\n }\n }\n }\n return original.size ? [`Track change authors replaced: ${Array.from(original).sort().join(', ')} → \"${newAuthor}\"`] : [];\n}\n\nexport function normalize_change_dates(doc: DocumentObject): string[] {\n let count = 0;\n const fixed = \"2025-01-01T00:00:00Z\";\n for (const tag of ['w:ins', 'w:del', 'w:rPrChange', 'w:pPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n if (el.hasAttribute('w:date')) {\n el.setAttribute('w:date', fixed);\n count++;\n }\n }\n }\n return count ? [`Track change timestamps: ${count} normalized`] : [];\n}\n\nexport function scrub_doc_properties(doc: DocumentObject): string[] {\n const lines: string[] = [];\n const corePart = doc.pkg.getPartByPath('docProps/core.xml');\n if (corePart) {\n const creators = findDescendantsByLocalName(corePart._element, 'creator');\n creators.forEach(c => { if (c.textContent) { lines.push(`Author: ${c.textContent}`); c.textContent = \"\"; }});\n \n const modifiers = findDescendantsByLocalName(corePart._element, 'lastModifiedBy');\n modifiers.forEach(c => { if (c.textContent) { lines.push(`Last modified by: ${c.textContent}`); c.textContent = \"\"; }});\n \n const revisions = findDescendantsByLocalName(corePart._element, 'revision');\n revisions.forEach(c => { if (c.textContent && parseInt(c.textContent) > 1) { lines.push(`Revision count: ${c.textContent} → 1`); c.textContent = \"1\"; }});\n }\n\n const appPart = doc.pkg.getPartByPath('docProps/app.xml');\n if (appPart) {\n const docEl = appPart._element;\n const intFields = [\"TotalTime\", \"Words\", \"Characters\", \"Paragraphs\", \"Lines\", \"CharactersWithSpaces\"];\n for (const f of intFields) {\n findDescendantsByLocalName(docEl, f).forEach(el => {\n if (el.textContent && el.textContent !== \"0\") {\n if (f === \"TotalTime\") lines.push(`Total editing time: ${el.textContent} minutes`);\n el.textContent = \"0\";\n }\n });\n }\n const strFields = [\"Template\", \"Manager\", \"Company\"];\n for (const f of strFields) {\n findDescendantsByLocalName(docEl, f).forEach(el => {\n if (el.textContent) {\n lines.push(`${f}: ${el.textContent}`);\n el.textContent = \"\";\n }\n });\n }\n }\n\n return lines.length ? [\"Metadata scrubbed:\", ...lines.map(l => ` ${l}`)] : [];\n}\n\nexport function scrub_timestamps(doc: DocumentObject): string[] {\n let modified = false;\n const epoch = \"1970-01-01T00:00:00Z\";\n const corePart = doc.pkg.getPartByPath('docProps/core.xml');\n if (corePart) {\n for (const tag of ['created', 'modified', 'lastPrinted']) {\n findDescendantsByLocalName(corePart._element, tag).forEach(el => {\n if (el.textContent && el.textContent !== epoch) {\n el.textContent = epoch;\n modified = true;\n }\n });\n }\n }\n return modified ? [\"Timestamps normalized to epoch\"] : [];\n}\n\nexport function strip_custom_xml(doc: DocumentObject): string[] {\n const customParts = doc.pkg.parts.filter(p => p.partname.includes('/customXml'));\n if (customParts.length === 0) return [];\n\n const partnames = new Set(customParts.map(p => p.partname));\n doc.pkg.parts = doc.pkg.parts.filter(p => !partnames.has(p.partname));\n\n const removeRelationsTo = (relsPart: Part) => {\n const toRemove: Element[] = [];\n for (const rel of findAllDescendants(relsPart._element, 'Relationship')) {\n const target = rel.getAttribute('Target');\n if (target && target.includes('customXml')) toRemove.push(rel);\n }\n toRemove.forEach(r => r.parentNode?.removeChild(r));\n };\n\n const rootRels = doc.pkg.getPartByPath('_rels/.rels');\n if (rootRels) removeRelationsTo(rootRels);\n\n const docRels = doc.pkg.getOrCreateRelsPart(doc.part.partname);\n if (docRels) removeRelationsTo(docRels);\n\n for (const sdtPr of findAllDescendants(doc.element, 'w:sdtPr')) {\n findChildren(sdtPr, 'w:dataBinding').forEach(b => sdtPr.removeChild(b));\n }\n\n return [`Custom XML parts: ${customParts.length} removed`];\n}\n\nexport function strip_image_alt_text(doc: DocumentObject): string[] {\n let count = 0;\n for (const docPr of findDescendantsByLocalName(doc.element, 'docPr')) {\n const descr = docPr.getAttribute('descr');\n if (descr) {\n const isShort = descr.length < 10;\n const isFile = descr.includes('.') && descr.length < 60;\n if (isShort || isFile) {\n docPr.removeAttribute('descr');\n count++;\n }\n }\n }\n return count ? [`Image alt text: ${count} auto-generated descriptions removed`] : [];\n}\n\nexport function audit_hyperlinks(doc: DocumentObject): string[] {\n const internal = [\"sharepoint.com\", \"onedrive.com\", \".internal\", \"intranet\", \"localhost\", \"10.\", \"192.168.\", \"172.16.\"];\n const warnings: string[] = [];\n \n const docRels = doc.pkg.getOrCreateRelsPart(doc.part.partname);\n for (const rel of findAllDescendants(docRels._element, 'Relationship')) {\n if (rel.getAttribute('TargetMode') === 'External') {\n const url = rel.getAttribute('Target') || '';\n for (const pattern of internal) {\n if (url.toLowerCase().includes(pattern.toLowerCase())) {\n warnings.push(`Hyperlink targets internal URL: ${_truncate(url, 80)}`);\n break;\n }\n }\n }\n }\n return warnings;\n}","import { DocumentObject } from '../docx/bridge.js';\nimport { SanitizeReport } from './report.js';\nimport * as transforms from './transforms.js';\nimport { findAllDescendants } from '../docx/dom.js';\n\nexport interface FinalizeOptions {\n filename: string;\n sanitize_mode?: 'full' | 'keep-markup' | 'baseline';\n accept_all?: boolean;\n protection_mode?: 'read_only' | 'encrypt' | null;\n password?: string | null;\n author?: string | null;\n export_pdf?: boolean;\n}\n\nexport interface FinalizeResult {\n reportText: string;\n outBuffer?: Buffer;\n}\n\nexport async function finalize_document(doc: DocumentObject, options: FinalizeOptions): Promise<FinalizeResult> {\n const report = new SanitizeReport(options.filename, options.sanitize_mode || 'full', options.author || null);\n\n if (options.sanitize_mode === 'full') {\n const counts = transforms.count_tracked_changes(doc);\n const total = counts[0] + counts[1] + counts[2];\n report.tracked_changes_found = total;\n\n if (total > 0 && !options.accept_all) {\n report.status = 'blocked';\n report.blocked_reason = `Document contains ${total} unresolved tracked changes (${counts[0]} insertions, ${counts[1]} deletions, ${counts[2]} formatting). Review in Word first, or set accept_all=true.`;\n return { reportText: report.render() };\n }\n\n if (total > 0) {\n const authors = transforms.get_track_change_authors(doc);\n if (authors.size > 1) {\n report.warnings.push(`Multiple authors detected in tracked changes: ${Array.from(authors).sort().join(', ')}. Review per-change list before sending.`);\n }\n report.add_transform_lines(transforms.accept_all_tracked_changes(doc));\n report.tracked_changes_accepted = total;\n }\n\n const commentsSummary = transforms.get_comments_summary(doc);\n report.comments_removed = commentsSummary.total;\n report.add_transform_lines(transforms.remove_all_comments(doc));\n } else if (options.sanitize_mode === 'keep-markup') {\n // Basic support for keep-markup in TS\n const counts = transforms.count_tracked_changes(doc);\n report.tracked_changes_found = counts[0] + counts[1] + counts[2];\n report.tracked_changes_kept = report.tracked_changes_found;\n\n if (options.author) {\n report.add_transform_lines(transforms.replace_comment_authors(doc, options.author));\n report.add_transform_lines(transforms.replace_change_authors(doc, options.author));\n }\n }\n\n // Common transforms\n report.add_transform_lines(transforms.strip_rsid(doc));\n report.add_transform_lines(transforms.strip_para_ids(doc));\n report.add_transform_lines(transforms.strip_proof_errors(doc));\n report.add_transform_lines(transforms.strip_empty_properties(doc));\n report.add_transform_lines(transforms.strip_hidden_text(doc));\n report.add_transform_lines(transforms.coalesce_runs(doc));\n report.add_transform_lines(transforms.scrub_doc_properties(doc));\n report.add_transform_lines(transforms.scrub_timestamps(doc));\n report.add_transform_lines(transforms.strip_custom_xml(doc));\n report.add_transform_lines(transforms.strip_image_alt_text(doc));\n \n const warnings = transforms.audit_hyperlinks(doc);\n for (const w of warnings) report.warnings.push(w);\n\n report.add_transform_lines(transforms.normalize_change_dates(doc));\n\n // Protection (Settings injection)\n if (options.protection_mode === 'read_only' || options.protection_mode === 'encrypt') {\n if (options.protection_mode === 'encrypt') {\n report.warnings.push(\"Encryption mode (AES compound wrappers) is strictly unsupported in the zero-dependency Node engine. Falling back to native Word Read-Only lock.\");\n }\n \n const settingsPart = doc.pkg.getPartByPath('word/settings.xml');\n if (settingsPart) {\n const docEl = settingsPart._element.ownerDocument!;\n let prot = transforms.findDescendantsByLocalName(settingsPart._element, 'documentProtection')[0];\n if (!prot) {\n prot = docEl.createElement('w:documentProtection');\n // Word expects documentProtection to be inserted before elements like w:autoFormatOverride, w:styleLockTheme, etc.\n // For standard robustness without complex XSD enforcement, appendChild generally works.\n settingsPart._element.appendChild(prot);\n }\n prot.setAttribute('w:edit', 'readOnly');\n prot.setAttribute('w:enforcement', '1');\n report.structural_lines.push(\"Document locked (Read-Only enforcement injected into settings.xml)\");\n }\n }\n\n if (options.export_pdf) {\n report.warnings.push(\"PDF export requires the Python/Word COM environment and is skipped in this zero-dependency Node agent.\");\n }\n\n // Clean up leaked Microsoft namespaces\n for (const part of doc.pkg.parts) {\n // Match the exact injection condition from RedlineEngine constructor\n if (part === doc.part || (part.contentType.includes('wordprocessingml') && part.contentType.endsWith('+xml'))) {\n if (part._element.hasAttribute('xmlns:w16du')) {\n let hasW16du = false;\n // Check root element attributes (excluding the xmlns declaration itself)\n if (Array.from(part._element.attributes || []).some(a => a.name.startsWith('w16du:') && a.name !== 'xmlns:w16du')) {\n hasW16du = true;\n }\n if (!hasW16du) {\n const allNodes = findAllDescendants(part._element, '*');\n for (const n of allNodes) {\n if (n.tagName.startsWith('w16du:') || Array.from(n.attributes || []).some(a => a.name.startsWith('w16du:'))) {\n hasW16du = true;\n break;\n }\n }\n }\n if (!hasW16du) part._element.removeAttribute('xmlns:w16du');\n }\n }\n }\n\n if (report.warnings.length > 0) report.status = 'clean_with_warnings';\n\n const outBuffer = await doc.save();\n return { reportText: report.render(), outBuffer };\n}","export function identifyEngine() {\n return 'adeu-core-node';\n}\n\nexport { DocumentObject } from './docx/bridge.js';\nexport { DocumentMapper, TextSpan } from './mapper.js';\nexport { RedlineEngine, BatchValidationError } from './engine.js';\nexport { generate_edits_from_text, trim_common_context, create_unified_diff, create_word_patch_diff } from './diff.js';\nexport { apply_edits_to_markdown } from './markup.js';\nexport { paginate, split_structural_appendix, PaginationResult, PageInfo } from './pagination.js';\nexport { extract_outline, OutlineNode } from './outline.js';\nexport { extractTextFromBuffer } from './ingest.js';\nexport { finalize_document, FinalizeOptions, FinalizeResult } from './sanitize/core.js';"],"mappings":"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","names":["result","prev","nxt","target_runs","render_comment"]}
1
+ {"version":3,"sources":["../src/docx/bridge.ts","../src/docx/dom.ts","../src/docx/primitives.ts","../src/comments.ts","../src/utils/docx.ts","../src/mapper.ts","../src/diff.ts","../src/markup.ts","../src/engine.ts","../src/pagination.ts","../src/domain.ts","../src/ingest.ts","../src/outline.ts","../src/sanitize/report.ts","../src/sanitize/transforms.ts","../src/sanitize/core.ts","../src/index.ts"],"sourcesContent":["// FILE: node/packages/core/src/docx/bridge.ts\nimport { unzipSync, zipSync, strFromU8, strToU8 } from \"fflate\";\nimport {\n parseXml,\n findChild,\n findAllDescendants,\n serializeXml,\n} from \"./dom.js\";\n\nexport class Relationship {\n constructor(\n public id: string,\n public type: string,\n public target: string,\n public isExternal: boolean,\n ) {}\n}\n\nexport class Part {\n public rels: Map<string, Relationship> = new Map();\n public _element: Element;\n public package?: DocxPackage;\n constructor(\n public partname: string,\n public blob: string,\n element: Element,\n public contentType: string,\n ) {\n this._element = element;\n }\n\n public addRelationship(\n id: string,\n type: string,\n target: string,\n isExternal: boolean = false,\n ) {\n this.rels.set(id, new Relationship(id, type, target, isExternal));\n\n // Directly append the relationship element to the document structure\n if (this.partname.endsWith(\".rels\")) {\n const doc = this._element.ownerDocument;\n if (doc) {\n // Use strict namespace to ensure it parses successfully on reload\n const relEl = doc.createElementNS(\n \"http://schemas.openxmlformats.org/package/2006/relationships\",\n \"Relationship\",\n );\n relEl.setAttribute(\"Id\", id);\n relEl.setAttribute(\"Type\", type);\n relEl.setAttribute(\"Target\", target);\n if (isExternal) relEl.setAttribute(\"TargetMode\", \"External\");\n this._element.appendChild(relEl);\n }\n }\n }\n}\n\nexport class DocxPackage {\n public parts: Part[] = [];\n public mainDocumentPart!: Part;\n\n constructor(public unzipped: Record<string, Uint8Array>) {}\n\n public getPartByPath(path: string): Part | undefined {\n // Strip leading slash for zip compat\n const searchPath = path.startsWith(\"/\") ? path.substring(1) : path;\n return this.parts.find(\n (p) => p.partname === searchPath || p.partname === \"/\" + searchPath,\n );\n }\n\n public nextPartname(pattern: string): string {\n let i = 1;\n while (true) {\n const candidate = pattern.replace(\"%d\", i === 1 ? \"\" : i.toString());\n if (!this.getPartByPath(candidate)) return candidate;\n i++;\n }\n }\n\n public addPart(\n partname: string,\n contentType: string,\n xmlString: string,\n ): Part {\n const doc = parseXml(xmlString);\n const part = new Part(\n partname,\n xmlString,\n doc.documentElement,\n contentType,\n );\n part.package = this;\n this.parts.push(part);\n\n // Update [Content_Types].xml\n const ctPart = this.getPartByPath(\"[Content_Types].xml\");\n if (ctPart) {\n const docCT = ctPart._element.ownerDocument;\n if (docCT) {\n const override = docCT.createElement(\"Override\");\n override.setAttribute(\"PartName\", partname);\n override.setAttribute(\"ContentType\", contentType);\n ctPart._element.appendChild(override);\n }\n }\n return part;\n }\n\n public getOrCreateRelsPart(sourcePartname: string): Part {\n // e.g., /word/document.xml -> /word/_rels/document.xml.rels\n const parts = sourcePartname.split(\"/\");\n const file = parts.pop();\n const relsPath = parts.join(\"/\") + \"/_rels/\" + file + \".rels\";\n\n let relsPart = this.getPartByPath(relsPath);\n if (!relsPart) {\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`;\n relsPart = this.addPart(\n relsPath,\n \"application/vnd.openxmlformats-package.relationships+xml\",\n xml,\n );\n }\n return relsPart;\n }\n}\n\nexport class DocumentObject {\n public part: Part;\n public settings: { oddAndEvenPagesHeaderFooter: boolean } = {\n oddAndEvenPagesHeaderFooter: false,\n };\n // Simplification for the TS port: sections hold header/footer refs\n public sections: any[] = [];\n\n constructor(\n public pkg: DocxPackage,\n part: Part,\n ) {\n this.part = part;\n }\n\n public get element(): Element {\n return findChild(this.part._element, \"w:body\") || this.part._element;\n }\n\n /**\n * Main entrypoint for loading a DOCX buffer into the DOM wrapper.\n */\n public static async load(\n buffer: Buffer | ArrayBuffer,\n ): Promise<DocumentObject> {\n const u8 = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const unzipped = unzipSync(u8);\n const pkg = new DocxPackage(unzipped);\n\n // 1. Load Content Types\n const ctFile = unzipped[\"[Content_Types].xml\"];\n let contentTypes: Record<string, string> = {};\n if (ctFile) {\n const ctXml = parseXml(strFromU8(ctFile));\n const overrides = findAllDescendants(ctXml.documentElement, \"Override\");\n for (const override of overrides) {\n contentTypes[override.getAttribute(\"PartName\") || \"\"] =\n override.getAttribute(\"ContentType\") || \"\";\n }\n }\n\n // 2. Pre-load all XML parts to allow synchronous traversal later\n for (const [path, fileData] of Object.entries(unzipped)) {\n if (path.endsWith(\".xml\") || path.endsWith(\".rels\")) {\n const text = strFromU8(fileData);\n const doc = parseXml(text);\n const cType = contentTypes[\"/\" + path] || \"application/xml\";\n const part = new Part(\"/\" + path, text, doc.documentElement, cType);\n part.package = pkg;\n pkg.parts.push(part);\n }\n }\n\n // 3. Resolve Relationships for the main document\n const mainPart = pkg.getPartByPath(\"word/document.xml\");\n if (!mainPart) throw new Error(\"Invalid DOCX: Missing word/document.xml\");\n pkg.mainDocumentPart = mainPart;\n\n const relsPart = pkg.getPartByPath(\"word/_rels/document.xml.rels\");\n if (relsPart) {\n const relElements = findAllDescendants(relsPart._element, \"Relationship\");\n for (const rel of relElements) {\n const rId = rel.getAttribute(\"Id\");\n const target = rel.getAttribute(\"Target\");\n const type = rel.getAttribute(\"Type\");\n const targetMode = rel.getAttribute(\"TargetMode\");\n\n if (rId && target && type) {\n mainPart.rels.set(\n rId,\n new Relationship(rId, type, target, targetMode === \"External\"),\n );\n }\n }\n }\n\n return new DocumentObject(pkg, mainPart);\n }\n\n public relateTo(part: Part, relType: string) {\n let rId = 1;\n while (this.part.rels.has(`rId${rId}`)) rId++;\n const id = `rId${rId}`;\n\n // In DOCX, targets in .rels are relative to the source part's directory.\n // /word/document.xml relating to /word/comments.xml -> target is \"comments.xml\"\n const target = part.partname.split(\"/\").pop()!;\n\n this.part.rels.set(id, new Relationship(id, relType, target, false));\n const relsPart = this.pkg.getOrCreateRelsPart(this.part.partname);\n relsPart.addRelationship(id, relType, target, false);\n }\n\n public relateToExternal(target: string, relType: string): string {\n let rId = 1;\n while (this.part.rels.has(`rId${rId}`)) rId++;\n const id = `rId${rId}`;\n\n this.part.rels.set(id, new Relationship(id, relType, target, true));\n const relsPart = this.pkg.getOrCreateRelsPart(this.part.partname);\n relsPart.addRelationship(id, relType, target, true);\n return id;\n }\n\n public async save(): Promise<Buffer> {\n for (const part of this.pkg.parts) {\n let xmlStr = serializeXml(part._element.ownerDocument || part._element);\n if (!xmlStr.startsWith(\"<?xml\")) {\n xmlStr =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' + xmlStr;\n }\n this.pkg.unzipped[part.partname.substring(1)] = strToU8(xmlStr); // Strip leading slash\n }\n return Buffer.from(zipSync(this.pkg.unzipped));\n }\n}\n","import { DOMParser, XMLSerializer } from \"@xmldom/xmldom\";\n\n/**\n * Simulates docx.oxml.ns.qn. In xmldom, namespaces are preserved in tagName.\n */\nexport const qn = (name: string) => name;\n\n/**\n * Simulates lxml element.find(\"w:tag\") - strictly searches DIRECT children only.\n */\nexport function findChild(element: Element, tagName: string): Element | null {\n for (let i = 0; i < element.childNodes.length; i++) {\n const child = element.childNodes[i];\n if (\n child.nodeType === 1 /* ELEMENT_NODE */ &&\n (child as Element).tagName === tagName\n ) {\n return child as Element;\n }\n }\n return null;\n}\n\n/**\n * Simulates lxml element.findall(\"w:tag\") - strictly searches DIRECT children only.\n */\nexport function findChildren(element: Element, tagName: string): Element[] {\n const result: Element[] = [];\n for (let i = 0; i < element.childNodes.length; i++) {\n const child = element.childNodes[i];\n if (child.nodeType === 1 && (child as Element).tagName === tagName) {\n result.push(child as Element);\n }\n }\n return result;\n}\n\n/**\n * Simulates lxml element.findall(\".//w:tag\") - searches ALL descendants.\n */\nexport function findAllDescendants(\n element: Element,\n tagName: string,\n): Element[] {\n return Array.from(element.getElementsByTagName(tagName));\n}\n\n/**\n * Parses raw XML strings into xmldom Documents.\n */\nexport function parseXml(xmlString: string): Document {\n return new DOMParser().parseFromString(xmlString, \"text/xml\");\n}\n\n/**\n * Serializes an xmldom Document or Element back to a string,\n * enforcing deterministic attribute ordering on the root element.\n */\nexport function serializeXml(node: Node): string {\n let xml = new XMLSerializer().serializeToString(node);\n\n // BUG-11: Deterministic namespace ordering on root elements.\n const rootTagRegex = /<([a-zA-Z0-9_:]+)(\\s+[^>]+?)(>|\\/>)/;\n const match = rootTagRegex.exec(xml);\n\n if (match && !match[1].startsWith(\"?\")) {\n const index = match.index;\n const textBefore = xml.substring(0, index);\n\n // Ensure this is the absolute root tag (only <?xml...?> allowed before it)\n const isRoot =\n !textBefore.includes(\"<\") ||\n (textBefore.trim().startsWith(\"<?xml\") &&\n (textBefore.match(/</g) || []).length === 1);\n\n if (isRoot) {\n const fullTag = match[0];\n const elemStart = `<${match[1]}`;\n const attrsStr = match[2];\n const tagEnd = match[3];\n\n // Robust extraction matching any quote style and internal spacing\n const attrRegex = /([a-zA-Z0-9_:]+)\\s*=\\s*([\"'])(.*?)\\2/g;\n const attrs: string[] = [];\n let m;\n while ((m = attrRegex.exec(attrsStr)) !== null) {\n attrs.push(m[0].trim());\n }\n\n // Sort attributes: xmlns definitions first, then standard attributes\n attrs.sort((a, b) => {\n const aName = a.split(\"=\")[0].trim();\n const bName = b.split(\"=\")[0].trim();\n const aIsXmlns = aName.startsWith(\"xmlns\");\n const bIsXmlns = bName.startsWith(\"xmlns\");\n if (aIsXmlns && !bIsXmlns) return -1;\n if (!aIsXmlns && bIsXmlns) return 1;\n return aName < bName ? -1 : aName > bName ? 1 : 0;\n });\n\n const newTag =\n attrs.length > 0\n ? `${elemStart} ${attrs.join(\" \")}${tagEnd}`\n : `${elemStart}${tagEnd}`;\n xml =\n xml.substring(0, index) +\n newTag +\n xml.substring(index + fullTag.length);\n }\n }\n\n return xml;\n}\n","import { findChild } from './dom.js';\n\nexport class Paragraph {\n constructor(public _element: Element, public _parent: any) {}\n \n get text(): string {\n let t = '';\n const texts = this._element.getElementsByTagName('w:t');\n for (let i = 0; i < texts.length; i++) {\n t += texts[i].textContent || '';\n }\n return t;\n }\n}\n\nexport class Run {\n constructor(public _element: Element, public _parent: any) {}\n}\n\nexport class Cell {\n constructor(public _element: Element, public _parent: any) {}\n}\n\nexport class Row {\n public cells: Cell[] = [];\n constructor(public _element: Element, public _parent: any) {\n const tcs = this._element.getElementsByTagName('w:tc');\n for (let i = 0; i < tcs.length; i++) {\n this.cells.push(new Cell(tcs[i], this));\n }\n }\n}\n\nexport class Table {\n public rows: Row[] = [];\n constructor(public _element: Element, public _parent: any) {\n const trs = this._element.getElementsByTagName('w:tr');\n for (let i = 0; i < trs.length; i++) {\n this.rows.push(new Row(trs[i], this));\n }\n }\n}\n\nexport class NotesPart {\n public _element: Element;\n constructor(public part: any, public note_type: 'fn' | 'en') {\n this._element = part._element;\n }\n}\n\nexport class FootnoteItem {\n public id: string;\n public part: any;\n constructor(public _element: Element, public _parent: any, public note_type: 'fn' | 'en') {\n this.id = _element.getAttribute('w:id') || '';\n this.part = _parent.part;\n }\n}\n\nexport interface DocxEvent {\n type: string;\n id: string;\n author?: string;\n date?: string;\n}","import { DocxPackage, Part, DocumentObject } from './docx/bridge.js';\nimport { findAllDescendants, findChild, parseXml } from './docx/dom.js';\n\nconst NS = {\n w: 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n w14: 'http://schemas.microsoft.com/office/word/2010/wordml',\n w15: 'http://schemas.microsoft.com/office/word/2012/wordml',\n w16cid: 'http://schemas.microsoft.com/office/word/2016/wordml/cid',\n w16cex: 'http://schemas.microsoft.com/office/word/2018/wordml/cex',\n mc: 'http://schemas.openxmlformats.org/markup-compatibility/2006'\n};\n\nconst CT = {\n COMMENTS: 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml',\n EXTENDED: 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml',\n IDS: 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml',\n EXTENSIBLE: 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml'\n};\n\nconst RT = {\n COMMENTS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',\n EXTENDED: 'http://schemas.microsoft.com/office/2011/relationships/commentsExtended',\n IDS: 'http://schemas.microsoft.com/office/2016/09/relationships/commentsIds',\n EXTENSIBLE: 'http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible'\n};\n\nexport class CommentsManager {\n private _commentsPart: Part | null = null;\n private _extendedPart: Part | null = null;\n private _idsPart: Part | null = null;\n private _extensiblePart: Part | null = null;\n private _nextId: number | null = null;\n\n constructor(public doc: DocumentObject) {}\n\n public get commentsPart() {\n if (!this._commentsPart) {\n this._commentsPart = this._getOrCreateCommentsPart();\n this._ensureNamespaces();\n }\n return this._commentsPart;\n }\n\n public get extendedPart() {\n if (!this._extendedPart) this._extendedPart = this._getOrCreateExtendedPart();\n return this._extendedPart;\n }\n\n public get idsPart() {\n if (!this._idsPart) this._idsPart = this._getOrCreateIdsPart();\n return this._idsPart;\n }\n\n public get extensiblePart() {\n if (!this._extensiblePart) this._extensiblePart = this._getOrCreateExtensiblePart();\n return this._extensiblePart;\n }\n\n public get nextId(): number {\n if (this._nextId === null) this._nextId = this._getNextCommentId();\n return this._nextId;\n }\n\n public set nextId(value: number) {\n this._nextId = value;\n }\n\n private _getExistingPartByType(contentType: string): Part | null {\n return this.doc.pkg.parts.find(p => p.contentType === contentType) || null;\n }\n\n private _linkPart(part: Part, relType: string): Part {\n for (const rel of this.doc.part.rels.values()) {\n if (!rel.isExternal && rel.target === part.partname.split('/').pop()) {\n return part;\n }\n }\n this.doc.relateTo(part, relType);\n return part;\n }\n\n private _getOrCreateCommentsPart(): Part {\n let part = this._getExistingPartByType(CT.COMMENTS);\n if (part) return this._linkPart(part, RT.COMMENTS);\n\n const partname = this.doc.pkg.nextPartname('/word/comments%d.xml');\n const xml = `<w:comments xmlns:w=\"${NS.w}\" xmlns:w14=\"${NS.w14}\" xmlns:w15=\"${NS.w15}\" xmlns:w16cid=\"${NS.w16cid}\" xmlns:w16cex=\"${NS.w16cex}\" xmlns:mc=\"${NS.mc}\" mc:Ignorable=\"w14 w15 w16cid w16cex\"></w:comments>`;\n part = this.doc.pkg.addPart(partname, CT.COMMENTS, xml);\n this.doc.relateTo(part, RT.COMMENTS);\n return part;\n }\n\n private _getOrCreateExtendedPart(): Part {\n let part = this._getExistingPartByType(CT.EXTENDED);\n if (part) return this._linkPart(part, RT.EXTENDED);\n\n const partname = this.doc.pkg.nextPartname('/word/commentsExtended%d.xml');\n const xml = `<w15:commentsEx xmlns:w15=\"${NS.w15}\"></w15:commentsEx>`;\n part = this.doc.pkg.addPart(partname, CT.EXTENDED, xml);\n this.doc.relateTo(part, RT.EXTENDED);\n return part;\n }\n\n private _getOrCreateIdsPart(): Part {\n let part = this._getExistingPartByType(CT.IDS);\n if (part) return this._linkPart(part, RT.IDS);\n\n const partname = this.doc.pkg.nextPartname('/word/commentsIds%d.xml');\n const xml = `<w16cid:commentsIds xmlns:w16cid=\"${NS.w16cid}\"></w16cid:commentsIds>`;\n part = this.doc.pkg.addPart(partname, CT.IDS, xml);\n this.doc.relateTo(part, RT.IDS);\n return part;\n }\n\n private _getOrCreateExtensiblePart(): Part {\n let part = this._getExistingPartByType(CT.EXTENSIBLE);\n if (part) return this._linkPart(part, RT.EXTENSIBLE);\n\n const partname = this.doc.pkg.nextPartname('/word/commentsExtensible%d.xml');\n const xml = `<w16cex:commentsExtensible xmlns:w16cex=\"${NS.w16cex}\"></w16cex:commentsExtensible>`;\n part = this.doc.pkg.addPart(partname, CT.EXTENSIBLE, xml);\n this.doc.relateTo(part, RT.EXTENSIBLE);\n return part;\n }\n\n private _ensureNamespaces() {\n // In TS we use full xml reconstruction if attributes are missing, but xmldom generally tolerates\n // runtime attributes if the namespace is declared. For absolute safety, if it's completely missing,\n // we would rebuild. Assuming the parser caught them if they existed.\n }\n\n private _getNextCommentId(): number {\n const ids = [0];\n const part = this._getExistingPartByType(CT.COMMENTS);\n if (part) {\n const comments = findAllDescendants(part._element, 'w:comment');\n for (const c of comments) {\n const idStr = c.getAttribute('w:id');\n if (idStr) ids.push(parseInt(idStr, 10) || 0);\n }\n }\n return Math.max(...ids) + 1;\n }\n\n private _generateHexId(): string {\n return Math.floor(Math.random() * 0xFFFFFFFF).toString(16).toUpperCase().padStart(8, '0');\n }\n\n private _getInitials(author: string): string {\n if (!author) return '';\n return author.split(' ').filter(Boolean).map(p => p[0]).join('').toUpperCase();\n }\n\n private _findParaIdForComment(commentId: string): string | null {\n if (!this._commentsPart) return null;\n for (const c of findAllDescendants(this._commentsPart._element, 'w:comment')) {\n if (c.getAttribute('w:id') === commentId) {\n for (const p of findAllDescendants(c, 'w:p')) {\n const pid = p.getAttribute('w14:paraId');\n if (pid) return pid;\n }\n }\n }\n return null;\n }\n\n private _findThreadRootParaId(commentId: string): string | null {\n const directParaId = this._findParaIdForComment(commentId);\n const extPart = this._getExistingPartByType(CT.EXTENDED);\n if (!directParaId || !extPart) return directParaId;\n\n for (let i = 0; i < extPart._element.childNodes.length; i++) {\n const child = extPart._element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n if (child.getAttribute('w15:paraId') === directParaId) {\n const parent = child.getAttribute('w15:paraIdParent');\n if (parent) return parent;\n }\n }\n return directParaId;\n }\n\n public addComment(author: string, text: string, parentId: string | null = null): string {\n const commentId = this.nextId.toString();\n this.nextId++;\n const now = new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n\n const doc = this.commentsPart._element.ownerDocument!;\n const comment = doc.createElement('w:comment');\n comment.setAttribute('w:id', commentId);\n comment.setAttribute('w:author', author);\n comment.setAttribute('w:date', now);\n \n const initials = this._getInitials(author);\n if (initials) comment.setAttribute('w:initials', initials);\n\n const extPart = this._getExistingPartByType(CT.EXTENDED);\n if (parentId && !extPart) {\n comment.setAttribute('w15:p', parentId);\n }\n\n const paraId = this._generateHexId();\n const rsid = this._generateHexId();\n\n const p = doc.createElement('w:p');\n p.setAttribute('w14:paraId', paraId);\n p.setAttribute('w14:textId', '77777777');\n p.setAttribute('w:rsidR', rsid);\n p.setAttribute('w:rsidRDefault', rsid);\n p.setAttribute('w:rsidP', rsid);\n\n const pPr = doc.createElement('w:pPr');\n const pStyle = doc.createElement('w:pStyle');\n pStyle.setAttribute('w:val', 'CommentText');\n pPr.appendChild(pStyle);\n p.appendChild(pPr);\n\n const rRef = doc.createElement('w:r');\n const rPrRef = doc.createElement('w:rPr');\n const rStyleRef = doc.createElement('w:rStyle');\n rStyleRef.setAttribute('w:val', 'CommentReference');\n rPrRef.appendChild(rStyleRef);\n rRef.appendChild(rPrRef);\n rRef.appendChild(doc.createElement('w:annotationRef'));\n p.appendChild(rRef);\n\n const r = doc.createElement('w:r');\n const t = doc.createElement('w:t');\n t.textContent = text;\n r.appendChild(t);\n p.appendChild(r);\n comment.appendChild(p);\n\n this.commentsPart._element.appendChild(comment);\n\n if (this.extendedPart) {\n const parentParaId = parentId ? this._findThreadRootParaId(parentId) : null;\n const exDoc = this.extendedPart._element.ownerDocument!;\n const commentEx = exDoc.createElement('w15:commentEx');\n commentEx.setAttribute('w15:paraId', paraId);\n if (parentParaId) commentEx.setAttribute('w15:paraIdParent', parentParaId);\n commentEx.setAttribute('w15:done', '0');\n this.extendedPart._element.appendChild(commentEx);\n }\n\n if (this.idsPart) {\n const idsDoc = this.idsPart._element.ownerDocument!;\n const commentIdEl = idsDoc.createElement('w16cid:commentId');\n commentIdEl.setAttribute('w16cid:paraId', paraId);\n commentIdEl.setAttribute('w16cid:durableId', this._generateHexId());\n this.idsPart._element.appendChild(commentIdEl);\n }\n\n if (this.extensiblePart) {\n let durableId: string | null = null;\n for (let i = 0; i < this.idsPart._element.childNodes.length; i++) {\n const child = this.idsPart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w16cid:paraId') === paraId) {\n durableId = child.getAttribute('w16cid:durableId');\n break;\n }\n }\n if (durableId) {\n const cexDoc = this.extensiblePart._element.ownerDocument!;\n const extEl = cexDoc.createElement('w16cex:commentExtensible');\n extEl.setAttribute('w16cex:durableId', durableId);\n extEl.setAttribute('w16cex:dateUtc', now);\n this.extensiblePart._element.appendChild(extEl);\n }\n }\n\n return commentId;\n }\n\n public deleteComment(commentId: string) {\n if (!this._commentsPart) return;\n\n let commentEl: Element | null = null;\n for (const c of findAllDescendants(this._commentsPart._element, 'w:comment')) {\n if (c.getAttribute('w:id') === commentId) {\n commentEl = c;\n break;\n }\n }\n\n if (!commentEl) return;\n\n let paraId: string | null = null;\n for (const p of findAllDescendants(commentEl, 'w:p')) {\n const pid = p.getAttribute('w14:paraId');\n if (pid) {\n paraId = pid;\n break;\n }\n }\n\n if (paraId) {\n const repliesToDelete: string[] = [];\n if (this.extendedPart) {\n for (let i = 0; i < this.extendedPart._element.childNodes.length; i++) {\n const child = this.extendedPart._element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n \n if (child.getAttribute('w15:paraIdParent') === paraId) {\n const childParaId = child.getAttribute('w15:paraId');\n if (childParaId) {\n for (const c of findAllDescendants(this._commentsPart._element, 'w:comment')) {\n for (const p of findAllDescendants(c, 'w:p')) {\n if (p.getAttribute('w14:paraId') === childParaId) {\n const cid = c.getAttribute('w:id');\n if (cid) repliesToDelete.push(cid);\n break;\n }\n }\n }\n }\n }\n }\n }\n\n for (const repId of repliesToDelete) {\n this.deleteComment(repId);\n }\n\n let durableId: string | null = null;\n\n if (this.idsPart) {\n const toRemove: Element[] = [];\n for (let i = 0; i < this.idsPart._element.childNodes.length; i++) {\n const child = this.idsPart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w16cid:paraId') === paraId) {\n durableId = child.getAttribute('w16cid:durableId');\n toRemove.push(child);\n }\n }\n toRemove.forEach(c => this.idsPart!._element.removeChild(c));\n }\n\n if (this.extendedPart) {\n const toRemove: Element[] = [];\n for (let i = 0; i < this.extendedPart._element.childNodes.length; i++) {\n const child = this.extendedPart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w15:paraId') === paraId) {\n toRemove.push(child);\n }\n }\n toRemove.forEach(c => this.extendedPart!._element.removeChild(c));\n }\n\n if (durableId && this.extensiblePart) {\n const toRemove: Element[] = [];\n for (let i = 0; i < this.extensiblePart._element.childNodes.length; i++) {\n const child = this.extensiblePart._element.childNodes[i] as Element;\n if (child.nodeType === 1 && child.getAttribute('w16cex:durableId') === durableId) {\n toRemove.push(child);\n }\n }\n toRemove.forEach(c => this.extensiblePart!._element.removeChild(c));\n }\n }\n\n if (commentEl.parentNode) {\n commentEl.parentNode.removeChild(commentEl);\n }\n }\n}\n\n// Keep the global extraction function matching Python behavior\nexport function extract_comments_data(pkg: DocxPackage): Record<string, any> {\n // Temporary bridge to use the new class\n const docObj = {\n pkg,\n part: pkg.mainDocumentPart,\n relateTo: () => {} // Mock since extraction is read-only\n } as unknown as DocumentObject;\n \n const mgr = new CommentsManager(docObj);\n const data: Record<string, any> = {};\n \n const part = pkg.parts.find(p => p.contentType === CT.COMMENTS);\n if (!part) return data;\n\n const para_id_to_cid: Record<string, string> = {};\n const comments = findAllDescendants(part._element, 'w:comment');\n\n for (const c of comments) {\n const c_id = c.getAttribute('w:id');\n if (!c_id) continue;\n\n const c_author = c.getAttribute('w:author') || 'Unknown';\n const c_date = c.getAttribute('w:date') || '';\n \n let is_resolved = false;\n const val = c.getAttribute('w15:done');\n if (val === '1' || val === 'true' || val === 'on') is_resolved = true;\n\n let parent_id = c.getAttribute('w15:p') || null;\n\n const p_elems = findAllDescendants(c, 'w:p');\n for (const p of p_elems) {\n const pid = p.getAttribute('w14:paraId');\n if (pid) para_id_to_cid[pid] = c_id;\n }\n\n const text_parts: string[] = [];\n for (const p of p_elems) {\n const t_elems = findAllDescendants(p, 'w:t');\n for (const t of t_elems) {\n if (t.textContent) text_parts.push(t.textContent);\n }\n text_parts.push('\\n');\n }\n const full_text = text_parts.join('').trim();\n\n data[c_id] = {\n author: c_author,\n text: full_text,\n date: c_date,\n resolved: is_resolved,\n parent_id: parent_id,\n };\n }\n\n const extPart = pkg.parts.find(p => p.contentType === CT.EXTENDED);\n if (extPart) {\n const children = extPart._element.childNodes;\n for (let i = 0; i < children.length; i++) {\n const child = children[i] as Element;\n if (child.nodeType !== 1) continue;\n\n const para_id = child.getAttribute('w15:paraId');\n const parent_para_id = child.getAttribute('w15:paraIdParent');\n const done_val = child.getAttribute('w15:done');\n\n if (para_id) {\n const c_id = para_id_to_cid[para_id];\n if (c_id && data[c_id]) {\n if (parent_para_id) {\n const p_id = para_id_to_cid[parent_para_id];\n if (p_id) data[c_id].parent_id = p_id;\n }\n if (done_val === '1' || done_val === 'true' || done_val === 'on') {\n data[c_id].resolved = true;\n }\n }\n }\n }\n }\n\n return data;\n}","import { qn, findChild, findAllDescendants } from \"../docx/dom.js\";\nimport {\n Paragraph,\n Table,\n Run,\n NotesPart,\n FootnoteItem,\n DocxEvent,\n} from \"../docx/primitives.js\";\n\nexport const QN_W_P = \"w:p\";\nexport const QN_W_R = \"w:r\";\nexport const QN_W_T = \"w:t\";\nexport const QN_W_DELTEXT = \"w:delText\";\nexport const QN_W_TAB = \"w:tab\";\nexport const QN_W_BR = \"w:br\";\nexport const QN_W_CR = \"w:cr\";\nexport const QN_W_RPR = \"w:rPr\";\nexport const QN_W_RPRCHANGE = \"w:rPrChange\";\nexport const QN_W_COMMENTREFERENCE = \"w:commentReference\";\nexport const QN_W_FOOTNOTEREFERENCE = \"w:footnoteReference\";\nexport const QN_W_ENDNOTEREFERENCE = \"w:endnoteReference\";\nexport const QN_W_FLDCHAR = \"w:fldChar\";\nexport const QN_W_FLDCHARTYPE = \"w:fldCharType\";\nexport const QN_W_INSTRTEXT = \"w:instrText\";\nexport const QN_W_INS = \"w:ins\";\nexport const QN_W_DEL = \"w:del\";\nexport const QN_W_ID = \"w:id\";\nexport const QN_W_AUTHOR = \"w:author\";\nexport const QN_W_DATE = \"w:date\";\nexport const QN_W_COMMENTRANGESTART = \"w:commentRangeStart\";\nexport const QN_W_COMMENTRANGEEND = \"w:commentRangeEnd\";\nexport const QN_W_HYPERLINK = \"w:hyperlink\";\nexport const QN_R_ID = \"r:id\";\nexport const QN_W_FLDSIMPLE = \"w:fldSimple\";\nexport const QN_W_INSTR = \"w:instr\";\nexport const QN_W_BOOKMARKSTART = \"w:bookmarkStart\";\nexport const QN_W_NAME = \"w:name\";\nexport const QN_W_SDT = \"w:sdt\";\nexport const QN_W_SMARTTAG = \"w:smartTag\";\nexport const QN_W_SDTCONTENT = \"w:sdtContent\";\nexport const QN_W_B = \"w:b\";\nexport const QN_W_I = \"w:i\";\nexport const QN_W_VAL = \"w:val\";\nexport const QN_W_PPR = \"w:pPr\";\nexport const QN_W_PSTYLE = \"w:pStyle\";\nexport const QN_W_OUTLINELVL = \"w:outlineLvl\";\nexport const QN_W_NUMPR = \"w:numPr\";\nexport const QN_W_NUMID = \"w:numId\";\nexport const QN_W_ILVL = \"w:ilvl\";\n\nconst _CUSTOM_HEADING_NAME_RE = /Heading[ ]?([1-6])(?![0-9])/;\n\nexport function _get_style_cache(\n part: any,\n): [Record<string, any>, string | null] {\n const pkg = part.package || part.pkg || (part.part ? part.part.pkg : null);\n if (pkg && pkg._adeu_style_cache) {\n return pkg._adeu_style_cache;\n }\n\n const cache: Record<string, any> = {};\n let default_pstyle: string | null = null;\n const raw_styles: Record<string, any> = {};\n\n const stylesPart = pkg?.getPartByPath(\"word/styles.xml\");\n if (!stylesPart) {\n const result: [Record<string, any>, string | null] = [cache, null];\n if (pkg) pkg._adeu_style_cache = result;\n return result;\n }\n\n const styles = findAllDescendants(stylesPart._element, \"w:style\");\n for (const s of styles) {\n const s_id = s.getAttribute(\"w:styleId\");\n if (!s_id) continue;\n\n const s_type = s.getAttribute(\"w:type\");\n const is_default =\n s.getAttribute(\"w:default\") === \"1\" ||\n s.getAttribute(\"w:default\") === \"true\";\n\n if (s_type === \"paragraph\" && is_default) default_pstyle = s_id;\n\n const name_el = findChild(s, \"w:name\");\n let name = name_el ? name_el.getAttribute(\"w:val\") : s_id;\n\n if (name && typeof name === \"string\") {\n if (name.toLowerCase().startsWith(\"heading\")) {\n name = name.replace(/^heading/i, \"Heading\");\n } else if (name.toLowerCase() === \"title\") {\n name = \"Title\";\n }\n }\n\n const based_on_el = findChild(s, \"w:basedOn\");\n const based_on = based_on_el ? based_on_el.getAttribute(\"w:val\") : null;\n\n let outline_lvl: number | null = null;\n const pPr = findChild(s, \"w:pPr\");\n if (pPr) {\n const oLvl = findChild(pPr, \"w:outlineLvl\");\n if (oLvl) {\n const val = oLvl.getAttribute(\"w:val\");\n if (val && /^\\d+$/.test(val)) outline_lvl = parseInt(val, 10);\n }\n }\n\n let bold: boolean | null = null;\n const rPr = findChild(s, \"w:rPr\");\n if (rPr) {\n const b = findChild(rPr, \"w:b\");\n if (b) {\n const val = b.getAttribute(\"w:val\");\n bold = val !== \"0\" && val !== \"false\" && val !== \"off\";\n }\n }\n\n raw_styles[s_id] = { name, based_on, outline_level: outline_lvl, bold };\n }\n\n const resolve_style = (s_id: string, visited: Set<string>): any => {\n if (cache[s_id]) return cache[s_id];\n if (visited.has(s_id) || !raw_styles[s_id])\n return { name: s_id, outline_level: null, bold: false };\n\n visited.add(s_id);\n const raw = raw_styles[s_id];\n const based_on_id = raw.based_on;\n\n let o_lvl = raw.outline_level;\n let bold_val = raw.bold !== null ? raw.bold : false;\n\n if (based_on_id) {\n const parent = resolve_style(based_on_id, visited);\n if (o_lvl === null) o_lvl = parent.outline_level;\n if (raw.bold === null) bold_val = parent.bold;\n }\n\n const resolved = { name: raw.name, outline_level: o_lvl, bold: bold_val };\n cache[s_id] = resolved;\n return resolved;\n };\n\n for (const s_id in raw_styles) resolve_style(s_id, new Set());\n\n const result: [Record<string, any>, string | null] = [cache, default_pstyle];\n if (pkg) pkg._adeu_style_cache = result;\n return result;\n}\n\nfunction _detect_heading_level_from_name(name: string): number | null {\n if (!name) return null;\n const match = name.match(_CUSTOM_HEADING_NAME_RE);\n return match ? parseInt(match[1], 10) : null;\n}\n\nexport function is_native_heading(\n paragraph: Paragraph,\n style_cache?: Record<string, any>,\n default_pstyle?: string | null,\n): boolean {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(\n paragraph._parent.part || paragraph._parent,\n );\n }\n const pPr = findChild(paragraph._element, QN_W_PPR);\n\n if (pPr) {\n const oLvl = findChild(pPr, QN_W_OUTLINELVL);\n if (oLvl) {\n const val = oLvl.getAttribute(QN_W_VAL);\n if (val && /^\\d+$/.test(val)) {\n const lvl = parseInt(val, 10);\n if (lvl >= 0 && lvl <= 8) return true;\n }\n }\n }\n\n let style_id = default_pstyle;\n if (pPr) {\n const pStyle = findChild(pPr, QN_W_PSTYLE);\n if (pStyle) style_id = pStyle.getAttribute(QN_W_VAL) || default_pstyle;\n }\n\n const style_info = style_id && style_cache ? style_cache[style_id] : null;\n if (\n style_info &&\n style_info.outline_level !== null &&\n style_info.outline_level >= 0 &&\n style_info.outline_level <= 8\n ) {\n return true;\n }\n\n let style_name = style_info ? style_info.name : style_id; // FALLBACK TO ID\n if (style_name && typeof style_name === \"string\" && style_name.toLowerCase().startsWith(\"heading\")) {\n style_name = style_name.replace(/^heading/i, \"Heading\");\n }\n if (style_name?.startsWith(\"Heading\")) return true;\n if (style_name === \"Title\") return true;\n if (style_name && style_name !== \"Normal\") {\n if (_detect_heading_level_from_name(style_name) !== null) return true;\n }\n\n return false;\n}\nexport function get_paragraph_prefix(\n paragraph: Paragraph,\n style_cache?: Record<string, any>,\n default_pstyle?: string | null,\n): string {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(\n paragraph._parent.part || paragraph._parent,\n );\n }\n const pPr = findChild(paragraph._element, QN_W_PPR);\n\n if (pPr) {\n const oLvl = findChild(pPr, QN_W_OUTLINELVL);\n if (oLvl) {\n const val = oLvl.getAttribute(QN_W_VAL);\n if (val && /^\\d+$/.test(val)) {\n const lvl = parseInt(val, 10);\n if (lvl >= 0 && lvl <= 8) return \"#\".repeat(lvl + 1) + \" \";\n }\n }\n }\n\n let style_id = default_pstyle;\n if (pPr) {\n const pStyle = findChild(pPr, QN_W_PSTYLE);\n if (pStyle) style_id = pStyle.getAttribute(QN_W_VAL) || default_pstyle;\n }\n\n const style_info = style_id && style_cache ? style_cache[style_id] : null;\n if (\n style_info &&\n style_info.outline_level !== null &&\n style_info.outline_level >= 0 &&\n style_info.outline_level <= 8\n ) {\n return \"#\".repeat(style_info.outline_level + 1) + \" \";\n }\n\n let style_name = style_info ? style_info.name : style_id; // FALLBACK TO ID\n if (style_name && typeof style_name === \"string\" && style_name.toLowerCase().startsWith(\"heading\")) {\n style_name = style_name.replace(/^heading/i, \"Heading\");\n }\n if (style_name?.startsWith(\"Heading\")) {\n const match = style_name.replace(\"Heading\", \"\").trim();\n if (/^\\d+$/.test(match)) return \"#\".repeat(parseInt(match, 10)) + \" \";\n }\n\n if (style_name === \"Title\") return \"# \";\n\n if (pPr) {\n const numPr = findChild(pPr, QN_W_NUMPR);\n if (numPr) {\n const numId = findChild(numPr, QN_W_NUMID);\n if (numId && numId.getAttribute(QN_W_VAL) !== \"0\") {\n let level = 0;\n const ilvl = findChild(numPr, QN_W_ILVL);\n if (ilvl) {\n const valAttr = ilvl.getAttribute(QN_W_VAL);\n if (valAttr) level = parseInt(valAttr, 10) || 0;\n }\n return \" \".repeat(level) + \"* \";\n }\n }\n }\n\n if (style_name && style_name !== \"Normal\") {\n const custom_level = _detect_heading_level_from_name(style_name);\n if (custom_level !== null) return \"#\".repeat(custom_level) + \" \";\n }\n\n if (!style_name || style_name === \"Normal\") {\n const text = paragraph.text.trim();\n if (text && text.length < 100 && text === text.toUpperCase()) {\n let is_bold = false;\n if (style_info?.bold) {\n is_bold = true;\n } else {\n const runs = findAllDescendants(paragraph._element, QN_W_R);\n for (const r of runs) {\n const tList = findAllDescendants(r, QN_W_T);\n const tText = tList.map((t) => t.textContent || \"\").join(\"\");\n if (tText.trim()) {\n const rPr_run = findChild(r, QN_W_RPR);\n if (rPr_run) {\n const b = findChild(rPr_run, QN_W_B);\n if (\n b &&\n b.getAttribute(QN_W_VAL) !== \"0\" &&\n b.getAttribute(QN_W_VAL) !== \"false\"\n ) {\n is_bold = true;\n }\n }\n break;\n }\n }\n }\n if (is_bold) return \"## \";\n }\n }\n\n return \"\";\n}\n\nexport function is_heading_paragraph(\n paragraph: Paragraph,\n style_cache?: Record<string, any>,\n default_pstyle?: string | null,\n): boolean {\n const prefix = get_paragraph_prefix(paragraph, style_cache, default_pstyle);\n if (!prefix) return false;\n const stripped = prefix.trimEnd();\n return stripped.length > 0 && stripped === \"#\".repeat(stripped.length);\n}\n\nexport function get_run_style_markers(\n run: Run,\n is_heading: boolean | null = null,\n): [string, string] {\n let prefix = \"\";\n let suffix = \"\";\n\n const rPr = findChild(run._element, QN_W_RPR);\n let is_bold = false;\n let is_italic = false;\n\n if (rPr) {\n const b = findChild(rPr, QN_W_B);\n if (\n b &&\n b.getAttribute(QN_W_VAL) !== \"0\" &&\n b.getAttribute(QN_W_VAL) !== \"false\"\n )\n is_bold = true;\n\n const i = findChild(rPr, QN_W_I);\n if (\n i &&\n i.getAttribute(QN_W_VAL) !== \"0\" &&\n i.getAttribute(QN_W_VAL) !== \"false\"\n )\n is_italic = true;\n }\n\n if (is_heading === null) {\n const parent = run._parent;\n is_heading =\n parent instanceof Paragraph ? is_native_heading(parent) : false;\n }\n\n if (is_bold && !is_heading) {\n prefix += \"**\";\n suffix = \"**\" + suffix;\n }\n\n if (is_italic) {\n prefix += \"_\";\n suffix = \"_\" + suffix;\n }\n\n return [prefix, suffix];\n}\n\nexport function apply_formatting_to_segments(\n text: string,\n prefix: string,\n suffix: string,\n): string {\n if (!prefix && !suffix) return text;\n if (!text) return \"\";\n if (!text.includes(\"\\n\")) return `${prefix}${text}${suffix}`;\n\n const parts = text.split(\"\\n\");\n return parts.map((p) => (p ? `${prefix}${p}${suffix}` : \"\")).join(\"\\n\");\n}\n\nexport function get_run_text(run: Run): string {\n let text = \"\";\n for (let i = 0; i < run._element.childNodes.length; i++) {\n const child = run._element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n if (child.tagName === QN_W_T || child.tagName === QN_W_DELTEXT) {\n const raw = child.textContent || \"\";\n text += raw.replace(/\\t/g, \" \");\n } else if (child.tagName === QN_W_TAB) {\n text += \" \";\n } else if (child.tagName === QN_W_BR || child.tagName === QN_W_CR) {\n text += \"\\n\";\n }\n }\n return text;\n}\n\nexport function* iter_block_items(\n parent: any,\n): Generator<Paragraph | Table | FootnoteItem> {\n const parent_elm = parent._element || parent.element || parent;\n\n if (parent.constructor.name === \"NotesPart\") {\n const tag = parent.note_type === \"fn\" ? \"w:footnote\" : \"w:endnote\";\n const notes = findAllDescendants(parent_elm, tag);\n for (const child of notes) {\n if (\n child.getAttribute(\"w:type\") === \"separator\" ||\n child.getAttribute(\"w:type\") === \"continuationSeparator\"\n )\n continue;\n yield new FootnoteItem(child, parent, parent.note_type);\n }\n return;\n }\n\n for (let i = 0; i < parent_elm.childNodes.length; i++) {\n const child = parent_elm.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n if (child.tagName === QN_W_P) {\n yield new Paragraph(child, parent);\n } else if (child.tagName === \"w:tbl\") {\n yield new Table(child, parent);\n }\n }\n}\n\nexport function* iter_document_parts(doc: any): Generator<any> {\n // 1. Headers\n const headers = doc.pkg.parts.filter(\n (p: any) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\",\n );\n for (const h of headers) yield h;\n\n // 2. Main Document Body\n yield doc;\n\n // 3. Footers\n const footers = doc.pkg.parts.filter(\n (p: any) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\",\n );\n for (const f of footers) yield f;\n\n // 4. Notes\n const fnPart = doc.pkg.getPartByPath(\"word/footnotes.xml\");\n const enPart = doc.pkg.getPartByPath(\"word/endnotes.xml\");\n\n if (fnPart) yield new NotesPart(fnPart, \"fn\");\n if (enPart) yield new NotesPart(enPart, \"en\");\n}\n\nfunction _is_page_instr(instr: string): boolean {\n if (!instr) return false;\n const parts = instr.toUpperCase().trim().split(/\\s+/);\n return parts.length > 0 && (parts[0] === \"PAGE\" || parts[0] === \"NUMPAGES\");\n}\n\nexport function _get_part(parent: any): any {\n if (!parent) return null;\n if (parent.part) return parent.part;\n if (parent.pkg && parent.pkg.mainDocumentPart)\n return parent.pkg.mainDocumentPart;\n if (parent._parent) return _get_part(parent._parent);\n return null;\n}\n\nexport function* iter_paragraph_content(\n paragraph: Paragraph,\n): Generator<Run | DocxEvent> {\n let in_complex_field = false;\n let current_instr = \"\";\n let hide_result = false;\n\n function* process_run_element(\n r_element: Element,\n ): Generator<Run | DocxEvent> {\n let c_id: string | null = null;\n const rPr = findChild(r_element, QN_W_RPR);\n if (rPr) {\n const rPrChange = findChild(rPr, QN_W_RPRCHANGE);\n if (rPrChange) {\n c_id = rPrChange.getAttribute(QN_W_ID);\n yield {\n type: \"fmt_start\",\n id: c_id!,\n author: rPrChange.getAttribute(QN_W_AUTHOR) || undefined,\n date: rPrChange.getAttribute(QN_W_DATE) || undefined,\n };\n }\n }\n\n for (let i = 0; i < r_element.childNodes.length; i++) {\n const child = r_element.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n const tag = child.tagName;\n if (tag === QN_W_COMMENTREFERENCE) {\n const ref_id = child.getAttribute(QN_W_ID);\n if (ref_id) yield { type: \"ref\", id: ref_id };\n } else if (tag === QN_W_FOOTNOTEREFERENCE) {\n const f_id = child.getAttribute(QN_W_ID);\n if (f_id) yield { type: \"footnote\", id: f_id };\n } else if (tag === QN_W_ENDNOTEREFERENCE) {\n const e_id = child.getAttribute(QN_W_ID);\n if (e_id) yield { type: \"endnote\", id: e_id };\n } else if (tag === QN_W_FLDCHAR) {\n const fld_type = child.getAttribute(QN_W_FLDCHARTYPE);\n if (fld_type === \"begin\") {\n in_complex_field = true;\n current_instr = \"\";\n } else if (fld_type === \"separate\") {\n if (_is_page_instr(current_instr)) hide_result = true;\n else {\n const parts = current_instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === \"REF\")\n yield { type: \"xref_start\", id: parts[1] };\n }\n } else if (fld_type === \"end\") {\n if (!hide_result) {\n const parts = current_instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === \"REF\")\n yield { type: \"xref_end\", id: parts[1] };\n }\n in_complex_field = false;\n current_instr = \"\";\n hide_result = false;\n }\n } else if (tag === QN_W_INSTRTEXT && in_complex_field && !hide_result) {\n current_instr += child.textContent || \"\";\n }\n }\n\n if (!hide_result) yield new Run(r_element, paragraph);\n if (c_id !== null) yield { type: \"fmt_end\", id: c_id };\n }\n\n function* traverse_node(node: Element): Generator<Run | DocxEvent> {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i] as Element;\n if (child.nodeType !== 1) continue;\n\n const tag = child.tagName;\n if (tag === QN_W_R) yield* process_run_element(child);\n else if (tag === QN_W_INS) {\n const i_id = child.getAttribute(QN_W_ID)!;\n yield {\n type: \"ins_start\",\n id: i_id,\n author: child.getAttribute(QN_W_AUTHOR) || undefined,\n date: child.getAttribute(QN_W_DATE) || undefined,\n };\n yield* traverse_node(child);\n yield { type: \"ins_end\", id: i_id };\n } else if (tag === QN_W_DEL) {\n const d_id = child.getAttribute(QN_W_ID)!;\n yield {\n type: \"del_start\",\n id: d_id,\n author: child.getAttribute(QN_W_AUTHOR) || undefined,\n date: child.getAttribute(QN_W_DATE) || undefined,\n };\n yield* traverse_node(child);\n yield { type: \"del_end\", id: d_id };\n } else if (tag === QN_W_COMMENTRANGESTART)\n yield { type: \"start\", id: child.getAttribute(QN_W_ID)! };\n else if (tag === QN_W_COMMENTRANGEEND)\n yield { type: \"end\", id: child.getAttribute(QN_W_ID)! };\n else if (tag === QN_W_HYPERLINK) {\n const rId = child.getAttribute(QN_R_ID) || child.getAttribute(\"id\");\n let url = \"\";\n const part = _get_part(paragraph._parent);\n if (rId && part) {\n const rel = part.rels.get(rId);\n if (rel && rel.isExternal) url = rel.target;\n }\n if (url) yield { type: \"hyperlink_start\", id: rId!, date: url };\n yield* traverse_node(child);\n if (url) yield { type: \"hyperlink_end\", id: rId!, date: url };\n } else if (tag === QN_W_FLDSIMPLE) {\n const instr = child.getAttribute(QN_W_INSTR) || \"\";\n const parts = instr.trim().split(/\\s+/);\n const target = parts.length > 1 && parts[0] === \"REF\" ? parts[1] : \"\";\n if (target) yield { type: \"xref_start\", id: target };\n yield* traverse_node(child);\n if (target) yield { type: \"xref_end\", id: target };\n } else if (tag === QN_W_BOOKMARKSTART) {\n const b_name = child.getAttribute(QN_W_NAME);\n if (b_name && (!b_name.startsWith(\"_\") || b_name.startsWith(\"_Ref\")))\n yield { type: \"bookmark\", id: b_name };\n } else if (\n tag === QN_W_SDT ||\n tag === QN_W_SMARTTAG ||\n tag === QN_W_SDTCONTENT\n ) {\n yield* traverse_node(child);\n }\n }\n }\n\n yield* traverse_node(paragraph._element);\n}\n","import { DocumentObject } from './docx/bridge.js';\nimport { Paragraph, Table, Run, DocxEvent } from './docx/primitives.js';\nimport { findAllDescendants, findChild } from './docx/dom.js';\nimport { extract_comments_data } from './comments.js';\nimport {\n _get_style_cache,\n get_paragraph_prefix,\n get_run_style_markers,\n get_run_text,\n is_heading_paragraph,\n is_native_heading,\n iter_block_items,\n iter_document_parts,\n iter_paragraph_content,\n} from './utils/docx.js';\n\nexport interface TextSpan {\n start: number;\n end: number;\n text: string;\n run: Run | null;\n paragraph: Paragraph | null;\n ins_id?: string | null;\n del_id?: string | null;\n hyperlink_id?: string | null;\n}\n\nexport function renumber_snapshot_ids(doc: DocumentObject): [Record<string, string>, Record<string, string>] {\n const chg_remap: Record<string, string> = {};\n let next_chg = 1;\n const body_root = doc.element;\n\n const chg_elements: Element[] = [];\n const all_elements = findAllDescendants(body_root, '*');\n for (const el of all_elements) {\n if (el.tagName === 'w:ins' || el.tagName === 'w:del') {\n chg_elements.push(el);\n }\n }\n\n for (const elem of chg_elements) {\n const old_id = elem.getAttribute('w:id');\n if (!old_id) continue;\n if (chg_remap[old_id]) {\n elem.setAttribute('w:id', chg_remap[old_id]);\n continue;\n }\n const new_id = next_chg.toString();\n chg_remap[old_id] = new_id;\n elem.setAttribute('w:id', new_id);\n next_chg++;\n }\n\n const com_remap: Record<string, string> = {};\n let next_com = 1;\n const comments_part = doc.pkg.parts.find(p => p.contentType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml');\n\n if (comments_part) {\n const comments_root = comments_part._element;\n for (const c of findAllDescendants(comments_root, 'w:comment')) {\n const old_id = c.getAttribute('w:id');\n if (!old_id) continue;\n if (com_remap[old_id]) {\n c.setAttribute('w:id', com_remap[old_id]);\n continue;\n }\n const new_id = next_com.toString();\n com_remap[old_id] = new_id;\n c.setAttribute('w:id', new_id);\n next_com++;\n }\n }\n\n for (const elem of all_elements) {\n if (['w:commentReference', 'w:commentRangeStart', 'w:commentRangeEnd'].includes(elem.tagName)) {\n const old_id = elem.getAttribute('w:id');\n if (old_id && com_remap[old_id]) {\n elem.setAttribute('w:id', com_remap[old_id]);\n }\n }\n }\n\n if (comments_part) {\n for (const c of findAllDescendants(comments_part._element, 'w:comment')) {\n const parent_id = c.getAttribute('w15:p');\n if (parent_id && com_remap[parent_id]) {\n c.setAttribute('w15:p', com_remap[parent_id]);\n }\n }\n }\n\n return [chg_remap, com_remap];\n}\n\nexport class DocumentMapper {\n public doc: DocumentObject;\n public clean_view: boolean;\n public comments_map: Record<string, any>;\n public full_text: string = '';\n public spans: TextSpan[] = [];\n public appendix_start_index: number = -1;\n private _text_chunks: string[] = [];\n\n constructor(doc: DocumentObject, clean_view: boolean = false) {\n this.doc = doc;\n this.clean_view = clean_view;\n this.comments_map = extract_comments_data(doc.pkg);\n this._build_map();\n }\n\n private _build_map() {\n let current_offset = 0;\n this.spans = [];\n this._text_chunks = [];\n this.full_text = '';\n\n for (const part of iter_document_parts(this.doc)) {\n current_offset = this._map_blocks(part, current_offset);\n\n if (this.spans.length > 0 && this.spans[this.spans.length - 1].text !== '\\n\\n') {\n this._add_virtual_text('\\n\\n', current_offset, null);\n current_offset += 2;\n }\n }\n\n while (this.spans.length > 0 && this.spans[this.spans.length - 1].text === '\\n\\n') {\n this.spans.pop();\n this._text_chunks.pop();\n }\n\n this.full_text = this._text_chunks.join('');\n this.appendix_start_index = -1;\n }\n\n private _map_blocks(container: any, offset: number): number {\n let current = offset;\n const c_type = container.constructor.name;\n const part = container.part || container;\n const [style_cache, default_pstyle] = _get_style_cache(part);\n\n if (c_type === 'NotesPart') {\n const header = container.note_type === 'fn' ? '## Footnotes' : '## Endnotes';\n const sep = `---\\n${header}`;\n this._add_virtual_text(sep, current, null);\n current += sep.length;\n this._add_virtual_text('\\n\\n', current, null);\n current += 2;\n }\n\n let is_first_para = true;\n let previous_item: any = null;\n\n for (const item of iter_block_items(container)) {\n const i_type = item.constructor.name;\n\n if (i_type === 'FootnoteItem') {\n current = this._map_blocks(item, current);\n } else if (item instanceof Paragraph) {\n if (!is_first_para) {\n const prev_para = previous_item instanceof Paragraph ? previous_item : null;\n this._add_virtual_text('\\n\\n', current, prev_para);\n current += 2;\n }\n\n let prefix = get_paragraph_prefix(item, style_cache, default_pstyle);\n if (is_first_para && c_type === 'FootnoteItem') {\n prefix = `[^${container.note_type}-${container.id}]: ` + prefix;\n }\n if (prefix) {\n this._add_virtual_text(prefix, current, item);\n current += prefix.length;\n }\n\n current = this._map_paragraph_content(item, current, style_cache, default_pstyle);\n is_first_para = false;\n previous_item = item;\n } else if (item instanceof Table) {\n if (!is_first_para) {\n const prev_para = previous_item instanceof Paragraph ? previous_item : null;\n this._add_virtual_text('\\n\\n', current, prev_para);\n current += 2;\n }\n current = this._map_table(item, current);\n is_first_para = false;\n previous_item = item;\n }\n }\n\n return current;\n }\n\n private _map_table(table: Table, offset: number): number {\n let current = offset;\n let rows_processed = 0;\n\n for (const row of table.rows) {\n const tr = row._element;\n const trPr = findChild(tr, 'w:trPr');\n const ins = trPr ? findChild(trPr, 'w:ins') : null;\n const del_node = trPr ? findChild(trPr, 'w:del') : null;\n\n if (this.clean_view && del_node) continue;\n\n if (rows_processed > 0) {\n this._add_virtual_text('\\n', current, null);\n current += 1;\n }\n\n if (ins && !this.clean_view) {\n this._add_virtual_text('{++ ', current, null);\n current += 4;\n } else if (del_node && !this.clean_view) {\n this._add_virtual_text('{-- ', current, null);\n current += 4;\n }\n\n const seen_cells = new Set();\n let cells_processed = 0;\n\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n if (cells_processed > 0) {\n this._add_virtual_text(' | ', current, null);\n current += 3;\n }\n\n current = this._map_blocks(cell, current);\n cells_processed += 1;\n }\n\n if (ins && !this.clean_view) {\n const suffix = ` |Chg:${ins.getAttribute('w:id')}++}`;\n this._add_virtual_text(suffix, current, null);\n current += suffix.length;\n } else if (del_node && !this.clean_view) {\n const suffix = ` |Chg:${del_node.getAttribute('w:id')}--}`;\n this._add_virtual_text(suffix, current, null);\n current += suffix.length;\n }\n\n rows_processed += 1;\n }\n\n return current;\n }\n\n private _strip_markdown_formatting(text: string): string {\n let result = text;\n result = result.replace(/^#+\\s*/gm, '');\n result = result.replace(/\\*\\*(\\w[\\w\\s]*\\w|\\w{2,})\\*\\*/g, '$1');\n result = result.replace(/__(\\w[\\w\\s]*\\w|\\w{2,})__/g, '$1');\n result = result.replace(/(?<!\\w)_(\\w[\\w\\s]*\\w|\\w{2,})_(?!\\w)/g, '$1');\n result = result.replace(/(?<!\\w)\\*(\\w[\\w\\s]*\\w|\\w{2,})\\*(?!\\w)/g, '$1');\n return result;\n }\n\n private _map_paragraph_content(\n paragraph: Paragraph,\n start_offset: number,\n style_cache?: any,\n default_pstyle?: string | null\n ): number {\n let current = start_offset;\n\n const span: TextSpan = { start: current, end: current, text: '', run: null, paragraph };\n this.spans.push(span);\n\n const active_ids = new Set<string>();\n const active_ins: Record<string, DocxEvent> = {};\n const active_del: Record<string, DocxEvent> = {};\n const active_fmt: Record<string, DocxEvent> = {};\n\n let deferred_meta_states: any[] = [];\n let current_wrappers: [string, string] = ['', ''];\n let current_style: [string, string] = ['', ''];\n let active_hyperlink_id: string | null = null;\n let pending_runs: [string, string, Run | null, string | null, string | null][] = [];\n\n const flush_pending_runs = () => {\n if (pending_runs.length === 0) return;\n const [s_tok, e_tok] = current_wrappers;\n if (s_tok) {\n this._add_virtual_text(s_tok, current, paragraph);\n current += s_tok.length;\n }\n for (const [kind, txt, r_obj, i_id, d_id] of pending_runs) {\n if (kind === 'virtual') {\n this._add_virtual_text(txt, current, paragraph, active_hyperlink_id);\n } else {\n const s: TextSpan = {\n start: current, end: current + txt.length, text: txt,\n run: r_obj, paragraph, ins_id: i_id || undefined, del_id: d_id || undefined,\n hyperlink_id: active_hyperlink_id || undefined\n };\n this.spans.push(s);\n this._text_chunks.push(txt);\n }\n current += txt.length;\n }\n if (e_tok) {\n this._add_virtual_text(e_tok, current, paragraph);\n current += e_tok.length;\n }\n pending_runs = [];\n };\n\n const items = Array.from(iter_paragraph_content(paragraph));\n const is_heading = is_heading_paragraph(paragraph, style_cache, default_pstyle);\n const native_heading = is_native_heading(paragraph, style_cache, default_pstyle);\n let leading_strip_active = is_heading;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n if (item instanceof Run) {\n const [prefix, suffix] = get_run_style_markers(item, native_heading);\n const run_parts: [string, string, Run | null][] = [];\n const text = get_run_text(item);\n\n if (leading_strip_active) {\n if (text === '' || /^\\s*$/.test(text)) continue;\n leading_strip_active = false;\n }\n\n if (text.includes('\\n') && (prefix || suffix)) {\n const parts = text.split('\\n');\n for (let idx = 0; idx < parts.length; idx++) {\n if (idx > 0) run_parts.push(['real', '\\n', item]);\n if (parts[idx]) {\n if (prefix) run_parts.push(['virtual', prefix, null]);\n run_parts.push(['real', parts[idx], item]);\n if (suffix) run_parts.push(['virtual', suffix, null]);\n }\n }\n } else {\n if (prefix) run_parts.push(['virtual', prefix, null]);\n if (text) run_parts.push(['real', text, item]);\n if (suffix) run_parts.push(['virtual', suffix, null]);\n }\n\n if (this.clean_view && Object.keys(active_del).length > 0) {\n // pass\n }\n\n const full_seg_text = run_parts.map(x => x[1]).join('');\n const curr_ins_id = Object.keys(active_ins).pop() || null;\n const curr_del_id = Object.keys(active_del).pop() || null;\n\n if (full_seg_text && !(this.clean_view && curr_del_id)) {\n const new_wrappers = this.clean_view ? ['', ''] as [string, string] : this._get_wrappers(curr_ins_id, curr_del_id, active_ids, active_fmt);\n const new_style: [string, string] = [prefix, suffix];\n\n if (pending_runs.length > 0 && new_wrappers[0] === current_wrappers[0] && new_wrappers[1] === current_wrappers[1]) {\n let skip_leading_prefix = false;\n if (new_style[0] === current_style[0] && new_style[1] === current_style[1] && current_style[0] !== '' &&\n pending_runs[pending_runs.length - 1][0] === 'virtual' &&\n pending_runs[pending_runs.length - 1][1] === current_style[1]) {\n pending_runs.pop();\n skip_leading_prefix = true;\n }\n\n for (const [kind, txt, r_obj] of run_parts) {\n if (skip_leading_prefix && kind === 'virtual' && txt === new_style[0]) {\n skip_leading_prefix = false;\n continue;\n }\n pending_runs.push([kind, txt, r_obj, curr_ins_id, curr_del_id]);\n }\n current_style = new_style;\n } else {\n flush_pending_runs();\n current_wrappers = new_wrappers;\n current_style = new_style;\n for (const [kind, txt, r_obj] of run_parts) {\n pending_runs.push([kind, txt, r_obj, curr_ins_id, curr_del_id]);\n }\n }\n }\n\n if (!this.clean_view) {\n const has_meta = Object.keys(active_ins).length > 0 || Object.keys(active_del).length > 0 || active_ids.size > 0 || Object.keys(active_fmt).length > 0;\n if (has_meta) {\n deferred_meta_states.push([{...active_ins}, {...active_del}, new Set(active_ids), {...active_fmt}]);\n }\n\n let should_defer = false;\n const is_redline = curr_ins_id !== null || curr_del_id !== null || Object.keys(active_fmt).length > 0;\n\n if (is_redline) {\n let j = i + 1;\n let next_is_redline = false;\n let temp_ins_count = Object.keys(active_ins).length;\n let temp_del_count = Object.keys(active_del).length;\n let temp_fmt_count = Object.keys(active_fmt).length;\n\n while (j < items.length) {\n const next_item = items[j];\n if (next_item instanceof Run) {\n if (!get_run_text(next_item)) {\n j++; continue;\n }\n if (temp_ins_count > 0 || temp_del_count > 0 || temp_fmt_count > 0) {\n next_is_redline = true;\n }\n break;\n } else {\n const ev = next_item as DocxEvent;\n if (ev.type === 'ins_start') temp_ins_count++;\n else if (ev.type === 'ins_end') temp_ins_count = Math.max(0, temp_ins_count - 1);\n else if (ev.type === 'del_start') temp_del_count++;\n else if (ev.type === 'del_end') temp_del_count = Math.max(0, temp_del_count - 1);\n else if (ev.type === 'fmt_start') temp_fmt_count++;\n else if (ev.type === 'fmt_end') temp_fmt_count = Math.max(0, temp_fmt_count - 1);\n }\n j++;\n }\n\n if (next_is_redline) should_defer = true;\n }\n\n if (!should_defer && deferred_meta_states.length > 0) {\n const meta_block = this._build_merged_meta_block(deferred_meta_states);\n if (meta_block) {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const full_meta = `{>>${meta_block}<<}`;\n this._add_virtual_text(full_meta, current, paragraph);\n current += full_meta.length;\n }\n deferred_meta_states = [];\n }\n }\n } else {\n const ev = item as DocxEvent;\n leading_strip_active = false;\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n\n if (ev.type === 'start') active_ids.add(ev.id);\n else if (ev.type === 'end') active_ids.delete(ev.id);\n else if (ev.type === 'ins_start') active_ins[ev.id] = ev;\n else if (ev.type === 'ins_end') delete active_ins[ev.id];\n else if (ev.type === 'del_start') active_del[ev.id] = ev;\n else if (ev.type === 'del_end') delete active_del[ev.id];\n else if (ev.type === 'fmt_start') active_fmt[ev.id] = ev;\n else if (ev.type === 'fmt_end') delete active_fmt[ev.id];\n else if (ev.type === 'footnote' || ev.type === 'endnote') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const prefix_str = ev.type === 'footnote' ? 'fn' : 'en';\n const txt = `[^${prefix_str}-${ev.id}]`;\n this._add_virtual_text(txt, current, paragraph);\n current += txt.length;\n } else if (ev.type === 'hyperlink_start') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n this._add_virtual_text('[', current, paragraph, ev.id);\n current += 1;\n active_hyperlink_id = ev.id;\n } else if (ev.type === 'hyperlink_end') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const txt = `](${ev.date})`;\n this._add_virtual_text(txt, current, paragraph, ev.id);\n current += txt.length;\n active_hyperlink_id = null;\n } else if (ev.type === 'xref_start') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n this._add_virtual_text('[~', current, paragraph);\n current += 2;\n } else if (ev.type === 'xref_end') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const txt = `~](#${ev.id})`;\n this._add_virtual_text(txt, current, paragraph);\n current += txt.length;\n } else if (ev.type === 'bookmark') {\n flush_pending_runs();\n current_wrappers = ['', ''];\n current_style = ['', ''];\n const txt = `{#${ev.id}}`;\n this._add_virtual_text(txt, current, paragraph);\n current += txt.length;\n }\n }\n }\n\n flush_pending_runs();\n\n if (deferred_meta_states.length > 0) {\n const meta_block = this._build_merged_meta_block(deferred_meta_states);\n if (meta_block) {\n const full_meta = `{>>${meta_block}<<}`;\n this._add_virtual_text(full_meta, current, paragraph);\n current += full_meta.length;\n }\n }\n\n return current;\n }\n\n private _get_wrappers(ins_id: string | null, del_id: string | null, active_ids: Set<string>, active_fmt: Record<string, DocxEvent>): [string, string] {\n if (del_id) return ['{--', '--}'];\n if (ins_id) return ['{++', '++}'];\n if (active_ids.size > 0 || Object.keys(active_fmt).length > 0) return ['{==', '==}'];\n return ['', ''];\n }\n\n private _build_merged_meta_block(states_list: any[]): string {\n const change_lines: string[] = [];\n const comment_lines: string[] = [];\n const seen_sigs = new Set<string>();\n\n for (const [ins_map, del_map, comments_set, fmt_map] of states_list) {\n for (const [uid, meta] of Object.entries(ins_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n const auth = meta.author || 'Unknown';\n change_lines.push(`[${sig} insert] ${auth}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(del_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n const auth = meta.author || 'Unknown';\n change_lines.push(`[${sig} delete] ${auth}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(fmt_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n const auth = meta.author || 'Unknown';\n change_lines.push(`[${sig} format] ${auth}`);\n seen_sigs.add(sig);\n }\n }\n\n const sorted_ids = Array.from(comments_set as Set<string>).sort();\n for (const c_id of sorted_ids) {\n if (!this.comments_map[c_id]) continue;\n const sig = `Com:${c_id}`;\n if (!seen_sigs.has(sig)) {\n const data = this.comments_map[c_id];\n let header = `[${sig}] ${data.author}`;\n if (data.date) header += ` @ ${data.date}`;\n if (data.resolved) header += `(RESOLVED)`;\n comment_lines.push(`${header}: ${data.text}`);\n seen_sigs.add(sig);\n }\n }\n }\n\n return [...change_lines, ...comment_lines].join('\\n');\n }\n\n private _add_virtual_text(text: string, offset: number, context_paragraph: Paragraph | null, hyperlink_id: string | null = null) {\n const span: TextSpan = {\n start: offset,\n end: offset + text.length,\n text,\n run: null,\n paragraph: context_paragraph,\n hyperlink_id: hyperlink_id || undefined\n };\n this.spans.push(span);\n this._text_chunks.push(text);\n }\n\n private _replace_smart_quotes(text: string): string {\n return text.replace(/“/g, '\"').replace(/”/g, '\"').replace(/‘/g, \"'\").replace(/’/g, \"'\");\n }\n\n private _make_fuzzy_regex(target_text: string): string {\n target_text = this._strip_markdown_formatting(target_text);\n target_text = this._replace_smart_quotes(target_text);\n\n const parts: string[] = [];\n const token_pattern = /(\\[_+\\])|(\\s+)|(['\"])|([.,;:\\/])/g;\n \n let last_idx = 0;\n let match;\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n while ((match = token_pattern.exec(target_text)) !== null) {\n const literal = target_text.substring(last_idx, match.index);\n if (literal) parts.push(escapeRegExp(literal));\n\n const g_placeholder = match[1];\n const g_space = match[2];\n const g_quote = match[3];\n const g_punct = match[4];\n\n if (g_placeholder) {\n parts.push('\\\\[_+\\\\]');\n } else if (g_space) {\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n parts.push('\\\\s+');\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n } else if (g_quote) {\n if (g_quote === \"'\") parts.push('[\\u2018\\u2019\\']');\n else parts.push('[\"\\u201c\\u201d]');\n } else if (g_punct) {\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n parts.push(escapeRegExp(g_punct));\n parts.push('(?:\\\\*\\\\*|__|\\\\*|_)?');\n }\n\n last_idx = token_pattern.lastIndex;\n }\n\n const remaining = target_text.substring(last_idx);\n if (remaining) parts.push(escapeRegExp(remaining));\n\n return parts.join('');\n }\n\n public find_match_index(target_text: string): [number, number] {\n let start_idx = this.full_text.indexOf(target_text);\n if (start_idx !== -1) return [start_idx, target_text.length];\n\n const norm_full = this._replace_smart_quotes(this.full_text);\n const norm_target = this._replace_smart_quotes(target_text);\n start_idx = norm_full.indexOf(norm_target);\n if (start_idx !== -1) return [start_idx, target_text.length];\n\n const stripped_target = this._strip_markdown_formatting(target_text);\n if (this.full_text.includes(stripped_target)) {\n start_idx = this.full_text.indexOf(stripped_target);\n return [start_idx, stripped_target.length];\n }\n\n try {\n const pattern = new RegExp(this._make_fuzzy_regex(target_text));\n const match = pattern.exec(this.full_text);\n if (match) return [match.index, match[0].length];\n } catch (e) {}\n\n return [-1, 0];\n }\n\n public find_all_match_indices(target_text: string): [number, number][] {\n if (!target_text) return [];\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n let matches = [...this.full_text.matchAll(new RegExp(escapeRegExp(target_text), 'g'))];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n\n const norm_full = this._replace_smart_quotes(this.full_text);\n const norm_target = this._replace_smart_quotes(target_text);\n matches = [...norm_full.matchAll(new RegExp(escapeRegExp(norm_target), 'g'))];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n\n const stripped_target = this._strip_markdown_formatting(target_text);\n matches = [...this.full_text.matchAll(new RegExp(escapeRegExp(stripped_target), 'g'))];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n\n try {\n const pattern = new RegExp(this._make_fuzzy_regex(target_text), 'g');\n matches = [...this.full_text.matchAll(pattern)];\n if (matches.length > 0) return matches.map(m => [m.index!, m[0].length]);\n } catch (e) {}\n\n return [];\n }\n\n public find_target_runs(target_text: string): Run[] {\n const [start_idx, length] = this.find_match_index(target_text);\n if (start_idx === -1) return [];\n return this._resolve_runs_at_range(start_idx, start_idx + length);\n }\n\n public find_target_runs_by_index(start_index: number, length: number, rebuild_map = true): Run[] {\n return this._resolve_runs_at_range(start_index, start_index + length, rebuild_map);\n }\n\n public get_virtual_spans_in_range(start_index: number, length: number): TextSpan[] {\n const end_index = start_index + length;\n return this.spans.filter(s => s.run === null && s.text === '\\n\\n' && s.start >= start_index && s.end <= end_index);\n }\n\n private _resolve_runs_at_range(start_idx: number, end_idx: number, rebuild_map = true): Run[] {\n const affected_spans = this.spans.filter(s => s.end > start_idx && s.start < end_idx);\n if (affected_spans.length === 0) return [];\n\n const working_runs = affected_spans.filter(s => s.run !== null).map(s => s.run!);\n if (working_runs.length === 0) return [];\n\n let dom_modified = false;\n\n const first_real_span = affected_spans.find(s => s.run !== null);\n let start_split_adjustment = 0;\n\n if (first_real_span) {\n const local_start = start_idx - first_real_span.start;\n if (local_start > 0) {\n const idx_in_working = 0;\n const [, right_run] = this._split_run_at_index(working_runs[idx_in_working], local_start);\n working_runs[idx_in_working] = right_run;\n dom_modified = true;\n start_split_adjustment = local_start;\n }\n }\n\n const last_real_span = [...affected_spans].reverse().find(s => s.run !== null);\n\n if (last_real_span) {\n const is_same_run = first_real_span === last_real_span;\n const run_to_split = working_runs[working_runs.length - 1];\n let overlap_end = Math.min(last_real_span.end, end_idx);\n let local_end = overlap_end - last_real_span.start;\n\n if (is_same_run && start_split_adjustment > 0) {\n local_end -= start_split_adjustment;\n }\n\n const run_text = get_run_text(run_to_split);\n if (local_end > 0 && local_end < run_text.length) {\n const [left_run] = this._split_run_at_index(run_to_split, local_end);\n working_runs[working_runs.length - 1] = left_run;\n dom_modified = true;\n }\n }\n\n if (dom_modified && rebuild_map) {\n this._build_map();\n }\n\n return working_runs;\n }\n\n public get_insertion_anchor(index: number, rebuild_map = true): [Run | null, Paragraph | null] {\n const preceding = this.spans.filter(s => s.end === index);\n if (preceding.length > 0) {\n for (let i = preceding.length - 1; i >= 0; i--) {\n if (preceding[i].run) return [preceding[i].run, preceding[i].paragraph];\n }\n for (let i = preceding.length - 1; i >= 0; i--) {\n if (preceding[i].paragraph) return [null, preceding[i].paragraph];\n }\n }\n\n const containing = this.spans.filter(s => s.start < index && index < s.end);\n if (containing.length > 0) {\n const span = containing[0];\n if (span.run === null) {\n if (span.paragraph === null) {\n return this.get_insertion_anchor(span.end, rebuild_map);\n }\n return [null, span.paragraph];\n } else {\n const offset = index - span.start;\n const [left, ] = this._split_run_at_index(span.run, offset);\n if (rebuild_map) this._build_map();\n return [left, span.paragraph];\n }\n }\n\n if (index === 0 && this.spans.length > 0) {\n for (const s of this.spans) if (s.run) return [s.run, s.paragraph];\n for (const s of this.spans) if (s.paragraph) return [null, s.paragraph];\n return [null, null];\n }\n\n const preceding_gap = this.spans.filter(s => s.end < index);\n if (preceding_gap.length > 0) {\n for (let i = preceding_gap.length - 1; i >= 0; i--) {\n if (preceding_gap[i].run) return [preceding_gap[i].run, preceding_gap[i].paragraph];\n }\n for (let i = preceding_gap.length - 1; i >= 0; i--) {\n if (preceding_gap[i].paragraph) return [null, preceding_gap[i].paragraph];\n }\n }\n \n return [null, null];\n }\n\n private _split_run_at_index(run: Run, split_index: number): [Run, Run] {\n const text = get_run_text(run);\n const left_text = text.substring(0, split_index);\n const right_text = text.substring(split_index);\n\n this._set_run_text_elements(run._element, left_text);\n\n const new_r_element = run._element.cloneNode(true) as Element;\n this._set_run_text_elements(new_r_element, right_text);\n\n if (run._element.parentNode) {\n run._element.parentNode.insertBefore(new_r_element, run._element.nextSibling);\n }\n\n const new_run = new Run(new_r_element, run._parent);\n return [run, new_run];\n }\n\n private _set_run_text_elements(r_element: Element, new_text: string) {\n const to_remove: Element[] = [];\n for (let i = 0; i < r_element.childNodes.length; i++) {\n const child = r_element.childNodes[i] as Element;\n if (child.nodeType === 1 && ['w:t', 'w:delText', 'w:br', 'w:cr', 'w:tab'].includes(child.tagName)) {\n to_remove.push(child);\n }\n }\n for (const child of to_remove) {\n r_element.removeChild(child);\n }\n\n const doc = r_element.ownerDocument;\n if (doc) {\n const new_t = doc.createElement('w:t');\n new_t.textContent = new_text;\n if (new_text.trim() !== new_text) {\n new_t.setAttribute('xml:space', 'preserve');\n }\n r_element.appendChild(new_t);\n }\n }\n\n public get_context_at_range(start_idx: number, end_idx: number): TextSpan | null {\n const real_spans = this.spans.filter(s => s.run && s.end > start_idx && s.start < end_idx);\n if (real_spans.length > 0) return real_spans[0];\n return null;\n }\n}","import diff_match_patch from \"diff-match-patch\";\nimport { ModifyText } from \"./models.js\";\n\nexport function trim_common_context(\n target: string,\n new_val: string,\n): [number, number] {\n if (!target || !new_val) return [0, 0];\n\n const isSpace = (char: string) => /\\s/.test(char);\n\n // 1. Prefix with Word Boundary Check\n let prefix_len = 0;\n let limit = Math.min(target.length, new_val.length);\n while (prefix_len < limit && target[prefix_len] === new_val[prefix_len]) {\n prefix_len++;\n }\n\n // Backtrack to nearest whitespace if we split a word\n if (prefix_len < target.length && prefix_len < new_val.length) {\n while (prefix_len > 0) {\n const target_split =\n !isSpace(target[prefix_len - 1]) && !isSpace(target[prefix_len]);\n const new_split =\n !isSpace(new_val[prefix_len - 1]) && !isSpace(new_val[prefix_len]);\n if (target_split || new_split) {\n prefix_len--;\n } else {\n break;\n }\n }\n }\n\n // Backtrack prefix to avoid splitting markdown markers\n while (prefix_len > 0) {\n if (prefix_len < target.length) {\n const charSeq = target.substring(prefix_len - 1, prefix_len + 1);\n if (charSeq === \"**\" || charSeq === \"__\") {\n prefix_len--;\n continue;\n }\n }\n\n const left = target.substring(0, prefix_len);\n const b_count = (left.match(/\\*\\*/g) || []).length;\n const u2_count = (left.match(/__/g) || []).length;\n const u1_count = (left.replace(/__/g, \"\").match(/_/g) || []).length;\n\n if (b_count % 2 !== 0) {\n prefix_len = left.lastIndexOf(\"**\");\n continue;\n }\n if (u2_count % 2 !== 0) {\n prefix_len = left.lastIndexOf(\"__\");\n continue;\n }\n if (u1_count % 2 !== 0) {\n let idx = left.length - 1;\n while (idx >= 0) {\n if (\n left[idx] === \"_\" &&\n (idx === 0 || left[idx - 1] !== \"_\") &&\n (idx === left.length - 1 || left[idx + 1] !== \"_\")\n ) {\n prefix_len = idx;\n break;\n }\n idx--;\n }\n continue;\n }\n\n // Safety: Backtrack if we consumed a Markdown Header marker (#)\n let temp_len = prefix_len;\n let hit_header = false;\n while (temp_len > 0) {\n const char = target[temp_len - 1];\n if (char === \"#\") {\n prefix_len = temp_len - 1;\n while (prefix_len > 0 && target[prefix_len - 1] !== \"\\n\") {\n prefix_len--;\n }\n hit_header = true;\n break;\n }\n if (char === \"\\n\") break;\n temp_len--;\n }\n if (hit_header) continue;\n\n break;\n }\n\n // 2. Suffix with Word Boundary Check\n let suffix_len = 0;\n const target_rem_len = target.length - prefix_len;\n const new_rem_len = new_val.length - prefix_len;\n const limit_suffix = Math.min(target_rem_len, new_rem_len);\n\n while (\n suffix_len < limit_suffix &&\n target[target.length - 1 - suffix_len] ===\n new_val[new_val.length - 1 - suffix_len]\n ) {\n suffix_len++;\n }\n\n if (suffix_len > 0) {\n while (suffix_len > 0) {\n let target_split = false;\n if (suffix_len < target.length) {\n target_split =\n !isSpace(target[target.length - 1 - suffix_len]) &&\n !isSpace(target[target.length - suffix_len]);\n }\n let new_split = false;\n if (suffix_len < new_val.length) {\n new_split =\n !isSpace(new_val[new_val.length - 1 - suffix_len]) &&\n !isSpace(new_val[new_val.length - suffix_len]);\n }\n if (target_split || new_split) {\n suffix_len--;\n } else {\n break;\n }\n }\n }\n\n while (suffix_len > 0) {\n const idx = target.length - suffix_len;\n if (idx > 0) {\n const charSeq = target.substring(idx - 1, idx + 1);\n if (charSeq === \"**\" || charSeq === \"__\") {\n suffix_len--;\n continue;\n }\n }\n\n const right = target.substring(target.length - suffix_len);\n const b_count = (right.match(/\\*\\*/g) || []).length;\n const u2_count = (right.match(/__/g) || []).length;\n const u1_count = (right.replace(/__/g, \"\").match(/_/g) || []).length;\n\n if (b_count % 2 !== 0) {\n suffix_len -= right.indexOf(\"**\") + 2;\n continue;\n }\n if (u2_count % 2 !== 0) {\n suffix_len -= right.indexOf(\"__\") + 2;\n continue;\n }\n if (u1_count % 2 !== 0) {\n let idx_in_right = 0;\n while (idx_in_right < right.length) {\n if (\n right[idx_in_right] === \"_\" &&\n (idx_in_right === 0 || right[idx_in_right - 1] !== \"_\") &&\n (idx_in_right === right.length - 1 || right[idx_in_right + 1] !== \"_\")\n ) {\n suffix_len -= idx_in_right + 1;\n break;\n }\n idx_in_right++;\n }\n continue;\n }\n break;\n }\n\n if (\n suffix_len > 0 &&\n /^\\s+$/.test(target.substring(target.length - suffix_len))\n ) {\n suffix_len = 0;\n }\n\n // Absorb balanced wrappers\n for (const marker of [\"**\", \"__\", \"_\"]) {\n const mlen = marker.length;\n const tgt_rem = target.substring(prefix_len, target.length - suffix_len);\n const new_rem = new_val.substring(prefix_len, new_val.length - suffix_len);\n\n if (\n tgt_rem.startsWith(marker) &&\n new_rem.startsWith(marker) &&\n tgt_rem.endsWith(marker) &&\n new_rem.endsWith(marker) &&\n tgt_rem.length >= 2 * mlen &&\n new_rem.length >= 2 * mlen\n ) {\n prefix_len += mlen;\n suffix_len += mlen;\n }\n }\n\n return [prefix_len, suffix_len];\n}\n\nfunction _words_to_chars(\n text1: string,\n text2: string,\n): [string, string, string[]] {\n const token_array: string[] = [];\n const token_hash: Record<string, number> = {};\n\n // RegExp equivalent to Python's r\"(\\s+|\\w+|[^\\w\\s])\" with unicode support\n const split_pattern = /(\\s+|[\\p{L}\\p{N}_]+|[^\\p{L}\\p{N}_\\s])/gu;\n\n const encode_text = (text: string) => {\n // Keep delimiters via capture group in split\n const tokens = text.split(split_pattern).filter(Boolean);\n let encoded_chars = \"\";\n for (const token of tokens) {\n if (token in token_hash) {\n encoded_chars += String.fromCharCode(token_hash[token]);\n } else {\n const code = token_array.length;\n token_hash[token] = code;\n token_array.push(token);\n encoded_chars += String.fromCharCode(code);\n }\n }\n return encoded_chars;\n };\n\n return [encode_text(text1), encode_text(text2), token_array];\n}\n\nexport function generate_edits_from_text(\n original_text: string,\n modified_text: string,\n): ModifyText[] {\n const dmp = new diff_match_patch.diff_match_patch();\n dmp.Diff_Timeout = 2.0; // Enforce strict 2-second timeout to prevent deep recursion hangs\n\n const [chars1, chars2, token_array] = _words_to_chars(\n original_text,\n modified_text,\n );\n const diffs = dmp.diff_main(chars1, chars2, false);\n dmp.diff_cleanupSemantic(diffs);\n\n // Manually map characters back to words to bypass prototype volatility (diff_charsToLines_)\n for (let i = 0; i < diffs.length; i++) {\n const chars = diffs[i][1];\n let text = \"\";\n for (let j = 0; j < chars.length; j++)\n text += token_array[chars.charCodeAt(j)];\n diffs[i][1] = text;\n }\n\n const edits: ModifyText[] = [];\n let current_original_index = 0;\n let pending_delete: [number, string] | null = null;\n\n for (const [op, text] of diffs) {\n if (op === 0) {\n // Equal\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({\n type: \"modify\",\n target_text: del_txt,\n new_text: \"\",\n comment: \"Diff: Text deleted\",\n _match_start_index: idx,\n });\n pending_delete = null;\n }\n current_original_index += text.length;\n } else if (op === -1) {\n // Delete\n pending_delete = [current_original_index, text];\n current_original_index += text.length;\n } else if (op === 1) {\n // Insert\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({\n type: \"modify\",\n target_text: del_txt,\n new_text: text,\n comment: \"Diff: Replacement\",\n _match_start_index: idx,\n });\n pending_delete = null;\n } else {\n edits.push({\n type: \"modify\",\n target_text: \"\",\n new_text: text,\n comment: \"Diff: Text inserted\",\n _match_start_index: current_original_index,\n });\n }\n }\n }\n\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({\n type: \"modify\",\n target_text: del_txt,\n new_text: \"\",\n comment: \"Diff: Text deleted\",\n _match_start_index: idx,\n });\n }\n\n return edits;\n}\nexport function create_unified_diff(\n original_text: string,\n modified_text: string,\n context_lines: number = 3,\n): string {\n const dmp = new diff_match_patch.diff_match_patch();\n dmp.Diff_Timeout = 2.0;\n\n const a = dmp.diff_linesToChars_(original_text, modified_text);\n const diffs = dmp.diff_main(a.chars1, a.chars2, false);\n dmp.diff_charsToLines_(diffs, a.lineArray);\n\n const output: string[] = [];\n output.push(\"--- Original\");\n output.push(\"+++ Modified\");\n\n let i = 0;\n while (i < diffs.length) {\n while (i < diffs.length && diffs[i][0] === 0) i++;\n if (i >= diffs.length) break;\n\n let start = i;\n let preContext: string[] = [];\n if (start > 0 && diffs[start - 1][0] === 0) {\n const lines = diffs[start - 1][1].replace(/\\n$/, \"\").split(\"\\n\");\n preContext = lines.slice(-context_lines);\n }\n\n const chunk: string[] = [];\n chunk.push(...preContext.map((l) => ` ${l}`));\n\n while (i < diffs.length) {\n const [op, text] = diffs[i];\n const lines = text.replace(/\\n$/, \"\").split(\"\\n\");\n\n if (op === 0) {\n if (lines.length > context_lines * 2) break;\n chunk.push(...lines.map((l) => ` ${l}`));\n } else {\n const prefix = op === -1 ? \"-\" : \"+\";\n chunk.push(...lines.map((l) => `${prefix}${l}`));\n }\n i++;\n }\n\n let postContext: string[] = [];\n if (i < diffs.length && diffs[i][0] === 0) {\n const lines = diffs[i][1].replace(/\\n$/, \"\").split(\"\\n\");\n postContext = lines.slice(0, context_lines);\n }\n chunk.push(...postContext.map((l) => ` ${l}`));\n\n output.push(\"@@ ... @@\");\n output.push(...chunk);\n }\n\n if (output.length === 2) return \"\"; // No changes\n return output.join(\"\\n\");\n}\n\nexport function create_word_patch_diff(\n original_text: string,\n modified_text: string,\n original_path: string = \"Original\",\n modified_path: string = \"Modified\"\n): string {\n const edits = generate_edits_from_text(original_text, modified_text);\n const output: string[] = [\n `--- ${original_path}`,\n `+++ ${modified_path}`,\n \"\"\n ];\n \n const CONTEXT_SIZE = 40;\n\n for (const edit of edits) {\n const raw_start = edit._match_start_index || 0;\n const raw_target = edit.target_text || \"\";\n const raw_new = edit.new_text || \"\";\n\n const [prefix_len, suffix_len] = trim_common_context(raw_target, raw_new);\n\n const target_end_in_target = raw_target.length - suffix_len;\n const new_end_in_new = raw_new.length - suffix_len;\n\n const display_target = raw_target.substring(prefix_len, target_end_in_target);\n const display_new = raw_new.substring(prefix_len, new_end_in_new);\n\n const change_start = raw_start + prefix_len;\n const change_end = change_start + display_target.length;\n\n let pre_start = Math.max(0, change_start - CONTEXT_SIZE);\n let pre_context = original_text.substring(pre_start, change_start);\n if (pre_start > 0) pre_context = \"...\" + pre_context;\n\n let post_end = Math.min(original_text.length, change_end + CONTEXT_SIZE);\n let post_context = original_text.substring(change_end, post_end);\n if (post_end < original_text.length) post_context = post_context + \"...\";\n\n pre_context = pre_context.replace(/\\n/g, \" \").replace(/\\r/g, \"\");\n post_context = post_context.replace(/\\n/g, \" \").replace(/\\r/g, \"\");\n\n output.push(\"@@ Word Patch @@\");\n output.push(` ${pre_context}`);\n if (display_target) output.push(`- ${display_target}`);\n if (display_new) output.push(`+ ${display_new}`);\n output.push(` ${post_context}`);\n output.push(\"\");\n }\n\n return output.join(\"\\n\");\n}\n","import { trim_common_context } from \"./diff.js\";\nimport { ModifyText } from \"./models.js\";\nexport const AMBIGUITY_EXAMPLES_CAP = 5;\nexport const AMBIGUITY_CONTEXT_CHARS = 50;\nfunction _should_strip_markers(text: string, marker: string): boolean {\n if (!text.startsWith(marker) || !text.endsWith(marker)) return false;\n if (text.length < marker.length * 2) return false;\n\n const inner = text.substring(marker.length, text.length - marker.length);\n if (!inner) return false;\n\n if (inner.includes(marker)) return false;\n if (!/[a-zA-Z]/.test(inner)) return false;\n\n if (marker === \"__\" && /^\\w+$/.test(inner)) return false;\n if (marker === \"_\") {\n if (inner.includes(\"_\")) return false;\n if (/^[0-9_]+$/.test(inner)) return false;\n }\n\n return true;\n}\n\nfunction _strip_balanced_markers(text: string): [string, string, string] {\n let prefix_markup = \"\";\n let suffix_markup = \"\";\n let clean_text = text;\n\n const markers = [\"**\", \"__\", \"_\", \"*\"];\n\n for (const marker of markers) {\n if (_should_strip_markers(clean_text, marker)) {\n prefix_markup += marker;\n suffix_markup = marker + suffix_markup;\n clean_text = clean_text.substring(\n marker.length,\n clean_text.length - marker.length,\n );\n break;\n }\n }\n\n return [prefix_markup, clean_text, suffix_markup];\n}\n\nexport function _replace_smart_quotes(text: string): string {\n return text\n .replace(/“/g, '\"')\n .replace(/”/g, '\"')\n .replace(/‘/g, \"'\")\n .replace(/’/g, \"'\");\n}\n\nfunction _find_safe_boundaries(\n text: string,\n start: number,\n end: number,\n): [number, number] {\n let new_start = start;\n let new_end = end;\n\n const expand_if_unbalanced = (marker: string) => {\n const current_match = text.substring(new_start, new_end);\n const count = (\n current_match.match(new RegExp(marker.replace(/\\*/g, \"\\\\*\"), \"g\")) || []\n ).length;\n\n if (count % 2 !== 0) {\n const suffix = text.substring(new_end);\n if (suffix.startsWith(marker)) {\n new_end += marker.length;\n return;\n }\n const prefix = text.substring(0, new_start);\n if (prefix.endsWith(marker)) {\n new_start -= marker.length;\n return;\n }\n }\n };\n\n for (let i = 0; i < 2; i++) {\n expand_if_unbalanced(\"**\");\n expand_if_unbalanced(\"__\");\n expand_if_unbalanced(\"_\");\n expand_if_unbalanced(\"*\");\n }\n\n return [new_start, new_end];\n}\n\nfunction _refine_match_boundaries(\n text: string,\n start: number,\n end: number,\n): [number, number] {\n const markers = [\"**\", \"__\", \"*\", \"_\"];\n let current_text = text.substring(start, end);\n let best_start = start;\n let best_end = end;\n\n const countMarker = (str: string, mk: string) =>\n (str.match(new RegExp(mk.replace(/\\*/g, \"\\\\*\"), \"g\")) || []).length;\n\n for (const marker of markers) {\n if (current_text.startsWith(marker)) {\n const current_score = countMarker(current_text, marker) % 2;\n const trimmed_text = current_text.substring(marker.length);\n const trimmed_score = countMarker(trimmed_text, marker) % 2;\n\n if (current_score === 1 && trimmed_score === 0) {\n best_start += marker.length;\n current_text = trimmed_text;\n }\n }\n }\n\n for (const marker of markers) {\n if (current_text.endsWith(marker)) {\n const current_score = countMarker(current_text, marker) % 2;\n const trimmed_text = current_text.substring(\n 0,\n current_text.length - marker.length,\n );\n const trimmed_score = countMarker(trimmed_text, marker) % 2;\n\n if (current_score === 1 && trimmed_score === 0) {\n best_end -= marker.length;\n current_text = trimmed_text;\n }\n }\n }\n\n return [best_start, best_end];\n}\n\nexport function _make_fuzzy_regex(target_text: string): string {\n target_text = _replace_smart_quotes(target_text);\n\n const parts: string[] = [];\n const token_pattern = /(_+)|(\\s+)|(['\"])|([.,;:\\/])/g;\n\n // Note: JS does not support atomic groups (?>...).\n // However, because we only match markdown characters * and _,\n // we can use a character class `[*_]*` which is mathematically equivalent\n // to `(?:\\*\\*|__|\\*|_)*` but fundamentally immune to catastrophic backtracking!\n const md_noise = \"[*_]*\";\n const structural_noise = \"(?:\\\\s*(?:[*+\\\\->]|\\\\d+\\\\.)\\\\s+|\\\\s*\\\\n\\\\s*)\";\n\n const start_list_marker = \"(?:[ \\\\t]*(?:[*+\\\\->]|\\\\d+\\\\.)\\\\s+)?\";\n parts.push(start_list_marker);\n parts.push(md_noise);\n\n let last_idx = 0;\n let match;\n\n const escapeRegExp = (str: string) =>\n str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n while ((match = token_pattern.exec(target_text)) !== null) {\n const literal = target_text.substring(last_idx, match.index);\n if (literal) {\n parts.push(escapeRegExp(literal));\n parts.push(md_noise);\n }\n\n const g_underscore = match[1];\n const g_space = match[2];\n const g_quote = match[3];\n const g_punct = match[4];\n\n if (g_underscore) {\n parts.push(\"_+\");\n } else if (g_space) {\n if (g_space.includes(\"\\n\")) {\n parts.push(`(?:${structural_noise}|\\\\s+)+`);\n } else {\n parts.push(\"\\\\s+\");\n }\n } else if (g_quote) {\n if (g_quote === \"'\") parts.push(\"[\\u2018\\u2019']\");\n else parts.push('[\"\\u201c\\u201d]');\n } else if (g_punct) {\n parts.push(escapeRegExp(g_punct));\n }\n\n parts.push(md_noise);\n last_idx = token_pattern.lastIndex;\n }\n\n const remaining = target_text.substring(last_idx);\n if (remaining) parts.push(escapeRegExp(remaining));\n\n return parts.join(\"\");\n}\n\nexport function _find_match_in_text(\n text: string,\n target: string,\n): [number, number] {\n if (!target) return [-1, -1];\n\n let idx = text.indexOf(target);\n if (idx !== -1) return _find_safe_boundaries(text, idx, idx + target.length);\n\n const norm_text = _replace_smart_quotes(text);\n const norm_target = _replace_smart_quotes(target);\n idx = norm_text.indexOf(norm_target);\n if (idx !== -1)\n return _find_safe_boundaries(text, idx, idx + norm_target.length);\n\n try {\n const pattern = new RegExp(_make_fuzzy_regex(target));\n const match = pattern.exec(text);\n if (match) {\n const raw_start = match.index;\n const raw_end = match.index + match[0].length;\n const [refined_start, refined_end] = _refine_match_boundaries(\n text,\n raw_start,\n raw_end,\n );\n return _find_safe_boundaries(text, refined_start, refined_end);\n }\n } catch (e) {\n // Ignore regex compilation errors from edge cases\n }\n\n return [-1, -1];\n}\n\nexport function _build_critic_markup(\n target_text: string,\n new_text: string,\n comment: string | null | undefined,\n edit_index: number,\n include_index: boolean,\n highlight_only: boolean,\n): string {\n const parts: string[] = [];\n\n let [prefix_markup, clean_target, suffix_markup] =\n _strip_balanced_markers(target_text);\n\n let clean_new = new_text;\n if (prefix_markup && new_text) {\n if (\n new_text.startsWith(prefix_markup) &&\n new_text.endsWith(suffix_markup)\n ) {\n const inner_len = prefix_markup.length;\n clean_new =\n new_text.length > inner_len * 2\n ? new_text.substring(inner_len, new_text.length - inner_len)\n : new_text;\n }\n }\n\n parts.push(prefix_markup);\n\n if (highlight_only) {\n parts.push(`{==${clean_target}==}`);\n } else {\n const has_target = Boolean(clean_target);\n const has_new = Boolean(clean_new);\n\n if (has_target && !has_new) parts.push(`{--${clean_target}--}`);\n else if (!has_target && has_new) parts.push(`{++${clean_new}++}`);\n else if (has_target && has_new)\n parts.push(`{--${clean_target}--}{++${clean_new}++}`);\n }\n\n parts.push(suffix_markup);\n\n const meta_parts: string[] = [];\n if (comment) meta_parts.push(comment);\n if (include_index) meta_parts.push(`[Edit:${edit_index}]`);\n\n if (meta_parts.length > 0) {\n parts.push(`{>>${meta_parts.join(\" \")}<<}`);\n }\n\n return parts.join(\"\");\n}\n\nexport function apply_edits_to_markdown(\n markdown_text: string,\n edits: ModifyText[],\n include_index = false,\n highlight_only = false,\n): string {\n if (!edits || edits.length === 0) return markdown_text;\n\n const matched_edits: [number, number, string, ModifyText, number][] = [];\n\n for (let idx = 0; idx < edits.length; idx++) {\n const edit = edits[idx];\n const target = edit.target_text || \"\";\n\n if (!target) {\n continue;\n }\n\n const [start, end] = _find_match_in_text(markdown_text, target);\n if (start === -1) continue;\n\n const actual_matched_text = markdown_text.substring(start, end);\n matched_edits.push([start, end, actual_matched_text, edit, idx]);\n }\n\n const matched_edits_filtered: [number, number, string, ModifyText, number][] =\n [];\n const occupied_ranges: [number, number][] = [];\n\n matched_edits.sort((a, b) => a[4] - b[4]);\n\n for (const [start, end, actual_text, edit, orig_idx] of matched_edits) {\n let overlaps = false;\n for (const [occ_start, occ_end] of occupied_ranges) {\n if (start < occ_end && end > occ_start) {\n overlaps = true;\n break;\n }\n }\n\n if (!overlaps) {\n matched_edits_filtered.push([start, end, actual_text, edit, orig_idx]);\n occupied_ranges.push([start, end]);\n }\n }\n\n matched_edits_filtered.sort((a, b) => b[0] - a[0]);\n\n let result = markdown_text;\n\n for (const [\n start,\n end,\n actual_text,\n edit,\n orig_idx,\n ] of matched_edits_filtered) {\n const new_txt = edit.new_text || \"\";\n const [prefix_len, suffix_len] = trim_common_context(actual_text, new_txt);\n\n const unmodified_prefix =\n prefix_len > 0 ? actual_text.substring(0, prefix_len) : \"\";\n const unmodified_suffix =\n suffix_len > 0\n ? actual_text.substring(actual_text.length - suffix_len)\n : \"\";\n\n const t_end = actual_text.length - suffix_len;\n const n_end = new_txt.length - suffix_len;\n\n const isolated_target = actual_text.substring(prefix_len, t_end);\n const isolated_new = new_txt.substring(prefix_len, n_end);\n\n const markup = _build_critic_markup(\n isolated_target,\n isolated_new,\n edit.comment,\n orig_idx,\n include_index,\n highlight_only,\n );\n\n const full_replacement = unmodified_prefix + markup + unmodified_suffix;\n result =\n result.substring(0, start) + full_replacement + result.substring(end);\n }\n\n return result;\n}\nexport function format_ambiguity_error(\n edit_index: number,\n target_text: string,\n haystack: string,\n match_positions: [number, number][],\n): string {\n const total = match_positions.length;\n if (total < 2) {\n throw new Error(\n `format_ambiguity_error requires at least 2 matches, got ${total}`,\n );\n }\n\n const shown = match_positions.slice(0, AMBIGUITY_EXAMPLES_CAP);\n const remaining = total - shown.length;\n\n const lines: string[] = [\n `- Edit ${edit_index} Failed: Ambiguous match. Target text appears ${total} times. First ${shown.length} occurrences:`,\n ];\n\n for (let i = 0; i < shown.length; i++) {\n const [start, end] = shown[i];\n const pre_start = Math.max(0, start - AMBIGUITY_CONTEXT_CHARS);\n const post_end = Math.min(haystack.length, end + AMBIGUITY_CONTEXT_CHARS);\n\n const pre_context = haystack\n .substring(pre_start, start)\n .replace(/\\n/g, \" \");\n const post_context = haystack.substring(end, post_end).replace(/\\n/g, \" \");\n let match_text = haystack.substring(start, end).replace(/\\n/g, \" \");\n\n if (match_text.length > 50) {\n match_text =\n match_text.substring(0, 25) +\n \"...\" +\n match_text.substring(match_text.length - 20);\n }\n\n const prefix_marker = pre_start > 0 ? \"...\" : \"\";\n const suffix_marker = post_end < haystack.length ? \"...\" : \"\";\n\n lines.push(\n ` ${i + 1}. \"${prefix_marker}${pre_context}[${match_text}]${post_context}${suffix_marker}\"`,\n );\n }\n\n if (remaining > 0) {\n lines.push(` ... and ${remaining} more occurrence(s) not shown.`);\n }\n\n lines.push(\n \" Please provide more surrounding context in your target_text to uniquely identify the location.\",\n );\n\n return lines.join(\"\\n\");\n}\n","import { DocumentObject } from \"./docx/bridge.js\";\nimport { Paragraph, Table, Run, DocxEvent } from \"./docx/primitives.js\";\nimport { DocumentMapper, TextSpan } from \"./mapper.js\";\nimport { CommentsManager } from \"./comments.js\";\nimport {\n ModifyText,\n InsertTableRow,\n DeleteTableRow,\n AcceptChange,\n RejectChange,\n ReplyComment,\n DocumentChange,\n} from \"./models.js\";\nimport { trim_common_context } from \"./diff.js\";\nimport { findChild, findAllDescendants, serializeXml } from \"./docx/dom.js\";\nimport {\n is_heading_paragraph,\n is_native_heading,\n get_run_style_markers,\n get_run_text,\n apply_formatting_to_segments,\n} from \"./utils/docx.js\";\nimport { format_ambiguity_error } from \"./markup.js\";\n\n// --- DOM Mutation Helpers for xmldom ---\nfunction getNextElement(el: Element): Element | null {\n let next = el.nextSibling;\n while (next) {\n if (next.nodeType === 1) return next as Element;\n next = next.nextSibling;\n }\n return null;\n}\n\nfunction getPreviousElement(el: Element): Element | null {\n let prev = el.previousSibling;\n while (prev) {\n if (prev.nodeType === 1) return prev as Element;\n prev = prev.previousSibling;\n }\n return null;\n}\n\nfunction insertAfter(newNode: Node, refNode: Element) {\n if (refNode.parentNode) {\n refNode.parentNode.insertBefore(newNode, refNode.nextSibling);\n }\n}\n\nfunction insertBefore(newNode: Node, refNode: Element) {\n if (refNode.parentNode) {\n refNode.parentNode.insertBefore(newNode, refNode);\n }\n}\n\nfunction insertAtIndex(parent: Element, index: number, child: Node) {\n const children = Array.from(parent.childNodes).filter(\n (n) => n.nodeType === 1,\n );\n if (index >= children.length) {\n parent.appendChild(child);\n } else {\n parent.insertBefore(child, children[index]);\n }\n}\n\n// --- Validation ---\nexport class BatchValidationError extends Error {\n public errors: string[];\n constructor(errors: string[]) {\n super(\"Batch validation failed:\\n\" + errors.join(\"\\n\"));\n this.name = \"BatchValidationError\";\n this.errors = errors;\n }\n}\n\nexport function validate_edit_strings(edits: any[]): string[] {\n const errors: string[] = [];\n\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i];\n const t_text = edit.target_text || \"\";\n const n_text = edit.new_text || \"\";\n\n if (\n n_text.includes(\"{++\") ||\n n_text.includes(\"{--\") ||\n n_text.includes(\"{>>\") ||\n n_text.includes(\"{==\")\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Do not manually write CriticMarkup tags ({++, {--, {>>, {==) in \\`new_text\\`. The engine handles redlining automatically. To add a comment, use the \\`comment\\` parameter.`,\n );\n }\n\n if (t_text.includes(\"[^\") || n_text.includes(\"[^\")) {\n const t_fns = (t_text.match(/\\[\\^(?:fn|en)-[^\\]]+\\]/g) || []).sort();\n const n_fns = (n_text.match(/\\[\\^(?:fn|en)-[^\\]]+\\]/g) || []).sort();\n if (JSON.stringify(t_fns) !== JSON.stringify(n_fns)) {\n if (\n n_fns.length > t_fns.length ||\n n_fns.some(\n (f: string) =>\n n_fns.filter((x: string) => x === f).length >\n t_fns.filter((x: string) => x === f).length,\n )\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot insert footnote/endnote markers via text replace. Markers like \\`[^fn-N]\\` are read-only projections. Use Word's References menu.`,\n );\n } else {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot delete footnote/endnote references via text replace. The marker corresponds to a structural XML element.`,\n );\n }\n }\n }\n\n if (t_text.includes(\"](\") || n_text.includes(\"](\")) {\n const t_links = (t_text.match(/\\[(?!~)[^\\]]+\\]\\([^)]+\\)/g) || []).sort();\n const n_links = (n_text.match(/\\[(?!~)[^\\]]+\\]\\([^)]+\\)/g) || []).sort();\n if (t_links.length !== n_links.length) {\n if (n_links.length > t_links.length) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot insert hyperlinks via text replace. Use a dedicated structural operation.`,\n );\n } else {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot delete hyperlinks via text replace. The marker corresponds to a structural XML element.`,\n );\n }\n } else if (\n t_links.length > 1 &&\n JSON.stringify(t_links) !== JSON.stringify(n_links)\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Can only edit or retarget one hyperlink per text replacement. Please split into multiple edits.`,\n );\n }\n }\n\n if (t_text.includes(\"[~\") || n_text.includes(\"[~\")) {\n const t_xrefs = t_text.match(/\\[~[^~]+~\\]\\(#[^\\)]+\\)/g) || [];\n const n_xrefs = n_text.match(/\\[~[^~]+~\\]\\(#[^\\)]+\\)/g) || [];\n if (t_xrefs.length !== n_xrefs.length) {\n if (n_xrefs.length > t_xrefs.length) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot insert cross-references via text replace. Markers are read-only projections.`,\n );\n } else {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot delete cross-references via text replace. The marker corresponds to a structural XML element.`,\n );\n }\n } else {\n // Advanced XREF validation simplified for port scope\n if (JSON.stringify(t_xrefs) !== JSON.stringify(n_xrefs)) {\n errors.push(\n `- Edit ${i + 1} Failed: Modifying or retargeting cross-reference markers is disallowed to prevent dependency corruption.`,\n );\n }\n }\n }\n\n if (t_text.includes(\"{#\") || n_text.includes(\"{#\")) {\n const t_anchors = t_text.match(/\\{#[^\\}]+\\}/g) || [];\n const n_anchors = n_text.match(/\\{#[^\\}]+\\}/g) || [];\n for (const a of n_anchors) {\n if (\n n_anchors.filter((x: string) => x === a).length >\n t_anchors.filter((x: string) => x === a).length\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Cannot modify or insert internal anchor markers (\\`{#...}\\`). These represent structural XML bookmarks.`,\n );\n break;\n }\n }\n }\n\n if (edit.type === \"modify\" && n_text) {\n const lines = n_text.split(/[\\r\\n]+/);\n for (const line of lines) {\n const stripped = line.trimStart();\n if (stripped.startsWith(\"#######\")) {\n const level = stripped.length - stripped.replace(/^#+/, \"\").length;\n if (\n stripped.substring(level).startsWith(\" \") ||\n stripped.substring(level) === \"\"\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Heading level ${level} is not supported (maximum is 6).`,\n );\n break;\n }\n }\n }\n }\n\n if (\n t_text.includes(\"READONLY_BOUNDARY_START\") ||\n n_text.includes(\"READONLY_BOUNDARY_START\") ||\n t_text.includes(\"# Document Structure (Read-Only)\") ||\n n_text.includes(\"# Document Structure (Read-Only)\")\n ) {\n errors.push(\n `- Edit ${i + 1} Failed: Modification targets the read-only boundary (Structural Appendix). This section cannot be edited.`,\n );\n }\n }\n\n return errors;\n}\n\n// --- Engine ---\nexport class RedlineEngine {\n public doc: DocumentObject;\n public author: string;\n public timestamp: string;\n public current_id: number;\n public mapper: DocumentMapper;\n public comments_manager: CommentsManager;\n public clean_mapper: DocumentMapper | null = null;\n public skipped_details: string[] = [];\n\n constructor(doc: DocumentObject, author: string = \"Adeu AI (TS)\") {\n this.doc = doc;\n this.author = author;\n this.timestamp = new Date().toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n\n const w16du_ns =\n \"http://schemas.microsoft.com/office/word/2023/wordml/word16du\";\n for (const part of this.doc.pkg.parts) {\n if (\n part === this.doc.part ||\n (part.contentType.includes(\"wordprocessingml\") &&\n part.contentType.endsWith(\"+xml\"))\n ) {\n if (!part._element.hasAttribute(\"xmlns:w16du\")) {\n part._element.setAttribute(\"xmlns:w16du\", w16du_ns);\n }\n }\n }\n\n this.current_id = this._scan_existing_ids();\n this.mapper = new DocumentMapper(this.doc);\n this.comments_manager = new CommentsManager(this.doc);\n }\n\n private _scan_existing_ids(): number {\n let maxId = 0;\n for (const tag of [\"w:ins\", \"w:del\"]) {\n const elements = findAllDescendants(this.doc.element, tag);\n for (const el of elements) {\n const val = parseInt(el.getAttribute(\"w:id\") || \"0\", 10);\n if (!isNaN(val) && val > maxId) maxId = val;\n }\n }\n return maxId;\n }\n\n public accept_all_revisions() {\n const parts_to_process: Element[] = [this.doc.element];\n\n for (const part of this.doc.pkg.parts) {\n if (part === this.doc.part) continue;\n if (\n part.contentType.includes(\"wordprocessingml\") &&\n part.contentType.endsWith(\"+xml\")\n ) {\n parts_to_process.push(part._element);\n }\n }\n\n for (const root_element of parts_to_process) {\n const insNodes = findAllDescendants(root_element, \"w:ins\");\n for (const ins of insNodes) {\n this._clean_wrapping_comments(ins);\n const parent = ins.parentNode as Element | null;\n if (!parent) continue;\n\n if (parent.tagName === \"w:trPr\") {\n parent.removeChild(ins);\n continue;\n }\n\n while (ins.firstChild) {\n parent.insertBefore(ins.firstChild, ins);\n }\n parent.removeChild(ins);\n }\n\n const pNodes = findAllDescendants(root_element, \"w:p\");\n for (const p of pNodes) {\n const pPr = findChild(p, \"w:pPr\");\n if (pPr) {\n const rPr = findChild(pPr, \"w:rPr\");\n const delMark = rPr ? findChild(rPr, \"w:del\") : null;\n if (rPr && delMark) {\n let has_content = false;\n for (const tag of [\"w:t\", \"w:tab\", \"w:br\"]) {\n for (const child of findAllDescendants(p, tag)) {\n if (tag === \"w:t\" && !child.textContent) continue;\n \n let is_deleted = false;\n let curr = child.parentNode as Element | null;\n while (curr && curr !== p) {\n if (curr.tagName === \"w:del\") {\n is_deleted = true;\n break;\n }\n curr = curr.parentNode as Element | null;\n }\n if (!is_deleted) {\n has_content = true;\n break;\n }\n }\n if (has_content) {\n break;\n }\n }\n if (has_content) {\n rPr.removeChild(delMark);\n } else {\n this._clean_wrapping_comments(p);\n this._delete_comments_in_element(p);\n if (p.parentNode) {\n p.parentNode.removeChild(p);\n }\n }\n }\n }\n }\n\n const delNodes = findAllDescendants(root_element, \"w:del\");\n for (const d of delNodes) {\n this._clean_wrapping_comments(d);\n this._delete_comments_in_element(d);\n const parent = d.parentNode as Element | null;\n if (parent) {\n if (parent.tagName === \"w:trPr\") {\n const row = parent.parentNode as Element | null;\n if (row && row.parentNode) {\n row.parentNode.removeChild(row);\n }\n } else {\n parent.removeChild(d);\n }\n }\n }\n }\n\n // Final pass: remove any free-standing comments\n const comment_ids = new Set<string>();\n for (const tag of [\n \"w:commentRangeStart\",\n \"w:commentRangeEnd\",\n \"w:commentReference\",\n ]) {\n for (const node of findAllDescendants(this.doc.element, tag)) {\n const cid = node.getAttribute(\"w:id\");\n if (cid) comment_ids.add(cid);\n }\n }\n\n const comments_part = this.doc.pkg.parts.find(\n (p) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\",\n );\n if (comments_part) {\n for (const c of findAllDescendants(comments_part._element, \"w:comment\")) {\n const cid = c.getAttribute(\"w:id\");\n if (cid) comment_ids.add(cid);\n }\n }\n\n for (const cid of comment_ids) {\n this.comments_manager.deleteComment(cid);\n }\n }\n private _getNextId(): string {\n this.current_id++;\n return this.current_id.toString();\n }\n\n private _create_track_change_tag(\n tagName: string,\n author: string = \"\",\n reuseId: string | null = null,\n ): Element {\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const tag = xmlDoc.createElement(tagName);\n const wid = reuseId !== null ? reuseId : this._getNextId();\n tag.setAttribute(\"w:id\", wid);\n tag.setAttribute(\"w:author\", author || this.author);\n tag.setAttribute(\"w:date\", this.timestamp);\n tag.setAttribute(\"w16du:dateUtc\", this.timestamp);\n return tag;\n }\n\n private _set_text_content(element: Element, text: string) {\n element.textContent = text;\n if (text.trim() !== text) {\n element.setAttribute(\"xml:space\", \"preserve\");\n }\n }\n\n /**\n * Attaches a comment that wraps a contiguous range within a single paragraph.\n * start_element and end_element must both be direct children of parent_element\n * and start_element must come before (or equal) end_element in document order.\n * Ported from Python `RedlineEngine._attach_comment`.\n */\n private _attach_comment(\n parent_element: Element,\n start_element: Element,\n end_element: Element,\n text: string,\n ) {\n if (!text) return;\n\n const comment_id = this.comments_manager.addComment(this.author, text);\n const xmlDoc = parent_element.ownerDocument!;\n\n const range_start = xmlDoc.createElement(\"w:commentRangeStart\");\n range_start.setAttribute(\"w:id\", comment_id);\n\n const range_end = xmlDoc.createElement(\"w:commentRangeEnd\");\n range_end.setAttribute(\"w:id\", comment_id);\n\n const ref_run = xmlDoc.createElement(\"w:r\");\n const rPr = xmlDoc.createElement(\"w:rPr\");\n const rStyle = xmlDoc.createElement(\"w:rStyle\");\n rStyle.setAttribute(\"w:val\", \"CommentReference\");\n rPr.appendChild(rStyle);\n ref_run.appendChild(rPr);\n\n const ref = xmlDoc.createElement(\"w:commentReference\");\n ref.setAttribute(\"w:id\", comment_id);\n ref_run.appendChild(ref);\n\n // Insert <w:commentRangeStart> immediately before start_element.\n // Insert <w:commentRangeEnd> immediately after end_element.\n // Insert <w:r><w:commentReference/></w:r> immediately after the range end.\n parent_element.insertBefore(range_start, start_element);\n\n // After insertBefore above, sibling positions shifted. Re-find end_element's next sibling.\n const after_end = end_element.nextSibling;\n if (after_end) {\n parent_element.insertBefore(range_end, after_end);\n parent_element.insertBefore(ref_run, range_end.nextSibling);\n } else {\n parent_element.appendChild(range_end);\n parent_element.appendChild(ref_run);\n }\n }\n\n /**\n * Attaches a comment that spans across two different paragraphs (or other block\n * containers). start_element lives inside start_p, end_element lives inside end_p,\n * and the comment is open from start_element through end_element.\n * Ported from Python `RedlineEngine._attach_comment_spanning`.\n */\n private _attach_comment_spanning(\n start_p: Element,\n start_el: Element,\n end_p: Element,\n end_el: Element,\n text: string,\n ) {\n if (!text) return;\n\n const comment_id = this.comments_manager.addComment(this.author, text);\n const xmlDocStart = start_p.ownerDocument!;\n const xmlDocEnd = end_p.ownerDocument!;\n\n const range_start = xmlDocStart.createElement(\"w:commentRangeStart\");\n range_start.setAttribute(\"w:id\", comment_id);\n\n const range_end = xmlDocEnd.createElement(\"w:commentRangeEnd\");\n range_end.setAttribute(\"w:id\", comment_id);\n\n const ref_run = xmlDocEnd.createElement(\"w:r\");\n const rPr = xmlDocEnd.createElement(\"w:rPr\");\n const rStyle = xmlDocEnd.createElement(\"w:rStyle\");\n rStyle.setAttribute(\"w:val\", \"CommentReference\");\n rPr.appendChild(rStyle);\n ref_run.appendChild(rPr);\n\n const ref = xmlDocEnd.createElement(\"w:commentReference\");\n ref.setAttribute(\"w:id\", comment_id);\n ref_run.appendChild(ref);\n\n // Place range start before start_el.\n start_p.insertBefore(range_start, start_el);\n\n // Place range end + reference run after end_el.\n const after_end = end_el.nextSibling;\n if (after_end) {\n end_p.insertBefore(range_end, after_end);\n end_p.insertBefore(ref_run, range_end.nextSibling);\n } else {\n end_p.appendChild(range_end);\n end_p.appendChild(ref_run);\n }\n } /**\n * Inserts `text` as one or more tracked paragraphs anchored relative to\n * either an existing run or a paragraph. Returns:\n * { first_node, last_p, last_ins, used_block_mode }\n * where:\n * - first_node: the first <w:ins> (for inline mode) OR the first new <w:p>\n * (for block mode). The caller uses this for splicing into the DOM and\n * for anchoring comments.\n * - last_p: the last new <w:p> created, if any. null when entirely inline.\n * - last_ins: the last <w:ins> created (inside the last new <w:p>, or the\n * sole inline ins). Used as the comment's end anchor.\n * - used_block_mode: true when the first line carried a heading/list style\n * marker and we created a new paragraph for it (rather than inlining it).\n *\n * Multi-paragraph rules (only when text contains '\\n'):\n * - Each additional line becomes a new <w:p>, inserted after the anchor\n * paragraph in document order.\n * - Each new <w:p> gets a copy of the anchor paragraph's <w:pPr> (so list\n * numbering / indentation are preserved) unless the line itself starts\n * with a markdown heading or list marker, which overrides the style.\n * - Each new <w:p> carries a tracked paragraph-break marker\n * (<w:pPr><w:rPr><w:ins/></w:rPr></w:pPr>) so Word natively tracks the\n * paragraph break.\n * - Each new <w:p>'s content is wrapped in a <w:ins>, with inline bold/\n * italic markdown parsed via _parse_inline_markdown.\n *\n * The first line:\n * - If it carries a heading / list marker AND we have a paragraph anchor,\n * we drop into \"block mode\": no inline <w:ins>; the first line itself\n * becomes the first new <w:p>.\n * - Otherwise we emit a single inline <w:ins> for the first line (current\n * behaviour) and treat the remaining lines as block extensions.\n *\n * Does NOT attach comments; callers handle that.\n */\n private _track_insert_multiline(\n text: string,\n anchor_run: Run | null,\n anchor_paragraph: Paragraph | null,\n reuse_id: string,\n ): {\n first_node: Element | null;\n last_p: Element | null;\n last_ins: Element | null;\n used_block_mode: boolean;\n } {\n if (!text) {\n return {\n first_node: null,\n last_p: null,\n last_ins: null,\n used_block_mode: false,\n };\n }\n\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const lines = text.split(/[\\r\\n]+/);\n\n // Resolve the containing <w:p> (current_p) for the anchor.\n let current_p: Element | null = null;\n if (anchor_paragraph !== null) {\n current_p = anchor_paragraph._element;\n } else if (anchor_run !== null) {\n let walker: Element | null = anchor_run._element;\n while (walker && walker.tagName !== \"w:p\") {\n walker = walker.parentNode as Element | null;\n }\n current_p = walker;\n }\n\n // Drop trailing empty line. \"foo\\n\\nbar\\n\\n\" splits to\n // ['foo', '', 'bar', '']; that trailing empty is just a terminator, not\n // a real empty paragraph.\n while (lines.length > 1 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n if (lines.length === 0) {\n return {\n first_node: null,\n last_p: null,\n last_ins: null,\n used_block_mode: false,\n };\n }\n\n // Inspect the first line for heading/list markers.\n const [first_clean, first_style] = this._parse_markdown_style(lines[0]);\n const have_paragraph_context = current_p !== null;\n const block_mode = first_style !== null && have_paragraph_context;\n\n let first_node: Element | null = null;\n let inline_ins: Element | null = null;\n\n // ---- INLINE PATH for the first line (when NOT in block mode) ----\n if (!block_mode) {\n inline_ins = this._build_tracked_ins_for_line(\n first_clean === lines[0] ? lines[0] : lines[0],\n anchor_run,\n reuse_id,\n xmlDoc,\n );\n first_node = inline_ins;\n // Caller will attach `inline_ins` to the DOM later — keep it for now.\n }\n\n // ---- BLOCK PATH for the first line (when in block mode) ----\n // Block-mode first line is just the first extension paragraph below.\n const remaining_lines = block_mode ? lines : lines.slice(1);\n\n // If there's nothing to do beyond inline, we're done.\n if (remaining_lines.length === 0) {\n return {\n first_node,\n last_p: null,\n last_ins: inline_ins,\n used_block_mode: false,\n };\n }\n\n if (!current_p) {\n // Multi-paragraph insertion needs a paragraph context. Without one, fall\n // back to the inline result we already built.\n return {\n first_node,\n last_p: null,\n last_ins: inline_ins,\n used_block_mode: false,\n };\n }\n\n const parent_body = current_p.parentNode as Element | null;\n if (!parent_body) {\n return {\n first_node,\n last_p: null,\n last_ins: inline_ins,\n used_block_mode: false,\n };\n }\n\n const insertAfterEl = (newNode: Element, ref: Element) => {\n parent_body.insertBefore(newNode, ref.nextSibling);\n };\n\n let last_p: Element | null = null;\n let last_ins: Element | null = null;\n let after: Element = current_p;\n\n for (let i = 0; i < remaining_lines.length; i++) {\n const raw_line = remaining_lines[i];\n const [clean_text, style_name] = this._parse_markdown_style(raw_line);\n\n const new_p = xmlDoc.createElement(\"w:p\");\n\n if (style_name) {\n // Heading or list style was explicitly authored: replace pPr entirely.\n this._set_paragraph_style(new_p, style_name);\n } else {\n // Inherit pPr from the anchor paragraph (preserves list numbering).\n const existing_pPr = findChild(current_p, \"w:pPr\");\n if (existing_pPr) {\n new_p.appendChild(existing_pPr.cloneNode(true));\n }\n }\n\n // Track the paragraph break itself as an insertion.\n let pPr = findChild(new_p, \"w:pPr\");\n if (!pPr) {\n pPr = xmlDoc.createElement(\"w:pPr\");\n new_p.insertBefore(pPr, new_p.firstChild);\n }\n let rPr = findChild(pPr, \"w:rPr\");\n if (!rPr) {\n rPr = xmlDoc.createElement(\"w:rPr\");\n pPr.appendChild(rPr);\n }\n const ins_mark = this._create_track_change_tag(\"w:ins\", \"\", reuse_id);\n rPr.appendChild(ins_mark);\n\n // Build the content <w:ins>.\n const content_ins = this._build_tracked_ins_for_line(\n clean_text,\n anchor_run,\n reuse_id,\n xmlDoc,\n );\n if (content_ins) {\n new_p.appendChild(content_ins);\n }\n\n insertAfterEl(new_p, after);\n after = new_p;\n last_p = new_p;\n last_ins = content_ins;\n\n // In block mode (or if the inline line was completely empty), the first new paragraph IS first_node.\n if (!first_node) {\n first_node = new_p;\n }\n }\n\n return { first_node, last_p, last_ins, used_block_mode: block_mode };\n }\n\n /**\n * Builds a single tracked-insert wrapper (<w:ins>) containing one or more\n * <w:r> elements representing the inline markdown segments of `line_text`.\n * Returns null if line_text is empty.\n */\n private _build_tracked_ins_for_line(\n line_text: string,\n anchor_run: Run | null,\n reuse_id: string,\n xmlDoc: Document,\n ): Element | null {\n if (!line_text && line_text !== \"\") return null;\n const ins = this._create_track_change_tag(\"w:ins\", \"\", reuse_id);\n const segments = this._parse_inline_markdown(line_text);\n if (segments.length === 0) {\n return null;\n }\n for (const [segText, segProps] of segments) {\n const r = xmlDoc.createElement(\"w:r\");\n // Inherit run formatting (e.g. bold from a heading style) only when we\n // have an anchor run AND we are not overriding via segment props.\n if (anchor_run && anchor_run._element) {\n const anchor_rPr = findChild(anchor_run._element, \"w:rPr\");\n if (anchor_rPr) {\n const clone = anchor_rPr.cloneNode(true) as Element;\n // Strip vanish / strike to avoid invisible inserts.\n for (const tag of [\"w:vanish\", \"w:strike\", \"w:dstrike\"]) {\n const found = findChild(clone, tag);\n if (found) clone.removeChild(found);\n }\n r.appendChild(clone);\n }\n }\n this._apply_run_props(r, segProps, false);\n const t = xmlDoc.createElement(\"w:t\");\n this._set_text_content(t, segText);\n r.appendChild(t);\n ins.appendChild(r);\n }\n return ins;\n }\n private _parse_markdown_style(text: string): [string, string | null] {\n const stripped_text = text.trimStart();\n\n if (stripped_text.startsWith(\"#\")) {\n let level = 0;\n let temp = stripped_text;\n while (temp.startsWith(\"#\")) {\n level++;\n temp = temp.substring(1);\n }\n if (temp.startsWith(\" \")) return [temp.trim(), `Heading ${level}`];\n }\n\n if (stripped_text.startsWith(\"* \") || stripped_text.startsWith(\"- \")) {\n return [stripped_text.substring(2).trim(), \"List Paragraph\"];\n }\n\n const match = stripped_text.match(/^\\d+\\.\\s+/);\n if (match) {\n return [stripped_text.substring(match[0].length).trim(), \"List Number\"];\n }\n\n return [text, null];\n }\n\n private _parse_inline_markdown(\n text: string,\n baseStyle: any = {},\n ): [string, any][] {\n if (!text) return [];\n\n const tokenPattern = /(\\*\\*.*?\\*\\*)|(_.*?_)/;\n const match = text.match(tokenPattern);\n\n if (!match) return [[text, baseStyle]];\n\n const start = match.index!;\n const raw = match[0];\n const end = start + raw.length;\n\n const isBold = raw.startsWith(\"**\");\n const innerContent = isBold\n ? raw.substring(2, raw.length - 2)\n : raw.substring(1, raw.length - 1);\n\n const preText = text.substring(0, start);\n const postText = text.substring(end);\n\n const results: [string, any][] = [];\n if (preText) results.push([preText, baseStyle]);\n\n const newStyle = { ...baseStyle };\n if (isBold) newStyle.bold = true;\n else newStyle.italic = true;\n\n results.push(...this._parse_inline_markdown(innerContent, newStyle));\n results.push(...this._parse_inline_markdown(postText, baseStyle));\n\n return results;\n }\n\n private _apply_run_props(\n runElement: Element,\n props: any,\n suppressInherited: boolean = false,\n ) {\n if (!props) {\n if (!suppressInherited) return;\n props = {};\n }\n\n let rPr = findChild(runElement, \"w:rPr\");\n if (!rPr && (props.bold || props.italic || suppressInherited)) {\n const doc = runElement.ownerDocument!;\n rPr = doc.createElement(\"w:rPr\");\n runElement.appendChild(rPr);\n }\n\n if (rPr) {\n const doc = runElement.ownerDocument!;\n if (props.bold) {\n let b = findChild(rPr, \"w:b\");\n if (!b) {\n b = doc.createElement(\"w:b\");\n rPr.appendChild(b);\n }\n b.setAttribute(\"w:val\", \"1\");\n } else if (suppressInherited) {\n const b = findChild(rPr, \"w:b\");\n if (b) rPr.removeChild(b);\n }\n\n if (props.italic) {\n let i = findChild(rPr, \"w:i\");\n if (!i) {\n i = doc.createElement(\"w:i\");\n rPr.appendChild(i);\n }\n i.setAttribute(\"w:val\", \"1\");\n } else if (suppressInherited) {\n const i = findChild(rPr, \"w:i\");\n if (i) rPr.removeChild(i);\n }\n }\n }\n /**\n * Replaces (or creates) a paragraph's <w:pPr> with a single <w:pStyle> entry\n * pointing at `style_name`. Strips any existing pPr to avoid layering a new\n * heading style on top of a previous list/heading configuration.\n *\n * In Python, the style id is resolved via doc.styles[style_name].style_id and\n * falls back to stripping spaces. Node has no equivalent style cache exposed\n * on `doc`, so we always use the simple \"strip spaces\" fallback: \"Heading 1\"\n * becomes the style id \"Heading1\", \"List Number\" becomes \"ListNumber\", etc.\n * This matches python-docx's default style-id convention for the built-in\n * paragraph styles and is what Word writes by default.\n */\n private _set_paragraph_style(p_element: Element, style_name: string) {\n const xmlDoc = p_element.ownerDocument!;\n\n const existing_pPr = findChild(p_element, \"w:pPr\");\n if (existing_pPr) {\n p_element.removeChild(existing_pPr);\n }\n\n const pPr = xmlDoc.createElement(\"w:pPr\");\n const pStyle = xmlDoc.createElement(\"w:pStyle\");\n const style_id = style_name.replace(/\\s+/g, \"\");\n pStyle.setAttribute(\"w:val\", style_id);\n pPr.appendChild(pStyle);\n\n // pPr is the first child of <w:p> per OOXML schema.\n p_element.insertBefore(pPr, p_element.firstChild);\n }\n private _anchor_reply_comment(parent_id: string, new_id: string) {\n const docEl = this.doc.part._element.ownerDocument!;\n\n const starts = findAllDescendants(\n this.doc.element,\n \"w:commentRangeStart\",\n ).filter((n) => n.getAttribute(\"w:id\") === parent_id);\n if (starts.length === 0) return;\n const parent_start = starts[0];\n\n const new_start = docEl.createElement(\"w:commentRangeStart\");\n new_start.setAttribute(\"w:id\", new_id);\n insertAfter(new_start, parent_start);\n\n const ends = findAllDescendants(\n this.doc.element,\n \"w:commentRangeEnd\",\n ).filter((n) => n.getAttribute(\"w:id\") === parent_id);\n if (ends.length === 0) return;\n const parent_end = ends[0];\n\n const parent_refs = findAllDescendants(\n this.doc.element,\n \"w:commentReference\",\n ).filter((n) => n.getAttribute(\"w:id\") === parent_id);\n\n let insertion_point = parent_end;\n if (parent_refs.length > 0) {\n const ref_el = parent_refs[0];\n if (\n ref_el.parentNode &&\n (ref_el.parentNode as Element).tagName === \"w:r\"\n ) {\n insertion_point = ref_el.parentNode as Element;\n }\n }\n\n const new_end = docEl.createElement(\"w:commentRangeEnd\");\n new_end.setAttribute(\"w:id\", new_id);\n insertAfter(new_end, insertion_point);\n\n const ref_run = docEl.createElement(\"w:r\");\n const rPr = docEl.createElement(\"w:rPr\");\n const rStyle = docEl.createElement(\"w:rStyle\");\n rStyle.setAttribute(\"w:val\", \"CommentReference\");\n rPr.appendChild(rStyle);\n ref_run.appendChild(rPr);\n\n const ref = docEl.createElement(\"w:commentReference\");\n ref.setAttribute(\"w:id\", new_id);\n ref_run.appendChild(ref);\n\n insertAfter(ref_run, new_end);\n }\n private _clean_wrapping_comments(element: Element) {\n let first_node: Element = element;\n while (true) {\n const prev = getPreviousElement(first_node);\n if (prev && (prev.tagName === \"w:ins\" || prev.tagName === \"w:del\")) {\n first_node = prev;\n } else {\n break;\n }\n }\n\n let last_node: Element = element;\n while (true) {\n const nxt = getNextElement(last_node);\n if (nxt && (nxt.tagName === \"w:ins\" || nxt.tagName === \"w:del\")) {\n last_node = nxt;\n } else {\n break;\n }\n }\n\n const starts_to_remove: Element[] = [];\n let prev = getPreviousElement(first_node);\n while (prev) {\n if (prev.tagName === \"w:commentRangeStart\") {\n starts_to_remove.push(prev);\n prev = getPreviousElement(prev);\n } else if (prev.tagName === \"w:rPr\" || prev.tagName === \"w:pPr\") {\n prev = getPreviousElement(prev);\n } else {\n break;\n }\n }\n\n const ends_to_remove: Element[] = [];\n let nxt = getNextElement(last_node);\n while (nxt) {\n if (nxt.tagName === \"w:commentRangeEnd\") {\n ends_to_remove.push(nxt);\n nxt = getNextElement(nxt);\n } else if (\n nxt.tagName === \"w:r\" &&\n findAllDescendants(nxt, \"w:commentReference\").length > 0\n ) {\n ends_to_remove.push(nxt);\n nxt = getNextElement(nxt);\n } else if (nxt.tagName === \"w:commentReference\") {\n ends_to_remove.push(nxt);\n nxt = getNextElement(nxt);\n } else {\n break;\n }\n }\n\n const end_ids = new Set<string>();\n for (const e of ends_to_remove) {\n if (e.tagName === \"w:commentRangeEnd\") {\n const eid = e.getAttribute(\"w:id\");\n if (eid) end_ids.add(eid);\n } else {\n let ref = findAllDescendants(e, \"w:commentReference\")[0];\n if (!ref && e.tagName === \"w:commentReference\") ref = e;\n if (ref) {\n const eid = ref.getAttribute(\"w:id\");\n if (eid) end_ids.add(eid);\n }\n }\n }\n\n for (const s of starts_to_remove) {\n const c_id = s.getAttribute(\"w:id\");\n if (c_id && end_ids.has(c_id)) {\n this.comments_manager.deleteComment(c_id);\n if (s.parentNode) s.parentNode.removeChild(s);\n for (const e of ends_to_remove) {\n let e_id: string | null = null;\n if (e.tagName === \"w:commentRangeEnd\") {\n e_id = e.getAttribute(\"w:id\");\n } else {\n let ref = findAllDescendants(e, \"w:commentReference\")[0];\n if (!ref && e.tagName === \"w:commentReference\") ref = e;\n if (ref) e_id = ref.getAttribute(\"w:id\");\n }\n if (e_id === c_id && e.parentNode) {\n e.parentNode.removeChild(e);\n }\n }\n }\n }\n }\n\n private _delete_comments_in_element(element: Element) {\n const refs = findAllDescendants(element, \"w:commentReference\");\n for (const ref of refs) {\n const c_id = ref.getAttribute(\"w:id\");\n if (c_id) {\n this.comments_manager.deleteComment(c_id);\n for (const tag of [\"w:commentRangeStart\", \"w:commentRangeEnd\"]) {\n const nodes = findAllDescendants(this.doc.element, tag);\n for (const node of nodes) {\n if (node.getAttribute(\"w:id\") === c_id && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n }\n }\n }\n }\n public validate_edits(edits: any[]): string[] {\n const errors: string[] = [];\n if (!this.mapper.full_text) this.mapper[\"_build_map\"]();\n\n errors.push(...validate_edit_strings(edits));\n\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i];\n if (!edit.target_text) continue;\n\n let matches = this.mapper.find_all_match_indices(edit.target_text);\n let activeText = this.mapper.full_text;\n\n if (matches.length === 0) {\n if (!this.clean_mapper)\n this.clean_mapper = new DocumentMapper(this.doc, true);\n matches = this.clean_mapper.find_all_match_indices(edit.target_text);\n if (matches.length > 0) activeText = this.clean_mapper.full_text;\n }\n\n if (matches.length === 0) {\n errors.push(\n `- Edit ${i + 1} Failed: Target text not found in document:\\n \"${edit.target_text}\"`,\n );\n } else if (matches.length > 1) {\n const positions: [number, number][] = matches.map(([start, length]) => [\n start,\n start + length,\n ]);\n errors.push(\n format_ambiguity_error(\n i + 1,\n edit.target_text,\n activeText,\n positions,\n ),\n );\n }\n\n for (const [start, length] of matches) {\n const spans = this.mapper.spans.filter(\n (s) => s.end > start && s.start < start + length,\n );\n const nestedAuthors = new Set<string>();\n for (const s of spans) {\n if (s.ins_id) {\n const insNodes = findAllDescendants(\n this.doc.element,\n \"w:ins\",\n ).filter((n) => n.getAttribute(\"w:id\") === s.ins_id);\n if (insNodes.length > 0) {\n const auth = insNodes[0].getAttribute(\"w:author\");\n if (auth && auth !== this.author) nestedAuthors.add(auth);\n }\n }\n }\n if (nestedAuthors.size > 0) {\n errors.push(\n `- Edit ${i + 1} Failed: Modification targets an active insertion from another author (${Array.from(nestedAuthors).join(\", \")}). Accept that change first or scope your edit outside of it.`,\n );\n }\n }\n }\n return errors;\n }\n public validate_review_actions(actions: any[]): string[] {\n const errors: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const type = action.type;\n\n if (type === \"reply\") {\n const cid = action.target_id.replace(\"Com:\", \"\");\n let found = false;\n const part = this.doc.pkg.parts.find(\n (p) =>\n p.contentType ===\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\",\n );\n if (part) {\n const comments = findAllDescendants(part._element, \"w:comment\");\n found = comments.some((c) => c.getAttribute(\"w:id\") === cid);\n }\n if (!found) {\n errors.push(\n `- Action ${i + 1} Failed: Target comment ID ${action.target_id} not found.`,\n );\n }\n } else if (type === \"accept\" || type === \"reject\") {\n const target_id = action.target_id.replace(\"Chg:\", \"\");\n const all_ins = findAllDescendants(this.doc.element, \"w:ins\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n const all_del = findAllDescendants(this.doc.element, \"w:del\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n if (all_ins.length === 0 && all_del.length === 0) {\n errors.push(\n `- Action ${i + 1} Failed: Target ID ${action.target_id} not found.`,\n );\n }\n }\n }\n return errors;\n }\n public process_batch(changes: DocumentChange[]): any {\n this.skipped_details = [];\n const actions = changes.filter((c) =>\n [\"accept\", \"reject\", \"reply\"].includes(c.type),\n );\n const edits = changes.filter(\n (c) => ![\"accept\", \"reject\", \"reply\"].includes(c.type),\n );\n\n const all_errors: string[] = [];\n\n if (actions.length > 0) {\n all_errors.push(...this.validate_review_actions(actions));\n }\n if (edits.length > 0) {\n all_errors.push(...this.validate_edits(edits));\n }\n\n if (all_errors.length > 0) {\n throw new BatchValidationError(all_errors);\n }\n\n let applied_actions = 0,\n skipped_actions = 0;\n if (actions.length > 0) {\n const res = this.apply_review_actions(actions);\n applied_actions = res[0];\n skipped_actions = res[1];\n if (applied_actions > 0) {\n this.mapper[\"_build_map\"]();\n if (this.clean_mapper) this.clean_mapper[\"_build_map\"]();\n }\n }\n\n let applied_edits = 0,\n skipped_edits = 0;\n if (edits.length > 0) {\n const res = this.apply_edits(edits as any[]);\n applied_edits = res[0];\n skipped_edits = res[1];\n }\n\n return {\n actions_applied: applied_actions,\n actions_skipped: skipped_actions,\n edits_applied: applied_edits,\n edits_skipped: skipped_edits,\n skipped_details: this.skipped_details,\n };\n }\n\n public apply_edits(edits: any[]): [number, number] {\n let applied = 0;\n let skipped = 0;\n const resolved_edits: [any, string | null][] = [];\n\n for (const edit of edits) {\n if (\n edit._match_start_index !== undefined &&\n edit._match_start_index !== null\n ) {\n resolved_edits.push([edit, edit.new_text || null]);\n } else if (edit.type === \"insert_row\" || edit.type === \"delete_row\") {\n const [idx] = this.mapper.find_match_index(edit.target_text);\n if (idx !== -1) {\n edit._match_start_index = idx;\n resolved_edits.push([edit, null]);\n } else {\n skipped++;\n this.skipped_details.push(\n `- Failed to locate row target: '${(edit.target_text || \"\").substring(0, 40)}...'`,\n );\n }\n } else {\n const resolved = this._pre_resolve_heuristic_edit(edit);\n if (resolved) {\n if (Array.isArray(resolved)) {\n for (const r of resolved) resolved_edits.push([r, r.new_text]);\n } else {\n resolved_edits.push([resolved, (resolved as any).new_text]);\n }\n } else {\n skipped++;\n this.skipped_details.push(\n `- Failed to apply edit targeting: '${(edit.target_text || \"insertion\").substring(0, 40)}...'`,\n );\n }\n }\n }\n\n resolved_edits.sort(\n (a, b) => (b[0]._match_start_index || 0) - (a[0]._match_start_index || 0),\n );\n const occupied_ranges: [number, number][] = [];\n\n for (const [edit, orig_new] of resolved_edits) {\n const start = edit._match_start_index || 0;\n const end = start + (edit.target_text ? edit.target_text.length : 0);\n\n const overlaps = occupied_ranges.some(\n ([occ_start, occ_end]) => start < occ_end && end > occ_start,\n );\n if (overlaps) {\n skipped++;\n this.skipped_details.push(\n `- Skipped overlapping edit targeting: '${(edit.target_text || \"insertion\").substring(0, 40)}...'`,\n );\n continue;\n }\n\n let success = false;\n if (edit.type === \"modify\") {\n success = this._apply_single_edit_indexed(edit, orig_new, false);\n } else if (edit.type === \"insert_row\" || edit.type === \"delete_row\") {\n success = this._apply_table_edit(edit, false);\n }\n\n if (success) {\n applied++;\n occupied_ranges.push([start, end]);\n } else {\n skipped++;\n this.skipped_details.push(\n `- Failed to apply edit targeting: '${(edit.target_text || \"insertion\").substring(0, 40)}...'`,\n );\n }\n }\n\n return [applied, skipped];\n }\n\n public apply_review_actions(actions: any[]): [number, number] {\n let applied = 0;\n let skipped = 0;\n\n for (const action of actions) {\n const type = action.type;\n if (type === \"reply\") {\n const cid = action.target_id.replace(\"Com:\", \"\");\n const new_id = this.comments_manager.addComment(\n this.author,\n action.text,\n cid,\n );\n this._anchor_reply_comment(cid, new_id);\n applied++;\n continue;\n }\n\n const target_id = action.target_id.replace(\"Chg:\", \"\");\n const all_ins = findAllDescendants(this.doc.element, \"w:ins\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n const all_del = findAllDescendants(this.doc.element, \"w:del\").filter(\n (n) => n.getAttribute(\"w:id\") === target_id,\n );\n const all_nodes = [...all_ins, ...all_del];\n\n if (all_nodes.length === 0) {\n skipped++;\n this.skipped_details.push(\n `- Failed to apply action: Target ID ${action.target_id} not found.`,\n );\n continue;\n }\n\n for (const node of all_nodes) {\n const is_ins = node.tagName === \"w:ins\";\n const parent_tag = node.parentNode\n ? (node.parentNode as Element).tagName\n : \"\";\n const is_trPr = parent_tag === \"w:trPr\";\n\n if (type === \"accept\") {\n if (is_ins) {\n this._clean_wrapping_comments(node);\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n while (node.firstChild)\n node.parentNode?.insertBefore(node.firstChild, node);\n node.parentNode?.removeChild(node);\n }\n } else {\n this._clean_wrapping_comments(node);\n this._delete_comments_in_element(node);\n if (is_trPr) {\n const tr = node.parentNode?.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else {\n node.parentNode?.removeChild(node);\n }\n }\n } else if (type === \"reject\") {\n if (is_ins) {\n this._clean_wrapping_comments(node);\n this._delete_comments_in_element(node);\n if (is_trPr) {\n const tr = node.parentNode?.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else node.parentNode?.removeChild(node);\n } else {\n this._clean_wrapping_comments(node);\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n const delTexts = Array.from(\n node.getElementsByTagName(\"w:delText\"),\n );\n for (const dt of delTexts) {\n const t = dt.ownerDocument!.createElement(\"w:t\");\n t.textContent = dt.textContent;\n if (dt.hasAttribute(\"xml:space\"))\n t.setAttribute(\"xml:space\", \"preserve\");\n dt.parentNode?.replaceChild(t, dt);\n }\n while (node.firstChild)\n node.parentNode?.insertBefore(node.firstChild, node);\n node.parentNode?.removeChild(node);\n }\n }\n }\n }\n applied++;\n }\n return [applied, skipped];\n }\n\n private _apply_table_edit(edit: any, rebuild_map: boolean): boolean {\n const start_idx = edit._match_start_index || 0;\n const [anchor_run, anchor_para] = this.mapper.get_insertion_anchor(\n start_idx,\n rebuild_map,\n );\n\n let target_element: Element | null = null;\n if (anchor_run) target_element = anchor_run._element;\n else if (anchor_para) target_element = anchor_para._element;\n\n if (!target_element) return false;\n\n let tr: Element | null = target_element;\n while (tr && tr.tagName !== \"w:tr\") tr = tr.parentNode as Element;\n if (!tr) return false;\n\n if (edit.type === \"delete_row\") {\n let trPr = findChild(tr, \"w:trPr\");\n if (!trPr) {\n trPr = tr.ownerDocument!.createElement(\"w:trPr\");\n tr.insertBefore(trPr, tr.firstChild);\n }\n trPr.appendChild(this._create_track_change_tag(\"w:del\"));\n return true;\n } else if (edit.type === \"insert_row\") {\n const new_tr = tr.ownerDocument!.createElement(\"w:tr\");\n const trPr = tr.ownerDocument!.createElement(\"w:trPr\");\n new_tr.appendChild(trPr);\n trPr.appendChild(this._create_track_change_tag(\"w:ins\"));\n for (const cellText of edit.cells) {\n const tc = tr.ownerDocument!.createElement(\"w:tc\");\n const p = tr.ownerDocument!.createElement(\"w:p\");\n const r = tr.ownerDocument!.createElement(\"w:r\");\n const t = tr.ownerDocument!.createElement(\"w:t\");\n t.textContent = cellText;\n if (cellText.trim() !== cellText)\n t.setAttribute(\"xml:space\", \"preserve\");\n r.appendChild(t);\n p.appendChild(r);\n tc.appendChild(p);\n new_tr.appendChild(tc);\n }\n if (edit.position === \"above\") tr.parentNode?.insertBefore(new_tr, tr);\n else insertAfter(new_tr, tr);\n return true;\n }\n return false;\n }\n\n private _pre_resolve_heuristic_edit(edit: any): any {\n if (!edit.target_text) return null;\n\n let [start_idx, match_len] = this.mapper.find_match_index(edit.target_text);\n let use_clean_map = false;\n\n if (start_idx === -1) {\n if (!this.clean_mapper)\n this.clean_mapper = new DocumentMapper(this.doc, true);\n [start_idx, match_len] = this.clean_mapper.find_match_index(\n edit.target_text,\n );\n if (start_idx !== -1) use_clean_map = true;\n else return null;\n }\n\n const active_mapper = use_clean_map ? this.clean_mapper! : this.mapper;\n const effective_new_text = edit.new_text || \"\";\n const actual_doc_text = this.mapper.full_text.substring(\n start_idx,\n start_idx + match_len,\n );\n\n if (\n actual_doc_text === effective_new_text ||\n edit.target_text === effective_new_text\n ) {\n return {\n type: \"modify\",\n target_text: actual_doc_text,\n new_text: actual_doc_text,\n comment: edit.comment,\n _match_start_index: start_idx,\n _internal_op: \"COMMENT_ONLY\",\n _active_mapper_ref: active_mapper,\n };\n }\n\n let effective_op = \"\";\n let final_target = \"\";\n let final_new = \"\";\n let effective_start_idx = start_idx;\n\n if (effective_new_text.startsWith(actual_doc_text)) {\n effective_op = \"INSERTION\";\n final_new = effective_new_text.substring(actual_doc_text.length);\n effective_start_idx = start_idx + match_len;\n } else {\n const [prefix_len, suffix_len] = trim_common_context(\n actual_doc_text,\n effective_new_text,\n );\n const t_end = actual_doc_text.length - suffix_len;\n const n_end = effective_new_text.length - suffix_len;\n\n final_target = actual_doc_text.substring(prefix_len, t_end);\n final_new = effective_new_text.substring(prefix_len, n_end);\n effective_start_idx = start_idx + prefix_len;\n\n if (!final_target && final_new) effective_op = \"INSERTION\";\n else if (final_target && !final_new) effective_op = \"DELETION\";\n else if (final_target && final_new) effective_op = \"MODIFICATION\";\n else effective_op = \"COMMENT_ONLY\";\n }\n\n return {\n type: \"modify\",\n target_text: final_target,\n new_text: final_new,\n comment: edit.comment,\n _match_start_index: effective_start_idx,\n _internal_op: effective_op,\n _active_mapper_ref: active_mapper,\n };\n }\n\n private _apply_single_edit_indexed(\n edit: any,\n orig_new: string | null,\n rebuild_map: boolean,\n ): boolean {\n let op = edit._internal_op;\n const active_mapper = edit._active_mapper_ref || this.mapper;\n const start_idx = edit._match_start_index || 0;\n const length = edit.target_text ? edit.target_text.length : 0;\n\n const del_id = [\"DELETION\", \"MODIFICATION\"].includes(op)\n ? this._getNextId()\n : null;\n const ins_id = [\"INSERTION\", \"MODIFICATION\"].includes(op)\n ? this._getNextId()\n : null;\n\n if (op === \"COMMENT_ONLY\") {\n // Resolve the runs covering [start_idx, start_idx+length) and attach a\n // comment around them. No tracked-change is produced.\n const target_runs = active_mapper.find_target_runs_by_index(\n start_idx,\n length,\n rebuild_map,\n );\n if (target_runs.length === 0) return false;\n if (!edit.comment) return true;\n\n const first_el = target_runs[0]._element;\n const last_el = target_runs[target_runs.length - 1]._element;\n\n // Walk up from the first/last run to their containing <w:p>.\n let start_p: Element | null = first_el;\n while (start_p && start_p.tagName !== \"w:p\")\n start_p = start_p.parentNode as Element;\n let end_p: Element | null = last_el;\n while (end_p && end_p.tagName !== \"w:p\")\n end_p = end_p.parentNode as Element;\n if (!start_p || !end_p) return false;\n\n // first_el / last_el may live inside a <w:ins> or <w:del>. We need their\n // top-level child-of-paragraph ancestor so the comment markers become\n // siblings of those wrappers, not children.\n const ascend_to_paragraph_child = (el: Element, p: Element): Element => {\n let cur: Element = el;\n while (cur.parentNode && cur.parentNode !== p) {\n cur = cur.parentNode as Element;\n }\n return cur;\n };\n const first_anchor = ascend_to_paragraph_child(first_el, start_p);\n const last_anchor = ascend_to_paragraph_child(last_el, end_p);\n\n if (start_p === end_p) {\n this._attach_comment(start_p, first_anchor, last_anchor, edit.comment);\n } else {\n this._attach_comment_spanning(\n start_p,\n first_anchor,\n end_p,\n last_anchor,\n edit.comment,\n );\n }\n return true;\n }\n if (op === \"INSERTION\") {\n const [anchor_run, anchor_para] = active_mapper.get_insertion_anchor(\n start_idx,\n rebuild_map,\n );\n if (!anchor_run && !anchor_para) return false;\n\n const result = this._track_insert_multiline(\n edit.new_text || \"\",\n anchor_run,\n anchor_para,\n ins_id!,\n );\n\n if (!result.first_node) return false;\n\n // Place the inline <w:ins> (or block-mode first paragraph) into the DOM.\n // Block-mode first_node is already a freshly-inserted <w:p>; only the\n // inline case needs DOM splicing here.\n const is_inline_first = result.first_node.tagName === \"w:ins\";\n if (is_inline_first) {\n if (anchor_run) {\n insertAfter(result.first_node, anchor_run._element);\n } else if (anchor_para) {\n anchor_para._element.appendChild(result.first_node);\n }\n }\n\n // Attach the comment if requested. Anchor depends on whether we created\n // additional paragraphs.\n if (edit.comment) {\n const ascend_to_paragraph_child = (\n el: Element,\n p: Element,\n ): Element => {\n let cur: Element = el;\n while (cur.parentNode && cur.parentNode !== p) {\n cur = cur.parentNode as Element;\n }\n return cur;\n };\n\n if (result.last_p && result.last_ins) {\n // Multi-paragraph: anchor from first_node (in its host paragraph)\n // through last_ins (inside last_p).\n let start_p: Element | null = result.first_node;\n while (start_p && start_p.tagName !== \"w:p\")\n start_p = start_p.parentNode as Element;\n if (start_p) {\n let first_anchor_target = result.first_node;\n if (result.first_node.tagName === \"w:p\") {\n first_anchor_target = findAllDescendants(result.first_node, \"w:ins\")[0] || result.first_node;\n }\n const start_anchor = ascend_to_paragraph_child(\n first_anchor_target,\n start_p,\n );\n const end_anchor = ascend_to_paragraph_child(\n result.last_ins,\n result.last_p,\n );\n this._attach_comment_spanning(\n start_p,\n start_anchor,\n result.last_p,\n end_anchor,\n edit.comment,\n );\n }\n } else {\n // Inline only: anchor around first_node in its host paragraph.\n let host_p: Element | null = result.first_node;\n while (host_p && host_p.tagName !== \"w:p\")\n host_p = host_p.parentNode as Element;\n if (host_p) {\n let first_anchor_target = result.first_node;\n if (result.first_node.tagName === \"w:p\") {\n first_anchor_target = findAllDescendants(result.first_node, \"w:ins\")[0] || result.first_node;\n }\n const anchor = ascend_to_paragraph_child(first_anchor_target, host_p);\n this._attach_comment(host_p, anchor, anchor, edit.comment);\n }\n }\n }\n return true;\n }\n\n // DELETION / MODIFICATION\n const target_runs = active_mapper.find_target_runs_by_index(\n start_idx,\n length,\n rebuild_map,\n );\n const virtual_spans = active_mapper.get_virtual_spans_in_range(start_idx, length);\n\n if (target_runs.length === 0 && virtual_spans.length === 0) return false;\n\n const affected_ps = new Set<Element>();\n for (const run of target_runs) {\n let p: Element | null = run._element.parentNode as Element;\n while (p && p.tagName !== \"w:p\") p = p.parentNode as Element;\n if (p) affected_ps.add(p);\n }\n\n let first_del: Element | null = null;\n let last_del: Element | null = null;\n for (const run of target_runs) {\n const del_tag = this._create_track_change_tag(\"w:del\", \"\", del_id);\n const new_run = run._element.cloneNode(true) as Element;\n\n const tNodes = Array.from(new_run.getElementsByTagName(\"w:t\"));\n tNodes.forEach((t) => {\n const delText = new_run.ownerDocument!.createElement(\"w:delText\");\n delText.textContent = t.textContent;\n if (t.hasAttribute(\"xml:space\"))\n delText.setAttribute(\"xml:space\", \"preserve\");\n new_run.replaceChild(delText, t);\n });\n\n del_tag.appendChild(new_run);\n run._element.parentNode?.replaceChild(del_tag, run._element);\n if (first_del === null) first_del = del_tag;\n last_del = del_tag;\n }\n\n let ins_elem: Element | null = null;\n let mod_last_p: Element | null = null;\n let mod_last_ins: Element | null = null;\n\n if (op === \"MODIFICATION\" && edit.new_text && last_del) {\n // Resolve a paragraph anchor: the <w:p> hosting last_del.\n let mod_anchor_para_el: Element | null = last_del;\n while (mod_anchor_para_el && mod_anchor_para_el.tagName !== \"w:p\") {\n mod_anchor_para_el = mod_anchor_para_el.parentNode as Element | null;\n }\n const mod_anchor_para: Paragraph | null = mod_anchor_para_el\n ? new Paragraph(mod_anchor_para_el, null)\n : null;\n\n // The \"anchor run\" for style inheritance is the run we just deleted; reuse\n // the deleted run's rPr by sourcing the original target run if available.\n const style_source_run: Run | null =\n target_runs.length > 0 ? target_runs[target_runs.length - 1] : null;\n\n const result = this._track_insert_multiline(\n edit.new_text,\n style_source_run,\n mod_anchor_para,\n ins_id!,\n );\n\n if (result.first_node) {\n const is_inline_first = result.first_node.tagName === \"w:ins\";\n if (is_inline_first) {\n // Inline: place the first <w:ins> immediately after last_del.\n insertAfter(result.first_node, last_del);\n ins_elem = result.first_node;\n } else {\n // Block-mode first paragraph was already inserted after the anchor\n // paragraph by the helper. We still need ins_elem for comment fallback.\n ins_elem = result.last_ins;\n }\n mod_last_p = result.last_p;\n mod_last_ins = result.last_ins;\n }\n }\n\n // PHASE 2: OOXML Paragraph Merge Protocol\n if (op === \"DELETION\" || op === \"MODIFICATION\") {\n if (op === \"MODIFICATION\" && target_runs.length === 0 && virtual_spans.length > 0 && edit.new_text) {\n const first_span = virtual_spans[0];\n if (first_span.paragraph) {\n const p1_el = first_span.paragraph._element;\n const last_runs = findAllDescendants(p1_el, \"w:r\");\n const anchor = last_runs.length > 0 ? new Run(last_runs[last_runs.length - 1], first_span.paragraph) : null;\n \n const result = this._track_insert_multiline(\n edit.new_text,\n anchor,\n first_span.paragraph,\n ins_id!\n );\n if (result.first_node) {\n p1_el.appendChild(result.first_node);\n }\n }\n }\n\n for (const span of [...virtual_spans].reverse()) {\n if (span.paragraph) {\n const p1_element = span.paragraph._element;\n let p2_element = getNextElement(p1_element);\n while (p2_element && p2_element.tagName !== \"w:p\") {\n p2_element = getNextElement(p2_element);\n }\n\n if (p2_element && p2_element.tagName === \"w:p\") {\n let pPr = findChild(p1_element, \"w:pPr\");\n if (!pPr) {\n pPr = p1_element.ownerDocument!.createElement(\"w:pPr\") as Element;\n p1_element.insertBefore(pPr, p1_element.firstChild as Node | null);\n }\n let rPr = findChild(pPr!, \"w:rPr\");\n if (!rPr) {\n rPr = p1_element.ownerDocument!.createElement(\"w:rPr\") as Element;\n pPr!.appendChild(rPr);\n }\n const del_mark = this._create_track_change_tag(\"w:del\");\n rPr!.appendChild(del_mark);\n\n const children = Array.from(p2_element.childNodes);\n for (const child of children) {\n if (child.nodeType === 1 && (child as Element).tagName === \"w:pPr\") {\n continue;\n }\n p1_element.appendChild(child);\n }\n\n if (p2_element.parentNode) {\n p2_element.parentNode.removeChild(p2_element);\n }\n }\n }\n }\n }\n\n // Attach comment around the modification or deletion if requested.\n if (edit.comment && first_del !== null) {\n // Resolve the comment END anchor. For multi-paragraph modifications,\n // the end anchor lives in the LAST inserted paragraph (mod_last_p);\n // otherwise it's the inline ins/del in the source paragraph.\n let end_anchor_el: Element;\n let end_p: Element | null;\n\n if (mod_last_p && mod_last_ins) {\n end_anchor_el = mod_last_ins;\n end_p = mod_last_p;\n } else {\n const final_anchor: Element = ins_elem !== null ? ins_elem : last_del!;\n end_anchor_el = final_anchor;\n end_p = final_anchor;\n while (end_p && end_p.tagName !== \"w:p\")\n end_p = end_p.parentNode as Element | null;\n }\n\n let start_p: Element | null = first_del;\n while (start_p && start_p.tagName !== \"w:p\")\n start_p = start_p.parentNode as Element | null;\n if (!start_p || !end_p) return true;\n\n const ascend_to_paragraph_child = (el: Element, p: Element): Element => {\n let cur: Element = el;\n while (cur.parentNode && cur.parentNode !== p) {\n cur = cur.parentNode as Element;\n }\n return cur;\n };\n const start_anchor = ascend_to_paragraph_child(first_del, start_p);\n const end_anchor = ascend_to_paragraph_child(end_anchor_el, end_p);\n\n if (start_p === end_p) {\n this._attach_comment(start_p, start_anchor, end_anchor, edit.comment);\n } else {\n this._attach_comment_spanning(\n start_p,\n start_anchor,\n end_p,\n end_anchor,\n edit.comment,\n );\n }\n }\n\n // PHASE 2: Check for orphaned paragraphs with zero visible content remaining\n for (const p_elem of affected_ps) {\n let has_visible = false;\n for (const tag of [\"w:t\", \"w:tab\", \"w:br\"]) {\n const nodes = findAllDescendants(p_elem, tag);\n for (const node of nodes) {\n let is_deleted = false;\n let curr = node.parentNode as Element | null;\n while (curr && curr !== p_elem.parentNode) {\n if (curr.tagName === \"w:del\") {\n is_deleted = true;\n break;\n }\n curr = curr.parentNode as Element | null;\n }\n if (!is_deleted) {\n if (tag === \"w:t\" && !node.textContent) continue;\n has_visible = true;\n break;\n }\n }\n if (has_visible) break;\n }\n\n if (!has_visible) {\n let pPr = findChild(p_elem, \"w:pPr\");\n if (!pPr) {\n pPr = p_elem.ownerDocument!.createElement(\"w:pPr\") as Element;\n p_elem.insertBefore(pPr, p_elem.firstChild as Node | null);\n }\n let rPr = findChild(pPr!, \"w:rPr\");\n if (!rPr) {\n rPr = p_elem.ownerDocument!.createElement(\"w:rPr\") as Element;\n pPr!.appendChild(rPr);\n }\n if (!findChild(rPr!, \"w:del\")) {\n const del_mark = this._create_track_change_tag(\"w:del\");\n rPr!.appendChild(del_mark);\n }\n }\n }\n\n return true;\n }\n}\n","/**\n * Stateless paginator for projected DOCX Markdown.\n */\n\nconst PAGE_TARGET_CHARS = 19_000;\nconst APPENDIX_MARKER = '<!-- READONLY_BOUNDARY_START -->';\n\nconst _CRITIC_TOKENS: Record<string, string> = {\n '{++': '++}',\n '{--': '--}',\n '{==': '==}',\n '{>>': '<<}',\n};\n\nconst _CHG_ID_PATTERN = /\\bChg:(\\d+)\\b/g;\n\nexport interface PageInfo {\n page: number;\n total_pages: number;\n has_next: boolean;\n has_prev: boolean;\n tracked_change_count: number;\n page_content: string;\n}\n\nexport interface PaginationResult {\n pages: PageInfo[];\n total_pages: number;\n body_pages: string[];\n body_page_offsets: number[];\n}\n\nexport function split_structural_appendix(markdown: string): [string, string] {\n if (!markdown) return ['', ''];\n\n const idx = markdown.indexOf(APPENDIX_MARKER);\n if (idx === -1) return [markdown, ''];\n\n const line_start = markdown.lastIndexOf('\\n', idx) + 1;\n const body = markdown.substring(0, line_start).trimEnd();\n const appendix = markdown.substring(line_start);\n\n return [body, appendix];\n}\n\nexport function paginate(markdown_body: string, structural_appendix: string = ''): PaginationResult {\n if (!markdown_body) {\n const appendix_clean = structural_appendix ? structural_appendix.trim() : '';\n const content = appendix_clean;\n return {\n pages: [{\n page: 1,\n total_pages: 1,\n has_next: false,\n has_prev: false,\n tracked_change_count: _count_tracked_changes(content),\n page_content: content,\n }],\n total_pages: 1,\n body_pages: [''],\n body_page_offsets: [0],\n };\n }\n\n const block_records = _tokenize_into_atomic_blocks(markdown_body);\n const [body_pages, body_page_offsets] = _assemble_pages(block_records);\n\n let final_pages: string[];\n if (structural_appendix && structural_appendix.trim()) {\n const appendix = structural_appendix.trim();\n final_pages = body_pages.map(bp => bp ? `${bp}\\n\\n${appendix}` : appendix);\n } else {\n final_pages = [...body_pages];\n }\n\n const total = final_pages.length;\n const page_infos: PageInfo[] = final_pages.map((content, i) => ({\n page: i + 1,\n total_pages: total,\n has_next: (i + 1 < total),\n has_prev: (i + 1 > 1),\n tracked_change_count: _count_tracked_changes(content),\n page_content: content,\n }));\n\n return {\n pages: page_infos,\n total_pages: total,\n body_pages,\n body_page_offsets,\n };\n}\n\nfunction _tokenize_into_atomic_blocks(markdown_body: string): [string, number][] {\n const raw_blocks = _split_on_safe_paragraph_breaks(markdown_body);\n return _merge_footnote_sections(raw_blocks);\n}\n\nfunction _split_on_safe_paragraph_breaks(text: string): [string, number][] {\n const counters: Record<string, number> = { '++}': 0, '--}': 0, '==}': 0, '<<}': 0 };\n const blocks: [string, number][] = [];\n let block_start = 0;\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n let matched_open = false;\n for (const [open_tok, close_tok] of Object.entries(_CRITIC_TOKENS)) {\n if (text.startsWith(open_tok, i)) {\n counters[close_tok]++;\n i += open_tok.length;\n matched_open = true;\n break;\n }\n }\n if (matched_open) continue;\n\n let matched_close = false;\n for (const close_tok of Object.values(_CRITIC_TOKENS)) {\n if (text.startsWith(close_tok, i)) {\n if (counters[close_tok] > 0) counters[close_tok]--;\n i += close_tok.length;\n matched_close = true;\n break;\n }\n }\n if (matched_close) continue;\n\n if (text[i] === '\\n' && i + 1 < n && text[i + 1] === '\\n') {\n if (Object.values(counters).every(c => c === 0)) {\n const block_text = text.substring(block_start, i);\n if (block_text) blocks.push([block_text, block_start]);\n\n let j = i;\n while (j < n && text[j] === '\\n') j++;\n i = j;\n block_start = i;\n continue;\n }\n }\n\n i++;\n }\n\n if (block_start < n) {\n const block_text = text.substring(block_start, n);\n if (block_text) blocks.push([block_text, block_start]);\n }\n\n return blocks;\n}\n\nfunction _merge_footnote_sections(blocks: [string, number][]): [string, number][] {\n if (!blocks.length) return blocks;\n\n const merged: [string, number][] = [];\n let i = 0;\n\n while (i < blocks.length) {\n const [block_text, block_offset] = blocks[i];\n const stripped = block_text.trimStart();\n const is_section_header = stripped.startsWith('## Footnotes') || stripped.startsWith('## Endnotes');\n\n if (!is_section_header) {\n merged.push([block_text, block_offset]);\n i++;\n continue;\n }\n\n let accumulated_text = block_text;\n let j = i + 1;\n while (j < blocks.length) {\n const [next_text] = blocks[j];\n const next_stripped = next_text.trimStart();\n if (next_stripped.startsWith('[^fn-') || next_stripped.startsWith('[^en-')) {\n accumulated_text = `${accumulated_text}\\n\\n${next_text}`;\n j++;\n } else {\n break;\n }\n }\n\n merged.push([accumulated_text, block_offset]);\n i = j;\n }\n\n return merged;\n}\n\nfunction _assemble_pages(block_records: [string, number][]): [string[], number[]] {\n if (!block_records.length) return [[''], [0]];\n\n const pages: string[] = [];\n const page_starts: number[] = [];\n\n let current_blocks: string[] = [];\n let current_size = 0;\n let current_start = -1;\n\n const flush_current = () => {\n if (current_blocks.length > 0) {\n pages.push(current_blocks.join('\\n\\n'));\n page_starts.push(current_start);\n }\n current_blocks = [];\n current_size = 0;\n current_start = -1;\n };\n\n for (const [block_text, block_offset] of block_records) {\n const block_size = block_text.length;\n const added_size = block_size + (current_blocks.length > 0 ? 2 : 0);\n\n if (current_blocks.length > 0 && current_size + added_size > PAGE_TARGET_CHARS) {\n flush_current();\n }\n\n if (current_blocks.length === 0 && block_size > PAGE_TARGET_CHARS) {\n pages.push(block_text);\n page_starts.push(block_offset);\n continue;\n }\n\n if (current_blocks.length === 0) current_start = block_offset;\n current_blocks.push(block_text);\n current_size += current_size > 0 ? added_size : block_size;\n }\n\n flush_current();\n\n if (!pages.length) return [[''], [0]];\n return [pages, page_starts];\n}\n\nfunction _count_tracked_changes(page_content: string): number {\n const matches = [...page_content.matchAll(_CHG_ID_PATTERN)];\n const distinct = new Set(matches.map(m => m[1]));\n return distinct.size;\n}","import { DocumentObject } from './docx/bridge.js';\nimport { Paragraph, Run } from './docx/primitives.js';\nimport { iter_block_items, get_run_text } from './utils/docx.js';\nimport { findAllDescendants } from './docx/dom.js';\n\nfunction boundedLevenshtein(a: string, b: string, maxDist: number = 2): number {\n if (a === b) return 0;\n if (Math.abs(a.length - b.length) > maxDist) return maxDist + 1;\n if (a.length === 0) return b.length <= maxDist ? b.length : maxDist + 1;\n if (b.length === 0) return a.length <= maxDist ? a.length : maxDist + 1;\n\n if (a.length > b.length) {\n const temp = a;\n a = b;\n b = temp;\n }\n\n let row = Array.from({ length: a.length + 1 }, (_, i) => i);\n\n for (let i = 1; i <= b.length; i++) {\n const newRow = [i];\n let minInRow = i;\n for (let j = 1; j <= a.length; j++) {\n const cost = a[j - 1] === b[i - 1] ? 0 : 1;\n const val = Math.min(\n row[j] + 1,\n newRow[j - 1] + 1,\n row[j - 1] + cost\n );\n newRow.push(val);\n if (val < minInRow) minInRow = val;\n }\n if (minInRow > maxDist) return maxDist + 1;\n row = newRow;\n }\n return row[a.length] <= maxDist ? row[a.length] : maxDist + 1;\n}\n\nfunction _get_paragraph_text(p: Paragraph): string {\n let text = '';\n const runs = findAllDescendants(p._element, 'w:r');\n for (const r of runs) {\n text += get_run_text(new Run(r, p));\n }\n return text;\n}\n\nexport function extract_all_domain_metadata(\n doc: DocumentObject,\n base_text: string\n): [Record<string, { count: number }>, string[], Record<string, { anchored_to: string; referenced_from: string[] }>] {\n const definitions: Record<string, { count: number }> = {};\n const duplicates = new Set<string>();\n const raw_anchors: Record<string, { anchored_to: string; referenced_from: string[] }> = {};\n const raw_references: [string, string][] = [];\n\n const leading_re = /^(?:[\\d.\\-()a-zA-Z]+\\s*)?[\"“]([A-Z][A-Za-z0-9\\s\\-&'’]{1,60})[\"”]/;\n const inline_re = /\\([^)]*?[\"“]([A-Z][A-Za-z0-9\\s\\-&'’]{1,60})[\"”][^)]*?\\)/g;\n\n for (const item of iter_block_items(doc)) {\n if (!(item instanceof Paragraph)) continue;\n\n const text = _get_paragraph_text(item).trim();\n if (!text) continue;\n\n const extracted_terms: string[] = [];\n const leading_match = text.match(leading_re);\n if (leading_match) extracted_terms.push(leading_match[1].trim());\n\n const inline_matches = text.matchAll(inline_re);\n for (const m of inline_matches) {\n extracted_terms.push(m[1].trim());\n }\n\n for (const term of extracted_terms) {\n if (definitions[term]) duplicates.add(term);\n else definitions[term] = { count: 0 };\n }\n\n const short_text = text.length > 60 ? text.substring(0, 60) + '...' : text;\n\n const nodes = findAllDescendants(item._element, '*');\n for (const node of nodes) {\n if (node.tagName === 'w:bookmarkStart') {\n const b_name = node.getAttribute('w:name');\n if (b_name && (!b_name.startsWith('_') || b_name.startsWith('_Ref'))) {\n if (!raw_anchors[b_name]) {\n raw_anchors[b_name] = { anchored_to: short_text, referenced_from: [] };\n }\n }\n }\n\n let target: string | null = null;\n if (node.tagName === 'w:fldSimple') {\n const instr = node.getAttribute('w:instr') || '';\n const parts = instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === 'REF') target = parts[1];\n } else if (node.tagName === 'w:instrText') {\n const instr = node.textContent || '';\n const parts = instr.trim().split(/\\s+/);\n if (parts.length > 1 && parts[0] === 'REF') target = parts[1];\n }\n\n if (target) raw_references.push([target, short_text]);\n }\n }\n\n for (const [target, ref_text] of raw_references) {\n if (raw_anchors[target]) {\n raw_anchors[target].referenced_from.push(ref_text);\n }\n }\n\n const diagnostics: string[] = [];\n\n const def_keys = Object.keys(definitions);\n if (def_keys.length > 0) {\n const sorted_terms = def_keys.sort((a, b) => b.length - a.length);\n const escapeRegExp = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const alt = sorted_terms.map(escapeRegExp).join('|');\n const usage_pattern = new RegExp(`(?<![\"“])\\\\b(${alt})\\\\b(?![”\"])`, 'g');\n\n for (const m of base_text.matchAll(usage_pattern)) {\n const matched_term = m[1];\n if (definitions[matched_term]) definitions[matched_term].count++;\n }\n\n for (const term of def_keys) {\n if (definitions[term].count === 0) {\n delete definitions[term];\n duplicates.delete(term);\n }\n }\n }\n\n for (const term of duplicates) {\n diagnostics.push(`[Error] Duplicate Definition: '${term}' is defined multiple times.`);\n }\n\n const stop_words = new Set([\n \"The\", \"This\", \"That\", \"Such\", \"A\", \"An\", \"Any\", \"All\", \"Some\", \"No\",\n \"Every\", \"Each\", \"As\", \"In\", \"Of\", \"For\", \"To\", \"On\", \"By\", \"With\"\n ]);\n\n const all_cap_pattern = /\\b[A-Z][a-zA-Z]*(?:\\s+[A-Z][a-zA-Z]*)*\\b/g;\n const all_caps = new Set(base_text.match(all_cap_pattern) || []);\n\n const valid_terms = new Set(Object.keys(definitions));\n const terms_by_first_letter: Record<string, string[]> = {};\n for (const term of valid_terms) {\n const fl = term[0].toLowerCase();\n if (!terms_by_first_letter[fl]) terms_by_first_letter[fl] = [];\n terms_by_first_letter[fl].push(term);\n }\n\n const candidates_by_term: Record<string, string[]> = {};\n\n for (const raw_candidate of all_caps) {\n let candidate = raw_candidate.trim();\n const words = candidate.split(/\\s+/);\n while (words.length > 0) {\n const first = words[0];\n const title = first.charAt(0).toUpperCase() + first.slice(1).toLowerCase();\n if (stop_words.has(title)) words.shift();\n else break;\n }\n candidate = words.join(' ');\n\n if (candidate.length < 4) continue;\n if (valid_terms.has(candidate)) continue;\n\n const first_letter = candidate[0].toLowerCase();\n let candidate_terms = terms_by_first_letter[first_letter] || [];\n\n if (candidate.length > 5) {\n for (const [k, v] of Object.entries(terms_by_first_letter)) {\n if (k !== first_letter) candidate_terms = candidate_terms.concat(v);\n }\n }\n\n for (const term of candidate_terms) {\n if (Math.abs(candidate.length - term.length) > 2) continue;\n if (candidate === term + 's' || candidate === term + 'es') continue;\n if (term === candidate + 's' || term === candidate + 'es') continue;\n\n const dist = boundedLevenshtein(candidate, term, 2);\n if (dist === 0 || dist > 2) continue;\n\n if (term.length <= 5) {\n if (dist > 1) continue;\n if (candidate[0].toLowerCase() !== term[0].toLowerCase()) continue;\n }\n\n if (!candidates_by_term[term]) candidates_by_term[term] = [];\n if (!candidates_by_term[term].includes(candidate)) candidates_by_term[term].push(candidate);\n }\n }\n\n for (const [term, candidates] of Object.entries(candidates_by_term)) {\n candidates.sort();\n const c_str = candidates.map(c => `'${c}'`).join(', ');\n diagnostics.push(`[Info] Possible Typos for '${term}': Found ${c_str}`);\n }\n\n function diag_sort_key(msg: string) {\n if (msg.startsWith('[Error]')) return 0;\n if (msg.startsWith('[Warning]')) return 1;\n return 2;\n }\n\n diagnostics.sort((a, b) => {\n const keyA = diag_sort_key(a);\n const keyB = diag_sort_key(b);\n if (keyA !== keyB) return keyA - keyB;\n return a.localeCompare(b);\n });\n\n return [definitions, diagnostics, raw_anchors];\n}\n\nexport function build_structural_appendix(doc: DocumentObject, base_text: string): string {\n const [defs, diagnostics, anchors] = extract_all_domain_metadata(doc, base_text);\n\n const lines: string[] = [\n \"\\n\\n---\",\n \"\",\n \"<!-- READONLY_BOUNDARY_START -->\",\n \"# Document Structure (Read-Only)\",\n \"The content below is metadata describing the document's reference structure. Do not include this section in any tracked changes or edits \\u2014 it is for your context only and will be discarded on write.\"\n ];\n\n let has_content = false;\n\n if (Object.keys(defs).length > 0) {\n has_content = true;\n lines.push(\"\\n## Defined Terms\");\n for (const [term, data] of Object.entries(defs)) {\n lines.push(`- \"${term}\" \\u2014 used ${data.count} times.`);\n }\n }\n\n if (diagnostics.length > 0) {\n has_content = true;\n lines.push(\"\\n## Semantic Diagnostics\");\n for (const diag of diagnostics) {\n lines.push(`- ${diag}`);\n }\n }\n\n if (Object.keys(anchors).length > 0) {\n has_content = true;\n lines.push(\"\\n## Named Anchors\");\n for (const [b_name, data] of Object.entries(anchors)) {\n lines.push(`- ${b_name} \\u2192 Anchored to: \"${data.anchored_to}\"`);\n for (const ref of data.referenced_from) {\n lines.push(` - Referenced from: \"${ref}\"`);\n }\n }\n }\n\n if (has_content) {\n return lines.join('\\n');\n }\n return \"\";\n}","import { DocumentObject } from './docx/bridge.js';\nimport { Paragraph, Table, Run, DocxEvent } from './docx/primitives.js';\nimport { \n _get_style_cache, get_paragraph_prefix, is_heading_paragraph, is_native_heading, \n get_run_style_markers, get_run_text, apply_formatting_to_segments, \n iter_block_items, iter_document_parts, iter_paragraph_content\n} from './utils/docx.js';\nimport { findChild } from './docx/dom.js';\nimport { build_structural_appendix } from './domain.js';\nimport { extract_comments_data } from './comments.js';\n\nexport async function extractTextFromBuffer(buffer: Buffer, cleanView = false): Promise<string> {\n const doc = await DocumentObject.load(buffer);\n return _extractTextFromDoc(doc, cleanView);\n}\n\nexport function _extractTextFromDoc(doc: DocumentObject, cleanView = false, includeAppendix = true): string {\n const comments_map = extract_comments_data(doc.pkg);\n\n const full_text: string[] = [];\n let cursor = 0;\n\n for (const part of iter_document_parts(doc)) {\n const part_cursor = full_text.length > 0 ? cursor + 2 : cursor;\n const part_text = _extract_blocks(part, comments_map, cleanView, part_cursor);\n if (part_text) {\n if (full_text.length > 0) cursor += 2;\n full_text.push(part_text);\n cursor += part_text.length;\n }\n }\n\n let base_text = full_text.join('\\n\\n');\n\n if (includeAppendix) {\n const appendix = build_structural_appendix(doc, base_text);\n if (appendix) base_text += appendix;\n }\n\n return base_text;\n}\n\nfunction _extract_blocks(container: any, comments_map: any, cleanView: boolean, cursor: number): string {\n const part = container.part || container;\n const [style_cache, default_pstyle] = _get_style_cache(part);\n\n const blocks: string[] = [];\n let local_cursor = cursor;\n let is_first_block = true;\n let is_first_para = true;\n\n if (container.constructor && container.constructor.name === 'NotesPart') {\n const header = container.note_type === 'fn' ? '## Footnotes' : '## Endnotes';\n const sep = `---\\n${header}`;\n blocks.push(sep);\n local_cursor += sep.length;\n is_first_block = false;\n }\n\n for (const item of iter_block_items(container)) {\n if (!is_first_block) local_cursor += 2;\n const block_start = local_cursor;\n\n if (item.constructor.name === 'FootnoteItem') {\n const fn_text = _extract_blocks(item, comments_map, cleanView, block_start);\n if (fn_text) {\n blocks.push(fn_text);\n local_cursor = block_start + fn_text.length;\n is_first_block = false;\n } else if (!is_first_block) {\n local_cursor -= 2;\n }\n } else if (item instanceof Paragraph) {\n let prefix = get_paragraph_prefix(item, style_cache, default_pstyle);\n if (is_first_para && container.constructor.name === 'FootnoteItem') {\n prefix = `[^${container.note_type}-${container.id}]: ` + prefix;\n }\n const p_text = build_paragraph_text(item, comments_map, cleanView, style_cache, default_pstyle);\n const full_block = prefix + p_text;\n blocks.push(full_block);\n local_cursor = block_start + full_block.length;\n is_first_para = false;\n is_first_block = false;\n } else if (item instanceof Table) {\n const table_text = extract_table(item, comments_map, cleanView, block_start);\n if (table_text) {\n blocks.push(table_text);\n local_cursor = block_start + table_text.length;\n is_first_block = false;\n } else if (!is_first_block) {\n local_cursor -= 2;\n }\n is_first_para = false;\n }\n }\n\n return blocks.join('\\n\\n');\n}\n\nexport function extract_table(table: Table, comments_map: any, cleanView: boolean, cursor: number): string {\n const rows_text: string[] = [];\n let rows_processed = 0;\n let local_cursor = cursor;\n\n for (const row of table.rows) {\n const cell_texts: string[] = [];\n const seen_cells = new Set();\n\n const trPr = findChild(row._element, 'w:trPr');\n const ins = trPr ? findChild(trPr, 'w:ins') : null;\n const del_node = trPr ? findChild(trPr, 'w:del') : null;\n\n if (cleanView && del_node) continue;\n\n const row_start = local_cursor + (rows_processed > 0 ? 1 : 0);\n const wrapper_prefix_len = (!cleanView && ins) ? 4 : (!cleanView && del_node) ? 4 : 0;\n \n let cell_cursor = row_start + wrapper_prefix_len;\n let first_cell = true;\n\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n if (!first_cell) cell_cursor += 3;\n \n const cell_content = _extract_blocks(cell, comments_map, cleanView, cell_cursor);\n cell_texts.push(cell_content);\n cell_cursor += cell_content.length;\n first_cell = false;\n }\n\n let row_str = cell_texts.join(' | ');\n\n if (!cleanView) {\n if (ins) row_str = `{++ ${row_str} |Chg:${ins.getAttribute('w:id')}++}`;\n else if (del_node) row_str = `{-- ${row_str} |Chg:${del_node.getAttribute('w:id')}--}`;\n }\n\n rows_text.push(row_str);\n local_cursor = row_start + row_str.length;\n rows_processed++;\n }\n\n return rows_text.join('\\n');\n}\n\nexport function build_paragraph_text(\n paragraph: Paragraph, comments_map: any, cleanView: boolean,\n style_cache?: any, default_pstyle?: string | null\n): string {\n const parts: string[] = [];\n const active_ins: Record<string, DocxEvent> = {};\n const active_del: Record<string, DocxEvent> = {};\n const active_comments: Set<string> = new Set();\n const active_fmt: Record<string, DocxEvent> = {};\n const deferred_meta_states: any[] = [];\n\n let pending_text = '';\n let current_wrappers: [string, string] = ['', ''];\n let current_style: [string, string] = ['', ''];\n\n const items = Array.from(iter_paragraph_content(paragraph));\n const is_heading = is_heading_paragraph(paragraph, style_cache, default_pstyle);\n const native_heading = is_native_heading(paragraph, style_cache, default_pstyle);\n let leading_strip_active = is_heading;\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n if (item instanceof Run) {\n const [prefix, suffix] = get_run_style_markers(item, native_heading);\n const text = get_run_text(item);\n\n if (cleanView && Object.keys(active_del).length > 0) continue;\n\n if (leading_strip_active) {\n if (!text || !text.trim()) continue;\n leading_strip_active = false;\n }\n\n const seg = apply_formatting_to_segments(text, prefix, suffix);\n if (seg) {\n const new_wrappers = cleanView ? ['', ''] as [string, string] : _get_wrappers(active_ins, active_del, active_comments, active_fmt);\n const new_style: [string, string] = [prefix, suffix];\n\n if (pending_text && new_wrappers[0] === current_wrappers[0] && new_wrappers[1] === current_wrappers[1]) {\n if (new_style[0] === current_style[0] && new_style[1] === current_style[1] && current_style[0] !== '' && \n pending_text.endsWith(current_style[1]) && seg.startsWith(new_style[0])) {\n pending_text = pending_text.slice(0, -current_style[1].length) + seg.slice(new_style[0].length);\n } else {\n pending_text += seg;\n }\n current_style = new_style;\n } else {\n if (pending_text) parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = seg;\n current_wrappers = new_wrappers;\n current_style = new_style;\n }\n\n if (!cleanView) {\n const has_meta = Object.keys(active_ins).length > 0 || Object.keys(active_del).length > 0 || active_comments.size > 0 || Object.keys(active_fmt).length > 0;\n if (has_meta) {\n deferred_meta_states.push([{...active_ins}, {...active_del}, new Set(active_comments), {...active_fmt}]);\n }\n\n let should_defer = false;\n const is_redline = Object.keys(active_ins).length > 0 || Object.keys(active_del).length > 0 || Object.keys(active_fmt).length > 0;\n\n if (is_redline) {\n let j = i + 1;\n let next_is_redline = false;\n let temp_ins = Object.keys(active_ins).length;\n let temp_del = Object.keys(active_del).length;\n let temp_fmt = Object.keys(active_fmt).length;\n\n while (j < items.length) {\n const next_item = items[j];\n if (next_item instanceof Run) {\n if (!get_run_text(next_item)) { j++; continue; }\n if (temp_ins > 0 || temp_del > 0 || temp_fmt > 0) next_is_redline = true;\n break;\n } else {\n const ev = next_item as DocxEvent;\n if (ev.type === 'ins_start') temp_ins++;\n else if (ev.type === 'ins_end') temp_ins = Math.max(0, temp_ins - 1);\n else if (ev.type === 'del_start') temp_del++;\n else if (ev.type === 'del_end') temp_del = Math.max(0, temp_del - 1);\n else if (ev.type === 'fmt_start') temp_fmt++;\n else if (ev.type === 'fmt_end') temp_fmt = Math.max(0, temp_fmt - 1);\n }\n j++;\n }\n if (next_is_redline) should_defer = true;\n }\n\n if (!should_defer && deferred_meta_states.length > 0) {\n const meta_block = _build_merged_meta_block(deferred_meta_states, comments_map);\n if (meta_block) {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`{>>${meta_block}<<}`);\n }\n deferred_meta_states.length = 0; // clear\n }\n }\n }\n } else {\n const ev = item as DocxEvent;\n leading_strip_active = false;\n \n if (!['ins_start', 'ins_end', 'del_start', 'del_end', 'fmt_start', 'fmt_end'].includes(ev.type)) {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n }\n\n if (ev.type === 'start') active_comments.add(ev.id);\n else if (ev.type === 'end') active_comments.delete(ev.id);\n else if (ev.type === 'ins_start') active_ins[ev.id] = ev;\n else if (ev.type === 'ins_end') delete active_ins[ev.id];\n else if (ev.type === 'del_start') active_del[ev.id] = ev;\n else if (ev.type === 'del_end') delete active_del[ev.id];\n else if (ev.type === 'fmt_start') active_fmt[ev.id] = ev;\n else if (ev.type === 'fmt_end') delete active_fmt[ev.id];\n else if (ev.type === 'footnote' || ev.type === 'endnote') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`[^${ev.type === 'footnote' ? 'fn' : 'en'}-${ev.id}]`);\n } else if (ev.type === 'hyperlink_start') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push('[');\n } else if (ev.type === 'hyperlink_end') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`](${ev.date})`);\n } else if (ev.type === 'xref_start') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push('[~');\n } else if (ev.type === 'xref_end') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`~](#${ev.id})`);\n } else if (ev.type === 'bookmark') {\n if (pending_text) {\n parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n pending_text = '';\n current_wrappers = ['', ''];\n current_style = ['', ''];\n }\n parts.push(`{#${ev.id}}`);\n }\n }\n }\n\n if (pending_text) parts.push(`${current_wrappers[0]}${pending_text}${current_wrappers[1]}`);\n\n if (deferred_meta_states.length > 0) {\n const meta_block = _build_merged_meta_block(deferred_meta_states, comments_map);\n if (meta_block) parts.push(`{>>${meta_block}<<}`);\n }\n\n return parts.join('');\n}\n\nfunction _get_wrappers(ins: any, del: any, comments: Set<string>, fmt: any): [string, string] {\n if (Object.keys(del).length > 0) return ['{--', '--}'];\n if (Object.keys(ins).length > 0) return ['{++', '++}'];\n if (comments.size > 0 || Object.keys(fmt).length > 0) return ['{==', '==}'];\n return ['', ''];\n}\n\nfunction _build_merged_meta_block(states_list: any[], comments_map: any): string {\n const change_lines: string[] = [];\n const comment_lines: string[] = [];\n const seen_sigs = new Set<string>();\n\n for (const [ins_map, del_map, comments_set, fmt_map] of states_list) {\n for (const [uid, meta] of Object.entries(ins_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n change_lines.push(`[${sig} insert] ${meta.author || 'Unknown'}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(del_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n change_lines.push(`[${sig} delete] ${meta.author || 'Unknown'}`);\n seen_sigs.add(sig);\n }\n }\n for (const [uid, meta] of Object.entries(fmt_map as Record<string, DocxEvent>)) {\n const sig = `Chg:${uid}`;\n if (!seen_sigs.has(sig)) {\n change_lines.push(`[${sig} format] ${meta.author || 'Unknown'}`);\n seen_sigs.add(sig);\n }\n }\n\n // Threaded Comment Resolution Tree\n const children_map: Record<string, string[]> = {};\n for (const [c_id, data] of Object.entries(comments_map as Record<string, any>)) {\n const p_id = data.parent_id;\n if (p_id) {\n if (!children_map[p_id]) children_map[p_id] = [];\n children_map[p_id].push(c_id);\n }\n }\n\n function render_comment(cid: string) {\n if (!comments_map[cid]) return;\n const sig = `Com:${cid}`;\n if (seen_sigs.has(sig)) return;\n\n const data = comments_map[cid];\n let header = `[${sig}] ${data.author}`;\n if (data.date) header += ` @ ${data.date}`;\n if (data.resolved) header += `(RESOLVED)`;\n comment_lines.push(`${header}: ${data.text}`);\n seen_sigs.add(sig);\n\n if (children_map[cid]) {\n const children = children_map[cid].sort((a, b) => (comments_map[a]?.date || '').localeCompare(comments_map[b]?.date || ''));\n for (const child_id of children) {\n render_comment(child_id);\n }\n }\n }\n\n const sorted_ids = Array.from(comments_set as Set<string>).sort();\n for (const c_id of sorted_ids) {\n render_comment(c_id);\n }\n }\n\n return [...change_lines, ...comment_lines].join('\\n');\n}","/**\n * Structural outline extractor.\n */\n\nimport { DocumentObject } from \"./docx/bridge.js\";\nimport { Paragraph, Table, DocxEvent } from \"./docx/primitives.js\";\nimport { build_paragraph_text, extract_table } from \"./ingest.js\";\nimport { extract_comments_data } from \"./comments.js\";\nimport { findChild } from \"./docx/dom.js\";\nimport {\n _get_style_cache,\n get_paragraph_prefix,\n iter_block_items,\n iter_document_parts,\n iter_paragraph_content,\n} from \"./utils/docx.js\";\n\nconst _HEADING_PREFIX_RE = /^(#{1,6}) /;\nconst _HEURISTIC_MIN_WORDS = 3;\n\nexport interface OutlineNode {\n level: number;\n text: string;\n page: number;\n style: string;\n has_table: boolean;\n footnote_ids: string[];\n}\n\ninterface _BlockRecord {\n item: any;\n is_paragraph: boolean;\n is_table: boolean;\n start_offset: number;\n projected_length: number;\n}\n\nexport function extract_outline(\n doc: DocumentObject,\n projected_body: string,\n body_pages: string[],\n body_page_offsets: number[],\n paragraph_offsets: Record<string, [number, number]> | null = null,\n): OutlineNode[] {\n if (body_pages.length !== body_page_offsets.length) {\n throw new Error(\"body_pages and body_page_offsets length mismatch\");\n }\n\n const comments_map = extract_comments_data(doc.pkg);\n const block_records = _walk_doc_body(doc, comments_map);\n\n const heading_indices: number[] = [];\n for (let idx = 0; idx < block_records.length; idx++) {\n const rec = block_records[idx];\n if (!(rec.is_paragraph && _is_heading(rec.item))) continue;\n if (!_heading_passes_quality_filter(rec.item, comments_map)) continue;\n heading_indices.push(idx);\n }\n\n if (heading_indices.length === 0) return [];\n\n const nodes: OutlineNode[] = [];\n for (let h_pos = 0; h_pos < heading_indices.length; h_pos++) {\n const rec_idx = heading_indices[h_pos];\n const rec = block_records[rec_idx];\n const paragraph = rec.item as Paragraph;\n\n const level = _heading_level(paragraph);\n const text = _heading_text(paragraph, comments_map);\n const style = _determine_heading_style(paragraph);\n\n const owned_end = _find_owned_end(\n block_records,\n heading_indices,\n h_pos,\n level,\n );\n const owned_blocks = block_records.slice(rec_idx + 1, owned_end);\n\n const has_table = _direct_has_table(block_records, rec_idx + 1, owned_end);\n const footnote_ids = _collect_footnote_ids(owned_blocks);\n\n const page_num = _offset_to_page(rec.start_offset, body_page_offsets);\n\n nodes.push({ level, text, page: page_num, style, has_table, footnote_ids });\n }\n\n return nodes;\n}\n\nfunction _direct_has_table(\n block_records: _BlockRecord[],\n range_start: number,\n range_end: number,\n): boolean {\n for (let idx = range_start; idx < range_end; idx++) {\n const rec = block_records[idx];\n if (rec.is_paragraph && _is_heading(rec.item)) return false;\n if (rec.is_table) return true;\n }\n return false;\n}\n\nfunction _walk_doc_body(\n doc: DocumentObject,\n comments_map: any,\n): _BlockRecord[] {\n const parts = Array.from(iter_document_parts(doc));\n let body_start_offset = 0;\n let body_part: any = null;\n\n for (const part of parts) {\n if (part === doc) {\n body_part = part;\n break;\n }\n const part_text = _project_part(part, comments_map);\n if (part_text) {\n if (body_start_offset > 0) body_start_offset += 2;\n body_start_offset += part_text.length;\n }\n }\n\n if (!body_part) {\n body_part = doc;\n body_start_offset = 0;\n } else {\n if (body_start_offset > 0) body_start_offset += 2;\n }\n\n const records: _BlockRecord[] = [];\n let cursor = body_start_offset;\n let is_first_block = true;\n\n for (const item of iter_block_items(body_part)) {\n if (item instanceof Paragraph) {\n const prefix = get_paragraph_prefix(item);\n const p_text = build_paragraph_text(item, comments_map, false);\n const block_len = (prefix + p_text).length;\n\n if (!is_first_block) cursor += 2;\n\n records.push({\n item,\n is_paragraph: true,\n is_table: false,\n start_offset: cursor,\n projected_length: block_len,\n });\n cursor += block_len;\n is_first_block = false;\n } else if (item instanceof Table) {\n const table_text = extract_table(item, comments_map, false, 0);\n const block_len = table_text ? table_text.length : 0;\n\n if (!is_first_block) cursor += 2;\n\n const table_start = cursor;\n records.push({\n item,\n is_paragraph: false,\n is_table: true,\n start_offset: table_start,\n projected_length: block_len,\n });\n _record_table_inner_blocks_lite(item, table_start, records, comments_map);\n cursor += block_len;\n is_first_block = false;\n }\n }\n\n return records;\n}\n\nfunction _compute_inner_block_offset(\n table: Table,\n target_paragraph: Paragraph,\n table_start_offset: number,\n comments_map: any,\n): number {\n const target_el = target_paragraph._element;\n let cursor = table_start_offset;\n let rows_processed = 0;\n\n for (const row of table.rows) {\n if (rows_processed > 0) cursor += 1;\n\n const seen_cells = new Set();\n let cells_in_row = 0;\n\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n if (cells_in_row > 0) cursor += 3;\n\n const [new_cursor, found] = _walk_cell_for_offset(\n cell,\n target_el,\n cursor,\n comments_map,\n );\n if (found) return new_cursor;\n cursor = new_cursor;\n\n cells_in_row++;\n }\n rows_processed++;\n }\n\n return table_start_offset;\n}\n\nfunction _walk_cell_for_offset(\n cell: any,\n target_el: any,\n cell_start_cursor: number,\n comments_map: any,\n): [number, boolean] {\n let cursor = cell_start_cursor;\n let is_first_block = true;\n\n for (const inner_item of iter_block_items(cell)) {\n if (!is_first_block) cursor += 2;\n\n if (inner_item instanceof Paragraph) {\n if (inner_item._element === target_el) return [cursor, true];\n const prefix = get_paragraph_prefix(inner_item);\n const p_text = build_paragraph_text(inner_item, comments_map, false);\n cursor += (prefix + p_text).length;\n } else if (inner_item instanceof Table) {\n const nested_offset = _compute_inner_block_offset(\n inner_item,\n new Paragraph(target_el, null),\n cursor,\n comments_map,\n );\n if (nested_offset !== cursor) {\n if (_element_is_descendant(target_el, inner_item._element))\n return [nested_offset, true];\n }\n const table_text = extract_table(inner_item, comments_map, false, 0);\n cursor += table_text ? table_text.length : 0;\n }\n is_first_block = false;\n }\n return [cursor, false];\n}\n\nfunction _element_is_descendant(\n target_el: Element,\n ancestor_el: Element,\n): boolean {\n let cur: Node | null = target_el.parentNode;\n while (cur) {\n if (cur === ancestor_el) return true;\n cur = cur.parentNode;\n }\n return false;\n}\n\nfunction _record_table_inner_blocks_lite(\n table: Table,\n inherited_offset: number,\n records: _BlockRecord[],\n comments_map: any,\n) {\n const seen_cells = new Set();\n for (const row of table.rows) {\n for (const cell of row.cells) {\n if (seen_cells.has(cell)) continue;\n seen_cells.add(cell);\n\n for (const inner_item of iter_block_items(cell)) {\n if (inner_item instanceof Paragraph) {\n const true_offset = _is_heading(inner_item)\n ? _compute_inner_block_offset(\n table,\n inner_item,\n inherited_offset,\n comments_map,\n )\n : inherited_offset;\n records.push({\n item: inner_item,\n is_paragraph: true,\n is_table: false,\n start_offset: true_offset,\n projected_length: 0,\n });\n } else if (inner_item instanceof Table) {\n records.push({\n item: inner_item,\n is_paragraph: false,\n is_table: true,\n start_offset: inherited_offset,\n projected_length: 0,\n });\n _record_table_inner_blocks_lite(\n inner_item,\n inherited_offset,\n records,\n comments_map,\n );\n }\n }\n }\n }\n}\n\nfunction _project_part(part: any, comments_map: any): string {\n const blocks: string[] = [];\n const c_type = part.constructor.name;\n\n if (c_type === \"NotesPart\") {\n const header = part.note_type === \"fn\" ? \"## Footnotes\" : \"## Endnotes\";\n blocks.push(`---\\n${header}`);\n }\n\n let is_first_para = true;\n for (const item of iter_block_items(part)) {\n if (item.constructor.name === \"FootnoteItem\") {\n const fn_text = _project_part(item, comments_map);\n if (fn_text) blocks.push(fn_text);\n } else if (item instanceof Paragraph) {\n let prefix = get_paragraph_prefix(item);\n if (is_first_para && c_type === \"FootnoteItem\")\n prefix = `[^${part.note_type}-${part.id}]: ${prefix}`;\n const p_text = build_paragraph_text(item, comments_map, false);\n blocks.push(prefix + p_text);\n is_first_para = false;\n } else if (item instanceof Table) {\n const table_text = extract_table(item, comments_map, false, 0);\n if (table_text) blocks.push(table_text);\n is_first_para = false;\n }\n }\n\n return blocks.join(\"\\n\\n\");\n}\n\nfunction _is_heading(paragraph: Paragraph): boolean {\n return _HEADING_PREFIX_RE.test(get_paragraph_prefix(paragraph));\n}\n\nfunction _heading_passes_quality_filter(\n paragraph: Paragraph,\n comments_map: any,\n): boolean {\n const style = _determine_heading_style(paragraph);\n if (style !== \"(heuristic)\") return true;\n const text = _heading_text(paragraph, comments_map);\n if (!text) return false;\n const word_count = (text.match(/\\w+/g) || []).length;\n return word_count >= _HEURISTIC_MIN_WORDS;\n}\n\nfunction _heading_level(paragraph: Paragraph): number {\n const match = _HEADING_PREFIX_RE.exec(get_paragraph_prefix(paragraph));\n return match ? Math.min(match[1].length, 6) : 1;\n}\n\nfunction _heading_text(paragraph: Paragraph, comments_map: any): string {\n const p_text = build_paragraph_text(paragraph, comments_map, false);\n let cleaned = _strip_critic_markup(p_text);\n cleaned = _strip_inline_formatting(cleaned);\n return cleaned.trim();\n}\n\nfunction _strip_critic_markup(text: string): string {\n if (!text) return \"\";\n text = text.replace(/\\{--[\\s\\S]*?--\\}/g, \"\");\n text = text.replace(/\\{>>[\\s\\S]*?<<\\}/g, \"\");\n text = text.replace(/\\{\\+\\+([\\s\\S]*?)\\+\\+\\}/g, \"$1\");\n text = text.replace(/\\{==([\\s\\S]*?)==\\}/g, \"$1\");\n return text;\n}\n\nfunction _strip_inline_formatting(text: string): string {\n if (!text) return \"\";\n text = text.replace(/\\*\\*(.+?)\\*\\*/g, \"$1\");\n text = text.replace(/__(.+?)__/g, \"$1\");\n text = text.replace(/(?<!\\w)_(\\S(?:.*?\\S)?)_(?!\\w)/g, \"$1\");\n return text;\n}\n\nfunction _determine_heading_style(paragraph: Paragraph): string {\n const [style_cache, default_pstyle] = _get_style_cache(\n paragraph._parent.part || paragraph._parent,\n );\n const pPr = findChild(paragraph._element, \"w:pPr\");\n let style_id = default_pstyle;\n\n if (pPr) {\n const pStyle = findChild(pPr, \"w:pStyle\");\n if (pStyle) style_id = pStyle.getAttribute(\"w:val\") || default_pstyle;\n }\n\n let outline_level: number | null = null;\n if (pPr) {\n const oLvl = findChild(pPr, \"w:outlineLvl\");\n if (oLvl && /^\\d+$/.test(oLvl.getAttribute(\"w:val\") || \"\")) {\n outline_level = parseInt(oLvl.getAttribute(\"w:val\") as string, 10);\n }\n }\n \n if (outline_level === null && style_id && style_cache && style_cache[style_id]) {\n outline_level = style_cache[style_id].outline_level;\n }\n\n const style_name =\n style_id && style_cache && style_cache[style_id]\n ? style_cache[style_id].name\n : style_id;\n\n let normalized_style_name = style_name;\n if (normalized_style_name && typeof normalized_style_name === \"string\") {\n if (normalized_style_name.toLowerCase().startsWith(\"heading\")) {\n normalized_style_name = normalized_style_name.replace(/^heading/i, \"Heading\");\n } else if (normalized_style_name.toLowerCase() === \"title\") {\n normalized_style_name = \"Title\";\n }\n }\n\n if (outline_level !== null && outline_level >= 0 && outline_level <= 8) {\n if (normalized_style_name && (normalized_style_name.startsWith(\"Heading\") || normalized_style_name === \"Title\")) {\n return normalized_style_name;\n }\n return \"(outline_level)\";\n }\n\n if (\n normalized_style_name &&\n (normalized_style_name.startsWith(\"Heading\") || normalized_style_name === \"Title\")\n )\n return normalized_style_name;\n\n if (normalized_style_name && /Heading[ ]?([1-6])(?![0-9])/.test(normalized_style_name))\n return normalized_style_name;\n\n return \"(heuristic)\";\n}\n\nfunction _safe_style_name(\n paragraph: Paragraph,\n style_cache: any,\n default_pstyle: any,\n): string | null {\n const pPr = findChild(paragraph._element, \"w:pPr\");\n let style_id = default_pstyle;\n if (pPr) {\n const pStyle = findChild(pPr, \"w:pStyle\");\n if (pStyle) style_id = pStyle.getAttribute(\"w:val\") || default_pstyle;\n }\n return style_id && style_cache && style_cache[style_id]\n ? style_cache[style_id].name\n : style_id;\n}\n\nfunction _find_owned_end(\n block_records: _BlockRecord[],\n heading_indices: number[],\n current_h_pos: number,\n current_level: number,\n): number {\n for (\n let next_h_pos = current_h_pos + 1;\n next_h_pos < heading_indices.length;\n next_h_pos++\n ) {\n const next_idx = heading_indices[next_h_pos];\n if (_heading_level(block_records[next_idx].item) <= current_level)\n return next_idx;\n }\n return block_records.length;\n}\n\nfunction _collect_footnote_ids(owned_blocks: _BlockRecord[]): string[] {\n const seen = new Set<string>();\n const ordered: string[] = [];\n for (const rec of owned_blocks) {\n if (!rec.is_paragraph) continue;\n for (const event of iter_paragraph_content(rec.item)) {\n if (!(\"type\" in event)) continue;\n let fn_id = \"\";\n if (event.type === \"footnote\") fn_id = `fn-${event.id}`;\n else if (event.type === \"endnote\") fn_id = `en-${event.id}`;\n else continue;\n\n if (!seen.has(fn_id)) {\n seen.add(fn_id);\n ordered.push(fn_id);\n }\n }\n }\n return ordered;\n}\n\nfunction _offset_to_page(offset: number, body_page_offsets: number[]): number {\n if (!body_page_offsets || body_page_offsets.length === 0) return 1;\n let page = 1;\n for (let i = 0; i < body_page_offsets.length; i++) {\n if (offset >= body_page_offsets[i]) page = i + 1;\n else break;\n }\n return page;\n}\n","export class SanitizeReport {\n public filename: string;\n public mode: string;\n public author: string | null;\n\n public tracked_changes_found: number = 0;\n public tracked_changes_accepted: number = 0;\n public tracked_changes_kept: number = 0;\n public change_lines: string[] = [];\n\n public comments_removed: number = 0;\n public comments_kept: number = 0;\n public removed_comment_lines: string[] = [];\n public kept_comment_lines: string[] = [];\n\n public metadata_lines: string[] = [];\n public structural_lines: string[] = [];\n public warnings: string[] = [];\n\n public status: string = \"clean\";\n public blocked_reason: string | null = null;\n\n constructor(filename: string, mode: string = \"full\", author: string | null = null) {\n this.filename = filename;\n this.mode = mode;\n this.author = author;\n }\n\n public add_transform_lines(lines: string[]) {\n for (const line of lines) {\n const lower = line.toLowerCase();\n if (lower.includes(\"tracked change\") || lower.includes(\"insertion\") || lower.includes(\"deletion\") || lower.includes(\"accepted\")) {\n this.change_lines.push(line);\n } else if (lower.includes(\"comment\") || lower.includes(\"[open]\") || lower.includes(\"[resolved]\")) {\n if (lower.includes(\"kept\") || lower.includes(\"visible\")) {\n this.kept_comment_lines.push(line);\n } else {\n this.removed_comment_lines.push(line);\n }\n } else if (\n lower.includes(\"author\") || lower.includes(\"template\") || lower.includes(\"company\") || \n lower.includes(\"manager\") || lower.includes(\"metadata\") || lower.includes(\"timestamp\") || \n lower.includes(\"custom xml\") || lower.includes(\"last modified by\") || lower.includes(\"revision count\") || lower.includes(\"last printed\")\n ) {\n this.metadata_lines.push(line);\n } else if (lower.includes(\"hyperlink\") || lower.includes(\"warning\")) {\n this.warnings.push(line);\n } else {\n this.structural_lines.push(line);\n }\n }\n }\n\n public render(): string {\n const sep = \"═\".repeat(50);\n const lines: string[] = [sep, `Finalization Report: ${this.filename}`];\n\n const flags: string[] = [];\n if (this.mode === \"keep-markup\") flags.push(\"--keep-markup\");\n if (this.author) flags.push(`--author \"${this.author}\"`);\n if (this.tracked_changes_accepted > 0) flags.push(\"--accept-all\");\n\n if (flags.length > 0) lines.push(flags.join(\" \"));\n lines.push(sep);\n\n if (this.status === \"blocked\") {\n lines.push(\"\");\n lines.push(`BLOCKED: ${this.blocked_reason}`);\n lines.push(sep);\n return lines.join(\"\\n\");\n }\n\n if (this.mode === \"keep-markup\" && (this.tracked_changes_kept > 0 || this.comments_kept > 0)) {\n lines.push(\"\");\n lines.push(\"VISIBLE TO COUNTERPARTY\");\n if (this.tracked_changes_kept > 0) lines.push(` Tracked changes: ${this.tracked_changes_kept}`);\n if (this.comments_kept > 0) {\n lines.push(` Open comments: ${this.comments_kept}`);\n for (const cl of this.kept_comment_lines) lines.push(` ${cl}`);\n }\n if (this.author) lines.push(` Author on all markup: \"${this.author}\"`);\n }\n\n if (this.change_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"TRACKED CHANGES\");\n for (const cl of this.change_lines) lines.push(` ${cl}`);\n }\n\n if (this.removed_comment_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"COMMENTS (stripped)\");\n for (const cl of this.removed_comment_lines) lines.push(` ${cl}`);\n }\n\n if (this.metadata_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"METADATA\");\n for (const ml of this.metadata_lines) lines.push(` ${ml}`);\n }\n\n if (this.structural_lines.length > 0) {\n lines.push(\"\");\n lines.push(\"STRUCTURAL & PROTECTION\");\n for (const sl of this.structural_lines) lines.push(` ${sl}`);\n }\n\n if (this.warnings.length > 0) {\n lines.push(\"\");\n lines.push(\"WARNINGS\");\n for (const w of this.warnings) lines.push(` ⚠ ${w}`);\n }\n\n lines.push(\"\");\n lines.push(sep);\n if (this.warnings.length > 0) {\n lines.push(`Result: CLEAN WITH WARNINGS (${this.warnings.length} warning${this.warnings.length > 1 ? 's' : ''})`);\n } else {\n lines.push(`Result: CLEAN (${this.tracked_changes_found} changes resolved, ${this.comments_removed} comments removed)`);\n }\n lines.push(sep);\n\n return lines.join(\"\\n\");\n }\n}","import { DocumentObject, Part } from '../docx/bridge.js';\nimport { findAllDescendants, findChild, findChildren } from '../docx/dom.js';\nimport { extract_comments_data, CommentsManager } from '../comments.js';\nimport { RedlineEngine } from '../engine.js';\n\nexport function findDescendantsByLocalName(element: Element, localName: string): Element[] {\n const result: Element[] = [];\n const all = element.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) {\n const tag = all[i].tagName;\n if (tag === localName || tag.endsWith(':' + localName)) {\n result.push(all[i]);\n }\n }\n return result;\n}\n\nexport function coalesce_runs(doc: DocumentObject): string[] {\n let count = 0;\n\n function areRunsIdentical(rPr1: Element | null, rPr2: Element | null): boolean {\n const xml1 = rPr1 ? rPr1.toString() : '';\n const xml2 = rPr2 ? rPr2.toString() : '';\n return xml1 === xml2;\n }\n\n function hasSpecialContent(run: Element): boolean {\n const safeTags = ['w:t', 'w:tab', 'w:br', 'w:cr', 'w:delText', 'w:rPr'];\n for (let i = 0; i < run.childNodes.length; i++) {\n const child = run.childNodes[i];\n if (child.nodeType === 1) {\n const tag = (child as Element).tagName;\n if (!safeTags.includes(tag)) return true;\n }\n }\n return false;\n }\n\n function coalesceContainer(container: Element) {\n const children = Array.from(container.childNodes).filter(n => n.nodeType === 1) as Element[];\n let i = 0;\n while (i < children.length - 1) {\n const curr = children[i];\n const nxt = children[i + 1];\n\n if (curr.tagName === 'w:r' && nxt.tagName === 'w:r') {\n if (!hasSpecialContent(curr) && !hasSpecialContent(nxt)) {\n const rPr1 = findChild(curr, 'w:rPr');\n const rPr2 = findChild(nxt, 'w:rPr');\n if (areRunsIdentical(rPr1, rPr2)) {\n let last_t: Element | null = null;\n for (let c = 0; c < curr.childNodes.length; c++) {\n const child = curr.childNodes[c];\n if (child.nodeType === 1 && ((child as Element).tagName === 'w:t' || (child as Element).tagName === 'w:delText')) {\n last_t = child as Element;\n }\n }\n\n const nxtChildren = Array.from(nxt.childNodes).filter(n => n.nodeType === 1) as Element[];\n for (const child of nxtChildren) {\n if (child.tagName === 'w:rPr') continue;\n if ((child.tagName === 'w:t' || child.tagName === 'w:delText') && last_t && last_t.tagName === child.tagName) {\n const t1 = last_t.textContent || '';\n const t2 = child.textContent || '';\n const combined = t1 + t2;\n last_t.textContent = combined;\n if (combined.trim() !== combined) {\n last_t.setAttribute('xml:space', 'preserve');\n }\n } else {\n curr.appendChild(child);\n if (child.tagName === 'w:t' || child.tagName === 'w:delText') {\n last_t = child;\n }\n }\n }\n container.removeChild(nxt);\n children.splice(i + 1, 1);\n count++;\n continue; \n }\n }\n }\n\n if (['w:ins', 'w:del', 'w:hyperlink', 'w:sdt', 'w:smartTag', 'w:fldSimple', 'w:sdtContent'].includes(curr.tagName)) {\n coalesceContainer(curr);\n }\n i++;\n }\n \n if (children.length > 0) {\n const last = children[children.length - 1];\n if (['w:ins', 'w:del', 'w:hyperlink', 'w:sdt', 'w:smartTag', 'w:fldSimple', 'w:sdtContent'].includes(last.tagName)) {\n coalesceContainer(last);\n }\n }\n }\n\n const paragraphs = findAllDescendants(doc.element, 'w:p');\n for (const p of paragraphs) coalesceContainer(p);\n\n return count ? [`Adjacent identical runs coalesced: ${count}`] : [];\n}\n\nexport function strip_rsid(doc: DocumentObject): string[] {\n let count = 0;\n const rsidAttrs = ['w:rsidR', 'w:rsidRPr', 'w:rsidRDefault', 'w:rsidP', 'w:rsidDel', 'w:rsidSect', 'w:rsidTr'];\n \n const all = doc.element.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) {\n for (const attr of rsidAttrs) {\n if (all[i].hasAttribute(attr)) {\n all[i].removeAttribute(attr);\n count++;\n }\n }\n }\n \n const rsidsElements = findAllDescendants(doc.element, 'w:rsids');\n for (const el of rsidsElements) {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n count++;\n }\n }\n \n return count ? [`rsid attributes: ${count} removed`] : [];\n}\n\nexport function strip_para_ids(doc: DocumentObject): string[] {\n let count = 0;\n const attrs = ['w14:paraId', 'w14:textId'];\n const all = doc.element.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) {\n for (const attr of attrs) {\n if (all[i].hasAttribute(attr)) {\n all[i].removeAttribute(attr);\n count++;\n }\n }\n }\n return count ? [`Paragraph/text IDs: ${count} removed`] : [];\n}\n\nexport function strip_proof_errors(doc: DocumentObject): string[] {\n const elements = findAllDescendants(doc.element, 'w:proofErr');\n elements.forEach(el => el.parentNode?.removeChild(el));\n return elements.length ? [`Spell check markers: ${elements.length} removed`] : [];\n}\n\nexport function strip_empty_properties(doc: DocumentObject): string[] {\n let count = 0;\n for (const tag of ['w:rPr', 'w:pPr']) {\n const elements = findAllDescendants(doc.element, tag);\n for (const el of elements) {\n if (el.childNodes.length === 0 || (el.childNodes.length === 1 && el.childNodes[0].nodeType === 3 && !el.childNodes[0].textContent?.trim())) {\n el.parentNode?.removeChild(el);\n count++;\n }\n }\n }\n return count ? [`Empty property elements: ${count} removed`] : [];\n}\n\nexport function strip_hidden_text(doc: DocumentObject): string[] {\n let count = 0;\n const elements = findAllDescendants(doc.element, 'w:rPr');\n for (const rPr of elements) {\n if (findChild(rPr, 'w:vanish') || findChild(rPr, 'w:webHidden')) {\n const run = rPr.parentNode as Element;\n if (run && run.tagName === 'w:r' && run.parentNode) {\n run.parentNode.removeChild(run);\n count++;\n }\n }\n }\n return count ? [`Hidden text runs: ${count} removed`] : [];\n}\n\nexport function count_tracked_changes(doc: DocumentObject): [number, number, number] {\n const ins = findAllDescendants(doc.element, 'w:ins').length;\n const del = findAllDescendants(doc.element, 'w:del').length;\n const fmt = findAllDescendants(doc.element, 'w:rPrChange').length +\n findAllDescendants(doc.element, 'w:pPrChange').length +\n findAllDescendants(doc.element, 'w:sectPrChange').length;\n return [ins, del, fmt];\n}\n\nexport function get_track_change_authors(doc: DocumentObject): Set<string> {\n const authors = new Set<string>();\n for (const tag of ['w:ins', 'w:del', 'w:rPrChange', 'w:pPrChange', 'w:sectPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n const author = el.getAttribute('w:author');\n if (author) authors.add(author);\n }\n }\n return authors;\n}\n\nfunction _getElementText(el: Element): string {\n const texts: string[] = [];\n const ts = findAllDescendants(el, 'w:t');\n for (const t of ts) if (t.textContent) texts.push(t.textContent);\n const dts = findAllDescendants(el, 'w:delText');\n for (const dt of dts) if (dt.textContent) texts.push(dt.textContent);\n return texts.join('');\n}\n\nexport function _truncate(text: string, maxLen: number = 60): string {\n const clean = text.replace(/\\n/g, ' ').trim();\n if (clean.length <= maxLen) return clean;\n return clean.substring(0, maxLen - 3) + \"...\";\n}\n\nexport function accept_all_tracked_changes(doc: DocumentObject): string[] {\n const lines: string[] = [];\n const insEls = findAllDescendants(doc.element, 'w:ins');\n const delEls = findAllDescendants(doc.element, 'w:del');\n \n for (const ins of insEls) {\n const text = _getElementText(ins).trim();\n if (text) lines.push(` Accepted insertion: \"${_truncate(text, 60)}\"`);\n }\n for (const del of delEls) {\n const text = _getElementText(del).trim();\n if (text) lines.push(` Accepted deletion of: \"${_truncate(text, 60)}\"`);\n }\n\n const engine = new RedlineEngine(doc);\n engine.accept_all_revisions();\n\n for (const tag of ['w:rPrChange', 'w:pPrChange', 'w:sectPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n el.parentNode?.removeChild(el);\n }\n }\n\n const total = insEls.length + delEls.length;\n if (total) {\n return [`Tracked changes auto-accepted: ${total}`].concat(lines);\n }\n return [];\n}\n\nexport function get_comments_summary(doc: DocumentObject): any {\n const data = extract_comments_data(doc.pkg);\n const comments = [];\n let openCount = 0;\n let resolvedCount = 0;\n\n for (const [cId, info] of Object.entries(data)) {\n if (info.resolved) resolvedCount++;\n else openCount++;\n comments.push({ id: cId, ...info });\n }\n\n return { total: comments.length, open: openCount, resolved: resolvedCount, comments };\n}\n\nexport function remove_all_comments(doc: DocumentObject): string[] {\n const data = extract_comments_data(doc.pkg);\n const keys = Object.keys(data);\n if (keys.length === 0) return [];\n\n const lines: string[] = [];\n const cm = new CommentsManager(doc);\n\n for (const [cId, info] of Object.entries(data)) {\n const status = info.resolved ? \"[Resolved]\" : \"[Open]\";\n lines.push(` ${status} \"${_truncate(info.text || '', 60)}\" (${info.author || 'Unknown'})`);\n cm.deleteComment(cId);\n }\n\n for (const tag of ['w:commentRangeStart', 'w:commentRangeEnd', 'w:commentReference']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n el.parentNode?.removeChild(el);\n }\n }\n\n const resolvedCount = Object.values(data).filter(c => c.resolved).length;\n const openCount = Object.values(data).filter(c => !c.resolved).length;\n return [`Comments removed: ${keys.length} (${resolvedCount} resolved, ${openCount} open)`].concat(lines);\n}\n\nexport function replace_comment_authors(doc: DocumentObject, newAuthor: string): string[] {\n const cm = new CommentsManager(doc);\n if (!cm.commentsPart) return [];\n\n const original = new Set<string>();\n const comments = findAllDescendants(cm.commentsPart._element, 'w:comment');\n for (const c of comments) {\n const author = c.getAttribute('w:author');\n if (author) {\n original.add(author);\n c.setAttribute('w:author', newAuthor);\n }\n if (c.hasAttribute('w:initials')) {\n const initials = newAuthor.split(' ').filter(Boolean).map(p => p[0]).join('').toUpperCase();\n c.setAttribute('w:initials', initials);\n }\n }\n return original.size ? [`Comment authors replaced: ${Array.from(original).sort().join(', ')} → \"${newAuthor}\"`] : [];\n}\n\nexport function replace_change_authors(doc: DocumentObject, newAuthor: string): string[] {\n const original = new Set<string>();\n for (const tag of ['w:ins', 'w:del', 'w:rPrChange', 'w:pPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n const author = el.getAttribute('w:author');\n if (author) {\n original.add(author);\n el.setAttribute('w:author', newAuthor);\n }\n }\n }\n return original.size ? [`Track change authors replaced: ${Array.from(original).sort().join(', ')} → \"${newAuthor}\"`] : [];\n}\n\nexport function normalize_change_dates(doc: DocumentObject): string[] {\n let count = 0;\n const fixed = \"2025-01-01T00:00:00Z\";\n for (const tag of ['w:ins', 'w:del', 'w:rPrChange', 'w:pPrChange']) {\n for (const el of findAllDescendants(doc.element, tag)) {\n if (el.hasAttribute('w:date')) {\n el.setAttribute('w:date', fixed);\n count++;\n }\n }\n }\n return count ? [`Track change timestamps: ${count} normalized`] : [];\n}\n\nexport function scrub_doc_properties(doc: DocumentObject): string[] {\n const lines: string[] = [];\n const corePart = doc.pkg.getPartByPath('docProps/core.xml');\n if (corePart) {\n const creators = findDescendantsByLocalName(corePart._element, 'creator');\n creators.forEach(c => { if (c.textContent) { lines.push(`Author: ${c.textContent}`); c.textContent = \"\"; }});\n \n const modifiers = findDescendantsByLocalName(corePart._element, 'lastModifiedBy');\n modifiers.forEach(c => { if (c.textContent) { lines.push(`Last modified by: ${c.textContent}`); c.textContent = \"\"; }});\n \n const revisions = findDescendantsByLocalName(corePart._element, 'revision');\n revisions.forEach(c => { if (c.textContent && parseInt(c.textContent) > 1) { lines.push(`Revision count: ${c.textContent} → 1`); c.textContent = \"1\"; }});\n }\n\n const appPart = doc.pkg.getPartByPath('docProps/app.xml');\n if (appPart) {\n const docEl = appPart._element;\n const intFields = [\"TotalTime\", \"Words\", \"Characters\", \"Paragraphs\", \"Lines\", \"CharactersWithSpaces\"];\n for (const f of intFields) {\n findDescendantsByLocalName(docEl, f).forEach(el => {\n if (el.textContent && el.textContent !== \"0\") {\n if (f === \"TotalTime\") lines.push(`Total editing time: ${el.textContent} minutes`);\n el.textContent = \"0\";\n }\n });\n }\n const strFields = [\"Template\", \"Manager\", \"Company\"];\n for (const f of strFields) {\n findDescendantsByLocalName(docEl, f).forEach(el => {\n if (el.textContent) {\n lines.push(`${f}: ${el.textContent}`);\n el.textContent = \"\";\n }\n });\n }\n }\n\n return lines.length ? [\"Metadata scrubbed:\", ...lines.map(l => ` ${l}`)] : [];\n}\n\nexport function scrub_timestamps(doc: DocumentObject): string[] {\n let modified = false;\n const epoch = \"1970-01-01T00:00:00Z\";\n const corePart = doc.pkg.getPartByPath('docProps/core.xml');\n if (corePart) {\n for (const tag of ['created', 'modified', 'lastPrinted']) {\n findDescendantsByLocalName(corePart._element, tag).forEach(el => {\n if (el.textContent && el.textContent !== epoch) {\n el.textContent = epoch;\n modified = true;\n }\n });\n }\n }\n return modified ? [\"Timestamps normalized to epoch\"] : [];\n}\n\nexport function strip_custom_xml(doc: DocumentObject): string[] {\n const customParts = doc.pkg.parts.filter(p => p.partname.includes('/customXml'));\n if (customParts.length === 0) return [];\n\n const partnames = new Set(customParts.map(p => p.partname));\n doc.pkg.parts = doc.pkg.parts.filter(p => !partnames.has(p.partname));\n\n const removeRelationsTo = (relsPart: Part) => {\n const toRemove: Element[] = [];\n for (const rel of findAllDescendants(relsPart._element, 'Relationship')) {\n const target = rel.getAttribute('Target');\n if (target && target.includes('customXml')) toRemove.push(rel);\n }\n toRemove.forEach(r => r.parentNode?.removeChild(r));\n };\n\n const rootRels = doc.pkg.getPartByPath('_rels/.rels');\n if (rootRels) removeRelationsTo(rootRels);\n\n const docRels = doc.pkg.getOrCreateRelsPart(doc.part.partname);\n if (docRels) removeRelationsTo(docRels);\n\n for (const sdtPr of findAllDescendants(doc.element, 'w:sdtPr')) {\n findChildren(sdtPr, 'w:dataBinding').forEach(b => sdtPr.removeChild(b));\n }\n\n return [`Custom XML parts: ${customParts.length} removed`];\n}\n\nexport function strip_image_alt_text(doc: DocumentObject): string[] {\n let count = 0;\n for (const docPr of findDescendantsByLocalName(doc.element, 'docPr')) {\n const descr = docPr.getAttribute('descr');\n if (descr) {\n const isShort = descr.length < 10;\n const isFile = descr.includes('.') && descr.length < 60;\n if (isShort || isFile) {\n docPr.removeAttribute('descr');\n count++;\n }\n }\n }\n return count ? [`Image alt text: ${count} auto-generated descriptions removed`] : [];\n}\n\nexport function audit_hyperlinks(doc: DocumentObject): string[] {\n const internal = [\"sharepoint.com\", \"onedrive.com\", \".internal\", \"intranet\", \"localhost\", \"10.\", \"192.168.\", \"172.16.\"];\n const warnings: string[] = [];\n \n const docRels = doc.pkg.getOrCreateRelsPart(doc.part.partname);\n for (const rel of findAllDescendants(docRels._element, 'Relationship')) {\n if (rel.getAttribute('TargetMode') === 'External') {\n const url = rel.getAttribute('Target') || '';\n for (const pattern of internal) {\n if (url.toLowerCase().includes(pattern.toLowerCase())) {\n warnings.push(`Hyperlink targets internal URL: ${_truncate(url, 80)}`);\n break;\n }\n }\n }\n }\n return warnings;\n}","import { DocumentObject } from '../docx/bridge.js';\nimport { SanitizeReport } from './report.js';\nimport * as transforms from './transforms.js';\nimport { findAllDescendants } from '../docx/dom.js';\n\nexport interface FinalizeOptions {\n filename: string;\n sanitize_mode?: 'full' | 'keep-markup' | 'baseline';\n accept_all?: boolean;\n protection_mode?: 'read_only' | 'encrypt' | null;\n password?: string | null;\n author?: string | null;\n export_pdf?: boolean;\n}\n\nexport interface FinalizeResult {\n reportText: string;\n outBuffer?: Buffer;\n}\n\nexport async function finalize_document(doc: DocumentObject, options: FinalizeOptions): Promise<FinalizeResult> {\n const report = new SanitizeReport(options.filename, options.sanitize_mode || 'full', options.author || null);\n\n if (options.sanitize_mode === 'full') {\n const counts = transforms.count_tracked_changes(doc);\n const total = counts[0] + counts[1] + counts[2];\n report.tracked_changes_found = total;\n\n if (total > 0 && !options.accept_all) {\n report.status = 'blocked';\n report.blocked_reason = `Document contains ${total} unresolved tracked changes (${counts[0]} insertions, ${counts[1]} deletions, ${counts[2]} formatting). Review in Word first, or set accept_all=true.`;\n return { reportText: report.render() };\n }\n\n if (total > 0) {\n const authors = transforms.get_track_change_authors(doc);\n if (authors.size > 1) {\n report.warnings.push(`Multiple authors detected in tracked changes: ${Array.from(authors).sort().join(', ')}. Review per-change list before sending.`);\n }\n report.add_transform_lines(transforms.accept_all_tracked_changes(doc));\n report.tracked_changes_accepted = total;\n }\n\n const commentsSummary = transforms.get_comments_summary(doc);\n report.comments_removed = commentsSummary.total;\n report.add_transform_lines(transforms.remove_all_comments(doc));\n } else if (options.sanitize_mode === 'keep-markup') {\n // Basic support for keep-markup in TS\n const counts = transforms.count_tracked_changes(doc);\n report.tracked_changes_found = counts[0] + counts[1] + counts[2];\n report.tracked_changes_kept = report.tracked_changes_found;\n\n if (options.author) {\n report.add_transform_lines(transforms.replace_comment_authors(doc, options.author));\n report.add_transform_lines(transforms.replace_change_authors(doc, options.author));\n }\n }\n\n // Common transforms\n report.add_transform_lines(transforms.strip_rsid(doc));\n report.add_transform_lines(transforms.strip_para_ids(doc));\n report.add_transform_lines(transforms.strip_proof_errors(doc));\n report.add_transform_lines(transforms.strip_empty_properties(doc));\n report.add_transform_lines(transforms.strip_hidden_text(doc));\n report.add_transform_lines(transforms.coalesce_runs(doc));\n report.add_transform_lines(transforms.scrub_doc_properties(doc));\n report.add_transform_lines(transforms.scrub_timestamps(doc));\n report.add_transform_lines(transforms.strip_custom_xml(doc));\n report.add_transform_lines(transforms.strip_image_alt_text(doc));\n \n const warnings = transforms.audit_hyperlinks(doc);\n for (const w of warnings) report.warnings.push(w);\n\n report.add_transform_lines(transforms.normalize_change_dates(doc));\n\n // Protection (Settings injection)\n if (options.protection_mode === 'read_only' || options.protection_mode === 'encrypt') {\n if (options.protection_mode === 'encrypt') {\n report.warnings.push(\"Encryption mode (AES compound wrappers) is strictly unsupported in the zero-dependency Node engine. Falling back to native Word Read-Only lock.\");\n }\n \n const settingsPart = doc.pkg.getPartByPath('word/settings.xml');\n if (settingsPart) {\n const docEl = settingsPart._element.ownerDocument!;\n let prot = transforms.findDescendantsByLocalName(settingsPart._element, 'documentProtection')[0];\n if (!prot) {\n prot = docEl.createElement('w:documentProtection');\n // Word expects documentProtection to be inserted before elements like w:autoFormatOverride, w:styleLockTheme, etc.\n // For standard robustness without complex XSD enforcement, appendChild generally works.\n settingsPart._element.appendChild(prot);\n }\n prot.setAttribute('w:edit', 'readOnly');\n prot.setAttribute('w:enforcement', '1');\n report.structural_lines.push(\"Document locked (Read-Only enforcement injected into settings.xml)\");\n }\n }\n\n if (options.export_pdf) {\n report.warnings.push(\"PDF export requires the Python/Word COM environment and is skipped in this zero-dependency Node agent.\");\n }\n\n // Clean up leaked Microsoft namespaces\n for (const part of doc.pkg.parts) {\n // Match the exact injection condition from RedlineEngine constructor\n if (part === doc.part || (part.contentType.includes('wordprocessingml') && part.contentType.endsWith('+xml'))) {\n if (part._element.hasAttribute('xmlns:w16du')) {\n let hasW16du = false;\n // Check root element attributes (excluding the xmlns declaration itself)\n if (Array.from(part._element.attributes || []).some(a => a.name.startsWith('w16du:') && a.name !== 'xmlns:w16du')) {\n hasW16du = true;\n }\n if (!hasW16du) {\n const allNodes = findAllDescendants(part._element, '*');\n for (const n of allNodes) {\n if (n.tagName.startsWith('w16du:') || Array.from(n.attributes || []).some(a => a.name.startsWith('w16du:'))) {\n hasW16du = true;\n break;\n }\n }\n }\n if (!hasW16du) part._element.removeAttribute('xmlns:w16du');\n }\n }\n }\n\n if (report.warnings.length > 0) report.status = 'clean_with_warnings';\n\n const outBuffer = await doc.save();\n return { reportText: report.render(), outBuffer };\n}","export function identifyEngine() {\n return 'adeu-core-node';\n}\n\nexport { DocumentObject } from './docx/bridge.js';\nexport { DocumentMapper, TextSpan } from './mapper.js';\nexport { RedlineEngine, BatchValidationError } from './engine.js';\nexport { generate_edits_from_text, trim_common_context, create_unified_diff, create_word_patch_diff } from './diff.js';\nexport { apply_edits_to_markdown } from './markup.js';\nexport { paginate, split_structural_appendix, PaginationResult, PageInfo } from './pagination.js';\nexport { extract_outline, OutlineNode } from './outline.js';\nexport { extractTextFromBuffer } from './ingest.js';\nexport { finalize_document, FinalizeOptions, FinalizeResult } from './sanitize/core.js';"],"mappings":"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","names":["result","prev","nxt","target_runs","render_comment"]}