@adeu/core 1.6.7 → 1.6.8
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.cjs +1774 -957
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -8
- package/dist/index.d.ts +21 -8
- package/dist/index.js +1772 -957
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/diff.ts +54 -0
- package/src/docx/bridge.ts +15 -3
- package/src/domain.test.ts +280 -0
- package/src/domain.ts +264 -10
- package/src/index.ts +7 -8
- package/src/ingest.ts +8 -0
- package/src/sanitize/core.ts +104 -0
- package/src/sanitize/report.ts +125 -0
- package/src/sanitize/sanitize.test.ts +192 -0
- package/src/sanitize/transforms.ts +365 -0
- package/src/utils/docx.ts +12 -3
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/utils/docx.ts","../src/domain.ts","../src/comments.ts","../src/ingest.ts","../src/mapper.ts","../src/diff.ts","../src/engine.ts","../src/markup.ts","../src/pagination.ts","../src/outline.ts","../src/index.ts"],"sourcesContent":["import JSZip from 'jszip';\nimport { parseXml, findChild, findAllDescendants, serializeXml } 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\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(id: string, type: string, target: string, isExternal: boolean = false) {\n this.rels.set(id, new Relationship(id, type, target, isExternal));\n \n // If this part represents a .rels file, update the XML directly\n if (this._element.tagName === 'Relationships') {\n const doc = this._element.ownerDocument;\n if (doc) {\n const relEl = doc.createElement('Relationship');\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((p) => p.partname === searchPath || p.partname === '/' + searchPath);\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(partname: string, contentType: string, xmlString: string): Part {\n const doc = parseXml(xmlString);\n const part = new Part(partname, xmlString, doc.documentElement, contentType);\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(relsPath, 'application/vnd.openxmlformats-package.relationships+xml', xml);\n }\n return relsPart;\n }\n}\n\nexport class DocumentObject {\n public part: Part;\n public settings: { oddAndEvenPagesHeaderFooter: boolean } = { oddAndEvenPagesHeaderFooter: false };\n // Simplification for the TS port: sections hold header/footer refs\n public sections: any[] = []; \n\n constructor(public pkg: DocxPackage, part: Part) {\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(buffer: Buffer | ArrayBuffer): 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') || ''] = 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 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(rId, new Relationship(rId, type, target, targetMode === 'External'));\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 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 = '<?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}","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 (child.nodeType === 1 /* ELEMENT_NODE */ && (child as Element).tagName === tagName) {\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(element: Element, tagName: string): 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 */\nexport function serializeXml(node: Node): string {\n return new XMLSerializer().serializeToString(node);\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 { qn, findChild, findAllDescendants } from '../docx/dom.js';\nimport { Paragraph, Table, Run, NotesPart, FootnoteItem, DocxEvent } 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(part: any): [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 = s.getAttribute('w:default') === '1' || 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 const name = name_el ? name_el.getAttribute('w:val') : s_id;\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]) 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(paragraph: Paragraph, style_cache?: Record<string, any>, default_pstyle?: string | null): boolean {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(paragraph._parent.part || paragraph._parent);\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 (style_info && style_info.outline_level !== null && style_info.outline_level >= 0 && style_info.outline_level <= 8) {\n return true;\n }\n\n const style_name = style_info ? style_info.name : null;\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}\n\nexport function get_paragraph_prefix(paragraph: Paragraph, style_cache?: Record<string, any>, default_pstyle?: string | null): string {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(paragraph._parent.part || paragraph._parent);\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 (style_info && style_info.outline_level !== null && style_info.outline_level >= 0 && style_info.outline_level <= 8) {\n return '#'.repeat(style_info.outline_level + 1) + ' ';\n }\n\n const style_name = style_info ? style_info.name : null;\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 (b && b.getAttribute(QN_W_VAL) !== '0' && b.getAttribute(QN_W_VAL) !== 'false') {\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(paragraph: Paragraph, style_cache?: Record<string, any>, default_pstyle?: string | null): 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(run: Run, is_heading: boolean | null = null): [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 (b && b.getAttribute(QN_W_VAL) !== '0' && b.getAttribute(QN_W_VAL) !== 'false') is_bold = true;\n\n const i = findChild(rPr, QN_W_I);\n if (i && i.getAttribute(QN_W_VAL) !== '0' && i.getAttribute(QN_W_VAL) !== 'false') is_italic = true;\n }\n\n if (is_heading === null) {\n const parent = run._parent;\n is_heading = 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(text: string, prefix: string, suffix: string): 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(parent: any): 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 (child.getAttribute('w:type') === 'separator' || child.getAttribute('w:type') === 'continuationSeparator') 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 // Simplified for TS port - just yield main document and notes for ingestion\n yield doc;\n\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* iter_paragraph_content(paragraph: Paragraph): Generator<Run | DocxEvent> {\n let in_complex_field = false;\n let current_instr = '';\n let hide_result = false;\n\n function* process_run_element(r_element: Element): 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 { type: 'fmt_start', id: c_id!, author: rPrChange.getAttribute(QN_W_AUTHOR) || undefined, date: rPrChange.getAttribute(QN_W_DATE) || undefined };\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') 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') 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 { type: 'ins_start', id: i_id, author: child.getAttribute(QN_W_AUTHOR) || undefined, date: child.getAttribute(QN_W_DATE) || undefined };\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 { type: 'del_start', id: d_id, author: child.getAttribute(QN_W_AUTHOR) || undefined, date: child.getAttribute(QN_W_DATE) || undefined };\n yield* traverse_node(child);\n yield { type: 'del_end', id: d_id };\n } else if (tag === QN_W_COMMENTRANGESTART) yield { type: 'start', id: child.getAttribute(QN_W_ID)! };\n else if (tag === QN_W_COMMENTRANGEEND) yield { type: 'end', id: child.getAttribute(QN_W_ID)! };\n else if (tag === QN_W_HYPERLINK) {\n const rId = child.getAttribute(QN_R_ID);\n let url = '';\n if (rId && paragraph._parent.part) {\n const rel = paragraph._parent.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'))) yield { type: 'bookmark', id: b_name };\n } else if (tag === QN_W_SDT || tag === QN_W_SMARTTAG || tag === QN_W_SDTCONTENT) {\n yield* traverse_node(child);\n }\n }\n }\n\n yield* traverse_node(paragraph._element);\n}","/**\n * Lightweight port of domain.py (Semantic Diagnostics & Appendix).\n * Uses a simplified heuristic since full rapidfuzz isn't available.\n */\n\nexport function build_structural_appendix(doc: any, base_text: string): string {\n // To keep the initial ingestion port lean and maintain 100% parity on body text,\n // we will return an empty appendix string for now. The python port can be completed\n // in a follow-up PR if diagnostics are required in Node MCPs.\n return '';\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 { 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 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}","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(target: string, new_val: string): [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 = !isSpace(target[prefix_len - 1]) && !isSpace(target[prefix_len]);\n const new_split = !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 (left[idx] === '_' && \n (idx === 0 || left[idx - 1] !== '_') && \n (idx === left.length - 1 || left[idx + 1] !== '_')) {\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 (suffix_len < limit_suffix && target[target.length - 1 - suffix_len] === new_val[new_val.length - 1 - suffix_len]) {\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 = !isSpace(target[target.length - 1 - suffix_len]) && !isSpace(target[target.length - suffix_len]);\n }\n let new_split = false;\n if (suffix_len < new_val.length) {\n new_split = !isSpace(new_val[new_val.length - 1 - suffix_len]) && !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 (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 suffix_len -= idx_in_right + 1;\n break;\n }\n idx_in_right++;\n }\n continue;\n }\n break;\n }\n\n if (suffix_len > 0 && /^\\s+$/.test(target.substring(target.length - suffix_len))) {\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) && new_rem.startsWith(marker) &&\n tgt_rem.endsWith(marker) && new_rem.endsWith(marker) &&\n tgt_rem.length >= 2 * mlen && 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(text1: string, text2: string): [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(original_text: string, modified_text: string): ModifyText[] {\n const dmp = new diff_match_patch.diff_match_patch();\n \n const [chars1, chars2, token_array] = _words_to_chars(original_text, modified_text);\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++) 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) { // Equal\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({ type: 'modify', target_text: del_txt, new_text: '', comment: 'Diff: Text deleted', _match_start_index: idx });\n pending_delete = null;\n }\n current_original_index += text.length;\n } else if (op === -1) { // Delete\n pending_delete = [current_original_index, text];\n current_original_index += text.length;\n } else if (op === 1) { // Insert\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({ type: 'modify', target_text: del_txt, new_text: text, comment: 'Diff: Replacement', _match_start_index: idx });\n pending_delete = null;\n } else {\n edits.push({ type: 'modify', target_text: '', new_text: text, comment: 'Diff: Text inserted', _match_start_index: current_original_index });\n }\n }\n }\n\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({ type: 'modify', target_text: del_txt, new_text: '', comment: 'Diff: Text deleted', _match_start_index: idx });\n }\n\n return edits;\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, InsertTableRow, DeleteTableRow, AcceptChange, RejectChange, ReplyComment, 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, is_native_heading, get_run_style_markers, get_run_text, apply_formatting_to_segments \n} from './utils/docx.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.nodeType === 1);\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_text.includes(\"{++\") || n_text.includes(\"{--\") || n_text.includes(\"{>>\") || n_text.includes(\"{==\")) {\n errors.push(`- 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 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_fns.length > t_fns.length || n_fns.some((f: string) => n_fns.filter((x: string) => x===f).length > t_fns.filter((x: string) => x===f).length)) {\n errors.push(`- 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 } else {\n errors.push(`- 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 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(`- Edit ${i + 1} Failed: Cannot insert hyperlinks via text replace. Use a dedicated structural operation.`);\n } else {\n errors.push(`- Edit ${i + 1} Failed: Cannot delete hyperlinks via text replace. The marker corresponds to a structural XML element.`);\n }\n } else if (t_links.length > 1 && JSON.stringify(t_links) !== JSON.stringify(n_links)) {\n errors.push(`- Edit ${i + 1} Failed: Can only edit or retarget one hyperlink per text replacement. Please split into multiple edits.`);\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(`- Edit ${i + 1} Failed: Cannot insert cross-references via text replace. Markers are read-only projections.`);\n } else {\n errors.push(`- Edit ${i + 1} Failed: Cannot delete cross-references via text replace. The marker corresponds to a structural XML element.`);\n }\n } else {\n // Advanced XREF validation simplified for port scope\n if (JSON.stringify(t_xrefs) !== JSON.stringify(n_xrefs)) {\n errors.push(`- Edit ${i + 1} Failed: Modifying or retargeting cross-reference markers is disallowed to prevent dependency corruption.`);\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_anchors.filter((x: string) => x===a).length > t_anchors.filter((x: string) => x===a).length) {\n errors.push(`- Edit ${i + 1} Failed: Cannot modify or insert internal anchor markers (\\`{#...}\\`). These represent structural XML bookmarks.`);\n break;\n }\n }\n }\n\n if (edit.type === 'modify' && n_text) {\n const lines = n_text.split('\\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 (stripped.substring(level).startsWith(' ') || stripped.substring(level) === '') {\n errors.push(`- Edit ${i + 1} Failed: Heading level ${level} is not supported (maximum is 6).`);\n break;\n }\n }\n }\n }\n\n if (t_text.includes(\"READONLY_BOUNDARY_START\") || n_text.includes(\"READONLY_BOUNDARY_START\") || \n t_text.includes(\"# Document Structure (Read-Only)\") || n_text.includes(\"# Document Structure (Read-Only)\")) {\n errors.push(`- Edit ${i + 1} Failed: Modification targets the read-only boundary (Structural Appendix). This section cannot be edited.`);\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 = \"http://schemas.microsoft.com/office/word/2023/wordml/word16du\";\n for (const part of this.doc.pkg.parts) {\n if (part === this.doc.part || (part.contentType.includes('wordprocessingml') && part.contentType.endsWith('+xml'))) {\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 dels = findAllDescendants(this.doc.element, 'w:del');\n for (const d of dels) {\n const parent = d.parentNode as Element | null;\n if (parent?.tagName === 'w:trPr') {\n const tr = parent.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else {\n parent?.removeChild(d);\n }\n }\n const insNodes = findAllDescendants(this.doc.element, 'w:ins');\n for (const i of insNodes) {\n const parent = i.parentNode as Element | null;\n if (parent?.tagName === 'w:trPr') {\n parent.removeChild(i);\n } else {\n while (i.firstChild) parent?.insertBefore(i.firstChild, i);\n parent?.removeChild(i);\n }\n }\n }\n\n private _getNextId(): string {\n this.current_id++;\n return this.current_id.toString();\n }\n\n private _create_track_change_tag(tagName: string, author: string = \"\", reuseId: string | null = null): 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 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(text: string, baseStyle: any = {}): [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 ? raw.substring(2, raw.length - 2) : 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(runElement: Element, props: any, suppressInherited: boolean = false) {\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) { b = doc.createElement('w:b'); rPr.appendChild(b); }\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) { i = doc.createElement('w:i'); rPr.appendChild(i); }\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 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) 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(`- Edit ${i + 1} Failed: Target text not found in document:\\n \"${edit.target_text}\"`);\n } else if (matches.length > 1) {\n errors.push(`- Edit ${i + 1} Failed: Target text is ambiguous. Found ${matches.length} matches.\\nProvide more context.`);\n }\n\n for (const [start, length] of matches) {\n const spans = this.mapper.spans.filter(s => s.end > start && s.start < start + length);\n const nestedAuthors = new Set<string>();\n for (const s of spans) {\n if (s.ins_id) {\n const insNodes = findAllDescendants(this.doc.element, 'w:ins').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(`- Edit ${i + 1} Failed: Modification targets an active insertion from another author (${Array.from(nestedAuthors).join(', ')}).`);\n }\n }\n }\n return errors;\n }\n\n public process_batch(changes: DocumentChange[]): any {\n this.skipped_details = [];\n const actions = changes.filter(c => ['accept', 'reject', 'reply'].includes(c.type));\n const edits = changes.filter(c => !['accept', 'reject', 'reply'].includes(c.type));\n\n let applied_actions = 0, 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 if (edits.length > 0) {\n const errors = this.validate_edits(edits);\n if (errors.length > 0) throw new BatchValidationError(errors);\n }\n\n let applied_edits = 0, 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 (edit._match_start_index !== undefined && edit._match_start_index !== null) {\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(`- Failed to locate row target: '${(edit.target_text || '').substring(0, 40)}...'`);\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(`- Failed to apply edit targeting: '${(edit.target_text || 'insertion').substring(0, 40)}...'`);\n }\n }\n }\n\n resolved_edits.sort((a, b) => (b[0]._match_start_index || 0) - (a[0]._match_start_index || 0));\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(([occ_start, occ_end]) => start < occ_end && end > occ_start);\n if (overlaps) {\n skipped++;\n this.skipped_details.push(`- Skipped overlapping edit targeting: '${(edit.target_text || 'insertion').substring(0, 40)}...'`);\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(`- Failed to apply edit targeting: '${(edit.target_text || 'insertion').substring(0, 40)}...'`);\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 this.comments_manager.addComment(this.author, action.text, cid);\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.getAttribute('w:id') === target_id);\n const all_del = findAllDescendants(this.doc.element, 'w:del').filter(n => n.getAttribute('w:id') === target_id);\n const all_nodes = [...all_ins, ...all_del];\n\n if (all_nodes.length === 0) {\n skipped++;\n this.skipped_details.push(`- Failed to apply action: Target ID ${action.target_id} not found.`);\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 ? (node.parentNode as Element).tagName : '';\n const is_trPr = parent_tag === 'w:trPr';\n\n if (type === 'accept') {\n if (is_ins) {\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n while (node.firstChild) node.parentNode?.insertBefore(node.firstChild, node);\n node.parentNode?.removeChild(node);\n }\n } else {\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 if (is_trPr) {\n const tr = node.parentNode?.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else node.parentNode?.removeChild(node);\n } else {\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n const delTexts = Array.from(node.getElementsByTagName('w:delText'));\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')) t.setAttribute('xml:space', 'preserve');\n dt.parentNode?.replaceChild(t, dt);\n }\n while (node.firstChild) 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(start_idx, rebuild_map);\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) t.setAttribute('xml:space', 'preserve');\n r.appendChild(t); p.appendChild(r); tc.appendChild(p); 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) this.clean_mapper = new DocumentMapper(this.doc, true);\n [start_idx, match_len] = this.clean_mapper.find_match_index(edit.target_text);\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(start_idx, start_idx + match_len);\n\n if (actual_doc_text === effective_new_text || edit.target_text === effective_new_text) {\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(actual_doc_text, effective_new_text);\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(edit: any, orig_new: string | null, rebuild_map: boolean): 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) ? this._getNextId() : null;\n const ins_id = ['INSERTION', 'MODIFICATION'].includes(op) ? this._getNextId() : null;\n\n if (op === \"COMMENT_ONLY\") {\n // Mocked for Port limits, normally anchors to found runs\n return true;\n }\n\n if (op === \"INSERTION\") {\n const [anchor_run, anchor_para] = active_mapper.get_insertion_anchor(start_idx, rebuild_map);\n if (!anchor_run && !anchor_para) return false;\n\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const ins = this._create_track_change_tag('w:ins', '', ins_id);\n \n const segments = this._parse_inline_markdown(edit.new_text || \"\");\n for (const [segText, segProps] of segments) {\n const r = xmlDoc.createElement('w:r');\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\n if (anchor_run) {\n insertAfter(ins, anchor_run._element);\n } else if (anchor_para) {\n anchor_para._element.appendChild(ins);\n }\n return true;\n }\n\n // DELETION / MODIFICATION\n const target_runs = active_mapper.find_target_runs_by_index(start_idx, length, rebuild_map);\n if (target_runs.length === 0) return false;\n\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')) 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 last_del = del_tag;\n }\n\n if (op === \"MODIFICATION\" && edit.new_text && last_del) {\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const ins = this._create_track_change_tag('w:ins', '', ins_id);\n const segments = this._parse_inline_markdown(edit.new_text);\n for (const [segText, segProps] of segments) {\n const r = xmlDoc.createElement('w:r');\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 insertAfter(ins, last_del);\n }\n\n return true;\n }\n}","import { trim_common_context } from './diff.js';\nimport { ModifyText } from './models.js';\n\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(marker.length, clean_text.length - marker.length);\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.replace(/“/g, '\"').replace(/”/g, '\"').replace(/‘/g, \"'\").replace(/’/g, \"'\");\n}\n\nfunction _find_safe_boundaries(text: string, start: number, end: number): [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 = (current_match.match(new RegExp(marker.replace(/\\*/g, '\\\\*'), 'g')) || []).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(text: string, start: number, end: number): [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) => (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(0, current_text.length - marker.length);\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) => 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(text: string, target: string): [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) 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(text, raw_start, raw_end);\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] = _strip_balanced_markers(target_text);\n\n let clean_new = new_text;\n if (prefix_markup && new_text) {\n if (new_text.startsWith(prefix_markup) && new_text.endsWith(suffix_markup)) {\n const inner_len = prefix_markup.length;\n clean_new = new_text.length > inner_len * 2 ? new_text.substring(inner_len, new_text.length - inner_len) : 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) 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 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 [start, end, actual_text, edit, orig_idx] 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 = prefix_len > 0 ? actual_text.substring(0, prefix_len) : '';\n const unmodified_suffix = suffix_len > 0 ? actual_text.substring(actual_text.length - suffix_len) : '';\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 = result.substring(0, start) + full_replacement + result.substring(end);\n }\n\n return result;\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}","/**\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(block_records, heading_indices, h_pos, level);\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(block_records: _BlockRecord[], range_start: number, range_end: number): 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(doc: DocumentObject, comments_map: any): _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({ item, is_paragraph: true, is_table: false, start_offset: cursor, projected_length: block_len });\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({ item, is_paragraph: false, is_table: true, start_offset: table_start, projected_length: block_len });\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(table: Table, target_paragraph: Paragraph, table_start_offset: number, comments_map: any): 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(cell, target_el, cursor, comments_map);\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(cell: any, target_el: any, cell_start_cursor: number, comments_map: any): [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(inner_item, new Paragraph(target_el, null), cursor, comments_map);\n if (nested_offset !== cursor) {\n if (_element_is_descendant(target_el, inner_item._element)) 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(target_el: Element, ancestor_el: Element): 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(table: Table, inherited_offset: number, records: _BlockRecord[], comments_map: any) {\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) ? _compute_inner_block_offset(table, inner_item, inherited_offset, comments_map) : inherited_offset;\n records.push({ item: inner_item, is_paragraph: true, is_table: false, start_offset: true_offset, projected_length: 0 });\n } else if (inner_item instanceof Table) {\n records.push({ item: inner_item, is_paragraph: false, is_table: true, start_offset: inherited_offset, projected_length: 0 });\n _record_table_inner_blocks_lite(inner_item, inherited_offset, records, comments_map);\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') 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(paragraph: Paragraph, comments_map: any): 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(paragraph._parent.part || paragraph._parent);\n const pPr = findChild(paragraph._element, 'w:pPr');\n let style_id = default_pstyle;\n \n if (pPr) {\n const oLvl = findChild(pPr, 'w:outlineLvl');\n if (oLvl && /^\\d+$/.test(oLvl.getAttribute('w:val') || '')) {\n const style = _safe_style_name(paragraph, style_cache, default_pstyle);\n if (style && (style.startsWith('Heading') || style === 'Title')) return style;\n return '(outline_level)';\n }\n const pStyle = findChild(pPr, 'w:pStyle');\n if (pStyle) style_id = pStyle.getAttribute('w:val') || default_pstyle;\n }\n\n const style_name = (style_id && style_cache && style_cache[style_id]) ? style_cache[style_id].name : null;\n if (style_name && (style_name.startsWith('Heading') || style_name === 'Title')) return style_name;\n \n if (style_name && /Heading[ ]?([1-6])(?![0-9])/.test(style_name)) return style_name;\n\n return '(heuristic)';\n}\n\nfunction _safe_style_name(paragraph: Paragraph, style_cache: any, default_pstyle: any): 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]) ? style_cache[style_id].name : null;\n}\n\nfunction _find_owned_end(block_records: _BlockRecord[], heading_indices: number[], current_h_pos: number, current_level: number): number {\n for (let next_h_pos = current_h_pos + 1; next_h_pos < heading_indices.length; next_h_pos++) {\n const next_idx = heading_indices[next_h_pos];\n if (_heading_level(block_records[next_idx].item) <= current_level) 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 * @adeu/core\n * Cross-platform XML Redlining Engine\n */\nexport const identifyEngine = () => 'adeu-core-node';\n\nexport { extractTextFromBuffer } from './ingest.js';\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 } 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';"],"mappings":"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","names":["result","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/engine.ts","../src/markup.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 { parseXml, findChild, findAllDescendants, serializeXml } 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\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(id: string, type: string, target: string, isExternal: boolean = false) {\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('http://schemas.openxmlformats.org/package/2006/relationships', 'Relationship');\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((p) => p.partname === searchPath || p.partname === '/' + searchPath);\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(partname: string, contentType: string, xmlString: string): Part {\n const doc = parseXml(xmlString);\n const part = new Part(partname, xmlString, doc.documentElement, contentType);\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(relsPath, 'application/vnd.openxmlformats-package.relationships+xml', xml);\n }\n return relsPart;\n }\n}\n\nexport class DocumentObject {\n public part: Part;\n public settings: { oddAndEvenPagesHeaderFooter: boolean } = { oddAndEvenPagesHeaderFooter: false };\n // Simplification for the TS port: sections hold header/footer refs\n public sections: any[] = []; \n\n constructor(public pkg: DocxPackage, part: Part) {\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(buffer: Buffer | ArrayBuffer): 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') || ''] = 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 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(rId, new Relationship(rId, type, target, targetMode === 'External'));\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 = '<?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}","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 (child.nodeType === 1 /* ELEMENT_NODE */ && (child as Element).tagName === tagName) {\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(element: Element, tagName: string): 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 */\nexport function serializeXml(node: Node): string {\n return new XMLSerializer().serializeToString(node);\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 { Paragraph, Table, Run, NotesPart, FootnoteItem, DocxEvent } 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(part: any): [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 = s.getAttribute('w:default') === '1' || 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 const name = name_el ? name_el.getAttribute('w:val') : s_id;\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]) 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(paragraph: Paragraph, style_cache?: Record<string, any>, default_pstyle?: string | null): boolean {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(paragraph._parent.part || paragraph._parent);\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 (style_info && style_info.outline_level !== null && style_info.outline_level >= 0 && style_info.outline_level <= 8) {\n return true;\n }\n\n const style_name = style_info ? style_info.name : null;\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}\n\nexport function get_paragraph_prefix(paragraph: Paragraph, style_cache?: Record<string, any>, default_pstyle?: string | null): string {\n if (!style_cache) {\n [style_cache, default_pstyle] = _get_style_cache(paragraph._parent.part || paragraph._parent);\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 (style_info && style_info.outline_level !== null && style_info.outline_level >= 0 && style_info.outline_level <= 8) {\n return '#'.repeat(style_info.outline_level + 1) + ' ';\n }\n\n const style_name = style_info ? style_info.name : null;\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 (b && b.getAttribute(QN_W_VAL) !== '0' && b.getAttribute(QN_W_VAL) !== 'false') {\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(paragraph: Paragraph, style_cache?: Record<string, any>, default_pstyle?: string | null): 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(run: Run, is_heading: boolean | null = null): [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 (b && b.getAttribute(QN_W_VAL) !== '0' && b.getAttribute(QN_W_VAL) !== 'false') is_bold = true;\n\n const i = findChild(rPr, QN_W_I);\n if (i && i.getAttribute(QN_W_VAL) !== '0' && i.getAttribute(QN_W_VAL) !== 'false') is_italic = true;\n }\n\n if (is_heading === null) {\n const parent = run._parent;\n is_heading = 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(text: string, prefix: string, suffix: string): 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(parent: any): 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 (child.getAttribute('w:type') === 'separator' || child.getAttribute('w:type') === 'continuationSeparator') 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 // Simplified for TS port - just yield main document and notes for ingestion\n yield doc;\n\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) return parent.pkg.mainDocumentPart;\n if (parent._parent) return _get_part(parent._parent);\n return null;\n}\n\nexport function* iter_paragraph_content(paragraph: Paragraph): Generator<Run | DocxEvent> {\n let in_complex_field = false;\n let current_instr = '';\n let hide_result = false;\n\n function* process_run_element(r_element: Element): 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 { type: 'fmt_start', id: c_id!, author: rPrChange.getAttribute(QN_W_AUTHOR) || undefined, date: rPrChange.getAttribute(QN_W_DATE) || undefined };\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') 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') 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 { type: 'ins_start', id: i_id, author: child.getAttribute(QN_W_AUTHOR) || undefined, date: child.getAttribute(QN_W_DATE) || undefined };\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 { type: 'del_start', id: d_id, author: child.getAttribute(QN_W_AUTHOR) || undefined, date: child.getAttribute(QN_W_DATE) || undefined };\n yield* traverse_node(child);\n yield { type: 'del_end', id: d_id };\n } else if (tag === QN_W_COMMENTRANGESTART) yield { type: 'start', id: child.getAttribute(QN_W_ID)! };\n else if (tag === QN_W_COMMENTRANGEEND) 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'))) yield { type: 'bookmark', id: b_name };\n } else if (tag === QN_W_SDT || tag === QN_W_SMARTTAG || tag === QN_W_SDTCONTENT) {\n yield* traverse_node(child);\n }\n }\n }\n\n yield* traverse_node(paragraph._element);\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(target: string, new_val: string): [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 = !isSpace(target[prefix_len - 1]) && !isSpace(target[prefix_len]);\n const new_split = !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 (left[idx] === '_' && \n (idx === 0 || left[idx - 1] !== '_') && \n (idx === left.length - 1 || left[idx + 1] !== '_')) {\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 (suffix_len < limit_suffix && target[target.length - 1 - suffix_len] === new_val[new_val.length - 1 - suffix_len]) {\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 = !isSpace(target[target.length - 1 - suffix_len]) && !isSpace(target[target.length - suffix_len]);\n }\n let new_split = false;\n if (suffix_len < new_val.length) {\n new_split = !isSpace(new_val[new_val.length - 1 - suffix_len]) && !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 (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 suffix_len -= idx_in_right + 1;\n break;\n }\n idx_in_right++;\n }\n continue;\n }\n break;\n }\n\n if (suffix_len > 0 && /^\\s+$/.test(target.substring(target.length - suffix_len))) {\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) && new_rem.startsWith(marker) &&\n tgt_rem.endsWith(marker) && new_rem.endsWith(marker) &&\n tgt_rem.length >= 2 * mlen && 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(text1: string, text2: string): [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(original_text: string, modified_text: string): ModifyText[] {\n const dmp = new diff_match_patch.diff_match_patch();\n \n const [chars1, chars2, token_array] = _words_to_chars(original_text, modified_text);\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++) 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) { // Equal\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({ type: 'modify', target_text: del_txt, new_text: '', comment: 'Diff: Text deleted', _match_start_index: idx });\n pending_delete = null;\n }\n current_original_index += text.length;\n } else if (op === -1) { // Delete\n pending_delete = [current_original_index, text];\n current_original_index += text.length;\n } else if (op === 1) { // Insert\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({ type: 'modify', target_text: del_txt, new_text: text, comment: 'Diff: Replacement', _match_start_index: idx });\n pending_delete = null;\n } else {\n edits.push({ type: 'modify', target_text: '', new_text: text, comment: 'Diff: Text inserted', _match_start_index: current_original_index });\n }\n }\n }\n\n if (pending_delete) {\n const [idx, del_txt] = pending_delete;\n edits.push({ type: 'modify', target_text: del_txt, new_text: '', comment: 'Diff: Text deleted', _match_start_index: idx });\n }\n\n return edits;\n}\n\nexport function create_unified_diff(original_text: string, modified_text: string, context_lines: number = 3): string {\n const dmp = new diff_match_patch.diff_match_patch();\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}","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, InsertTableRow, DeleteTableRow, AcceptChange, RejectChange, ReplyComment, 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, is_native_heading, get_run_style_markers, get_run_text, apply_formatting_to_segments \n} from './utils/docx.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.nodeType === 1);\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_text.includes(\"{++\") || n_text.includes(\"{--\") || n_text.includes(\"{>>\") || n_text.includes(\"{==\")) {\n errors.push(`- 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 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_fns.length > t_fns.length || n_fns.some((f: string) => n_fns.filter((x: string) => x===f).length > t_fns.filter((x: string) => x===f).length)) {\n errors.push(`- 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 } else {\n errors.push(`- 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 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(`- Edit ${i + 1} Failed: Cannot insert hyperlinks via text replace. Use a dedicated structural operation.`);\n } else {\n errors.push(`- Edit ${i + 1} Failed: Cannot delete hyperlinks via text replace. The marker corresponds to a structural XML element.`);\n }\n } else if (t_links.length > 1 && JSON.stringify(t_links) !== JSON.stringify(n_links)) {\n errors.push(`- Edit ${i + 1} Failed: Can only edit or retarget one hyperlink per text replacement. Please split into multiple edits.`);\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(`- Edit ${i + 1} Failed: Cannot insert cross-references via text replace. Markers are read-only projections.`);\n } else {\n errors.push(`- Edit ${i + 1} Failed: Cannot delete cross-references via text replace. The marker corresponds to a structural XML element.`);\n }\n } else {\n // Advanced XREF validation simplified for port scope\n if (JSON.stringify(t_xrefs) !== JSON.stringify(n_xrefs)) {\n errors.push(`- Edit ${i + 1} Failed: Modifying or retargeting cross-reference markers is disallowed to prevent dependency corruption.`);\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_anchors.filter((x: string) => x===a).length > t_anchors.filter((x: string) => x===a).length) {\n errors.push(`- Edit ${i + 1} Failed: Cannot modify or insert internal anchor markers (\\`{#...}\\`). These represent structural XML bookmarks.`);\n break;\n }\n }\n }\n\n if (edit.type === 'modify' && n_text) {\n const lines = n_text.split('\\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 (stripped.substring(level).startsWith(' ') || stripped.substring(level) === '') {\n errors.push(`- Edit ${i + 1} Failed: Heading level ${level} is not supported (maximum is 6).`);\n break;\n }\n }\n }\n }\n\n if (t_text.includes(\"READONLY_BOUNDARY_START\") || n_text.includes(\"READONLY_BOUNDARY_START\") || \n t_text.includes(\"# Document Structure (Read-Only)\") || n_text.includes(\"# Document Structure (Read-Only)\")) {\n errors.push(`- Edit ${i + 1} Failed: Modification targets the read-only boundary (Structural Appendix). This section cannot be edited.`);\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 = \"http://schemas.microsoft.com/office/word/2023/wordml/word16du\";\n for (const part of this.doc.pkg.parts) {\n if (part === this.doc.part || (part.contentType.includes('wordprocessingml') && part.contentType.endsWith('+xml'))) {\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 dels = findAllDescendants(this.doc.element, 'w:del');\n for (const d of dels) {\n const parent = d.parentNode as Element | null;\n if (parent?.tagName === 'w:trPr') {\n const tr = parent.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else {\n parent?.removeChild(d);\n }\n }\n const insNodes = findAllDescendants(this.doc.element, 'w:ins');\n for (const i of insNodes) {\n const parent = i.parentNode as Element | null;\n if (parent?.tagName === 'w:trPr') {\n parent.removeChild(i);\n } else {\n while (i.firstChild) parent?.insertBefore(i.firstChild, i);\n parent?.removeChild(i);\n }\n }\n }\n\n private _getNextId(): string {\n this.current_id++;\n return this.current_id.toString();\n }\n\n private _create_track_change_tag(tagName: string, author: string = \"\", reuseId: string | null = null): 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 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(text: string, baseStyle: any = {}): [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 ? raw.substring(2, raw.length - 2) : 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(runElement: Element, props: any, suppressInherited: boolean = false) {\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) { b = doc.createElement('w:b'); rPr.appendChild(b); }\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) { i = doc.createElement('w:i'); rPr.appendChild(i); }\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 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) 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(`- Edit ${i + 1} Failed: Target text not found in document:\\n \"${edit.target_text}\"`);\n } else if (matches.length > 1) {\n errors.push(`- Edit ${i + 1} Failed: Target text is ambiguous. Found ${matches.length} matches.\\nProvide more context.`);\n }\n\n for (const [start, length] of matches) {\n const spans = this.mapper.spans.filter(s => s.end > start && s.start < start + length);\n const nestedAuthors = new Set<string>();\n for (const s of spans) {\n if (s.ins_id) {\n const insNodes = findAllDescendants(this.doc.element, 'w:ins').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(`- Edit ${i + 1} Failed: Modification targets an active insertion from another author (${Array.from(nestedAuthors).join(', ')}).`);\n }\n }\n }\n return errors;\n }\n\n public process_batch(changes: DocumentChange[]): any {\n this.skipped_details = [];\n const actions = changes.filter(c => ['accept', 'reject', 'reply'].includes(c.type));\n const edits = changes.filter(c => !['accept', 'reject', 'reply'].includes(c.type));\n\n let applied_actions = 0, 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 if (edits.length > 0) {\n const errors = this.validate_edits(edits);\n if (errors.length > 0) throw new BatchValidationError(errors);\n }\n\n let applied_edits = 0, 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 (edit._match_start_index !== undefined && edit._match_start_index !== null) {\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(`- Failed to locate row target: '${(edit.target_text || '').substring(0, 40)}...'`);\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(`- Failed to apply edit targeting: '${(edit.target_text || 'insertion').substring(0, 40)}...'`);\n }\n }\n }\n\n resolved_edits.sort((a, b) => (b[0]._match_start_index || 0) - (a[0]._match_start_index || 0));\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(([occ_start, occ_end]) => start < occ_end && end > occ_start);\n if (overlaps) {\n skipped++;\n this.skipped_details.push(`- Skipped overlapping edit targeting: '${(edit.target_text || 'insertion').substring(0, 40)}...'`);\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(`- Failed to apply edit targeting: '${(edit.target_text || 'insertion').substring(0, 40)}...'`);\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 this.comments_manager.addComment(this.author, action.text, cid);\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.getAttribute('w:id') === target_id);\n const all_del = findAllDescendants(this.doc.element, 'w:del').filter(n => n.getAttribute('w:id') === target_id);\n const all_nodes = [...all_ins, ...all_del];\n\n if (all_nodes.length === 0) {\n skipped++;\n this.skipped_details.push(`- Failed to apply action: Target ID ${action.target_id} not found.`);\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 ? (node.parentNode as Element).tagName : '';\n const is_trPr = parent_tag === 'w:trPr';\n\n if (type === 'accept') {\n if (is_ins) {\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n while (node.firstChild) node.parentNode?.insertBefore(node.firstChild, node);\n node.parentNode?.removeChild(node);\n }\n } else {\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 if (is_trPr) {\n const tr = node.parentNode?.parentNode;\n tr?.parentNode?.removeChild(tr);\n } else node.parentNode?.removeChild(node);\n } else {\n if (is_trPr) node.parentNode?.removeChild(node);\n else {\n const delTexts = Array.from(node.getElementsByTagName('w:delText'));\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')) t.setAttribute('xml:space', 'preserve');\n dt.parentNode?.replaceChild(t, dt);\n }\n while (node.firstChild) 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(start_idx, rebuild_map);\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) t.setAttribute('xml:space', 'preserve');\n r.appendChild(t); p.appendChild(r); tc.appendChild(p); 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) this.clean_mapper = new DocumentMapper(this.doc, true);\n [start_idx, match_len] = this.clean_mapper.find_match_index(edit.target_text);\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(start_idx, start_idx + match_len);\n\n if (actual_doc_text === effective_new_text || edit.target_text === effective_new_text) {\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(actual_doc_text, effective_new_text);\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(edit: any, orig_new: string | null, rebuild_map: boolean): 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) ? this._getNextId() : null;\n const ins_id = ['INSERTION', 'MODIFICATION'].includes(op) ? this._getNextId() : null;\n\n if (op === \"COMMENT_ONLY\") {\n // Mocked for Port limits, normally anchors to found runs\n return true;\n }\n\n if (op === \"INSERTION\") {\n const [anchor_run, anchor_para] = active_mapper.get_insertion_anchor(start_idx, rebuild_map);\n if (!anchor_run && !anchor_para) return false;\n\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const ins = this._create_track_change_tag('w:ins', '', ins_id);\n \n const segments = this._parse_inline_markdown(edit.new_text || \"\");\n for (const [segText, segProps] of segments) {\n const r = xmlDoc.createElement('w:r');\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\n if (anchor_run) {\n insertAfter(ins, anchor_run._element);\n } else if (anchor_para) {\n anchor_para._element.appendChild(ins);\n }\n return true;\n }\n\n // DELETION / MODIFICATION\n const target_runs = active_mapper.find_target_runs_by_index(start_idx, length, rebuild_map);\n if (target_runs.length === 0) return false;\n\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')) 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 last_del = del_tag;\n }\n\n if (op === \"MODIFICATION\" && edit.new_text && last_del) {\n const xmlDoc = this.doc.part._element.ownerDocument!;\n const ins = this._create_track_change_tag('w:ins', '', ins_id);\n const segments = this._parse_inline_markdown(edit.new_text);\n for (const [segText, segProps] of segments) {\n const r = xmlDoc.createElement('w:r');\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 insertAfter(ins, last_del);\n }\n\n return true;\n }\n}","import { trim_common_context } from './diff.js';\nimport { ModifyText } from './models.js';\n\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(marker.length, clean_text.length - marker.length);\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.replace(/“/g, '\"').replace(/”/g, '\"').replace(/‘/g, \"'\").replace(/’/g, \"'\");\n}\n\nfunction _find_safe_boundaries(text: string, start: number, end: number): [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 = (current_match.match(new RegExp(marker.replace(/\\*/g, '\\\\*'), 'g')) || []).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(text: string, start: number, end: number): [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) => (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(0, current_text.length - marker.length);\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) => 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(text: string, target: string): [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) 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(text, raw_start, raw_end);\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] = _strip_balanced_markers(target_text);\n\n let clean_new = new_text;\n if (prefix_markup && new_text) {\n if (new_text.startsWith(prefix_markup) && new_text.endsWith(suffix_markup)) {\n const inner_len = prefix_markup.length;\n clean_new = new_text.length > inner_len * 2 ? new_text.substring(inner_len, new_text.length - inner_len) : 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) 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 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 [start, end, actual_text, edit, orig_idx] 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 = prefix_len > 0 ? actual_text.substring(0, prefix_len) : '';\n const unmodified_suffix = suffix_len > 0 ? actual_text.substring(actual_text.length - suffix_len) : '';\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 = result.substring(0, start) + full_replacement + result.substring(end);\n }\n\n return result;\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(block_records, heading_indices, h_pos, level);\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(block_records: _BlockRecord[], range_start: number, range_end: number): 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(doc: DocumentObject, comments_map: any): _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({ item, is_paragraph: true, is_table: false, start_offset: cursor, projected_length: block_len });\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({ item, is_paragraph: false, is_table: true, start_offset: table_start, projected_length: block_len });\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(table: Table, target_paragraph: Paragraph, table_start_offset: number, comments_map: any): 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(cell, target_el, cursor, comments_map);\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(cell: any, target_el: any, cell_start_cursor: number, comments_map: any): [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(inner_item, new Paragraph(target_el, null), cursor, comments_map);\n if (nested_offset !== cursor) {\n if (_element_is_descendant(target_el, inner_item._element)) 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(target_el: Element, ancestor_el: Element): 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(table: Table, inherited_offset: number, records: _BlockRecord[], comments_map: any) {\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) ? _compute_inner_block_offset(table, inner_item, inherited_offset, comments_map) : inherited_offset;\n records.push({ item: inner_item, is_paragraph: true, is_table: false, start_offset: true_offset, projected_length: 0 });\n } else if (inner_item instanceof Table) {\n records.push({ item: inner_item, is_paragraph: false, is_table: true, start_offset: inherited_offset, projected_length: 0 });\n _record_table_inner_blocks_lite(inner_item, inherited_offset, records, comments_map);\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') 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(paragraph: Paragraph, comments_map: any): 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(paragraph._parent.part || paragraph._parent);\n const pPr = findChild(paragraph._element, 'w:pPr');\n let style_id = default_pstyle;\n \n if (pPr) {\n const oLvl = findChild(pPr, 'w:outlineLvl');\n if (oLvl && /^\\d+$/.test(oLvl.getAttribute('w:val') || '')) {\n const style = _safe_style_name(paragraph, style_cache, default_pstyle);\n if (style && (style.startsWith('Heading') || style === 'Title')) return style;\n return '(outline_level)';\n }\n const pStyle = findChild(pPr, 'w:pStyle');\n if (pStyle) style_id = pStyle.getAttribute('w:val') || default_pstyle;\n }\n\n const style_name = (style_id && style_cache && style_cache[style_id]) ? style_cache[style_id].name : null;\n if (style_name && (style_name.startsWith('Heading') || style_name === 'Title')) return style_name;\n \n if (style_name && /Heading[ ]?([1-6])(?![0-9])/.test(style_name)) return style_name;\n\n return '(heuristic)';\n}\n\nfunction _safe_style_name(paragraph: Paragraph, style_cache: any, default_pstyle: any): 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]) ? style_cache[style_id].name : null;\n}\n\nfunction _find_owned_end(block_records: _BlockRecord[], heading_indices: number[], current_h_pos: number, current_level: number): number {\n for (let next_h_pos = current_h_pos + 1; next_h_pos < heading_indices.length; next_h_pos++) {\n const next_idx = heading_indices[next_h_pos];\n if (_heading_level(block_records[next_idx].item) <= current_level) 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}","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: SECURE & READY TO SEND\");\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 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';\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.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 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 } 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","render_comment"]}
|