@p10node/office-engine 0.0.0 → 0.1.0
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/LICENSE +21 -0
- package/README.md +64 -1
- package/dist/DocViewer-Cv4LaMB_.js +9342 -0
- package/dist/DocViewer-Cv4LaMB_.js.map +1 -0
- package/dist/THIRD_PARTY_LICENSES.txt +79 -0
- package/dist/assets/worker-CJfZ05I7.js.map +1 -0
- package/dist/collab-BzN1ZI-z.js +1984 -0
- package/dist/collab-BzN1ZI-z.js.map +1 -0
- package/dist/collab.js +2 -0
- package/dist/core.js +2 -0
- package/dist/default-worker-B5CGBnic.js +9193 -0
- package/dist/default-worker-B5CGBnic.js.map +1 -0
- package/dist/embed.js +83 -0
- package/dist/embed.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/office-engine.embed.js +33 -0
- package/dist/office-engine.worker.js +9092 -0
- package/dist/types/collab/codec.d.ts +3 -0
- package/dist/types/collab/docx.d.ts +166 -0
- package/dist/types/collab/hosts.d.ts +24 -0
- package/dist/types/collab/hub.d.ts +41 -0
- package/dist/types/collab/index.d.ts +43 -0
- package/dist/types/collab/pptx-ops.d.ts +60 -0
- package/dist/types/collab/pptx-worker.d.ts +35 -0
- package/dist/types/collab/pptx.d.ts +47 -0
- package/dist/types/collab/protocol.d.ts +76 -0
- package/dist/types/collab/react.d.ts +23 -0
- package/dist/types/collab/session.d.ts +115 -0
- package/dist/types/collab/transport.d.ts +47 -0
- package/dist/types/collab/xlsx-ops.d.ts +72 -0
- package/dist/types/collab/xlsx-worker.d.ts +29 -0
- package/dist/types/collab/xlsx.d.ts +51 -0
- package/dist/types/core/color.d.ts +25 -0
- package/dist/types/core/default-worker.d.ts +1 -0
- package/dist/types/core/docx/numbering.d.ts +33 -0
- package/dist/types/core/docx/parser.d.ts +126 -0
- package/dist/types/core/docx/spec.d.ts +4 -0
- package/dist/types/core/docx/styles.d.ts +63 -0
- package/dist/types/core/docx/types.d.ts +325 -0
- package/dist/types/core/docx/writer.d.ts +35 -0
- package/dist/types/core/fonts.d.ts +1 -0
- package/dist/types/core/index.d.ts +15 -0
- package/dist/types/core/opc.d.ts +56 -0
- package/dist/types/core/pptx/edit.d.ts +10 -0
- package/dist/types/core/pptx/parser.d.ts +52 -0
- package/dist/types/core/pptx/types.d.ts +238 -0
- package/dist/types/core/raw.d.ts +40 -0
- package/dist/types/core/source.d.ts +65 -0
- package/dist/types/core/theme.d.ts +11 -0
- package/dist/types/core/units.d.ts +7 -0
- package/dist/types/core/worker/client.d.ts +48 -0
- package/dist/types/core/worker/engine.d.ts +27 -0
- package/dist/types/core/worker/protocol.d.ts +112 -0
- package/dist/types/core/worker/worker.d.ts +1 -0
- package/dist/types/core/xlsx/calc.d.ts +31 -0
- package/dist/types/core/xlsx/editor.d.ts +95 -0
- package/dist/types/core/xlsx/formula/assist.d.ts +35 -0
- package/dist/types/core/xlsx/formula/catalog.d.ts +14 -0
- package/dist/types/core/xlsx/formula/dates.d.ts +23 -0
- package/dist/types/core/xlsx/formula/evaluate.d.ts +33 -0
- package/dist/types/core/xlsx/formula/fn-date.d.ts +2 -0
- package/dist/types/core/xlsx/formula/fn-logic.d.ts +3 -0
- package/dist/types/core/xlsx/formula/fn-lookup.d.ts +3 -0
- package/dist/types/core/xlsx/formula/fn-math.d.ts +3 -0
- package/dist/types/core/xlsx/formula/fn-stats.d.ts +3 -0
- package/dist/types/core/xlsx/formula/fn-text.d.ts +3 -0
- package/dist/types/core/xlsx/formula/fn.d.ts +64 -0
- package/dist/types/core/xlsx/formula/format.d.ts +5 -0
- package/dist/types/core/xlsx/formula/functions.d.ts +4 -0
- package/dist/types/core/xlsx/formula/index.d.ts +17 -0
- package/dist/types/core/xlsx/formula/lexer.d.ts +54 -0
- package/dist/types/core/xlsx/formula/parser.d.ts +53 -0
- package/dist/types/core/xlsx/formula/refs.d.ts +23 -0
- package/dist/types/core/xlsx/formula/transform.d.ts +21 -0
- package/dist/types/core/xlsx/formula/types.d.ts +59 -0
- package/dist/types/core/xlsx/formula/values.d.ts +49 -0
- package/dist/types/core/xlsx/numfmt.d.ts +11 -0
- package/dist/types/core/xlsx/structure.d.ts +31 -0
- package/dist/types/core/xlsx/styles.d.ts +17 -0
- package/dist/types/core/xlsx/types.d.ts +193 -0
- package/dist/types/core/xlsx/workbook.d.ts +94 -0
- package/dist/types/core/xml.d.ts +80 -0
- package/dist/types/core/zip.d.ts +35 -0
- package/dist/types/core/zipwrite.d.ts +9 -0
- package/dist/types/embed.d.ts +30 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/react/DocViewer.d.ts +43 -0
- package/dist/types/react/common/ContextMenu.d.ts +21 -0
- package/dist/types/react/common/Dialog.d.ts +27 -0
- package/dist/types/react/common/Slots.d.ts +18 -0
- package/dist/types/react/common/Status.d.ts +6 -0
- package/dist/types/react/common/ZoomControl.d.ts +6 -0
- package/dist/types/react/common/hooks.d.ts +20 -0
- package/dist/types/react/docx/DocxEditor.d.ts +172 -0
- package/dist/types/react/docx/DocxToolbar.d.ts +18 -0
- package/dist/types/react/docx/DocxView.d.ts +8 -0
- package/dist/types/react/docx/FindBar.d.ts +22 -0
- package/dist/types/react/docx/html.d.ts +8 -0
- package/dist/types/react/docx/render.d.ts +24 -0
- package/dist/types/react/docx/tables.d.ts +20 -0
- package/dist/types/react/edit/Toolbar.d.ts +130 -0
- package/dist/types/react/edit/input.d.ts +81 -0
- package/dist/types/react/edit/rich.d.ts +40 -0
- package/dist/types/react/injectStyles.d.ts +4 -0
- package/dist/types/react/pptx/PptxEditor.d.ts +95 -0
- package/dist/types/react/pptx/PptxToolbar.d.ts +36 -0
- package/dist/types/react/pptx/PptxView.d.ts +24 -0
- package/dist/types/react/pptx/Presenter.d.ts +9 -0
- package/dist/types/react/pptx/Slide.d.ts +28 -0
- package/dist/types/react/pptx/geometry.d.ts +5 -0
- package/dist/types/react/useDocument.d.ts +11 -0
- package/dist/types/react/xlsx/XlsxToolbar.d.ts +27 -0
- package/dist/types/react/xlsx/XlsxView.d.ts +16 -0
- package/dist/types/react/xlsx/axis.d.ts +19 -0
- package/dist/xlsx-ops-CsjNpMI0.js +244 -0
- package/dist/xlsx-ops-CsjNpMI0.js.map +1 -0
- package/package.json +74 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-CJfZ05I7.js","names":["REL_NS","num","cache","num","BULLETS","formatNumber","num","RUN_STOP","num","IMAGE_REL","IMG_TYPES","num","FILLS","num","MAX_COL","colName","colIndex","colIndex","MAX_COL","dateSerial","MONTHS","DAYS","splitSections","isDateFormat","formatDate","rank","grid","formatNumber","formatText","splitSections","isDateFormat","formatDate","formatText","MAX_COL","idOf","num","num","MAX_RECS","isNode","x","parseRaw","root","stack","push","n","xml","lt","c","end","gt","q","j","ch","body","self","m","qn","node","serialize","s","local","prefixOf","rootEl","nodes","kidsOf","loc","kidOf","ATTR_RE","getAttr","name","loose","unescape","setAttr","repl","value","escAttr","el","a","k","v","attrs","children","clone","removeKids","test","l","setOrdered","idx","parent","child","rank","order","at","i","escText","e","code","walkOoxml","rec","choiceSeen","isAlt","visit","REL_NS$1","relIdAttrs","u64","dv","o","ZipArchive","src","zip","tailLen","tailStart","tail","eocd","head","count","cdSize","cdOffset","z64Off","rdv","cd","cdv","utf8","p","flags","method","time","date","crc","compSize","size","nameLen","extraLen","commentLen","localOffset","eEnd","id","len","normalize","path","h","off","raw","onRaw","consumed","total","chunk","ctrl","reader","out","pos","extra","done","all","CRC_TABLE","t","crc32","data","IS_BUN","deflate","input","chunks","csize","toStream","d","bytes","dosNow","rebuildZip","enc","parts","central","offset","pending","changes","writeEntry","nameBytes","lh","cv","writeNew","key","ev","REL_NS","ENTITIES","decodeEntities","isWs","SaxParser","final","seg","cc","stop","start","qname","colon","eq","an","ve","ac","pfx","skip","AbortedError","parseXmlStream","stream","dec","opts","TreeBuilder","top","parseXml","tb","kid","kids","names","cur","desc","r","descAll","num$1","def","onOff","attr","textOf","MIME","mimeOf","ext","dirOf","part","resolvePath","target","baseDir","relativeTarget","fromDir","b","abs","relsPathFor","f","OpcPackage","type","rp","ids","external","base","ct","contentType","dir","pn","partName","load","SKIP_EXT","cache","map","rels","candidates","kind","relOfType","suffix","relsOfType","DEFAULT_THEME","parseTheme","te","colors","fs","fmt","EMU_PER_PX","emuToPx","emuToPt","ALIASES","SERIF","MONO","cache$1","cssFont","lower","generic","alias","HIGHLIGHT","hexColor","shading","BORDER_STYLE","border","w","borderCss","fontOf","th","rf","theme","readRPr","rPr","col","readPPr","ps","pPr","hang","first","line","rule","merge","CANON_BY_NAME","StyleSheet","dd","pretty","canon","canonOf","seen","tblPr","readTableBorders","readMargins","shd","prev","BULLETS$1","roman","letters","formatNumber$2","Numbering","readLevels","ilvl","inst","so","lvl","l0","numId","level","startOf","lv","DEFAULT_PAGE","fieldKind","instr","sameRecord","ka","cssLen","style","prop","pageSetup","sectPr","sz","mar","RUN_STOP$1","collectRuns","collectParas","into","roots","markerOf","listed","numbering","num","ms","markRs","Converter","styles","hooks","st","forced","layer","numPr","sid","lst","pid","saved","runs","last","g","href","lk","sink","link","text","rel","blocks","box","docPr","gd","txbx","spPr","fill","ln","blip","click","ts","look","readLook","borders","cols","jc","ind","rowEls","flatten","grid","nCols","trPr","tr","row","ri","cells","tci","tc","tcPr","span","vmEl","conds","bi","crs","cf","cm","va","tcW","cell","rj","below","nRows","lastRow","_gs","_vm","_tcB","_g","_ri","hex","Capture","onItem","DocxDocument","pkg","mainPath","themeRel","stylesRel","numRel","conv","item","ords","ord","info","list","baseMeta","finalSect","firstSect","started","hold","cb","lastFlush","held","index","els","before","capture","flush","now","sect","meta","ref","tag","changed","items","arr","pid0","pids","inf","next","PPR_ORDER","RPR_ORDER","START_MARKS","END_MARKS","RUN_STOP","HL_NAME","collectParasRaw","collectRunsRaw","itemCache","itemParas","doc","paras","origPara","runCache","origRun","applyRunSet","val","W","put","toggle","on","set","textContentXml","piece","abstractXml","bullets","fmts","canonDef","color","italic","ensureStyle","have","styleXml","parsed","ensureList","found","absNode","abstract","numNode","idxOf","lastAbs","firstNum","lastNum","cleanup","applyParaDirty","pd","sp","styleNum","readStyle","attrOf","genParagraph","tpl","spec","pq","markRPr","openLink","closeLink","runXml","content","baseRPr","pi","run","imageRunXml","cx","cy","starts","ends","orig","op","ppr","groupFor","detach","applyEdit","anchor","involved","listy","listPids","group","tplInfo","bl","markers","drawingId","A","PIC","descr","alt","rid","IMG_TYPES$1","addImage","addLink","url","TCPR_ORDER","rawRows","tbl","rawCells","genTable","rows","firstTcPr","cont","tcPrFor","pr","vm","trSrc","applyTable","saveDocx","touched","whole","hexToRgb","rgbToHex","rgbToHsl","max","min","hslToRgb","clamp01","applyTint","tint","hsl","PRESET","DEFAULT_MAP","COLOR_TAGS","drawingColor","ctx","mapped","applyMods","rgb","alpha","colorOf","INDEXED","XL_THEME_ORDER","sheetColor","indexed","customIndexed","stylesRoot","RPR_KIDS","FILLS$1","ALGN_OUT","findShape","applyPRunSet","PPR_KIDS","BULLETS","applyPPr","ALGN","DASH","nvPr","nv","phOf","ph","masterType","indexPlaceholders","byIdx","byType","tree","spTree","romanize","autoNum","core","PptxPresentation","defaultTextStyle","slides","clrMap","tx","mRel","master","clrMapOf","slide","lRel","layout","SlideRenderer","showSlideMaster","identity","curNodes","shape","late","origShape","txBody","origBody","origParas","P","origRuns","tplPPr","wants","gp","keep","ovr","inherited","readXfrm","rot","pres","tableStyles","typeface","phClr","stops","refIdx","lnRef","refLn","refColor","gs","wEmu","dash","bg","bgPr","hl","latin","pct","pts","sources","empty","gm","styleFont","fnt","synthetic","defRPr","chain","bodyAttrs","autofit","bp","na","fontScale","lnReduce","ins","counters","L","hrefId","endR","firstSz","hasText","bullet","spc","lph","mph","skipPh","idAttr","myTop","xf","xfrmPath","stroke","geom","adj","pathD","pg","gds","cg","customPath","bf","sr","crop","video","chOff","chExt","ox","oy","sx","sy","olePic","uri","label","flag","styleId","trs","tableFill","add","bodyRi","bodyCi","ci","fallback","defaultTableLook","bold","bord","tcStyle","bdr","side","fb","own","edge","outer","inner","textEl","accent","firstRow","bandRow","mix","pa","pb","paths","pw","pt","wR","hR","sw","ccx","ccy","ex","ey","BlobSource","blob","length","BufferSource","HttpRangeSource","init","res","cr","readWithProgress","err","endExcl","buf","waits","runStart","endBlock","oldest","bs","blk","blkStart","from","to","onProgress","loaded","openSource","ERROR_CODES","FormulaError","MAX_ROW","MAX_COL$1","ERR","colName$1","colIndex$1","up","sameSheet","quoteSheet","cellText","ar","fmtRef","pre","sheetText","normalizeRef","refInBounds","FormulaSyntaxError","message","ERRS","IDENT","RE_AREA","RE_CELL","RE_COLS","RE_ROWS","RE_NUM","PREFIXES","re","isIdent","readRef","r0","c0","r1","c1","readError","txt","stripFnPrefix","again","tokenize","afterSheet","sheet","two","word","depth","parseRefText","toks","CMP","Parser","ops","msg","args","sign","parseFormula","ast","MS_DAY","EPOCH_1900","EPOCH_1904","date1904","getDate1904","setDate1904","utc","y","ymdToSerial","serialToYmd","serial","dt","dow","serialSeconds","daysInMonth","dateToSerial","TIME_RE","ISO_RE","US_RE","parseTime","mi","sec","pm","dateSerial$1","parseDateText","day","rest","MONTHS$1","DAYS$1","splitSections$1","bare","isDateFormat$1","formatDate$1","lc","hasAp","secs","H","N","S","pad","am","RangeV","ArrayV","UnionV","areas","NUM_RE","parseNumberText","numToText","mant","digits","int","frac","toNum","toStr","toBool","u","str","bool","numEq","rank$1","compare","ra","rb","valueEq","hasWildcard","wildcardRe","pat","anchored","cmpOp","errCode","criteria","crit","ec","hit","INF","guard","pick","lifted","xs","vals","inRange","direct","eachNum","nums","flat","opt","addMonths","months","eom","WEEKDAY_START","datedif","unit","anniv","networkdays","lo","hi","holidays","DATE","yy","hol","arg","logicals","IF","cond","thenA","elseA","iferror","naOnly","LOGIC","findExact","wild","findApprox","best","lookupValue","grid$1","vhlookup","approx","vertical","keys","match","slice","xlookup","ret","notFound","mode","search","rev","lookup","dr","dc","parseR1C1","indirect","rowcol","isRow","seq","dims","LOOKUP","roundHalf","ax","formatNumber$1","prefix","pattern","lit","dot","ip","dp","decs","minDec","minInt","is","ds","signed","formatText$1","sections","textSec","clean","roundDir","finite","multiple","sig","gcd2","intArgs","MATH","sum","mean","variance","sample","ss","median","counts","bestN","rangeNums","kth","largest","asc","resized","matched","ranges","tests","pairs","values","ok","numsOf","vs","ifOne","ifMany","sumproduct","arrays","minmax","STATS","blanks","MAX_TEXT","proper","prevLetter","isLetter","find","hay","needle","TEXT","delim","skipEmpty","nth","nw","FUNCTIONS","arith","binop","map1","map2","da","db","Evaluator","it","left","right","rg","evaluate","rewrite","lead","rep","refError","translateFormula","shiftSpan","delta","shiftFormula","affects","refSheet","renameSheetInFormula","newName","oldName","toRef","references","walk","idOf$1","Calc","wb","dep","MAX_COL","sheetName","visiting","store","queue","formulas","rd","sheets","BUILTIN_FORMATS","COLORS","MONTHS","DAYS","splitSections","br","parseSection","isDate","sym","compile","isDateFormat","formatGeneral","intStr","formatNumber","pctCount","dotIdx","expIdx","slashIdx","firstDigit","lastDigit","scale","grouping","formatFraction","intEnd","decToks","decCount","exp","intPlaces","fixed","intPart","decPart","chars","intToks","hasInnerLit","placed","expDigits","slash","denToks","fixedDen","maxDen","hasWhole","bestD","neg","serialToDate","days","formatDate","hasAmPm","Y","M","D","Mi","msec","isMinute","tv","formatValue","formatText","BORDER","parseSheetStyles","numFmts","fonts","fills","pf","gf","css","f0","baseFont","xfs","font","deco","al","hAlign","wrap","decodeX","colIndex","colName","parseRef","parseRange","SheetData","SheetHandler","fontPt","basePt","hidden","px","SstHandler","XlsxWorkbook","existing","emit","rowSizesOf","onBytes","sentHeader","header","query","norm","limit","formula","snapshot","restore","materializeShared","si","shiftMerges","a0","a1","axis","shiftSheet","auto","others","setMerge","range","setColWidth","setRowHeight","FONT_ORDER","WB_ORDER","SS_ORDER","rowOf","create","getEntry","setEntry","exists","dateSerial","mo","parseInput","StyleEditor","sectionName","xfIndex","patch","sides","drop","XlsxEditor","needsWrite","formulaKeys","which","f1","inputs","ed","budget","cellPatch","borderSides","applyLayout","recalc","counter","layoutState","rowSizes","lay","fn","R","clear","_h","hideCols","escRe","by","sc","sf","nf","cmp","sorted","sheetsEl","entries","remap","old","after","dn","any","wbNodes","calc","fix","broken","rowCols","rw","RowPatcher","cellXml","fx","covered","pane","view","block","dataClose","rowOpen","ro","ce","replacements","inserts","ordered","IMG_TYPES","SPPR_ORDER","FILLS","emu","spTreeOf","idOf","maxId","aPrefix","setXfrm","host","prName","fillXml","shapeXml","setBackground","cSld","editSlide","undoShapes","redo","addSlideImage","shapeOps","shapes","copy","presNodes","refreshMeta","pickLayout","refSlide","masterPath","layouts","types","want2","want","newSlideXml","layoutPath","phXml","insertSlidePart","entry","slideOp","rn","rroot","notes","STRUCTURAL","XlsxCollabWorker","SkipOp","grew","PptxCollabWorker","WRITES","Engine","source","params","main","engine","result"],"sources":["../../src/core/raw.ts","../../src/core/zip.ts","../../src/core/zipwrite.ts","../../src/core/xml.ts","../../src/core/opc.ts","../../src/core/theme.ts","../../src/core/units.ts","../../src/core/fonts.ts","../../src/core/docx/styles.ts","../../src/core/docx/numbering.ts","../../src/core/docx/types.ts","../../src/core/docx/parser.ts","../../src/core/docx/writer.ts","../../src/core/color.ts","../../src/core/pptx/parser.ts","../../src/core/source.ts","../../src/core/xlsx/formula/types.ts","../../src/core/xlsx/formula/refs.ts","../../src/core/xlsx/formula/lexer.ts","../../src/core/xlsx/formula/parser.ts","../../src/core/xlsx/formula/dates.ts","../../src/core/xlsx/formula/values.ts","../../src/core/xlsx/formula/fn.ts","../../src/core/xlsx/formula/fn-date.ts","../../src/core/xlsx/formula/fn-logic.ts","../../src/core/xlsx/formula/fn-lookup.ts","../../src/core/xlsx/formula/format.ts","../../src/core/xlsx/formula/fn-math.ts","../../src/core/xlsx/formula/fn-stats.ts","../../src/core/xlsx/formula/fn-text.ts","../../src/core/xlsx/formula/functions.ts","../../src/core/xlsx/formula/evaluate.ts","../../src/core/xlsx/formula/transform.ts","../../src/core/xlsx/calc.ts","../../src/core/xlsx/numfmt.ts","../../src/core/xlsx/styles.ts","../../src/core/xlsx/workbook.ts","../../src/core/xlsx/structure.ts","../../src/core/xlsx/editor.ts","../../src/core/pptx/edit.ts","../../src/collab/xlsx-ops.ts","../../src/collab/xlsx-worker.ts","../../src/collab/pptx-worker.ts","../../src/core/worker/engine.ts","../../src/core/worker/worker.ts"],"sourcesContent":["/**\n * Byte-faithful XML tree: keeps qualified names, raw attribute text and raw\n * (still-escaped) text, so untouched parts serialize back exactly as read.\n */\nexport interface RNode {\n q: string\n a: string\n c: RChild[]\n self: boolean\n}\nexport type RChild = RNode | string\n\nexport const isNode = (x: RChild | undefined): x is RNode => typeof x === 'object' && x !== null\n\nexport function parseRaw(xml: string): RChild[] {\n const root: RChild[] = []\n const stack: RNode[] = []\n const push = (x: RChild) => (stack.length ? stack[stack.length - 1].c : root).push(x)\n let i = 0\n const n = xml.length\n while (i < n) {\n const lt = xml.indexOf('<', i)\n if (lt < 0) {\n push(xml.slice(i))\n break\n }\n if (lt > i) push(xml.slice(i, lt))\n const c = xml[lt + 1]\n if (c === '!' || c === '?') {\n let end: number\n if (xml.startsWith('<!--', lt)) end = xml.indexOf('-->', lt) + 3\n else if (xml.startsWith('<![CDATA[', lt)) end = xml.indexOf(']]>', lt) + 3\n else if (c === '?') end = xml.indexOf('?>', lt) + 2\n else end = xml.indexOf('>', lt) + 1\n if (end <= 0) end = n\n push(xml.slice(lt, end))\n i = end\n continue\n }\n if (c === '/') {\n const gt = xml.indexOf('>', lt)\n stack.pop()\n i = gt < 0 ? n : gt + 1\n continue\n }\n let gt = -1\n let q = ''\n for (let j = lt + 1; j < n; j++) {\n const ch = xml[j]\n if (q) {\n if (ch === q) q = ''\n } else if (ch === '\"' || ch === \"'\") q = ch\n else if (ch === '>') {\n gt = j\n break\n }\n }\n if (gt < 0) gt = n - 1\n let body = xml.slice(lt + 1, gt)\n const self = body.endsWith('/')\n if (self) body = body.slice(0, -1)\n const m = /^[^\\s/>]+/.exec(body)\n const qn = m ? m[0] : body\n const node: RNode = { q: qn, a: body.slice(qn.length), c: [], self }\n push(node)\n if (!self) stack.push(node)\n i = gt + 1\n }\n return root\n}\n\nexport function serialize(x: RChild | RChild[]): string {\n if (Array.isArray(x)) {\n let s = ''\n for (const c of x) s += serialize(c)\n return s\n }\n if (typeof x === 'string') return x\n if (x.self && !x.c.length) return `<${x.q}${x.a}/>`\n return `<${x.q}${x.a}>${serialize(x.c)}</${x.q}>`\n}\n\nexport const local = (q: string) => q.slice(q.indexOf(':') + 1)\nexport const prefixOf = (q: string) => (q.includes(':') ? q.slice(0, q.indexOf(':') + 1) : '')\n\nexport function rootEl(nodes: RChild[]): RNode | undefined {\n return nodes.find(isNode)\n}\n\nexport function kidsOf(n: RNode | undefined, loc?: string): RNode[] {\n if (!n) return []\n return n.c.filter((c): c is RNode => isNode(c) && (!loc || local(c.q) === loc))\n}\n\nexport function kidOf(n: RNode | undefined, loc: string): RNode | undefined {\n if (!n) return undefined\n for (const c of n.c) if (isNode(c) && local(c.q) === loc) return c\n return undefined\n}\n\nconst ATTR_RE = /([^\\s=]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g\n\n/** Attribute value by exact qualified name, or by local name when `loose`. */\nexport function getAttr(n: RNode, name: string, loose = false): string | undefined {\n ATTR_RE.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = ATTR_RE.exec(n.a))) {\n if (m[1] === name || (loose && local(m[1]) === name)) return unescape(m[3] ?? m[4] ?? '')\n }\n return undefined\n}\n\nexport function setAttr(n: RNode, name: string, value: string | undefined): void {\n ATTR_RE.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = ATTR_RE.exec(n.a))) {\n if (m[1] === name) {\n const repl = value === undefined ? '' : `${name}=\"${escAttr(value)}\"`\n n.a = n.a.slice(0, m.index) + repl + n.a.slice(m.index + m[0].length)\n if (value === undefined) n.a = n.a.replace(/\\s+$/, '').replace(/\\s{2,}/g, ' ')\n return\n }\n }\n if (value !== undefined) n.a = `${n.a.replace(/\\s+$/, '')} ${name}=\"${escAttr(value)}\"`\n}\n\nexport function el(q: string, attrs: Record<string, string | undefined> = {}, children: RChild[] = []): RNode {\n let a = ''\n for (const [k, v] of Object.entries(attrs)) if (v !== undefined) a += ` ${k}=\"${escAttr(v)}\"`\n return { q, a, c: children, self: children.length === 0 }\n}\n\nexport function clone<T extends RChild>(x: T): T {\n if (typeof x === 'string') return x\n const n = x as RNode\n return { q: n.q, a: n.a, self: n.self, c: n.c.map(clone) } as T\n}\n\nexport function removeKids(n: RNode, loc: string | ((l: string) => boolean)): void {\n const test = typeof loc === 'string' ? (l: string) => l === loc : loc\n n.c = n.c.filter((c) => !(isNode(c) && test(local(c.q))))\n}\n\n/**\n * Replaces (or inserts) the child with local name `loc`, keeping schema order:\n * the new child goes before the first existing sibling that comes later in `order`.\n */\nexport function setOrdered(parent: RNode, child: RNode | undefined, loc: string, order: string[]): void {\n const idx = parent.c.findIndex((c) => isNode(c) && local(c.q) === loc)\n if (idx >= 0) {\n if (child) parent.c[idx] = child\n else parent.c.splice(idx, 1)\n parent.self = parent.c.length === 0\n return\n }\n if (!child) return\n const rank = order.indexOf(loc)\n let at = parent.c.length\n for (let i = 0; i < parent.c.length; i++) {\n const c = parent.c[i]\n if (!isNode(c)) continue\n const r = order.indexOf(local(c.q))\n if (r > rank) {\n at = i\n break\n }\n }\n parent.c.splice(at, 0, child)\n parent.self = false\n}\n\nexport function escText(s: string): string {\n // strip characters that are illegal in XML 1.0\n return s.replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\uFFFE\\uFFFF]/g, '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n}\n\nexport function escAttr(s: string): string {\n return escText(s).replace(/\"/g, '"')\n}\n\nfunction unescape(s: string): string {\n return s.indexOf('&') < 0 ? s : s.replace(/&(lt|gt|amp|quot|apos|#\\d+|#x[0-9a-fA-F]+);/g, (m, e: string) => {\n switch (e) {\n case 'lt': return '<'\n case 'gt': return '>'\n case 'amp': return '&'\n case 'quot': return '\"'\n case 'apos': return \"'\"\n }\n const code = e[1] === 'x' ? parseInt(e.slice(2), 16) : parseInt(e.slice(1), 10)\n return Number.isFinite(code) ? String.fromCodePoint(code) : m\n })\n}\n\nexport function textContent(n: RChild): string {\n if (typeof n === 'string') return n.startsWith('<') ? '' : unescape(n)\n return n.c.map(textContent).join('')\n}\n\n/**\n * Preorder walk mirroring TreeBuilder semantics: mc:Fallback skipped, only the first\n * mc:Choice of an mc:AlternateContent is visited. `visit` returns true to stop descending.\n */\nexport function walkOoxml(n: RNode, visit: (node: RNode, parent: RNode, index: number) => boolean | void): void {\n const rec = (node: RNode) => {\n let choiceSeen = false\n const isAlt = local(node.q) === 'AlternateContent'\n for (let i = 0; i < node.c.length; i++) {\n const c = node.c[i]\n if (!isNode(c)) continue\n const l = local(c.q)\n if (l === 'Fallback') continue\n if (isAlt && l === 'Choice') {\n if (choiceSeen) continue\n choiceSeen = true\n rec(c)\n continue\n }\n if (l === 'AlternateContent') {\n rec(c)\n continue\n }\n if (visit(c, node, i)) continue\n rec(c)\n }\n }\n rec(n)\n}\n\nconst REL_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\n\n/** attributes for an `r:id`-style reference that are valid whatever prefixes the root declared */\nexport function relIdAttrs(root: RNode, local = 'id', value: string): Record<string, string> {\n const m = new RegExp(`xmlns:([\\\\w.-]+)=\"${REL_NS.replace(/[.]/g, '\\\\.')}\"`).exec(root.a)\n if (m) return { [`${m[1]}:${local}`]: value }\n return { 'xmlns:r': REL_NS, [`r:${local}`]: value }\n}\n","import type { ByteSource } from './source'\n\nexport interface ZipEntry {\n name: string\n method: number\n flags: number\n crc: number\n time: number\n date: number\n compSize: number\n size: number\n localOffset: number\n dataOffset?: number\n}\n\nconst SIG_EOCD = 0x06054b50\nconst SIG_Z64_LOC = 0x07064b50\nconst SIG_Z64_EOCD = 0x06064b50\nconst SIG_CEN = 0x02014b50\nconst SIG_LOC = 0x04034b50\n\nconst u64 = (dv: DataView, o: number) => Number(dv.getBigUint64(o, true))\n\n/**\n * Lazy ZIP reader: parses only the central directory, then inflates single\n * entries on demand straight from the byte source (native DecompressionStream).\n */\nexport class ZipArchive {\n private entries = new Map<string, ZipEntry>()\n\n private constructor(readonly src: ByteSource) {}\n\n static async open(src: ByteSource): Promise<ZipArchive> {\n const zip = new ZipArchive(src)\n await zip.readDirectory()\n return zip\n }\n\n private async readDirectory() {\n const { src } = this\n if (src.size < 22) throw new Error('Not a ZIP/OOXML file (too small)')\n const tailLen = Math.min(src.size, 22 + 0xffff + 20)\n const tailStart = src.size - tailLen\n const tail = await src.read(tailStart, tailLen)\n const dv = new DataView(tail.buffer, tail.byteOffset, tail.byteLength)\n let eocd = -1\n for (let i = tail.length - 22; i >= 0; i--) {\n if (dv.getUint32(i, true) === SIG_EOCD) {\n eocd = i\n break\n }\n }\n if (eocd < 0) {\n const head = await src.read(0, 8)\n if (head[0] === 0xd0 && head[1] === 0xcf) {\n throw new Error('Legacy binary Office format (.doc/.xls/.ppt) or encrypted file is not supported')\n }\n throw new Error('Not a ZIP/OOXML file (no end of central directory)')\n }\n let count = dv.getUint16(eocd + 10, true)\n let cdSize = dv.getUint32(eocd + 12, true)\n let cdOffset = dv.getUint32(eocd + 16, true)\n\n if (count === 0xffff || cdSize === 0xffffffff || cdOffset === 0xffffffff) {\n const loc = eocd - 20\n if (loc >= 0 && dv.getUint32(loc, true) === SIG_Z64_LOC) {\n const z64Off = u64(dv, loc + 8)\n const rec = await src.read(z64Off, 56)\n const rdv = new DataView(rec.buffer, rec.byteOffset, rec.byteLength)\n if (rdv.getUint32(0, true) === SIG_Z64_EOCD) {\n count = u64(rdv, 32)\n cdSize = u64(rdv, 40)\n cdOffset = u64(rdv, 48)\n }\n }\n }\n\n const cd = await src.read(cdOffset, cdSize)\n const cdv = new DataView(cd.buffer, cd.byteOffset, cd.byteLength)\n const utf8 = new TextDecoder()\n let p = 0\n for (let n = 0; n < count && p + 46 <= cd.length; n++) {\n if (cdv.getUint32(p, true) !== SIG_CEN) break\n const flags = cdv.getUint16(p + 8, true)\n const method = cdv.getUint16(p + 10, true)\n const time = cdv.getUint16(p + 12, true)\n const date = cdv.getUint16(p + 14, true)\n const crc = cdv.getUint32(p + 16, true)\n let compSize = cdv.getUint32(p + 20, true)\n let size = cdv.getUint32(p + 24, true)\n const nameLen = cdv.getUint16(p + 28, true)\n const extraLen = cdv.getUint16(p + 30, true)\n const commentLen = cdv.getUint16(p + 32, true)\n let localOffset = cdv.getUint32(p + 42, true)\n const name = utf8.decode(cd.subarray(p + 46, p + 46 + nameLen))\n if (size === 0xffffffff || compSize === 0xffffffff || localOffset === 0xffffffff) {\n let e = p + 46 + nameLen\n const eEnd = e + extraLen\n while (e + 4 <= eEnd) {\n const id = cdv.getUint16(e, true)\n const len = cdv.getUint16(e + 2, true)\n if (id === 0x0001) {\n let q = e + 4\n if (size === 0xffffffff) (size = u64(cdv, q)), (q += 8)\n if (compSize === 0xffffffff) (compSize = u64(cdv, q)), (q += 8)\n if (localOffset === 0xffffffff) localOffset = u64(cdv, q)\n break\n }\n e += 4 + len\n }\n }\n if (!name.endsWith('/')) {\n this.entries.set(normalize(name), { name, method, flags, crc, time, date, compSize, size, localOffset })\n }\n p += 46 + nameLen + extraLen + commentLen\n }\n }\n\n list(): ZipEntry[] {\n return [...this.entries.values()]\n }\n\n get(path: string): ZipEntry | undefined {\n return this.entries.get(normalize(path))\n }\n\n has(path: string): boolean {\n return this.entries.has(normalize(path))\n }\n\n private async dataOffset(e: ZipEntry): Promise<number> {\n if (e.dataOffset !== undefined) return e.dataOffset\n const h = await this.src.read(e.localOffset, 30)\n const dv = new DataView(h.buffer, h.byteOffset, h.byteLength)\n if (dv.getUint32(0, true) !== SIG_LOC) throw new Error(`Corrupt ZIP local header for ${e.name}`)\n e.dataOffset = e.localOffset + 30 + dv.getUint16(26, true) + dv.getUint16(28, true)\n return e.dataOffset\n }\n\n /** Compressed bytes of an entry, as stored (zero-copy Blob slice when the source allows). */\n async rawData(e: ZipEntry): Promise<Blob | Uint8Array> {\n const off = await this.dataOffset(e)\n return this.src.slice ? this.src.slice(off, e.compSize) : this.src.read(off, e.compSize)\n }\n\n /** Decompressed stream of an entry. `onRaw` reports compressed bytes consumed. */\n async stream(path: string, onRaw?: (consumed: number, total: number) => void): Promise<ReadableStream<Uint8Array>> {\n const e = this.get(path)\n if (!e) throw new Error(`Missing part: ${path}`)\n if (e.flags & 1) throw new Error('Encrypted documents are not supported')\n const off = await this.dataOffset(e)\n let raw = this.src.stream(off, e.compSize)\n if (onRaw) {\n let consumed = 0\n const total = e.compSize\n raw = raw.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, ctrl) {\n consumed += chunk.length\n onRaw(consumed, total)\n ctrl.enqueue(chunk)\n },\n }),\n )\n }\n if (e.method === 0) return raw\n if (e.method === 8) return raw.pipeThrough(new DecompressionStream('deflate-raw') as unknown as TransformStream<Uint8Array, Uint8Array>)\n throw new Error(`Unsupported ZIP compression method ${e.method} for ${e.name}`)\n }\n\n async bytes(path: string): Promise<Uint8Array> {\n const e = this.get(path)\n if (!e) throw new Error(`Missing part: ${path}`)\n const reader = (await this.stream(path)).getReader()\n const out = new Uint8Array(e.size)\n let pos = 0\n const extra: Uint8Array[] = []\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n if (pos + value.length <= out.length) out.set(value, pos)\n else extra.push(value)\n pos += value.length\n }\n if (!extra.length) return pos === out.length ? out : out.subarray(0, pos)\n // Size in directory was wrong: rebuild.\n const all = new Uint8Array(pos)\n all.set(out)\n let q = out.length\n for (const x of extra) all.set(x, q), (q += x.length)\n return all\n }\n\n async text(path: string): Promise<string> {\n return new TextDecoder().decode(await this.bytes(path))\n }\n}\n\nexport function normalize(path: string): string {\n return path.replace(/^\\/+/, '').replace(/\\\\/g, '/').toLowerCase()\n}\n","import { normalize, type ZipArchive } from './zip'\n\nconst CRC_TABLE = (() => {\n const t = new Uint32Array(256)\n for (let n = 0; n < 256; n++) {\n let c = n\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1\n t[n] = c >>> 0\n }\n return t\n})()\n\nexport function crc32(data: Uint8Array, crc = 0): number {\n let c = ~crc >>> 0\n for (let i = 0; i < data.length; i++) c = CRC_TABLE[(c ^ data[i]) & 0xff] ^ (c >>> 8)\n return ~c >>> 0\n}\n\nconst IS_BUN = typeof (globalThis as { Bun?: unknown }).Bun !== 'undefined'\n\nexport type PartData = Uint8Array | string | (() => ReadableStream<Uint8Array>)\n\ninterface Deflated {\n chunks: Uint8Array[]\n crc: number\n size: number\n csize: number\n}\n\n/** Deflates (raw) a stream while computing CRC32 and sizes. */\nasync function deflate(input: ReadableStream<Uint8Array>): Promise<Deflated> {\n let crc = 0\n let size = 0\n const counted = input.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, ctrl) {\n crc = crc32(chunk, crc)\n size += chunk.length\n ctrl.enqueue(chunk)\n },\n }),\n )\n const out = counted.pipeThrough(new CompressionStream('deflate-raw') as unknown as TransformStream<Uint8Array, Uint8Array>)\n const reader = out.getReader()\n const chunks: Uint8Array[] = []\n let csize = 0\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n csize += value.length\n }\n return { chunks, crc, size, csize }\n}\n\nfunction toStream(d: PartData): ReadableStream<Uint8Array> {\n if (typeof d === 'function') return d()\n const bytes = typeof d === 'string' ? new TextEncoder().encode(d) : d\n return new ReadableStream({\n start(c) {\n c.enqueue(bytes)\n c.close()\n },\n })\n}\n\nfunction dosNow(): { time: number; date: number } {\n const d = new Date()\n return {\n time: (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1),\n date: ((d.getFullYear() - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate(),\n }\n}\n\n/**\n * Re-packs an archive: unchanged entries are copied as stored (no recompression,\n * zero-copy when the source is a Blob); changed/added entries are deflated.\n * `changes`: path → new data, or null to delete.\n */\nexport async function rebuildZip(zip: ZipArchive, changes: Map<string, PartData | null>, type = 'application/zip'): Promise<Blob> {\n const enc = new TextEncoder()\n const parts: BlobPart[] = []\n const central: Uint8Array[] = []\n let offset = 0\n let count = 0\n const pending = new Map<string, { name: string; data: PartData | null }>()\n for (const [k, v] of changes) pending.set(normalize(k), { name: k.replace(/^\\/+/, ''), data: v })\n\n const writeEntry = (name: string, method: number, crc: number, csize: number, size: number, time: number, date: number, body: BlobPart[]) => {\n const nameBytes = enc.encode(name)\n const utf8 = /[^\\x20-\\x7e]/.test(name) ? 0x800 : 0\n if (offset > 0xfffffff0 || csize > 0xfffffff0) throw new Error('Saved file exceeds 4 GB (ZIP64 writing not supported)')\n const lh = new Uint8Array(30 + nameBytes.length)\n const dv = new DataView(lh.buffer)\n dv.setUint32(0, 0x04034b50, true)\n dv.setUint16(4, 20, true)\n dv.setUint16(6, utf8, true)\n dv.setUint16(8, method, true)\n dv.setUint16(10, time, true)\n dv.setUint16(12, date, true)\n dv.setUint32(14, crc, true)\n dv.setUint32(18, csize, true)\n dv.setUint32(22, size, true)\n dv.setUint16(26, nameBytes.length, true)\n lh.set(nameBytes, 30)\n const ch = new Uint8Array(46 + nameBytes.length)\n const cv = new DataView(ch.buffer)\n cv.setUint32(0, 0x02014b50, true)\n cv.setUint16(4, 20, true)\n cv.setUint16(6, 20, true)\n cv.setUint16(8, utf8, true)\n cv.setUint16(10, method, true)\n cv.setUint16(12, time, true)\n cv.setUint16(14, date, true)\n cv.setUint32(16, crc, true)\n cv.setUint32(20, csize, true)\n cv.setUint32(24, size, true)\n cv.setUint16(28, nameBytes.length, true)\n cv.setUint32(42, offset, true)\n ch.set(nameBytes, 46)\n parts.push(lh, ...body)\n central.push(ch)\n offset += lh.length + csize\n count++\n }\n\n const writeNew = async (name: string, data: PartData) => {\n const d = await deflate(toStream(data))\n const { time, date } = dosNow()\n writeEntry(name, 8, d.crc, d.csize, d.size, time, date, d.chunks as BlobPart[])\n }\n\n for (const e of zip.list()) {\n const key = normalize(e.name)\n const ch = pending.get(key)\n if (ch) {\n pending.delete(key)\n if (ch.data !== null) await writeNew(e.name, ch.data)\n continue\n }\n let raw = await zip.rawData(e)\n // Bun drops lazily-read file slices when composing Blobs: materialize there (browsers stay zero-copy)\n if (IS_BUN && raw instanceof Blob) raw = new Uint8Array(await raw.arrayBuffer())\n writeEntry(e.name, e.method, e.crc, e.compSize, e.size, e.time, e.date, [raw as BlobPart])\n }\n for (const { name, data } of pending.values()) if (data !== null) await writeNew(name, data)\n\n const cdSize = central.reduce((n, c) => n + c.length, 0)\n const eocd = new Uint8Array(22)\n const ev = new DataView(eocd.buffer)\n ev.setUint32(0, 0x06054b50, true)\n ev.setUint16(8, count, true)\n ev.setUint16(10, count, true)\n ev.setUint32(12, cdSize, true)\n ev.setUint32(16, offset, true)\n return new Blob([...parts, ...(central as BlobPart[]), eocd], { type })\n}\n","/**\n * Minimal streaming XML tokenizer tailored to OOXML (works inside Web Workers,\n * where DOMParser is unavailable). Element names are reduced to local names;\n * attributes too, except relationship-namespace ones which become `r:<local>`.\n */\nexport type Attrs = Record<string, string>\n\nexport interface SaxHandler {\n /** Return `true` to skip the element's whole subtree (no `close` is emitted then). */\n open(name: string, attrs: Attrs, selfClosing: boolean): boolean | void\n close(name: string): void\n text(text: string): void\n}\n\nconst REL_NS = new Set([\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n 'http://purl.oclc.org/ooxml/officeDocument/relationships',\n])\n\nconst ENTITIES: Record<string, string> = { lt: '<', gt: '>', amp: '&', quot: '\"', apos: \"'\" }\n\nexport function decodeEntities(s: string): string {\n if (s.indexOf('&') < 0) return s\n return s.replace(/&(#x[0-9a-fA-F]+|#\\d+|[a-zA-Z]+);/g, (m, e: string) => {\n if (e[0] === '#') {\n const code = e[1] === 'x' || e[1] === 'X' ? parseInt(e.slice(2), 16) : parseInt(e.slice(1), 10)\n return Number.isFinite(code) && code <= 0x10ffff ? String.fromCodePoint(code) : m\n }\n return ENTITIES[e] ?? m\n })\n}\n\nconst isWs = (c: number) => c === 32 || c === 9 || c === 10 || c === 13\n\nexport class SaxParser {\n private buf = ''\n private depth = 0\n private skipDepth = -1\n private relPrefixes = new Set<string>(['r'])\n\n /**\n * @param raw optional tap receiving every consumed source segment verbatim (tags, text, comments…),\n * called right before the matching handler event. Used for byte-preserving rewrites.\n */\n constructor(\n private h: SaxHandler,\n private raw?: (segment: string) => void,\n ) {}\n\n write(chunk: string): void {\n this.buf = this.buf.length ? this.buf + chunk : chunk\n this.run(false)\n }\n\n end(): void {\n this.run(true)\n this.buf = ''\n }\n\n private run(final: boolean) {\n const s = this.buf\n const n = s.length\n let i = 0\n while (i < n) {\n const lt = s.indexOf('<', i)\n if (lt < 0) {\n if (final) {\n const seg = s.substring(i)\n this.raw?.(seg)\n this.onText(seg)\n i = n\n }\n break\n }\n if (lt > i) {\n const seg = s.substring(i, lt)\n this.raw?.(seg)\n this.onText(seg)\n }\n i = lt\n if (lt + 1 >= n) break\n const c = s.charCodeAt(lt + 1)\n if (c === 47) {\n const gt = s.indexOf('>', lt + 2)\n if (gt < 0) break\n this.raw?.(s.substring(lt, gt + 1))\n this.onClose(s.substring(lt + 2, gt))\n i = gt + 1\n continue\n }\n if (c === 63) {\n const e = s.indexOf('?>', lt + 2)\n if (e < 0) break\n this.raw?.(s.substring(lt, e + 2))\n i = e + 2\n continue\n }\n if (c === 33) {\n if (n - lt < 9 && !final) break\n if (s.startsWith('<!--', lt)) {\n const e = s.indexOf('-->', lt + 4)\n if (e < 0) break\n this.raw?.(s.substring(lt, e + 3))\n i = e + 3\n continue\n }\n if (s.startsWith('<![CDATA[', lt)) {\n const e = s.indexOf(']]>', lt + 9)\n if (e < 0) break\n this.raw?.(s.substring(lt, e + 3))\n if (this.skipDepth < 0) this.h.text(s.substring(lt + 9, e))\n i = e + 3\n continue\n }\n const e = s.indexOf('>', lt + 2)\n if (e < 0) break\n this.raw?.(s.substring(lt, e + 1))\n i = e + 1\n continue\n }\n let gt = -1\n let q = 0\n for (let j = lt + 1; j < n; j++) {\n const cc = s.charCodeAt(j)\n if (q !== 0) {\n if (cc === q) q = 0\n } else if (cc === 34 || cc === 39) q = cc\n else if (cc === 62) {\n gt = j\n break\n }\n }\n if (gt < 0) break\n this.raw?.(s.substring(lt, gt + 1))\n this.onOpen(s, lt + 1, gt)\n i = gt + 1\n }\n this.buf = i >= n ? '' : s.substring(i)\n }\n\n private onText(raw: string) {\n if (this.skipDepth >= 0 || this.depth === 0) return\n this.h.text(raw.indexOf('&') >= 0 ? decodeEntities(raw) : raw)\n }\n\n private onOpen(s: string, start: number, end: number) {\n let stop = end\n let self = false\n if (s.charCodeAt(end - 1) === 47) {\n self = true\n stop = end - 1\n }\n if (this.skipDepth >= 0) {\n if (!self) this.depth++\n return\n }\n let k = start\n while (k < stop && !isWs(s.charCodeAt(k))) k++\n const qname = s.substring(start, k)\n const colon = qname.indexOf(':')\n const name = colon < 0 ? qname : qname.substring(colon + 1)\n const attrs: Attrs = {}\n while (k < stop) {\n if (isWs(s.charCodeAt(k))) {\n k++\n continue\n }\n const eq = s.indexOf('=', k)\n if (eq < 0 || eq >= stop) break\n let an = s.substring(k, eq).trim()\n let v = eq + 1\n while (v < stop && s.charCodeAt(v) !== 34 && s.charCodeAt(v) !== 39) v++\n if (v >= stop) break\n const ve = s.indexOf(s[v], v + 1)\n if (ve < 0) break\n const raw = s.substring(v + 1, ve)\n k = ve + 1\n const ac = an.indexOf(':')\n if (ac >= 0) {\n const pfx = an.substring(0, ac)\n const local = an.substring(ac + 1)\n if (pfx === 'xmlns') {\n if (REL_NS.has(raw)) this.relPrefixes.add(local)\n continue\n }\n an = this.relPrefixes.has(pfx) ? 'r:' + local : local\n } else if (an === 'xmlns') continue\n attrs[an] = raw.indexOf('&') >= 0 ? decodeEntities(raw) : raw\n }\n const skip = this.h.open(name, attrs, self)\n if (self) {\n if (!skip) this.h.close(name)\n return\n }\n this.depth++\n if (skip) this.skipDepth = this.depth\n }\n\n private onClose(qname: string) {\n if (this.skipDepth >= 0) {\n if (this.depth === this.skipDepth) this.skipDepth = -1\n this.depth--\n return\n }\n this.depth--\n const t = qname.trim()\n const colon = t.indexOf(':')\n this.h.close(colon < 0 ? t : t.substring(colon + 1))\n }\n}\n\nexport class AbortedError extends Error {\n constructor() {\n super('aborted')\n this.name = 'AbortError'\n }\n}\n\nexport interface StreamParseOptions {\n signal?: AbortSignal\n /** verbatim source tap, see SaxParser */\n raw?: (segment: string) => void\n /** Called after each chunk (decompressed byte count); may return a promise to yield. */\n onChunk?: (bytes: number) => void | Promise<void>\n}\n\nexport async function parseXmlStream(stream: ReadableStream<Uint8Array>, h: SaxHandler, opts: StreamParseOptions = {}): Promise<void> {\n const reader = stream.getReader()\n const dec = new TextDecoder()\n const p = new SaxParser(h, opts.raw)\n try {\n for (;;) {\n if (opts.signal?.aborted) throw new AbortedError()\n const { done, value } = await reader.read()\n if (done) break\n p.write(dec.decode(value, { stream: true }))\n if (opts.onChunk) await opts.onChunk(value.length)\n }\n p.write(dec.decode())\n p.end()\n } catch (e) {\n reader.cancel().catch(() => {})\n throw e\n }\n}\n\n// ---------------------------------------------------------------------------\n// Lightweight element tree\n\nexport interface XEl {\n n: string\n a: Attrs\n c: XEl[]\n t: string\n}\n\nconst TRANSPARENT = 0\nconst SHALLOW = 1\ntype Frame = XEl | typeof TRANSPARENT | typeof SHALLOW\n\nexport interface TreeBuilderOptions {\n /** When set, elements at this depth are built and emitted one by one; ancestors are not kept. */\n emitDepth?: number\n onElement?: (el: XEl) => void\n onShallowOpen?: (name: string, attrs: Attrs, depth: number) => void\n /** Element local names whose subtree is dropped. */\n skip?: Set<string>\n}\n\n/** Builds XEl trees; resolves mc:AlternateContent by taking the first mc:Choice. */\nexport class TreeBuilder implements SaxHandler {\n root: XEl | null = null\n private stack: Frame[] = []\n private parents: XEl[] = []\n private depth = 0\n private alt: boolean[] = []\n\n constructor(private o: TreeBuilderOptions = {}) {}\n\n open(name: string, a: Attrs): boolean | void {\n if (name === 'Fallback' || this.o.skip?.has(name)) return true\n if (name === 'AlternateContent') {\n this.alt.push(false)\n this.stack.push(TRANSPARENT)\n return\n }\n if (name === 'Choice' && this.alt.length) {\n const top = this.alt.length - 1\n if (this.alt[top]) return true\n this.alt[top] = true\n this.stack.push(TRANSPARENT)\n return\n }\n const d = this.depth++\n if (this.o.emitDepth !== undefined && d < this.o.emitDepth) {\n this.o.onShallowOpen?.(name, a, d)\n this.stack.push(SHALLOW)\n return\n }\n const el: XEl = { n: name, a, c: [], t: '' }\n const parent = this.parents[this.parents.length - 1]\n if (parent) parent.c.push(el)\n this.parents.push(el)\n this.stack.push(el)\n }\n\n close(name: string): void {\n const top = this.stack.pop()\n if (top === TRANSPARENT) {\n if (name === 'AlternateContent') this.alt.pop()\n return\n }\n this.depth--\n if (top === SHALLOW || top === undefined) return\n this.parents.pop()\n if (this.parents.length === 0) {\n if (this.o.emitDepth !== undefined) this.o.onElement?.(top)\n else this.root = top\n }\n }\n\n text(t: string): void {\n const p = this.parents[this.parents.length - 1]\n if (p) p.t += t\n }\n}\n\nexport function parseXml(xml: string, skip?: Set<string>): XEl {\n const tb = new TreeBuilder({ skip })\n const p = new SaxParser(tb)\n p.write(xml)\n p.end()\n if (!tb.root) throw new Error('Empty XML document')\n return tb.root\n}\n\n// ---------------------------------------------------------------------------\n// Tree helpers\n\nexport function kid(el: XEl | undefined, name: string): XEl | undefined {\n if (!el) return undefined\n for (const c of el.c) if (c.n === name) return c\n return undefined\n}\n\nexport function kids(el: XEl | undefined, name: string): XEl[] {\n return el ? el.c.filter((c) => c.n === name) : []\n}\n\nexport function path(el: XEl | undefined, ...names: string[]): XEl | undefined {\n let cur = el\n for (const n of names) {\n cur = kid(cur, n)\n if (!cur) return undefined\n }\n return cur\n}\n\nexport function desc(el: XEl | undefined, name: string): XEl | undefined {\n if (!el) return undefined\n for (const c of el.c) {\n if (c.n === name) return c\n const r = desc(c, name)\n if (r) return r\n }\n return undefined\n}\n\nexport function descAll(el: XEl | undefined, name: string, out: XEl[] = []): XEl[] {\n if (!el) return out\n for (const c of el.c) {\n if (c.n === name) out.push(c)\n else descAll(c, name, out)\n }\n return out\n}\n\nexport function num(v: string | undefined, def?: number): number | undefined {\n if (v === undefined || v === '') return def\n const n = Number(v)\n return Number.isFinite(n) ? n : def\n}\n\n/** OOXML on/off value: absent element → undefined, `<x/>` → true. */\nexport function onOff(el: XEl | undefined, attr = 'val'): boolean | undefined {\n if (!el) return undefined\n const v = el.a[attr]\n if (v === undefined) return true\n return !(v === '0' || v === 'false' || v === 'off' || v === 'none')\n}\n\nexport function textOf(el: XEl | undefined): string {\n if (!el) return ''\n if (!el.c.length) return el.t\n let s = ''\n for (const c of el.c) s += c.n === 't' ? c.t : textOf(c)\n return s\n}\n","import { el, getAttr, isNode, kidsOf, parseRaw, rootEl, serialize } from './raw'\nimport { normalize, ZipArchive } from './zip'\nimport { rebuildZip, type PartData } from './zipwrite'\nimport { kids, parseXml, type XEl } from './xml'\n\nexport type DocKind = 'docx' | 'xlsx' | 'pptx'\n\nexport interface Rel {\n id: string\n type: string\n target: string\n external: boolean\n}\n\nexport type Rels = Map<string, Rel>\n\nconst MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n jpe: 'image/jpeg',\n gif: 'image/gif',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n ico: 'image/x-icon',\n emf: 'image/emf',\n wmf: 'image/wmf',\n mp4: 'video/mp4',\n m4v: 'video/mp4',\n mov: 'video/quicktime',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n m4a: 'audio/mp4',\n}\n\nexport function mimeOf(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase() ?? ''\n return MIME[ext] ?? 'application/octet-stream'\n}\n\n/** Browser-renderable image? (EMF/WMF/TIFF are not.) */\nexport function isWebImage(path: string): boolean {\n return /\\.(png|jpe?g|jpe|gif|bmp|svg|webp|ico)$/i.test(path)\n}\n\nexport function dirOf(part: string): string {\n const i = part.lastIndexOf('/')\n return i < 0 ? '' : part.slice(0, i)\n}\n\nexport function resolvePath(baseDir: string, target: string): string {\n if (target.startsWith('/')) return target.slice(1)\n const out = baseDir ? baseDir.split('/') : []\n for (const seg of target.split('/')) {\n if (seg === '..') out.pop()\n else if (seg && seg !== '.') out.push(seg)\n }\n return out.join('/')\n}\n\n/** Inverse of resolvePath: target of `abs` relative to directory `fromDir`. */\nexport function relativeTarget(fromDir: string, abs: string): string {\n const a = fromDir ? fromDir.split('/') : []\n const b = abs.split('/')\n let i = 0\n while (i < a.length && i < b.length - 1 && a[i] === b[i]) i++\n return [...a.slice(i).map(() => '..'), ...b.slice(i)].join('/')\n}\n\nexport function relsPathFor(part: string): string {\n const d = dirOf(part)\n const f = part.slice(d.length ? d.length + 1 : 0)\n return (d ? d + '/' : '') + '_rels/' + f + '.rels'\n}\n\nexport class OpcPackage {\n private relsCache = new Map<string, Promise<Rels>>()\n private xmlCache = new Map<string, Promise<XEl | undefined>>()\n private contentTypes?: Promise<Map<string, string>>\n /** edited parts: normalized path → { path, data } (data null = deleted) */\n private changes = new Map<string, { path: string; data: PartData | null }>()\n\n constructor(readonly zip: ZipArchive) {}\n\n has(path: string) {\n const ch = this.changes.get(normalize(path))\n if (ch) return ch.data !== null\n return this.zip.has(path)\n }\n\n get dirty(): boolean {\n return this.changes.size > 0\n }\n\n /** Current text of a part (edited version if any). */\n async text(path: string): Promise<string> {\n const ch = this.changes.get(normalize(path))\n if (ch) {\n if (ch.data === null) throw new Error(`Missing part: ${path}`)\n if (typeof ch.data === 'string') return ch.data\n if (ch.data instanceof Uint8Array) return new TextDecoder().decode(ch.data)\n throw new Error(`Part ${path} is a stream`)\n }\n return this.zip.text(path)\n }\n\n /** Decompressed stream of the current version of a part (edited parts included). */\n async stream(path: string, onRaw?: (consumed: number, total: number) => void): Promise<ReadableStream<Uint8Array>> {\n const ch = this.changes.get(normalize(path))\n if (!ch) return this.zip.stream(path, onRaw)\n if (ch.data === null) throw new Error(`Missing part: ${path}`)\n if (typeof ch.data === 'function') return ch.data()\n const bytes = typeof ch.data === 'string' ? new TextEncoder().encode(ch.data) : ch.data\n return new ReadableStream({\n start(c) {\n c.enqueue(bytes)\n c.close()\n },\n })\n }\n\n setPart(path: string, data: PartData | null): void {\n path = path.replace(/^\\/+/, '')\n this.changes.set(normalize(path), { path, data })\n this.xmlCache.delete(path)\n this.relsCache.clear()\n if (/\\[content_types\\]\\.xml$/i.test(path)) this.contentTypes = undefined\n }\n\n /** Builds the edited package; unchanged entries are copied without recompression. */\n async save(type: string): Promise<Blob> {\n const m = new Map<string, PartData | null>()\n for (const { path, data } of this.changes.values()) m.set(path, data)\n return rebuildZip(this.zip, m, type)\n }\n\n /** Adds a relationship from `part` to `target` (absolute part path); returns its id. */\n async addRel(part: string, type: string, target: string, external = false): Promise<string> {\n const rp = relsPathFor(part)\n const nodes = this.has(rp)\n ? parseRaw(await this.text(rp))\n : parseRaw('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>')\n const root = rootEl(nodes)!\n const ids = new Set(kidsOf(root, 'Relationship').map((r) => getAttr(r, 'Id')))\n let n = ids.size + 1\n while (ids.has(`rId${n}`)) n++\n const id = `rId${n}`\n root.c.push(el('Relationship', external ? { Id: id, Type: type, Target: target, TargetMode: 'External' } : { Id: id, Type: type, Target: relativeTarget(dirOf(part), target) }))\n root.self = false\n this.setPart(rp, serialize(nodes))\n return id\n }\n\n async removeRelsTo(part: string, target: string): Promise<void> {\n const rp = relsPathFor(part)\n if (!this.has(rp)) return\n const nodes = parseRaw(await this.text(rp))\n const root = rootEl(nodes)!\n const base = dirOf(part)\n root.c = root.c.filter((c) => !(isNode(c) && resolvePath(base, getAttr(c, 'Target') ?? '').toLowerCase() === target.toLowerCase()))\n this.setPart(rp, serialize(nodes))\n }\n\n /** Ensures a <Default Extension=…> entry exists (for new media types). */\n async ensureDefaultType(ext: string, contentType: string): Promise<void> {\n const ct = '[Content_Types].xml'\n const nodes = parseRaw(await this.text(ct))\n const root = rootEl(nodes)!\n if (kidsOf(root, 'Default').some((d) => getAttr(d, 'Extension')?.toLowerCase() === ext.toLowerCase())) return\n root.c.unshift(el('Default', { Extension: ext, ContentType: contentType }))\n this.setPart(ct, serialize(nodes))\n }\n\n /** Free part name like `word/media/image7.png`. */\n freeName(dir: string, base: string, ext: string): string {\n for (let i = 1; ; i++) {\n const p = `${dir}/${base}${i}.${ext}`\n if (!this.has(p)) return p\n }\n }\n\n async setContentType(partName: string, contentType: string | null): Promise<void> {\n const ct = '[Content_Types].xml'\n const nodes = parseRaw(await this.text(ct))\n const root = rootEl(nodes)!\n const pn = '/' + partName.replace(/^\\/+/, '')\n root.c = root.c.filter((c) => !(isNode(c) && getAttr(c, 'PartName')?.toLowerCase() === pn.toLowerCase()))\n if (contentType) root.c.push(el('Override', { PartName: pn, ContentType: contentType }))\n this.setPart(ct, serialize(nodes))\n }\n\n /** Parsed XML part (cached). Missing parts resolve to undefined. */\n xml(path: string, cache = true): Promise<XEl | undefined> {\n const load = async () => (this.has(path) ? parseXml(await this.text(path), SKIP_EXT) : undefined)\n if (!cache) return load()\n let p = this.xmlCache.get(path)\n if (!p) this.xmlCache.set(path, (p = load()))\n return p\n }\n\n rels(part: string): Promise<Rels> {\n let p = this.relsCache.get(part)\n if (!p) {\n p = (async () => {\n const map: Rels = new Map()\n const rp = relsPathFor(part)\n if (!this.has(rp)) return map\n const root = parseXml(await this.text(rp))\n const base = dirOf(part)\n for (const r of kids(root, 'Relationship')) {\n const external = r.a.TargetMode === 'External'\n const target = r.a.Target ?? ''\n map.set(r.a.Id, {\n id: r.a.Id,\n type: r.a.Type ?? '',\n external,\n target: external ? target : resolvePath(base, target),\n })\n }\n return map\n })()\n this.relsCache.set(part, p)\n }\n return p\n }\n\n async contentType(path: string): Promise<string | undefined> {\n if (!this.contentTypes) {\n this.contentTypes = (async () => {\n const m = new Map<string, string>()\n if (!this.has('[Content_Types].xml')) return m\n const root = parseXml(await this.text('[Content_Types].xml'))\n for (const d of kids(root, 'Default')) m.set('ext:' + (d.a.Extension ?? '').toLowerCase(), d.a.ContentType)\n for (const o of kids(root, 'Override')) m.set((o.a.PartName ?? '').replace(/^\\//, '').toLowerCase(), o.a.ContentType)\n return m\n })()\n }\n const m = await this.contentTypes\n const key = path.toLowerCase()\n return m.get(key) ?? m.get('ext:' + (key.split('.').pop() ?? ''))\n }\n\n async blob(path: string): Promise<Blob> {\n const ch = this.changes.get(normalize(path))\n const bytes = ch && ch.data !== null && typeof ch.data !== 'function' ? (typeof ch.data === 'string' ? new TextEncoder().encode(ch.data) : ch.data) : await this.zip.bytes(path)\n return new Blob([bytes as BlobPart], { type: mimeOf(path) })\n }\n\n async mainPart(): Promise<{ path: string; kind: DocKind }> {\n const rels = await this.rels('')\n let path: string | undefined\n for (const r of rels.values()) if (r.type.endsWith('/officeDocument')) path = r.target\n const candidates: [string, DocKind][] = [\n ['word/document.xml', 'docx'],\n ['xl/workbook.xml', 'xlsx'],\n ['ppt/presentation.xml', 'pptx'],\n ]\n if (!path) path = candidates.find(([p]) => this.zip.has(p))?.[0]\n if (!path) throw new Error('Not an Office Open XML document (no main part found)')\n const ct = (await this.contentType(path)) ?? ''\n let kind: DocKind | undefined\n if (ct.includes('wordprocessingml')) kind = 'docx'\n else if (ct.includes('spreadsheetml')) kind = 'xlsx'\n else if (ct.includes('presentationml')) kind = 'pptx'\n else kind = candidates.find(([p]) => path!.toLowerCase().startsWith(p.split('/')[0] + '/'))?.[1]\n if (!kind) throw new Error(`Unsupported document type (${ct || path})`)\n return { path, kind }\n }\n}\n\nexport function relOfType(rels: Rels, suffix: string): Rel | undefined {\n for (const r of rels.values()) if (r.type.endsWith('/' + suffix)) return r\n return undefined\n}\n\nexport function relsOfType(rels: Rels, suffix: string): Rel[] {\n return [...rels.values()].filter((r) => r.type.endsWith('/' + suffix))\n}\n\nconst SKIP_EXT = new Set(['extLst'])\n","import { kid, kids, path, type XEl } from './xml'\n\nexport interface Theme {\n colors: Record<string, string>\n major: string\n minor: string\n fillStyles: XEl[]\n bgFillStyles: XEl[]\n lineStyles: XEl[]\n}\n\nexport const DEFAULT_THEME: Theme = {\n colors: {\n dk1: '#000000', lt1: '#ffffff', dk2: '#44546a', lt2: '#e7e6e6',\n accent1: '#4472c4', accent2: '#ed7d31', accent3: '#a5a5a5', accent4: '#ffc000',\n accent5: '#5b9bd5', accent6: '#70ad47', hlink: '#0563c1', folHlink: '#954f72',\n },\n major: 'Calibri Light',\n minor: 'Calibri',\n fillStyles: [],\n bgFillStyles: [],\n lineStyles: [],\n}\n\nexport function parseTheme(root: XEl | undefined): Theme {\n if (!root) return DEFAULT_THEME\n const te = kid(root, 'themeElements')\n const colors: Record<string, string> = { ...DEFAULT_THEME.colors }\n for (const c of kid(te, 'clrScheme')?.c ?? []) {\n const v = c.c[0]\n if (!v) continue\n if (v.n === 'srgbClr' && v.a.val) colors[c.n] = '#' + v.a.val.toLowerCase()\n else if (v.n === 'sysClr') colors[c.n] = '#' + (v.a.lastClr ?? (v.a.val === 'window' ? 'ffffff' : '000000')).toLowerCase()\n }\n const fs = kid(te, 'fontScheme')\n const fmt = kid(te, 'fmtScheme')\n return {\n colors,\n major: path(fs, 'majorFont', 'latin')?.a.typeface || DEFAULT_THEME.major,\n minor: path(fs, 'minorFont', 'latin')?.a.typeface || DEFAULT_THEME.minor,\n fillStyles: kid(fmt, 'fillStyleLst')?.c ?? [],\n bgFillStyles: kid(fmt, 'bgFillStyleLst')?.c ?? [],\n lineStyles: kids(kid(fmt, 'lnStyleLst'), 'ln'),\n }\n}\n","export const EMU_PER_PX = 9525\nexport const EMU_PER_PT = 12700\nexport const emuToPx = (v: number | undefined) => (v ?? 0) / EMU_PER_PX\nexport const emuToPt = (v: number | undefined) => (v ?? 0) / EMU_PER_PT\nexport const twipToPt = (v: number | undefined) => (v ?? 0) / 20\nexport const ptToPx = (pt: number) => (pt * 96) / 72\nexport const round2 = (v: number) => Math.round(v * 100) / 100\n","/** Maps Office font names to CSS stacks with metric-compatible fallbacks. */\nconst ALIASES: Record<string, string> = {\n calibri: 'Carlito',\n cambria: 'Caladea',\n arial: '\"Liberation Sans\", Arimo',\n helvetica: '\"Liberation Sans\", Arimo',\n 'times new roman': '\"Liberation Serif\", Tinos',\n 'courier new': '\"Liberation Mono\", Cousine',\n 'segoe ui': 'system-ui',\n 'calibri light': 'Carlito',\n aptos: '\"Segoe UI\", system-ui',\n 'aptos display': '\"Segoe UI\", system-ui',\n}\n\nconst SERIF = /times|cambria|georgia|garamond|book|serif|palatino|minion|baskerville|didot|caslon|mincho|song/i\nconst MONO = /courier|mono|consolas|menlo|code/i\n\nconst cache = new Map<string, string>()\n\nexport function cssFont(name: string | undefined): string | undefined {\n if (!name) return undefined\n let v = cache.get(name)\n if (v) return v\n const lower = name.toLowerCase()\n const generic = MONO.test(name) ? 'monospace' : SERIF.test(name) && !/sans/i.test(name) ? 'serif' : 'sans-serif'\n const alias = ALIASES[lower]\n v = `\"${name.replace(/\"/g, '')}\"${alias ? ', ' + alias : ''}, ${generic}`\n cache.set(name, v)\n return v\n}\n","import { cssFont } from '../fonts'\nimport type { Theme } from '../theme'\nimport { kid, kids, num, onOff, path, type XEl } from '../xml'\nimport type { Border, CanonStyle, ParaStyle, RunStyle, StyleInfo } from './types'\n\nexport const HIGHLIGHT: Record<string, string> = {\n yellow: '#ffff00', green: '#00ff00', cyan: '#00ffff', magenta: '#ff00ff', blue: '#0000ff', red: '#ff0000',\n darkBlue: '#000080', darkCyan: '#008080', darkGreen: '#008000', darkMagenta: '#800080', darkRed: '#800000',\n darkYellow: '#808000', darkGray: '#808080', lightGray: '#c0c0c0', black: '#000000', white: '#ffffff',\n}\n\nexport const hexColor = (v: string | undefined): string | undefined =>\n v && v !== 'auto' && /^[0-9a-fA-F]{6}$/.test(v) ? '#' + v.toLowerCase() : undefined\n\nexport function shading(el: XEl | undefined): string | undefined {\n if (!el) return undefined\n return hexColor(el.a.fill) ?? (el.a.val === 'solid' ? hexColor(el.a.color) : undefined)\n}\n\nconst BORDER_STYLE: Record<string, string> = {\n single: 'solid', thick: 'solid', double: 'double', dotted: 'dotted', dashed: 'dashed', dotDash: 'dashed',\n dotDotDash: 'dotted', triple: 'double', thinThickSmallGap: 'double', thickThinSmallGap: 'double',\n wave: 'solid', dashSmallGap: 'dashed', outset: 'outset', inset: 'inset',\n}\n\nexport function border(el: XEl | undefined): Border | undefined | null {\n if (!el) return undefined\n const v = el.a.val\n if (!v || v === 'nil' || v === 'none') return null\n const w = Math.max(0.5, (num(el.a.sz) ?? 4) / 8)\n return { w: v === 'double' ? Math.max(w, 2.25) : w, style: BORDER_STYLE[v] ?? 'solid', color: hexColor(el.a.color) ?? '#000000' }\n}\n\nexport const borderCss = (b: Border | null | undefined): string | undefined =>\n b === null ? 'none' : b ? `${b.w}pt ${b.style} ${b.color}` : undefined\n\nfunction fontOf(rf: XEl, theme: Theme): string | undefined {\n const th = rf.a.asciiTheme ?? rf.a.hAnsiTheme\n if (th) return cssFont(th.startsWith('major') ? theme.major : theme.minor)\n return cssFont(rf.a.ascii ?? rf.a.hAnsi ?? rf.a.cs ?? rf.a.eastAsia)\n}\n\nexport function readRPr(rPr: XEl | undefined, theme: Theme): RunStyle {\n const s: RunStyle = {}\n if (!rPr) return s\n for (const c of rPr.c) {\n switch (c.n) {\n case 'b': s.b = onOff(c); break\n case 'i': s.i = onOff(c); break\n case 'strike': s.strike = onOff(c); break\n case 'dstrike': s.dstrike = onOff(c); break\n case 'caps': s.caps = onOff(c); break\n case 'smallCaps': s.smallCaps = onOff(c); break\n case 'vanish': s.vanish = onOff(c); break\n case 'u': s.u = c.a.val ?? 'single'; break\n case 'color': { const col = hexColor(c.a.val); if (col) s.color = col; break }\n case 'sz': { const v = num(c.a.val); if (v) s.sz = v / 2; break }\n case 'rFonts': { const f = fontOf(c, theme); if (f) s.font = f; break }\n case 'highlight': { const h = HIGHLIGHT[c.a.val]; if (h) s.hl = h; break }\n case 'shd': { const h = shading(c); if (h) s.shd = h; break }\n case 'vertAlign': s.va = c.a.val === 'superscript' ? 'sup' : c.a.val === 'subscript' ? 'sub' : undefined; break\n case 'spacing': { const v = num(c.a.val); if (v) s.spacing = v / 20; break }\n }\n }\n return s\n}\n\nexport interface NumPr {\n numId: string\n ilvl: number\n}\n\nexport interface PPrResult {\n ps: ParaStyle\n styleId?: string\n numPr?: NumPr\n sectPr?: XEl\n}\n\nexport function readPPr(pPr: XEl | undefined): PPrResult {\n const ps: ParaStyle = {}\n const out: PPrResult = { ps }\n if (!pPr) return out\n for (const c of pPr.c) {\n switch (c.n) {\n case 'pStyle': out.styleId = c.a.val; break\n case 'numPr': {\n const id = kid(c, 'numId')?.a.val\n if (id !== undefined) out.numPr = { numId: id, ilvl: num(kid(c, 'ilvl')?.a.val, 0)! }\n break\n }\n case 'jc': {\n const v = c.a.val\n ps.align = v === 'center' ? 'center' : v === 'right' || v === 'end' ? 'right' : v === 'both' || v === 'distribute' ? 'justify' : 'left'\n break\n }\n case 'ind': {\n const l = num(c.a.left ?? c.a.start)\n const r = num(c.a.right ?? c.a.end)\n if (l !== undefined) ps.indL = l / 20\n if (r !== undefined) ps.indR = r / 20\n const hang = num(c.a.hanging)\n const first = num(c.a.firstLine)\n if (hang !== undefined) ps.indFirst = -hang / 20\n else if (first !== undefined) ps.indFirst = first / 20\n break\n }\n case 'spacing': {\n const b = num(c.a.before)\n const a = num(c.a.after)\n if (c.a.beforeAutospacing === '1' || c.a.beforeAutospacing === 'true') ps.before = 14\n else if (b !== undefined) ps.before = b / 20\n if (c.a.afterAutospacing === '1' || c.a.afterAutospacing === 'true') ps.after = 14\n else if (a !== undefined) ps.after = a / 20\n const line = num(c.a.line)\n if (line !== undefined) {\n const rule = (c.a.lineRule as ParaStyle['lineRule']) ?? 'auto'\n ps.lineRule = rule\n ps.line = rule === 'auto' ? line / 240 : line / 20\n }\n break\n }\n case 'shd': { const h = shading(c); if (h) ps.shd = h; break }\n case 'pBdr': {\n const t = border(kid(c, 'top'))\n const b = border(kid(c, 'bottom'))\n const l = border(kid(c, 'left') ?? kid(c, 'start'))\n const r = border(kid(c, 'right') ?? kid(c, 'end'))\n if (t) ps.bTop = t\n if (b) ps.bBottom = b\n if (l) ps.bLeft = l\n if (r) ps.bRight = r\n break\n }\n case 'keepNext': ps.keepNext = onOff(c); break\n case 'contextualSpacing': ps.contextual = onOff(c); break\n case 'pageBreakBefore': ps.pageBreakBefore = onOff(c); break\n case 'outlineLvl': ps.outline = num(c.a.val); break\n case 'sectPr': out.sectPr = c; break\n }\n }\n return out\n}\n\nexport const merge = <T extends object>(...parts: (T | undefined)[]): T => Object.assign({}, ...parts.filter(Boolean)) as T\n\n// ---------------------------------------------------------------------------\n\ninterface StyleDef {\n id: string\n type: string\n basedOn?: string\n el: XEl\n isDefault: boolean\n name: string\n next?: string\n quick: boolean\n hidden: boolean\n}\n\nexport interface ResolvedParaStyle {\n ps: ParaStyle\n rs: RunStyle\n numPr?: NumPr\n}\n\nexport interface CondFormat {\n rs: RunStyle\n shd?: string\n}\n\nexport interface ResolvedTableStyle {\n ps: ParaStyle\n rs: RunStyle\n borders: Record<string, Border | null | undefined>\n cellMar: Partial<Record<'top' | 'left' | 'bottom' | 'right', number>>\n shd?: string\n cond: Record<string, CondFormat>\n}\n\nconst CANON_BY_NAME: Record<string, CanonStyle> = {\n normal: 'normal',\n title: 'title',\n subtitle: 'subtitle',\n 'heading 1': 'h1',\n 'heading 2': 'h2',\n 'heading 3': 'h3',\n 'heading 4': 'h4',\n 'heading 5': 'h5',\n 'heading 6': 'h6',\n heading1: 'h1',\n heading2: 'h2',\n heading3: 'h3',\n heading4: 'h4',\n heading5: 'h5',\n heading6: 'h6',\n}\n\nexport class StyleSheet {\n private defs = new Map<string, StyleDef>()\n private paraCache = new Map<string, ResolvedParaStyle>()\n private charCache = new Map<string, RunStyle>()\n private tblCache = new Map<string, ResolvedTableStyle>()\n defaultPara?: string\n defaultTable?: string\n docRs: RunStyle = {}\n docPs: ParaStyle = {}\n\n constructor(root: XEl | undefined, private theme: Theme) {\n if (!root) return\n const dd = kid(root, 'docDefaults')\n this.docRs = readRPr(path(dd, 'rPrDefault', 'rPr'), theme)\n this.docPs = readPPr(path(dd, 'pPrDefault', 'pPr')).ps\n for (const s of kids(root, 'style')) {\n const id = s.a.styleId\n if (!id) continue\n const def: StyleDef = {\n id,\n type: s.a.type ?? 'paragraph',\n basedOn: kid(s, 'basedOn')?.a.val,\n el: s,\n isDefault: s.a.default === '1' || s.a.default === 'true',\n name: kid(s, 'name')?.a.val ?? id,\n next: kid(s, 'next')?.a.val,\n quick: !!kid(s, 'qFormat'),\n hidden: !!kid(s, 'semiHidden') || !!kid(s, 'hidden'),\n }\n this.defs.set(id, def)\n if (def.isDefault && def.type === 'paragraph') this.defaultPara = id\n if (def.isDefault && def.type === 'table') this.defaultTable = id\n }\n }\n\n /** registers a style element added to styles.xml */\n add(s: XEl) {\n const id = s.a.styleId\n if (!id) return\n this.defs.set(id, {\n id,\n type: s.a.type ?? 'paragraph',\n basedOn: kid(s, 'basedOn')?.a.val,\n el: s,\n isDefault: false,\n name: kid(s, 'name')?.a.val ?? id,\n next: kid(s, 'next')?.a.val,\n quick: !!kid(s, 'qFormat'),\n hidden: false,\n })\n this.paraCache.clear()\n }\n\n /** ids of the built-in paragraph styles present in the document (matched by name, any locale id) */\n canonical(): Partial<Record<CanonStyle, string>> {\n const out: Partial<Record<CanonStyle, string>> = {}\n if (this.defaultPara) out.normal = this.defaultPara\n for (const d of this.defs.values()) {\n if (d.type !== 'paragraph') continue\n const k = CANON_BY_NAME[d.name.toLowerCase()] ?? CANON_BY_NAME[d.id.toLowerCase()]\n if (k && !out[k]) out[k] = d.id\n }\n return out\n }\n\n has(id: string): boolean {\n return this.defs.has(id)\n }\n\n /** Paragraph styles offered in the style picker (Normal, Title, Heading 1…). */\n quickStyles(): StyleInfo[] {\n const pretty = (n: string) => n.replace(/^heading (\\d)$/i, 'Heading $1').replace(/^\\w/, (c) => c.toUpperCase())\n const canon = this.canonical()\n const canonOf = new Map(Object.entries(canon).map(([k, id]) => [id, k as CanonStyle]))\n return [...this.defs.values()]\n .filter((d) => d.type === 'paragraph' && (d.isDefault || canonOf.has(d.id) || (d.quick && !d.hidden)))\n .map((d) => {\n const r = this.para(d.id)\n const { b, i, color, sz, font } = r.rs\n return { id: d.id, name: pretty(d.name), next: d.next, canon: canonOf.get(d.id), outline: r.ps.outline, preview: { b, i, color, sz, font } }\n })\n }\n\n private chain(id: string | undefined): StyleDef[] {\n const out: StyleDef[] = []\n const seen = new Set<string>()\n let cur = id ? this.defs.get(id) : undefined\n while (cur && !seen.has(cur.id)) {\n seen.add(cur.id)\n out.unshift(cur)\n cur = cur.basedOn ? this.defs.get(cur.basedOn) : undefined\n }\n return out\n }\n\n para(id: string | undefined): ResolvedParaStyle {\n const key = id ?? this.defaultPara ?? ''\n let r = this.paraCache.get(key)\n if (r) return r\n r = { ps: {}, rs: {} }\n for (const d of this.chain(key)) {\n const p = readPPr(kid(d.el, 'pPr'))\n r.ps = merge(r.ps, p.ps)\n if (p.numPr) r.numPr = p.numPr\n r.rs = merge(r.rs, readRPr(kid(d.el, 'rPr'), this.theme))\n }\n this.paraCache.set(key, r)\n return r\n }\n\n char(id: string | undefined): RunStyle {\n if (!id) return {}\n let r = this.charCache.get(id)\n if (r) return r\n r = {}\n for (const d of this.chain(id)) r = merge(r, readRPr(kid(d.el, 'rPr'), this.theme))\n this.charCache.set(id, r)\n return r\n }\n\n table(id: string | undefined): ResolvedTableStyle {\n const key = id ?? this.defaultTable ?? ''\n let r = this.tblCache.get(key)\n if (r) return r\n r = { ps: {}, rs: {}, borders: {}, cellMar: {}, cond: {} }\n for (const d of this.chain(key)) {\n r.ps = merge(r.ps, readPPr(kid(d.el, 'pPr')).ps)\n r.rs = merge(r.rs, readRPr(kid(d.el, 'rPr'), this.theme))\n const tblPr = kid(d.el, 'tblPr')\n Object.assign(r.borders, readTableBorders(kid(tblPr, 'tblBorders')))\n Object.assign(r.cellMar, readMargins(kid(tblPr, 'tblCellMar')))\n const shd = shading(path(d.el, 'tcPr', 'shd'))\n if (shd) r.shd = shd\n for (const c of kids(d.el, 'tblStylePr')) {\n const type = c.a.type\n if (!type) continue\n const prev = r.cond[type] ?? { rs: {} }\n r.cond[type] = {\n rs: merge(prev.rs, readRPr(kid(c, 'rPr'), this.theme)),\n shd: shading(path(c, 'tcPr', 'shd')) ?? prev.shd,\n }\n }\n }\n this.tblCache.set(key, r)\n return r\n }\n}\n\nexport function readTableBorders(el: XEl | undefined): Record<string, Border | null | undefined> {\n const out: Record<string, Border | null | undefined> = {}\n if (!el) return out\n for (const c of el.c) {\n const k = c.n === 'start' ? 'left' : c.n === 'end' ? 'right' : c.n\n const b = border(c)\n if (b !== undefined) out[k] = b\n }\n return out\n}\n\nexport function readMargins(el: XEl | undefined): Partial<Record<'top' | 'left' | 'bottom' | 'right', number>> {\n const out: Partial<Record<'top' | 'left' | 'bottom' | 'right', number>> = {}\n if (!el) return out\n for (const c of el.c) {\n const k = (c.n === 'start' ? 'left' : c.n === 'end' ? 'right' : c.n) as 'top' | 'left' | 'bottom' | 'right'\n const w = num(c.a.w)\n if (w !== undefined && (c.a.type === undefined || c.a.type === 'dxa')) out[k] = w / 20\n }\n return out\n}\n","import type { Theme } from '../theme'\nimport { kid, kids, num, type XEl } from '../xml'\nimport { readPPr, readRPr } from './styles'\nimport type { ParaStyle, RunStyle } from './types'\n\nexport interface Level {\n start: number\n fmt: string\n text: string\n ps: ParaStyle\n rs: RunStyle\n isLgl: boolean\n suff: string\n restart?: number\n}\n\ninterface NumInstance {\n abstractId: string\n starts: Record<number, number>\n levels: Record<number, Level>\n}\n\n// Private-use bullet glyphs from Symbol/Wingdings fonts → Unicode\nconst BULLETS: Record<string, string> = {\n '\\uF0B7': '•', '\\uF0A7': '▪', '\\uF0A8': '□', '\\uF0FC': '✓', '\\uF0D8': '➢', '\\uF076': '❖', '\\uF0E0': '➔',\n '\\uF06E': '■', '\\uF071': '□', '\\uF072': '❑', '\\uF075': '◆', '\\uF0E8': '➔', '\\uF0F0': '⇨', '\\uF0AE': '→',\n '\\uF02D': '–', '\\u00B7': '•', '\\uF0BE': '—', '\\uF06F': '○', '\\uF09F': '•', '\\uF0FE': '☑', o: '◦',\n}\n\nfunction roman(n: number): string {\n const map: [number, string][] = [\n [1000, 'm'], [900, 'cm'], [500, 'd'], [400, 'cd'], [100, 'c'], [90, 'xc'],\n [50, 'l'], [40, 'xl'], [10, 'x'], [9, 'ix'], [5, 'v'], [4, 'iv'], [1, 'i'],\n ]\n let s = ''\n for (const [v, r] of map) while (n >= v) (s += r), (n -= v)\n return s\n}\n\nfunction letters(n: number): string {\n if (n <= 0) return ''\n const ch = String.fromCharCode(97 + ((n - 1) % 26))\n return ch.repeat(Math.floor((n - 1) / 26) + 1)\n}\n\nexport function formatNumber(n: number, fmt: string): string {\n switch (fmt) {\n case 'decimalZero': return n < 10 ? '0' + n : String(n)\n case 'upperRoman': return roman(n).toUpperCase()\n case 'lowerRoman': return roman(n)\n case 'upperLetter': return letters(n).toUpperCase()\n case 'lowerLetter': return letters(n)\n case 'ordinal': {\n const s = ['th', 'st', 'nd', 'rd']\n const v = n % 100\n return n + (s[(v - 20) % 10] || s[v] || s[0])\n }\n case 'none': return ''\n case 'bullet': return ''\n default: return String(n)\n }\n}\n\nexport class Numbering {\n private abstracts = new Map<string, Record<number, Level>>()\n private nums = new Map<string, NumInstance>()\n private counters = new Map<string, number[]>()\n\n constructor(root: XEl | undefined, theme: Theme) {\n if (!root) return\n const readLevels = (el: XEl) => {\n const out: Record<number, Level> = {}\n for (const l of kids(el, 'lvl')) {\n const ilvl = num(l.a.ilvl, 0)!\n out[ilvl] = {\n start: num(kid(l, 'start')?.a.val, 1)!,\n fmt: kid(l, 'numFmt')?.a.val ?? 'decimal',\n text: kid(l, 'lvlText')?.a.val ?? '',\n ps: readPPr(kid(l, 'pPr')).ps,\n rs: readRPr(kid(l, 'rPr'), theme),\n isLgl: !!kid(l, 'isLgl'),\n suff: kid(l, 'suff')?.a.val ?? 'tab',\n restart: num(kid(l, 'lvlRestart')?.a.val),\n }\n }\n return out\n }\n for (const a of kids(root, 'abstractNum')) this.abstracts.set(a.a.abstractNumId, readLevels(a))\n for (const n of kids(root, 'num')) {\n const inst: NumInstance = { abstractId: kid(n, 'abstractNumId')?.a.val ?? '', starts: {}, levels: {} }\n for (const o of kids(n, 'lvlOverride')) {\n const ilvl = num(o.a.ilvl, 0)!\n const so = num(kid(o, 'startOverride')?.a.val)\n if (so !== undefined) inst.starts[ilvl] = so\n const lvl = kid(o, 'lvl')\n if (lvl) Object.assign(inst.levels, readLevels({ n: 'x', a: {}, c: [{ ...lvl, a: { ...lvl.a, ilvl: String(ilvl) } }], t: '' }))\n }\n this.nums.set(n.a.numId, inst)\n }\n }\n\n reset() {\n this.counters.clear()\n }\n\n /** First list instance whose level 0 is a bullet / a number, without overrides. */\n findList(kind: 'bullet' | 'number'): string | undefined {\n for (const [id, inst] of this.nums) {\n if (Object.keys(inst.starts).length) continue\n const l0 = this.abstracts.get(inst.abstractId)?.[0]\n if (!l0) continue\n if (kind === 'bullet' ? l0.fmt === 'bullet' : l0.fmt === 'decimal') return id\n }\n return undefined\n }\n\n ids(): { abstract: number; num: number } {\n const a = [...this.abstracts.keys()].map(Number).filter(Number.isFinite)\n const n = [...this.nums.keys()].map(Number).filter(Number.isFinite)\n return { abstract: a.length ? Math.max(...a) + 1 : 0, num: n.length ? Math.max(...n) + 1 : 1 }\n }\n\n level(numId: string, ilvl: number): Level | undefined {\n const inst = this.nums.get(numId)\n if (!inst) return undefined\n return inst.levels[ilvl] ?? this.abstracts.get(inst.abstractId)?.[ilvl]\n }\n\n /** Advances the counter for (numId, ilvl) and returns the marker text. */\n next(numId: string, ilvl: number): { text: string; level: Level } | undefined {\n const inst = this.nums.get(numId)\n const level = this.level(numId, ilvl)\n if (!inst || !level) return undefined\n const hasOverride = Object.keys(inst.starts).length > 0\n const key = hasOverride ? 'n' + numId : 'a' + inst.abstractId\n let c = this.counters.get(key)\n if (!c) {\n c = []\n this.counters.set(key, c)\n }\n const startOf = (l: number) => inst.starts[l] ?? this.level(numId, l)?.start ?? 1\n c[ilvl] = c[ilvl] === undefined ? startOf(ilvl) : c[ilvl] + 1\n for (let d = ilvl + 1; d < 9; d++) c[d] = undefined as unknown as number\n for (let d = 0; d < ilvl; d++) if (c[d] === undefined) c[d] = startOf(d)\n if (level.fmt === 'bullet') {\n const t = level.text\n return { text: BULLETS[t] ?? (t || '•'), level }\n }\n const text = level.text.replace(/%(\\d)/g, (_, d: string) => {\n const l = Number(d) - 1\n const lv = this.level(numId, l)\n const v = c![l] ?? startOf(l)\n return formatNumber(v, level.isLgl && l < ilvl ? 'decimal' : lv?.fmt ?? 'decimal')\n })\n return { text, level }\n }\n}\n","/** All lengths in points unless stated otherwise. */\n\nexport interface RunStyle {\n b?: boolean\n i?: boolean\n /** underline kind ('single', 'double', …) or 'none' */\n u?: string\n strike?: boolean\n dstrike?: boolean\n color?: string\n sz?: number\n font?: string\n hl?: string\n shd?: string\n va?: 'sup' | 'sub'\n caps?: boolean\n smallCaps?: boolean\n vanish?: boolean\n spacing?: number\n}\n\nexport interface Border {\n w: number\n style: string\n color: string\n}\n\nexport interface ParaStyle {\n align?: 'left' | 'center' | 'right' | 'justify'\n indL?: number\n indR?: number\n /** positive: first line indent; negative: hanging */\n indFirst?: number\n before?: number\n after?: number\n line?: number\n lineRule?: 'auto' | 'exact' | 'atLeast'\n shd?: string\n bTop?: Border\n bBottom?: Border\n bLeft?: Border\n bRight?: Border\n keepNext?: boolean\n pageBreakBefore?: boolean\n outline?: number\n contextual?: boolean\n}\n\n/** [paragraph id, run ordinal] of the source run in the original XML */\nexport type SrcRef = [number, number]\n\n/** Direct formatting changed by the user (written back as explicit run properties). */\nexport interface RunSet {\n b?: boolean\n i?: boolean\n u?: string\n strike?: boolean\n color?: string | null\n sz?: number\n /** raw font name */\n font?: string\n hl?: string | null\n va?: 'sup' | 'sub' | null\n}\n\n/**\n * Inline content. Tabs and line breaks are carried as '\\t' / '\\n' inside text.\n * Everything that isn't 'text' counts as one character when editing.\n */\nexport type Inline =\n | { t: 'text'; text: string; s: RunStyle; href?: string; lk?: string; src?: SrcRef; d?: RunSet }\n | {\n t: 'img'\n target: string\n w: number\n h: number\n alt?: string\n href?: string\n src?: SrcRef\n rid?: string\n resized?: boolean\n /** alt text changed by the user */\n altSet?: boolean\n /** picture replaced (rid points to the new image part) */\n repl?: boolean\n }\n | { t: 'field'; kind: 'PAGE' | 'NUMPAGES'; s: RunStyle; src?: SrcRef }\n | { t: 'box'; w: number; h: number; blocks: Block[]; fill?: string; border?: string; src?: SrcRef }\n | { t: 'shape'; w: number; h: number; label?: string; src?: SrcRef }\n | { t: 'ref'; text: string; s: RunStyle; src?: SrcRef }\n\nexport interface ListMarker {\n text: string\n s: RunStyle\n /** marker followed by tab (default) */\n tab: boolean\n}\n\nexport interface Paragraph {\n t: 'p'\n ps: ParaStyle\n runs: Inline[]\n marker?: ListMarker\n /** font size of the paragraph mark, for empty paragraph height */\n markSz?: number\n markFont?: string\n /** explicit page break before this paragraph (from w:br type=page or pageBreakBefore) */\n pb?: boolean\n /** paragraph id (editable paragraphs only); split parts share it */\n pid?: number\n /** read-only (inside fields spanning paragraphs, text boxes, nested tables…) */\n ro?: boolean\n /** paragraph style id */\n sid?: string\n /** list kind + level when numbered */\n lst?: 'bullet' | 'number'\n ilvl?: number\n // ---- editor bookkeeping (main thread) ----\n /** template paragraph (original pid) */\n from?: number\n /** original paragraphs whose bookmarks/comments this one carries */\n orig?: number[]\n /** paragraph-level changes */\n pd?: ParaDirty\n /** changed since load */\n edited?: boolean\n /** keeps the template's section break */\n keepSect?: boolean\n /** render version (bumped to force DOM rebuild after IME composition) */\n ver?: number\n /** formatting for text typed into this (empty) paragraph */\n caret?: Inline\n}\n\nexport interface ParaDirty {\n style?: string\n align?: 'left' | 'center' | 'right' | 'justify'\n list?: 'bullet' | 'number' | 'none'\n ilvl?: number\n indL?: number\n /** line spacing multiple (1, 1.15, 1.5, 2…) */\n line?: number\n /** spacing before / after in pt */\n before?: number\n after?: number\n pageBreak?: boolean\n}\n\nexport type SpecRun =\n | { text: string; src?: SrcRef; set?: RunSet; lk?: string }\n | { obj: 'copy'; src: SrcRef; size?: [number, number]; alt?: string; rid?: string }\n | { obj: 'image'; rid: string; w: number; h: number; name?: string; alt?: string }\n | { obj: 'field'; kind: 'PAGE' | 'NUMPAGES'; set?: RunSet }\n\nexport interface ParaSpec {\n pid: number\n from: number\n orig?: number[]\n pd?: ParaDirty\n /** page-break separated parts */\n parts: SpecRun[][]\n pristine?: boolean\n keepSect?: boolean\n}\n\nexport interface CellSpec {\n src?: [number, number]\n colSpan: number\n rowSpan: number\n paras: ParaSpec[]\n shd?: string\n}\n\nexport interface TableSpec {\n tid: number\n item?: number\n cols: number[]\n rows: { src?: number; cells: CellSpec[] }[]\n}\n\nexport interface TableOp {\n tid: number\n item?: number\n /** paragraph the (new) table follows */\n anchor?: number\n /** null deletes the table */\n spec: TableSpec | null\n}\n\nexport interface EditOp {\n anchor: number\n list: ParaSpec[]\n remove?: number[]\n /** return re-converted blocks (needed after style/list changes) */\n want?: boolean\n}\n\nexport interface EditResult {\n blocks: Record<number, Block[]>\n markers: Record<number, { text: string; s: RunStyle; tab: boolean; lst?: 'bullet' | 'number' } | null>\n}\n\n/** built-in paragraph styles the picker always offers (created on first use when missing) */\nexport type CanonStyle = 'normal' | 'title' | 'subtitle' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n\nexport interface StyleInfo {\n id: string\n name: string\n next?: string\n canon?: CanonStyle\n /** heading level 0-8 (outline) */\n outline?: number\n /** run look of the style, for the style picker */\n preview?: { b?: boolean; i?: boolean; color?: string; sz?: number; font?: string }\n}\n\nexport interface CellBorders {\n t?: string\n r?: string\n b?: string\n l?: string\n}\n\nexport interface TableCell {\n blocks: Block[]\n /** [row, tc] index in the original table XML (template for cell properties) */\n src?: [number, number]\n colSpan: number\n rowSpan: number\n w?: number\n shd?: string\n vAlign?: 'top' | 'middle' | 'bottom'\n borders: CellBorders\n pad: [number, number, number, number]\n}\n\nexport interface TableRow {\n cells: TableCell[]\n /** original row index */\n src?: number\n h?: number\n exact?: boolean\n header?: boolean\n}\n\nexport interface Table {\n t: 'tbl'\n /** body item index of an original top-level table */\n item?: number\n /** set once the table is regenerated by the editor (new or structurally changed) */\n tid?: number\n cols: number[]\n rows: TableRow[]\n align?: 'left' | 'center' | 'right'\n indL?: number\n w?: number\n}\n\nexport interface PageSetup {\n w: number\n h: number\n mt: number\n mr: number\n mb: number\n ml: number\n header: number\n footer: number\n}\n\nexport interface SectionBreak {\n t: 'sect'\n page: PageSetup\n /** 'nextPage' | 'continuous' | 'evenPage' | 'oddPage' */\n kind: string\n}\n\nexport type Block = Paragraph | Table | SectionBreak\n\nexport interface DocxMeta {\n page: PageSetup\n /** quick paragraph styles for the style picker */\n styles?: StyleInfo[]\n header?: Block[]\n footer?: Block[]\n firstHeader?: Block[]\n firstFooter?: Block[]\n titlePg?: boolean\n /** body default font (CSS) and size */\n font?: string\n sz?: number\n /** final page setup known (end of document reached) */\n final?: boolean\n}\n\nexport const DEFAULT_PAGE: PageSetup = { w: 612, h: 792, mt: 72, mr: 72, mb: 72, ml: 72, header: 36, footer: 36 }\n","import { OpcPackage, relOfType, type Rels } from '../opc'\nimport { parseTheme, type Theme } from '../theme'\nimport { emuToPt } from '../units'\nimport { desc, descAll, kid, kids, num, parseXml, parseXmlStream, path, TreeBuilder, type SaxHandler, type XEl } from '../xml'\nimport { Numbering } from './numbering'\nimport {\n borderCss, merge, readMargins, readPPr, readRPr, readTableBorders, shading, StyleSheet, type NumPr,\n} from './styles'\nimport type {\n Block, CellBorders, DocxMeta, Inline, ListMarker, PageSetup, Paragraph, ParaStyle, RunSet, RunStyle, SrcRef, Table, TableCell, TableRow,\n} from './types'\nimport { DEFAULT_PAGE } from './types'\n\ninterface FieldState {\n instr: string\n phase: 'instr' | 'result'\n kind?: 'PAGE' | 'NUMPAGES'\n href?: string\n}\n\ninterface Sink {\n push(x: Inline): void\n pageBreak(): void\n}\n\nexport type Layer = { ps: ParaStyle; rs: RunStyle }\n\nexport interface ParaRecord {\n layer?: Layer\n num?: NumPr\n ro: boolean\n sid: string\n lst?: 'bullet' | 'number'\n marker?: ListMarker\n}\n\n/** run ordinal → original source (reconversion of generated XML) */\nexport interface GenRun {\n src?: SrcRef\n d?: RunSet\n}\n\nexport interface ConvHooks {\n /** registers an editable paragraph; returns its id */\n para?(el: XEl, rec: ParaRecord): number | undefined\n forced?: { pid: number; root: XEl; map: GenRun[]; layer?: Layer; marker?: ListMarker; rec?: ParaRecord }\n /** body item currently being converted (tables remember it) */\n item?: () => number\n}\n\nfunction fieldKind(instr: string): 'PAGE' | 'NUMPAGES' | undefined {\n const m = /^\\s*(PAGE|NUMPAGES|SECTIONPAGES)\\b/i.exec(instr)\n if (!m) return undefined\n return m[1].toUpperCase() === 'PAGE' ? 'PAGE' : 'NUMPAGES'\n}\n\nfunction sameRecord(a: object | undefined, b: object | undefined): boolean {\n if (a === b) return true\n if (!a || !b) return !a && !b\n const ka = Object.keys(a)\n if (ka.length !== Object.keys(b).length) return false\n for (const k of ka) if ((a as Record<string, unknown>)[k] !== (b as Record<string, unknown>)[k]) return false\n return true\n}\n\nfunction cssLen(style: string | undefined, prop: string): number | undefined {\n if (!style) return undefined\n const m = new RegExp(`(?:^|;)\\\\s*${prop}\\\\s*:\\\\s*([\\\\d.]+)\\\\s*(pt|in|px|cm|mm)?`, 'i').exec(style)\n if (!m) return undefined\n const v = Number(m[1])\n switch ((m[2] ?? 'px').toLowerCase()) {\n case 'pt': return v\n case 'in': return v * 72\n case 'cm': return (v * 72) / 2.54\n case 'mm': return (v * 72) / 25.4\n default: return v * 0.75\n }\n}\n\nexport function pageSetup(sectPr: XEl | undefined): PageSetup {\n if (!sectPr) return { ...DEFAULT_PAGE }\n const sz = kid(sectPr, 'pgSz')\n const mar = kid(sectPr, 'pgMar')\n const t = (v: string | undefined, d: number) => (v === undefined ? d : Math.abs(Number(v)) / 20)\n let w = t(sz?.a.w, DEFAULT_PAGE.w)\n let h = t(sz?.a.h, DEFAULT_PAGE.h)\n if (sz?.a.orient === 'landscape' && h > w) [w, h] = [h, w]\n return {\n w, h,\n mt: t(mar?.a.top, 72), mr: t(mar?.a.right ?? mar?.a.end, 72), mb: t(mar?.a.bottom, 72), ml: t(mar?.a.left ?? mar?.a.start, 72),\n header: t(mar?.a.header, 36), footer: t(mar?.a.footer, 36),\n }\n}\n\nconst RUN_STOP = new Set(['p', 'del', 'moveFrom', 'oMath', 'oMathPara', 'pPr', 'rPr', 'r'])\n\n/** Runs of a paragraph in preorder (the ordinal is the run's identity for write-back). */\nexport function collectRuns(p: XEl): Map<XEl, number> {\n const m = new Map<XEl, number>()\n const rec = (n: XEl) => {\n for (const c of n.c) {\n if (c.n === 'r') m.set(c, m.size)\n if (!RUN_STOP.has(c.n)) rec(c)\n }\n }\n rec(p)\n return m\n}\n\n/** Paragraphs of a body item (root included) in preorder. */\nexport function collectParas(roots: XEl[], into = new Map<XEl, number>()): Map<XEl, number> {\n const rec = (n: XEl) => {\n if (n.n === 'p') into.set(n, into.size)\n for (const c of n.c) rec(c)\n }\n for (const r of roots) rec(r)\n return into\n}\n\nexport function markerOf(numbering: Numbering, num: NumPr, markRs: RunStyle): { marker: ListMarker; lst: 'bullet' | 'number' } | undefined {\n const listed = numbering.next(num.numId, num.ilvl)\n if (!listed) return undefined\n const ms = merge<RunStyle>(markRs, listed.level.rs)\n delete ms.u\n delete ms.hl\n return {\n marker: { text: listed.level.suff === 'space' ? listed.text + ' ' : listed.text, s: ms, tab: listed.level.suff === 'tab' },\n lst: listed.level.fmt === 'bullet' ? 'bullet' : 'number',\n }\n}\n\nexport class Converter {\n private fields: FieldState[] = []\n private tableLayer?: Layer\n private boxDepth = 0\n private tableDepth = 0\n private cur?: { pid?: number; runs: Map<XEl, number>; forced?: ConvHooks['forced'] }\n\n constructor(\n private styles: StyleSheet,\n private numbering: Numbering,\n private theme: Theme,\n private rels: Rels,\n private hooks: ConvHooks = {},\n ) {}\n\n blocks(el: XEl, out: Block[]): void {\n switch (el.n) {\n case 'p':\n this.paragraph(el, out)\n break\n case 'tbl':\n out.push(this.table(el))\n break\n case 'sdt':\n for (const c of kid(el, 'sdtContent')?.c ?? []) this.blocks(c, out)\n break\n case 'customXml':\n case 'ins':\n case 'smartTag':\n case 'sdtContent':\n for (const c of el.c) this.blocks(c, out)\n break\n }\n }\n\n paragraph(el: XEl, out: Block[]): void {\n const pPr = kid(el, 'pPr')\n const d = readPPr(pPr)\n const st = this.styles.para(d.styleId)\n const forced = this.hooks.forced?.root === el ? this.hooks.forced : undefined\n const layer = forced ? forced.layer : this.tableLayer\n const numPr = d.numPr ?? st.numPr\n const level = numPr && numPr.numId !== '0' ? this.numbering.level(numPr.numId, numPr.ilvl) : undefined\n const ps = merge<ParaStyle>(this.styles.docPs, layer?.ps, st.ps, level?.ps, d.ps)\n const base = merge<RunStyle>(this.styles.docRs, layer?.rs, st.rs)\n const markRs = merge<RunStyle>(base, readRPr(kid(pPr, 'rPr'), this.theme))\n const sid = d.styleId ?? this.styles.defaultPara ?? ''\n let cur: Paragraph = { t: 'p', ps, runs: [], markSz: markRs.sz, markFont: markRs.font, sid }\n if (ps.pageBreakBefore) cur.pb = true\n let lst: 'bullet' | 'number' | undefined\n if (level && numPr) {\n if (forced) {\n lst = level.fmt === 'bullet' ? 'bullet' : 'number'\n if (forced.marker) cur.marker = forced.marker\n else cur.marker = { text: level.fmt === 'bullet' ? '•' : '', s: merge<RunStyle>(markRs, level.rs), tab: level.suff === 'tab' }\n } else {\n const m = markerOf(this.numbering, numPr, markRs)\n if (m) {\n cur.marker = m.marker\n lst = m.lst\n }\n }\n if (lst) {\n cur.lst = lst\n cur.ilvl = numPr.ilvl\n }\n }\n const rec: ParaRecord = {\n layer,\n num: numPr && numPr.numId !== '0' ? numPr : undefined,\n ro: this.fields.length > 0 || this.boxDepth > 0 || this.tableDepth > 1,\n sid,\n lst,\n marker: cur.marker,\n }\n if (forced) forced.rec = rec\n const pid = forced ? forced.pid : this.hooks.para?.(el, rec)\n if (pid !== undefined) cur.pid = pid\n const saved = this.cur\n this.cur = { pid, runs: collectRuns(el), forced }\n const parts: Paragraph[] = [cur]\n const sink: Sink = {\n push: (x) => {\n const runs = cur.runs\n const last = runs[runs.length - 1]\n if (x.t === 'text' && last?.t === 'text' && last.href === x.href && last.lk === x.lk && sameRecord(last.s, x.s) && sameRecord(last.d, x.d)) last.text += x.text\n else runs.push(x)\n },\n pageBreak: () => {\n cur = { t: 'p', ps, runs: [], markSz: markRs.sz, markFont: markRs.font, pb: true, sid }\n if (pid !== undefined) cur.pid = pid\n parts.push(cur)\n },\n }\n this.inlines(el.c, base, undefined, undefined, sink)\n this.cur = saved\n if (this.fields.length > 0) rec.ro = true\n for (const p of parts) {\n if (rec.ro) p.ro = true\n out.push(p)\n }\n if (d.sectPr) out.push({ t: 'sect', page: pageSetup(d.sectPr), kind: kid(d.sectPr, 'type')?.a.val ?? 'nextPage' })\n }\n\n /** source reference + user formatting of a run element */\n private srcOf(r: XEl): { src?: SrcRef; d?: RunSet } {\n const cur = this.cur\n if (!cur) return {}\n const k = cur.runs.get(r)\n if (k === undefined) return {}\n if (cur.forced) {\n const g = cur.forced.map[k]\n return g ? { src: g.src, d: g.d } : {}\n }\n return cur.pid !== undefined ? { src: [cur.pid, k] } : {}\n }\n\n private inlines(children: XEl[], base: RunStyle, href: string | undefined, lk: string | undefined, sink: Sink): void {\n for (const c of children) {\n switch (c.n) {\n case 'r':\n this.run(c, base, href, lk, sink)\n break\n case 'hyperlink': {\n const id = c.a['r:id']\n const target = id ? this.rels.get(id)?.target : c.a.anchor ? '#' + c.a.anchor : undefined\n const link = id ? 'r:' + id : c.a.anchor ? 'a:' + c.a.anchor : undefined\n this.inlines(c.c, base, target ?? href, link ?? lk, sink)\n break\n }\n case 'fldSimple': {\n const kind = fieldKind(c.a.instr ?? '')\n if (kind) {\n const r = kid(c, 'r')\n sink.push({ t: 'field', kind, s: merge(base, readRPr(kid(r, 'rPr'), this.theme)), ...(r ? this.srcOf(r) : {}) })\n } else this.inlines(c.c, base, href, lk, sink)\n break\n }\n case 'ins':\n case 'smartTag':\n case 'customXml':\n case 'bdo':\n case 'dir':\n case 'moveTo':\n this.inlines(c.c, base, href, lk, sink)\n break\n case 'sdt':\n this.inlines(kid(c, 'sdtContent')?.c ?? [], base, href, lk, sink)\n break\n case 'oMath':\n case 'oMathPara': {\n const text = descAll(c, 't').map((t) => t.t).join('')\n if (text) sink.push({ t: 'text', text, s: { ...base, i: true, font: '\"Cambria Math\", \"STIX Two Math\", serif' } })\n break\n }\n }\n }\n }\n\n private run(r: XEl, base: RunStyle, href: string | undefined, lk: string | undefined, sink: Sink): void {\n const rPr = kid(r, 'rPr')\n const s = merge<RunStyle>(base, this.styles.char(kid(rPr, 'rStyle')?.a.val), readRPr(rPr, this.theme))\n if (s.vanish) return\n const { src, d } = this.srcOf(r)\n const text = (t: string, style = s, link = href) => sink.push({ t: 'text', text: t, s: style, href: link, lk: link === href ? lk : undefined, src, d })\n for (const c of r.c) {\n const f = this.fields[this.fields.length - 1]\n switch (c.n) {\n case 'fldChar': {\n const type = c.a.fldCharType\n if (type === 'begin') this.fields.push({ instr: '', phase: 'instr' })\n else if (type === 'separate' && f) {\n f.phase = 'result'\n f.kind = fieldKind(f.instr)\n const link = /HYPERLINK\\s+(?:\\\\l\\s+)?\"([^\"]+)\"/.exec(f.instr)\n if (link) f.href = /\\\\l/.test(f.instr) ? '#' + link[1] : link[1]\n if (f.kind) sink.push({ t: 'field', kind: f.kind, s, src })\n } else if (type === 'end') {\n if (f && f.phase === 'instr') {\n const kind = fieldKind(f.instr)\n if (kind) sink.push({ t: 'field', kind, s, src })\n }\n this.fields.pop()\n }\n break\n }\n case 'instrText':\n if (f) f.instr += c.t\n break\n case 't':\n if (f && (f.phase === 'instr' || f.kind)) break\n if (c.t) text(c.t, s, f?.href ?? href)\n break\n case 'tab':\n case 'ptab':\n if (!f || (f.phase === 'result' && !f.kind)) text('\\t')\n break\n case 'br':\n if (c.a.type === 'page') sink.pageBreak()\n else text('\\n')\n break\n case 'cr':\n text('\\n')\n break\n case 'noBreakHyphen':\n text('\\u2011')\n break\n case 'softHyphen':\n text('\\u00AD')\n break\n case 'sym': {\n const code = parseInt(c.a.char ?? '', 16)\n if (code) text(String.fromCharCode(code >= 0xf000 ? code - 0xf000 : code), { ...s, font: c.a.font ? `\"${c.a.font}\", ${s.font ?? 'serif'}` : s.font })\n break\n }\n case 'drawing':\n this.drawing(c, href, sink, src)\n break\n case 'pict':\n case 'object':\n this.vml(c, href, sink, src)\n break\n case 'footnoteReference':\n case 'endnoteReference':\n sink.push({ t: 'ref', text: c.a.id ?? '*', s: { ...s, va: 'sup' }, src })\n break\n }\n }\n }\n\n private target(id: string | undefined): string | undefined {\n if (!id) return undefined\n const rel = this.rels.get(id)\n return rel && !rel.external ? rel.target : undefined\n }\n\n private boxBlocks(roots: XEl[]): Block[] {\n const blocks: Block[] = []\n const saved = this.cur\n this.boxDepth++\n for (const t of roots) for (const c of t.c) this.blocks(c, blocks)\n this.boxDepth--\n this.cur = saved\n return blocks\n }\n\n private drawing(d: XEl, href: string | undefined, sink: Sink, src?: SrcRef): void {\n const box = kid(d, 'inline') ?? kid(d, 'anchor')\n if (!box) return\n const ext = kid(box, 'extent')\n const w = emuToPt(num(ext?.a.cx, 0))\n const h = emuToPt(num(ext?.a.cy, 0))\n const docPr = kid(box, 'docPr')\n const gd = path(box, 'graphic', 'graphicData')\n const txbx = descAll(gd, 'txbxContent')\n if (txbx.length) {\n const blocks = this.boxBlocks(txbx)\n const spPr = desc(gd, 'spPr')\n const fill = path(spPr, 'solidFill', 'srgbClr')?.a.val\n const ln = path(spPr, 'ln', 'solidFill', 'srgbClr')?.a.val\n sink.push({ t: 'box', w, h, blocks, fill: fill ? '#' + fill : undefined, border: ln ? `1px solid #${ln}` : undefined, src })\n return\n }\n const blip = desc(gd, 'blip')\n const target = this.target(blip?.a['r:embed'])\n if (target) {\n const click = this.rels.get(kid(docPr, 'hlinkClick')?.a['r:id'] ?? '')?.target\n sink.push({ t: 'img', target, w, h, alt: docPr?.a.descr || docPr?.a.title || undefined, href: click ?? href, src, rid: blip?.a['r:embed'] })\n return\n }\n if (desc(gd, 'chart')) sink.push({ t: 'shape', w, h, label: 'Chart', src })\n else if (desc(gd, 'relIds')) sink.push({ t: 'shape', w, h, label: 'Diagram', src })\n else sink.push({ t: 'shape', w: 0, h: 0, src })\n }\n\n private vml(el: XEl, href: string | undefined, sink: Sink, src?: SrcRef): void {\n const tb = desc(el, 'txbxContent')\n const shape = desc(el, 'shape') ?? desc(el, 'rect')\n const style = shape?.a.style\n const w = cssLen(style, 'width') ?? 0\n const h = cssLen(style, 'height') ?? 0\n if (tb) {\n sink.push({ t: 'box', w, h, blocks: this.boxBlocks([tb]), src })\n return\n }\n const target = this.target(desc(el, 'imagedata')?.a['r:id'])\n if (target && w && h) sink.push({ t: 'img', target, w, h, href, src })\n else sink.push({ t: 'shape', w: 0, h: 0, src })\n }\n\n table(el: XEl): Table {\n this.tableDepth++\n try {\n const t = this.tableInner(el)\n if (this.tableDepth === 1 && this.hooks.item) t.item = this.hooks.item()\n return t\n } finally {\n this.tableDepth--\n }\n }\n\n private tableInner(el: XEl): Table {\n const tblPr = kid(el, 'tblPr')\n const ts = this.styles.table(kid(tblPr, 'tblStyle')?.a.val)\n const look = readLook(kid(tblPr, 'tblLook'))\n const borders = { ...ts.borders, ...readTableBorders(kid(tblPr, 'tblBorders')) }\n const mar = { top: 0, bottom: 0, left: 5.4, right: 5.4, ...ts.cellMar, ...readMargins(kid(tblPr, 'tblCellMar')) }\n const cols = kids(kid(el, 'tblGrid'), 'gridCol').map((g) => (num(g.a.w) ?? 0) / 20)\n const jc = kid(tblPr, 'jc')?.a.val\n const ind = kid(tblPr, 'tblInd')\n const rowEls = flatten(el, 'tr')\n\n interface Tmp extends TableCell { gs: number; vm?: 'restart' | 'continue'; tcB: ReturnType<typeof readTableBorders>; gone?: boolean; ri: number }\n const grid: { row: TableRow; cells: Tmp[] }[] = []\n let nCols = cols.length\n rowEls.forEach((tr, ri) => {\n const trPr = kid(tr, 'trPr')\n const th = kid(trPr, 'trHeight')\n const row: TableRow = { cells: [], src: ri }\n if (th?.a.val) {\n row.h = Number(th.a.val) / 20\n row.exact = th.a.hRule === 'exact'\n }\n if (kid(trPr, 'tblHeader')) row.header = true\n let col = num(kid(trPr, 'gridBefore')?.a.val, 0)!\n const cells: Tmp[] = []\n for (const [tci, tc] of flatten(tr, 'tc').entries()) {\n const tcPr = kid(tc, 'tcPr')\n const span = Math.max(1, num(kid(tcPr, 'gridSpan')?.a.val, 1)!)\n const vmEl = kid(tcPr, 'vMerge')\n const conds: string[] = []\n if (!look.noVBand) conds.push((col - (look.firstCol ? 1 : 0)) % 2 === 0 ? 'band1Vert' : 'band2Vert')\n if (!look.noHBand) {\n const bi = ri - (look.firstRow ? 1 : 0)\n if (bi >= 0) conds.push(bi % 2 === 0 ? 'band1Horz' : 'band2Horz')\n }\n if (look.firstCol && col === 0) conds.push('firstCol')\n if (look.lastCol && nCols && col + span >= nCols) conds.push('lastCol')\n if (look.firstRow && ri === 0) conds.push('firstRow')\n if (look.lastRow && ri === rowEls.length - 1) conds.push('lastRow')\n let shd = ts.shd\n let crs: RunStyle = {}\n for (const k of conds) {\n const cf = ts.cond[k]\n if (!cf) continue\n if (cf.shd) shd = cf.shd\n crs = merge(crs, cf.rs)\n }\n shd = shading(kid(tcPr, 'shd')) ?? shd\n const prev = this.tableLayer\n this.tableLayer = { ps: ts.ps, rs: merge(ts.rs, crs) }\n const blocks: Block[] = []\n for (const c of tc.c) if (c.n !== 'tcPr') this.blocks(c, blocks)\n this.tableLayer = prev\n const cm = readMargins(kid(tcPr, 'tcMar'))\n const va = kid(tcPr, 'vAlign')?.a.val\n const tcW = kid(tcPr, 'tcW')\n cells.push({\n blocks,\n src: [ri, tci],\n colSpan: span,\n rowSpan: 1,\n w: tcW && (tcW.a.type ?? 'dxa') === 'dxa' ? Number(tcW.a.w) / 20 : undefined,\n shd,\n vAlign: va === 'center' ? 'middle' : va === 'bottom' ? 'bottom' : undefined,\n borders: {},\n pad: [cm.top ?? mar.top, cm.right ?? mar.right, cm.bottom ?? mar.bottom, cm.left ?? mar.left],\n gs: col,\n vm: vmEl ? (vmEl.a.val === 'restart' ? 'restart' : 'continue') : undefined,\n tcB: readTableBorders(kid(tcPr, 'tcBorders')),\n ri,\n })\n col += span\n }\n nCols = Math.max(nCols, col)\n grid.push({ row, cells })\n })\n\n // vertical merges\n for (let ri = 0; ri < grid.length; ri++) {\n for (const cell of grid[ri].cells) {\n if (cell.gone || !cell.vm) continue\n for (let rj = ri + 1; rj < grid.length; rj++) {\n const below = grid[rj].cells.find((c) => c.gs === cell.gs)\n if (!below || below.vm !== 'continue') break\n below.gone = true\n cell.rowSpan++\n }\n }\n }\n const nRows = grid.length\n const rows: TableRow[] = grid.map(({ row, cells }) => {\n for (const c of cells) {\n if (c.gone) continue\n const lastRow = c.ri + c.rowSpan - 1 === nRows - 1\n const b: CellBorders = {\n t: borderCss(c.tcB.top !== undefined ? c.tcB.top : c.ri === 0 ? borders.top : borders.insideH),\n b: borderCss(c.tcB.bottom !== undefined ? c.tcB.bottom : lastRow ? borders.bottom : borders.insideH),\n l: borderCss(c.tcB.left !== undefined ? c.tcB.left : c.gs === 0 ? borders.left : borders.insideV),\n r: borderCss(c.tcB.right !== undefined ? c.tcB.right : c.gs + c.colSpan >= nCols ? borders.right : borders.insideV),\n }\n const { gs: _gs, vm: _vm, tcB: _tcB, gone: _g, ri: _ri, ...cell } = c\n row.cells.push({ ...cell, borders: b })\n }\n return row\n })\n return {\n t: 'tbl',\n cols,\n rows,\n align: jc === 'center' ? 'center' : jc === 'right' || jc === 'end' ? 'right' : undefined,\n indL: ind && (ind.a.type ?? 'dxa') === 'dxa' ? Number(ind.a.w) / 20 : undefined,\n }\n }\n}\n\nfunction flatten(el: XEl, name: string): XEl[] {\n const out: XEl[] = []\n for (const c of el.c) {\n if (c.n === name) out.push(c)\n else if (c.n === 'sdt') out.push(...flatten(kid(c, 'sdtContent') ?? c, name))\n else if (c.n === 'customXml' || c.n === 'sdtContent') out.push(...flatten(c, name))\n }\n return out\n}\n\nfunction readLook(el: XEl | undefined) {\n const look = { firstRow: true, lastRow: false, firstCol: true, lastCol: false, noHBand: false, noVBand: true }\n if (!el) return look\n const hex = el.a.val\n if (hex && /^[0-9a-fA-F]+$/.test(hex) && el.a.firstRow === undefined) {\n const v = parseInt(hex, 16)\n return {\n firstRow: !!(v & 0x20), lastRow: !!(v & 0x40), firstCol: !!(v & 0x80), lastCol: !!(v & 0x100),\n noHBand: !!(v & 0x200), noVBand: !!(v & 0x400),\n }\n }\n const b = (k: string, d: boolean) => (el.a[k] === undefined ? d : el.a[k] === '1' || el.a[k] === 'true')\n return {\n firstRow: b('firstRow', true), lastRow: b('lastRow', false), firstCol: b('firstColumn', true),\n lastCol: b('lastColumn', false), noHBand: b('noHBand', false), noVBand: b('noVBand', true),\n }\n}\n\n// ---------------------------------------------------------------------------\n\nexport interface DocxStreamCallbacks {\n onBlocks(blocks: Block[]): void\n onMeta(meta: DocxMeta): void\n onProgress?(loaded: number, total: number): void\n signal?: AbortSignal\n /** Hold blocks until this much time passed so small docs render in one go (ms). */\n initialHoldMs?: number\n}\n\nexport interface PInfo extends ParaRecord {\n item: number\n ord: number\n}\n\n/** Splits document.xml into prefix / body items / suffix while streaming, keeping exact source text. */\nclass Capture implements SaxHandler {\n prefix = ''\n items: string[] = []\n suffix = ''\n private buf = ''\n private tail = ''\n private pending = ''\n private inItem = false\n private depth = 0\n private els: XEl[] = []\n\n constructor(\n private tb: TreeBuilder,\n private onItem: (index: number, els: XEl[]) => void,\n ) {}\n\n raw = (seg: string) => {\n this.flush()\n this.pending = seg\n }\n\n /** TreeBuilder onElement target */\n element = (el: XEl) => {\n this.els.push(el)\n }\n\n private flush() {\n if (!this.pending) return\n if (this.inItem) this.buf += this.pending\n else this.tail += this.pending\n this.pending = ''\n }\n\n open(name: string, attrs: Record<string, string>): boolean | void {\n if (this.depth === 2) {\n if (this.items.length) this.items[this.items.length - 1] += this.tail\n else this.prefix += this.tail\n this.tail = ''\n this.inItem = true\n this.buf = ''\n this.els = []\n }\n this.flush()\n const skip = this.tb.open(name, attrs)\n if (!skip) this.depth++\n return skip\n }\n\n close(name: string): void {\n this.flush()\n this.tb.close(name)\n this.depth--\n if (this.depth === 2 && this.inItem) {\n this.inItem = false\n this.items.push(this.buf)\n this.buf = ''\n this.onItem(this.items.length - 1, this.els)\n this.els = []\n }\n }\n\n text(t: string): void {\n this.flush()\n this.tb.text(t)\n }\n\n finish() {\n this.flush()\n if (!this.items.length) this.prefix += this.tail\n else this.suffix = this.tail\n this.tail = ''\n }\n}\n\nexport class DocxDocument {\n // ---- edit state ----\n /** raw XML of each body child (exact source) */\n items: string[] = []\n prefix = ''\n suffix = ''\n info = new Map<number, PInfo>()\n /** where each original paragraph lives in the source (never changes) */\n origLoc = new Map<number, { item: number; ord: number }>()\n /** original paragraph id per (item, ord) */\n ordPid = new Map<string, number>()\n itemParas = new Map<number, number[]>()\n /** (item:ord) → paragraph ids now standing in for that original paragraph */\n groups = new Map<string, number[]>()\n genXml = new Map<number, string>()\n /** whole body items replaced by the editor (regenerated tables; '' = deleted) */\n itemXml = new Map<number, string>()\n private nextPid = 1\n private captured = false\n private edited = false\n\n private constructor(\n readonly pkg: OpcPackage,\n readonly mainPath: string,\n public rels: Rels,\n readonly styles: StyleSheet,\n public numbering: Numbering,\n readonly theme: Theme,\n ) {}\n\n static async open(pkg: OpcPackage, mainPath: string): Promise<DocxDocument> {\n const rels = await pkg.rels(mainPath)\n const themeRel = relOfType(rels, 'theme')\n const theme = parseTheme(themeRel ? await pkg.xml(themeRel.target) : undefined)\n const stylesRel = relOfType(rels, 'styles')\n const numRel = relOfType(rels, 'numbering')\n const styles = new StyleSheet(stylesRel ? await pkg.xml(stylesRel.target) : undefined, theme)\n const numbering = new Numbering(numRel ? await pkg.xml(numRel.target) : undefined, theme)\n return new DocxDocument(pkg, mainPath, rels, styles, numbering, theme)\n }\n\n get dirty() {\n return this.edited || this.pkg.dirty\n }\n\n markEdited() {\n this.edited = true\n }\n\n private async headerFooter(id: string | undefined): Promise<Block[] | undefined> {\n const rel = id ? this.rels.get(id) : undefined\n if (!rel) return undefined\n const root = await this.pkg.xml(rel.target)\n if (!root) return undefined\n const conv = new Converter(this.styles, this.numbering, this.theme, await this.pkg.rels(rel.target))\n const out: Block[] = []\n for (const c of root.c) conv.blocks(c, out)\n return out\n }\n\n async stream(cb: DocxStreamCallbacks): Promise<void> {\n let item = 0\n let ords = new Map<XEl, number>()\n const hooks: ConvHooks = {\n item: () => item,\n para: (el, rec) => {\n const ord = ords.get(el)\n if (ord === undefined) return undefined\n const pid = this.nextPid++\n const info = rec as PInfo\n info.item = item\n info.ord = ord\n this.info.set(pid, info)\n this.origLoc.set(pid, { item, ord })\n this.ordPid.set(`${item}:${ord}`, pid)\n let list = this.itemParas.get(item)\n if (!list) this.itemParas.set(item, (list = []))\n list[ord] = pid\n return pid\n },\n }\n const conv = new Converter(this.styles, this.numbering, this.theme, this.rels, hooks)\n const baseMeta = {\n font: this.styles.docRs.font ?? '\"Times New Roman\", serif',\n sz: this.styles.docRs.sz ?? 10,\n styles: this.styles.quickStyles(),\n }\n let pending: Block[] = []\n let finalSect: XEl | undefined\n let firstSect: PageSetup | undefined\n const started = Date.now()\n const hold = cb.initialHoldMs ?? 350\n let lastFlush = 0\n let held = true\n const onItem = (index: number, els: XEl[]) => {\n item = index\n ords = collectParas(els)\n for (const el of els) {\n if (el.n === 'sectPr') {\n finalSect = el\n continue\n }\n const before = pending.length\n conv.blocks(el, pending)\n if (!firstSect)\n for (let i = before; i < pending.length; i++) {\n const b = pending[i]\n if (b.t === 'sect') firstSect = b.page\n }\n }\n }\n let capture: Capture | undefined\n const tb = new TreeBuilder({ emitDepth: 2, onElement: (el) => capture!.element(el) })\n capture = new Capture(tb, onItem)\n const flush = () => {\n if (!pending.length) return\n cb.onBlocks(pending)\n pending = []\n lastFlush = Date.now()\n }\n const stream = await this.pkg.zip.stream(this.mainPath, cb.onProgress)\n await parseXmlStream(stream, capture, {\n signal: cb.signal,\n raw: capture.raw,\n onChunk: async () => {\n const now = Date.now()\n if (held) {\n if (now - started < hold) return\n held = false\n cb.onMeta({ page: firstSect ?? { ...DEFAULT_PAGE }, ...baseMeta })\n flush()\n return\n }\n if (pending.length >= 400 || (pending.length && now - lastFlush > 120)) {\n flush()\n // yield so RPC requests (images, etc.) get served during long parses\n await new Promise((r) => setTimeout(r, 0))\n }\n },\n })\n capture.finish()\n this.items = capture.items\n this.prefix = capture.prefix\n this.suffix = capture.suffix\n this.captured = true\n const sect = finalSect\n const meta: DocxMeta = { page: pageSetup(sect), ...baseMeta, final: true }\n if (sect) {\n const ref = (tag: string, type: string) => kids(sect, tag).find((r) => (r.a.type ?? 'default') === type)?.a['r:id']\n meta.header = await this.headerFooter(ref('headerReference', 'default'))\n meta.footer = await this.headerFooter(ref('footerReference', 'default'))\n meta.titlePg = !!kid(sect, 'titlePg') && kid(sect, 'titlePg')?.a.val !== '0'\n if (meta.titlePg) {\n meta.firstHeader = await this.headerFooter(ref('headerReference', 'first'))\n meta.firstFooter = await this.headerFooter(ref('footerReference', 'first'))\n }\n }\n cb.onMeta(meta)\n flush()\n }\n\n get ready() {\n return this.captured\n }\n\n /** Re-converts generated paragraph XML into blocks (styles, list levels resolved by the engine). */\n reconvert(pid: number, xml: string, map: GenRun[], layer: Layer | undefined, marker?: ListMarker): { blocks: Block[]; rec: ParaRecord } {\n const root = parseXml(xml)\n const forced: NonNullable<ConvHooks['forced']> = { pid, root, map, layer, marker }\n const conv = new Converter(this.styles, this.numbering, this.theme, this.rels, { forced })\n const out: Block[] = []\n conv.paragraph(root, out)\n return { blocks: out, rec: forced.rec! }\n }\n\n /** Recomputes list markers in document order; returns changed ones. */\n recomputeMarkers(): Map<number, PInfo> {\n const changed = new Map<number, PInfo>()\n this.numbering.reset()\n const items = [...this.itemParas.keys()].sort((a, b) => a - b)\n for (const item of items) {\n const arr = this.itemParas.get(item)!\n for (let ord = 0; ord < arr.length; ord++) {\n const pid0 = arr[ord]\n if (pid0 === undefined) continue\n const pids = this.groups.get(`${item}:${ord}`) ?? [pid0]\n for (const pid of pids) {\n const inf = this.info.get(pid)\n if (!inf) continue\n let next: ListMarker | undefined\n let lst: 'bullet' | 'number' | undefined\n if (inf.num) {\n const base = inf.marker?.s ?? {}\n const m = markerOf(this.numbering, inf.num, base)\n if (m) {\n next = { ...m.marker, s: inf.marker?.s ?? m.marker.s }\n lst = m.lst\n }\n }\n if ((next?.text ?? null) !== (inf.marker?.text ?? null) || lst !== inf.lst) {\n inf.marker = next\n inf.lst = lst\n changed.set(pid, inf)\n }\n }\n }\n }\n return changed\n }\n}\n","/**\n * DOCX write-back: edited paragraphs are regenerated from their original XML\n * (pPr / rPr / inline objects copied verbatim, only changed properties patched);\n * everything else is written back byte-for-byte.\n */\nimport { relOfType } from '../opc'\nimport {\n clone, el, isNode, kidOf, kidsOf, local, parseRaw, prefixOf, removeKids, rootEl, serialize, setAttr, setOrdered, walkOoxml,\n escText, type RChild, type RNode,\n} from '../raw'\nimport { parseXml } from '../xml'\nimport { Numbering } from './numbering'\nimport type { DocxDocument, GenRun } from './parser'\nimport { HIGHLIGHT } from './styles'\nimport type { Block, CanonStyle, CellSpec, EditOp, EditResult, ParaDirty, ParaSpec, Paragraph, RunSet, SpecRun, SrcRef, StyleInfo, TableOp, TableSpec } from './types'\n\nexport const DOCX_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\nconst NUMBERING_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering'\nconst NUMBERING_CT = 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml'\n\nconst PPR_ORDER = [\n 'pStyle', 'keepNext', 'keepLines', 'pageBreakBefore', 'framePr', 'widowControl', 'numPr', 'suppressLineNumbers', 'pBdr', 'shd',\n 'tabs', 'suppressAutoHyphens', 'kinsoku', 'wordWrap', 'overflowPunct', 'topLinePunct', 'autoSpaceDE', 'autoSpaceDN', 'bidi',\n 'adjustRightInd', 'snapToGrid', 'spacing', 'ind', 'contextualSpacing', 'mirrorIndents', 'suppressOverlap', 'jc', 'textDirection',\n 'textAlignment', 'textboxTightWrap', 'outlineLvl', 'divId', 'cnfStyle', 'rPr', 'sectPr', 'pPrChange',\n]\nconst RPR_ORDER = [\n 'rStyle', 'rFonts', 'b', 'bCs', 'i', 'iCs', 'caps', 'smallCaps', 'strike', 'dstrike', 'outline', 'shadow', 'emboss', 'imprint',\n 'noProof', 'snapToGrid', 'vanish', 'webHidden', 'color', 'spacing', 'w', 'kern', 'position', 'sz', 'szCs', 'highlight', 'u',\n 'effect', 'bdr', 'shd', 'fitText', 'vertAlign', 'rtl', 'cs', 'em', 'lang', 'eastAsianLayout', 'specVanish', 'oMath',\n]\nconst START_MARKS = new Set(['bookmarkStart', 'commentRangeStart', 'permStart', 'moveFromRangeStart', 'moveToRangeStart'])\nconst END_MARKS = new Set(['bookmarkEnd', 'commentRangeEnd', 'permEnd', 'moveFromRangeEnd', 'moveToRangeEnd'])\nconst RUN_STOP = new Set(['p', 'del', 'moveFrom', 'oMath', 'oMathPara', 'pPr', 'rPr', 'r'])\nconst HL_NAME: Record<string, string> = Object.fromEntries(Object.entries(HIGHLIGHT).map(([k, v]) => [v, k]))\n\ninterface ParaLoc {\n node: RNode\n list: RChild[]\n index: number\n}\n\n/** Paragraphs of a body item in the same preorder the converter uses. */\nexport function collectParasRaw(nodes: RChild[]): ParaLoc[] {\n const out: ParaLoc[] = []\n nodes.forEach((n, i) => {\n if (!isNode(n)) return\n if (local(n.q) === 'p') out.push({ node: n, list: nodes, index: i })\n walkOoxml(n, (c, parent, idx) => {\n if (local(c.q) === 'p') out.push({ node: c, list: parent.c, index: idx })\n })\n })\n return out\n}\n\nexport function collectRunsRaw(p: RNode): RNode[] {\n const out: RNode[] = []\n walkOoxml(p, (c) => {\n const l = local(c.q)\n if (l === 'r') out.push(c)\n return RUN_STOP.has(l)\n })\n return out\n}\n\n// ---------------------------------------------------------------- source lookup\n\nconst itemCache = new WeakMap<DocxDocument, Map<number, ParaLoc[]>>()\n\nfunction itemParas(doc: DocxDocument, item: number): ParaLoc[] {\n let m = itemCache.get(doc)\n if (!m) itemCache.set(doc, (m = new Map()))\n let paras = m.get(item)\n if (!paras) {\n paras = collectParasRaw(parseRaw(doc.items[item] ?? ''))\n if (m.size > 64) m.delete(m.keys().next().value as number)\n m.set(item, paras)\n }\n return paras\n}\n\nexport function origPara(doc: DocxDocument, pid: number): RNode | undefined {\n const loc = doc.origLoc.get(pid)\n if (!loc) return undefined\n return itemParas(doc, loc.item)[loc.ord]?.node\n}\n\nconst runCache = new WeakMap<RNode, RNode[]>()\nfunction origRun(doc: DocxDocument, src: SrcRef | undefined): RNode | undefined {\n if (!src) return undefined\n const p = origPara(doc, src[0])\n if (!p) return undefined\n let runs = runCache.get(p)\n if (!runs) runCache.set(p, (runs = collectRunsRaw(p)))\n return runs[src[1]]\n}\n\n// ---------------------------------------------------------------- generation\n\nfunction applyRunSet(rPr: RNode, set: RunSet, W: string) {\n const val = W + 'val'\n const put = (l: string, node: RNode | undefined) => setOrdered(rPr, node, l, RPR_ORDER)\n const toggle = (l: string, on: boolean) => put(l, on ? el(W + l) : el(W + l, { [val]: '0' }))\n if (set.b !== undefined) {\n toggle('b', set.b)\n toggle('bCs', set.b)\n }\n if (set.i !== undefined) {\n toggle('i', set.i)\n toggle('iCs', set.i)\n }\n if (set.strike !== undefined) {\n toggle('strike', set.strike)\n if (set.strike) put('dstrike', undefined)\n }\n if (set.u !== undefined) put('u', el(W + 'u', { [val]: set.u && set.u !== 'none' ? set.u : 'none' }))\n if ('color' in set) put('color', set.color ? el(W + 'color', { [val]: set.color.replace('#', '').toUpperCase() }) : undefined)\n if (set.sz !== undefined) {\n const v = String(Math.round(set.sz * 2))\n put('sz', el(W + 'sz', { [val]: v }))\n put('szCs', el(W + 'szCs', { [val]: v }))\n }\n if (set.font !== undefined) {\n const f = set.font\n put('rFonts', el(W + 'rFonts', { [W + 'ascii']: f, [W + 'hAnsi']: f, [W + 'eastAsia']: f, [W + 'cs']: f }))\n }\n if ('hl' in set) {\n const name = set.hl ? HL_NAME[set.hl.toLowerCase()] : undefined\n if (!set.hl) {\n put('highlight', undefined)\n put('shd', undefined)\n } else if (name) put('highlight', el(W + 'highlight', { [val]: name }))\n else put('shd', el(W + 'shd', { [val]: 'clear', [W + 'color']: 'auto', [W + 'fill']: set.hl.replace('#', '').toUpperCase() }))\n }\n if ('va' in set) put('vertAlign', set.va ? el(W + 'vertAlign', { [val]: set.va === 'sup' ? 'superscript' : 'subscript' }) : undefined)\n}\n\nfunction textContentXml(text: string, W: string): string {\n let out = ''\n for (const piece of text.split(/(\\t|\\n)/)) {\n if (!piece) continue\n if (piece === '\\t') out += `<${W}tab/>`\n else if (piece === '\\n') out += `<${W}br/>`\n else out += `<${W}t xml:space=\"preserve\">${escText(piece)}</${W}t>`\n }\n return out\n}\n\nfunction abstractXml(W: string, id: number, kind: 'bullet' | 'number'): string {\n const bullets = ['•', '◦', '▪']\n const fmts = ['decimal', 'lowerLetter', 'lowerRoman']\n let lv = ''\n for (let l = 0; l < 9; l++) {\n const fmt = kind === 'bullet' ? 'bullet' : fmts[l % 3]\n const text = kind === 'bullet' ? bullets[l % 3] : `%${l + 1}.`\n lv +=\n `<${W}lvl ${W}ilvl=\"${l}\"><${W}start ${W}val=\"1\"/><${W}numFmt ${W}val=\"${fmt}\"/><${W}lvlText ${W}val=\"${text}\"/>` +\n `<${W}lvlJc ${W}val=\"left\"/><${W}pPr><${W}ind ${W}left=\"${720 * (l + 1)}\" ${W}hanging=\"360\"/></${W}pPr></${W}lvl>`\n }\n return `<${W}abstractNum ${W}abstractNumId=\"${id}\"><${W}multiLevelType ${W}val=\"hybridMultilevel\"/>${lv}</${W}abstractNum>`\n}\n\nconst STYLES_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles'\nconst STYLES_CT = 'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml'\n\n/** Word's built-in look for the canonical styles (used when a document lacks them) */\nfunction canonDef(kind: Exclude<CanonStyle, 'normal'>, W: string): { id: string; name: string; ppr: string; rpr: string } {\n const sz = (v: number) => `<${W}sz ${W}val=\"${v}\"/><${W}szCs ${W}val=\"${v}\"/>`\n const color = (c: string) => `<${W}color ${W}val=\"${c}\"/>`\n if (kind === 'title')\n return { id: 'Title', name: 'Title', ppr: `<${W}spacing ${W}after=\"80\" ${W}line=\"240\" ${W}lineRule=\"auto\"/><${W}contextualSpacing/>`, rpr: `<${W}spacing ${W}val=\"-10\"/><${W}kern ${W}val=\"28\"/>${sz(56)}` }\n if (kind === 'subtitle') return { id: 'Subtitle', name: 'Subtitle', ppr: `<${W}spacing ${W}after=\"160\"/>`, rpr: `${color('5A5A5A')}<${W}spacing ${W}val=\"15\"/>${sz(28)}` }\n const n = Number(kind.slice(1))\n const look: Record<number, [number, number, string, boolean]> = {\n 1: [240, 32, '2F5496', false],\n 2: [40, 26, '2F5496', false],\n 3: [40, 24, '1F3763', false],\n 4: [40, 22, '2F5496', true],\n 5: [40, 22, '2F5496', false],\n 6: [40, 22, '1F3763', true],\n }\n const [before, size, c, italic] = look[n]\n return {\n id: `Heading${n}`,\n name: `heading ${n}`,\n ppr: `<${W}keepNext/><${W}keepLines/><${W}spacing ${W}before=\"${before}\" ${W}after=\"0\"/><${W}outlineLvl ${W}val=\"${n - 1}\"/>`,\n rpr: `${italic ? `<${W}i/><${W}iCs/>` : ''}${color(c)}${sz(size)}`,\n }\n}\n\n/** Id of a built-in paragraph style (Title, Heading 1…), added to styles.xml when the document lacks it. */\nexport async function ensureStyle(doc: DocxDocument, kind: CanonStyle): Promise<{ id: string; styles: StyleInfo[] }> {\n const have = doc.styles.canonical()[kind]\n if (have || kind === 'normal') return { id: have ?? '', styles: doc.styles.quickStyles() }\n const rel = relOfType(doc.rels, 'styles')\n const path = rel?.target ?? 'word/styles.xml'\n const xml = doc.pkg.has(path)\n ? await doc.pkg.text(path)\n : '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"></w:styles>'\n const nodes = parseRaw(xml)\n const root = rootEl(nodes)!\n const W = prefixOf(root.q)\n const def = canonDef(kind, W)\n let id = def.id\n for (let i = 2; doc.styles.has(id); i++) id = def.id + i\n const base = doc.styles.defaultPara\n const link = base ? `<${W}basedOn ${W}val=\"${base}\"/><${W}next ${W}val=\"${base}\"/>` : ''\n const styleXml =\n `<${W}style ${W}type=\"paragraph\" ${W}styleId=\"${id}\"><${W}name ${W}val=\"${def.name}\"/>${link}<${W}uiPriority ${W}val=\"9\"/><${W}qFormat/>` +\n `<${W}pPr>${def.ppr}</${W}pPr><${W}rPr>${def.rpr}</${W}rPr></${W}style>`\n root.c.push(parseRaw(styleXml)[0])\n root.self = false\n doc.pkg.setPart(path, serialize(nodes))\n if (!rel) {\n await doc.pkg.addRel(doc.mainPath, STYLES_REL, path)\n await doc.pkg.setContentType(path, STYLES_CT)\n doc.rels = await doc.pkg.rels(doc.mainPath)\n }\n const parsed = parseXml(W ? styleXml.replace(`<${W}style `, `<${W}style xmlns:${W.slice(0, -1)}=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" `) : styleXml)\n if (parsed) doc.styles.add(parsed)\n doc.markEdited()\n return { id, styles: doc.styles.quickStyles() }\n}\n\n/** Finds (or creates in numbering.xml) a list definition of the given kind. */\nasync function ensureList(doc: DocxDocument, kind: 'bullet' | 'number'): Promise<string> {\n const found = doc.numbering.findList(kind)\n if (found) return found\n const rel = relOfType(doc.rels, 'numbering')\n const path = rel?.target ?? 'word/numbering.xml'\n const xml = doc.pkg.has(path)\n ? await doc.pkg.text(path)\n : '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"></w:numbering>'\n const nodes = parseRaw(xml)\n const root = rootEl(nodes)!\n const W = prefixOf(root.q)\n const { abstract, num } = doc.numbering.ids()\n const absNode = parseRaw(abstractXml(W, abstract, kind))[0] as RNode\n const numNode = parseRaw(`<${W}num ${W}numId=\"${num}\"><${W}abstractNumId ${W}val=\"${abstract}\"/></${W}num>`)[0] as RNode\n const idxOf = (l: string, last: boolean) => {\n let at = -1\n root.c.forEach((c, i) => {\n if (isNode(c) && local(c.q) === l && (last || at < 0)) at = i\n })\n return at\n }\n const lastAbs = idxOf('abstractNum', true)\n const firstNum = idxOf('num', false)\n root.c.splice(lastAbs >= 0 ? lastAbs + 1 : firstNum >= 0 ? firstNum : root.c.length, 0, absNode)\n const lastNum = idxOf('num', true)\n const cleanup = idxOf('numIdMacAtCleanup', false)\n root.c.splice(lastNum >= 0 ? lastNum + 1 : cleanup >= 0 ? cleanup : root.c.length, 0, numNode)\n root.self = false\n const out = serialize(nodes)\n doc.pkg.setPart(path, out)\n if (!rel) {\n await doc.pkg.addRel(doc.mainPath, NUMBERING_REL, path)\n await doc.pkg.setContentType(path, NUMBERING_CT)\n doc.rels = await doc.pkg.rels(doc.mainPath)\n }\n doc.numbering = new Numbering(parseXml(out), doc.theme)\n return String(num)\n}\n\nasync function applyParaDirty(doc: DocxDocument, pPr: RNode, pd: ParaDirty, W: string) {\n const val = W + 'val'\n const put = (l: string, node: RNode | undefined) => setOrdered(pPr, node, l, PPR_ORDER)\n if (pd.style !== undefined) put('pStyle', pd.style && pd.style !== doc.styles.defaultPara ? el(W + 'pStyle', { [val]: pd.style }) : undefined)\n if (pd.align) put('jc', el(W + 'jc', { [val]: pd.align === 'justify' ? 'both' : pd.align }))\n if (pd.line !== undefined || pd.before !== undefined || pd.after !== undefined) {\n const sp = clone(kidOf(pPr, 'spacing') ?? el(W + 'spacing'))\n if (pd.before !== undefined) {\n setAttr(sp, W + 'before', String(Math.round(pd.before * 20)))\n setAttr(sp, W + 'beforeAutospacing', undefined)\n }\n if (pd.after !== undefined) {\n setAttr(sp, W + 'after', String(Math.round(pd.after * 20)))\n setAttr(sp, W + 'afterAutospacing', undefined)\n }\n if (pd.line !== undefined) {\n setAttr(sp, W + 'line', String(Math.round(pd.line * 240)))\n setAttr(sp, W + 'lineRule', 'auto')\n }\n put('spacing', sp)\n }\n if (pd.pageBreak !== undefined) put('pageBreakBefore', pd.pageBreak ? el(W + 'pageBreakBefore') : undefined)\n if (pd.indL !== undefined) {\n const ind = clone(kidOf(pPr, 'ind') ?? el(W + 'ind'))\n setAttr(ind, W + 'start', undefined)\n setAttr(ind, W + 'left', String(Math.max(0, Math.round(pd.indL * 20))))\n put('ind', ind)\n }\n const styleNum = doc.styles.para(readStyle(pPr)).numPr\n const numPr = (numId: string, ilvl: number) =>\n el(W + 'numPr', {}, [el(W + 'ilvl', { [val]: String(ilvl) }), el(W + 'numId', { [val]: numId })])\n if (pd.list === 'none') put('numPr', styleNum ? numPr('0', 0) : undefined)\n else if (pd.list) put('numPr', numPr(await ensureList(doc, pd.list), pd.ilvl ?? 0))\n else if (pd.ilvl !== undefined) {\n const cur = kidOf(pPr, 'numPr')\n const numId = (cur && attrOf(kidOf(cur, 'numId'), val)) ?? styleNum?.numId\n if (numId && numId !== '0') put('numPr', numPr(numId, pd.ilvl))\n }\n}\n\nfunction attrOf(n: RNode | undefined, q: string): string | undefined {\n if (!n) return undefined\n const m = new RegExp(`(?:^|\\\\s)${q.replace(':', '\\\\:')}=\"([^\"]*)\"`).exec(n.a)\n return m?.[1]\n}\n\nfunction readStyle(pPr: RNode): string | undefined {\n const ps = kidOf(pPr, 'pStyle')\n return ps ? /=\"([^\"]*)\"/.exec(ps.a)?.[1] : undefined\n}\n\nexport async function genParagraph(doc: DocxDocument, spec: ParaSpec): Promise<{ xml: string; map: GenRun[] }> {\n const tpl = origPara(doc, spec.from)\n const pq = tpl?.q ?? 'w:p'\n const W = prefixOf(pq) || 'w:'\n const pPr = clone(kidOf(tpl, 'pPr') ?? el(W + 'pPr'))\n if (spec.pd) await applyParaDirty(doc, pPr, spec.pd, W)\n const keepSect = spec.keepSect ?? spec.pid === spec.from\n if (!keepSect) removeKids(pPr, 'sectPr')\n const markRPr = kidOf(pPr, 'rPr')\n\n const map: GenRun[] = []\n let body = ''\n let openLink: string | undefined\n const closeLink = () => {\n if (openLink !== undefined) body += `</${W}hyperlink>`\n openLink = undefined\n }\n const runXml = (rPr: RNode | undefined, content: string) => `<${W}r>${rPr && rPr.c.length ? serialize(rPr) : ''}${content}</${W}r>`\n const baseRPr = (src: SrcRef | undefined) => {\n const sr = origRun(doc, src)\n const r = kidOf(sr, 'rPr') ?? markRPr\n if (!r) return undefined\n const c = clone(r)\n c.q = W + 'rPr'\n removeKids(c, (l) => l === 'rPrChange' || l === 'ins' || l === 'del' || l === 'moveFrom' || l === 'moveTo')\n return c\n }\n\n spec.parts.forEach((part, pi) => {\n if (pi > 0) {\n closeLink()\n body += `<${W}r><${W}br ${W}type=\"page\"/></${W}r>`\n map.push({})\n }\n for (const run of part as SpecRun[]) {\n if ('obj' in run) {\n closeLink()\n if (run.obj === 'field') {\n let rPr = baseRPr(undefined)\n if (run.set) applyRunSet((rPr ??= el(W + 'rPr')), run.set, W)\n body += `<${W}fldSimple ${W}instr=\" ${run.kind} \">${runXml(rPr, `<${W}t>1</${W}t>`)}</${W}fldSimple>`\n map.push({ d: run.set })\n } else if (run.obj === 'image') {\n body += imageRunXml(W, run.rid, run.w, run.h, run.name, run.alt)\n map.push({})\n } else {\n const src = origRun(doc, run.src)\n if (src) {\n if (run.size || run.alt !== undefined || run.rid) {\n const r = clone(src)\n const cx = run.size && String(Math.round(run.size[0] * 12700))\n const cy = run.size && String(Math.round(run.size[1] * 12700))\n walkOoxml(r, (n) => {\n const l = local(n.q)\n if (cx && cy && (l === 'extent' || (l === 'ext' && /\\scx=/.test(n.a)))) {\n setAttr(n, 'cx', cx)\n setAttr(n, 'cy', cy)\n }\n if (run.alt !== undefined && (l === 'docPr' || (l === 'cNvPr' && /\\sid=/.test(n.a)))) setAttr(n, 'descr', run.alt || undefined)\n if (run.rid && l === 'blip') {\n const m = /([\\w.-]+):embed=\"/.exec(n.a)\n setAttr(n, m ? `${m[1]}:embed` : 'r:embed', run.rid)\n }\n })\n body += serialize(r)\n } else body += serialize(src)\n map.push({ src: run.src })\n }\n }\n continue\n }\n if (run.lk !== openLink) {\n closeLink()\n if (run.lk) {\n const attr = run.lk.startsWith('r:') ? `r:id=\"${run.lk.slice(2)}\"` : `${W}anchor=\"${escText(run.lk.slice(2))}\"`\n body += `<${W}hyperlink ${attr}>`\n openLink = run.lk\n }\n }\n let rPr = baseRPr(run.src)\n if (run.set && Object.keys(run.set).length) applyRunSet((rPr ??= el(W + 'rPr')), run.set, W)\n if (!run.text) continue\n body += runXml(rPr, textContentXml(run.text, W))\n map.push({ src: run.src, d: run.set })\n }\n })\n closeLink()\n\n // bookmarks / comment ranges / comment references of the source paragraphs\n let starts = ''\n let ends = ''\n const orig = spec.orig ?? (spec.pid === spec.from ? [spec.from] : [])\n for (const pid of orig) {\n const op = origPara(doc, pid)\n if (!op) continue\n for (const c of kidsOf(op)) {\n const l = local(c.q)\n if (START_MARKS.has(l)) starts += serialize(c)\n else if (END_MARKS.has(l)) ends += serialize(c)\n }\n for (const r of collectRunsRaw(op)) {\n if (kidOf(r, 'commentReference')) {\n ends += serialize(r)\n map.push({})\n }\n }\n }\n\n let attrs = tpl?.a ?? ''\n if (spec.pid !== spec.from) attrs = attrs.replace(/\\s+w14:(paraId|textId)=\"[^\"]*\"/g, '')\n const ppr = pPr.c.length ? serialize(pPr) : ''\n // comment references were appended after `body`; keep `map` order aligned with emission order\n return { xml: `<${pq}${attrs}>${ppr}${starts}${body}${ends}</${pq}>`, map }\n}\n\n// ---------------------------------------------------------------- edit operations\n\nfunction groupFor(doc: DocxDocument, key: string): number[] {\n let g = doc.groups.get(key)\n if (!g) {\n const p = doc.ordPid.get(key)\n g = p !== undefined ? [p] : []\n doc.groups.set(key, g)\n }\n return g\n}\n\nfunction detach(doc: DocxDocument, pid: number) {\n const inf = doc.info.get(pid)\n if (!inf) return\n const g = groupFor(doc, `${inf.item}:${inf.ord}`)\n const i = g.indexOf(pid)\n if (i >= 0) g.splice(i, 1)\n}\n\nexport async function applyEdit(doc: DocxDocument, op: EditOp): Promise<EditResult> {\n if (!doc.ready) throw new Error('Document is still loading')\n const anchor = doc.info.get(op.anchor)\n if (!anchor) throw new Error(`Unknown paragraph ${op.anchor}`)\n doc.markEdited()\n // list numbering only needs recomputing when list paragraphs or paragraph properties are involved\n const involved = [op.anchor, ...op.list.map((x) => x.pid), ...(op.remove ?? [])]\n const listy = op.list.some((x) => x.pd) || involved.some((pid) => doc.info.get(pid)?.num)\n const item = anchor.item\n const ord = anchor.ord\n const listPids = op.list.map((s) => s.pid)\n for (const pid of [...listPids, ...(op.remove ?? [])]) if (pid !== op.anchor) detach(doc, pid)\n const group = groupFor(doc, `${item}:${ord}`)\n const idx = group.indexOf(op.anchor)\n if (idx < 0) throw new Error(`Paragraph ${op.anchor} is not in the document`)\n group.splice(idx, 1, ...listPids)\n for (const pid of [op.anchor, ...(op.remove ?? [])]) if (!listPids.includes(pid)) doc.genXml.delete(pid)\n\n const blocks: Record<number, Block[]> = {}\n for (const spec of op.list) {\n const tplInfo = doc.info.get(spec.from) ?? anchor\n const prev = doc.info.get(spec.pid)\n let xml: string\n let map: GenRun[]\n const orig = spec.pristine && spec.pid === spec.from ? origPara(doc, spec.pid) : undefined\n if (orig) {\n xml = serialize(orig)\n map = collectRunsRaw(orig).map((_, k) => ({ src: [spec.pid, k] as SrcRef }))\n } else ({ xml, map } = await genParagraph(doc, spec))\n doc.genXml.set(spec.pid, xml)\n const { blocks: bl, rec } = doc.reconvert(spec.pid, xml, map, tplInfo.layer, prev?.marker)\n doc.info.set(spec.pid, { ...rec, item, ord, marker: prev?.marker, lst: prev?.lst })\n if (op.want) blocks[spec.pid] = bl\n }\n const listy2 = listy || op.list.some((x) => doc.info.get(x.pid)?.num)\n const changed = listy2 ? doc.recomputeMarkers() : new Map()\n const markers: EditResult['markers'] = {}\n for (const [pid, inf] of changed) markers[pid] = inf.marker ? { ...inf.marker, lst: inf.lst } : null\n // returned blocks carry the final markers\n for (const [pid, bl] of Object.entries(blocks)) {\n const inf = doc.info.get(Number(pid))\n bl.filter((b): b is Paragraph => b.t === 'p').forEach((p, i) => {\n delete p.marker\n delete p.lst\n if (i === 0 && inf?.marker) {\n p.marker = inf.marker\n p.lst = inf.lst\n }\n })\n }\n return { blocks, markers }\n}\n\nlet drawingId = 7000\n\nfunction imageRunXml(W: string, rid: string, w: number, h: number, name = 'Picture', alt?: string): string {\n const cx = Math.round(w * 12700)\n const cy = Math.round(h * 12700)\n const id = ++drawingId\n const A = 'http://schemas.openxmlformats.org/drawingml/2006/main'\n const PIC = 'http://schemas.openxmlformats.org/drawingml/2006/picture'\n const WP = 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'\n const n = escText(name)\n const descr = alt ? ` descr=\"${escText(alt).replace(/\"/g, '"')}\"` : ''\n return (\n `<${W}r><${W}drawing><wp:inline xmlns:wp=\"${WP}\" distT=\"0\" distB=\"0\" distL=\"0\" distR=\"0\"><wp:extent cx=\"${cx}\" cy=\"${cy}\"/>` +\n `<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/><wp:docPr id=\"${id}\" name=\"${n} ${id}\"${descr}/><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a=\"${A}\" noChangeAspect=\"1\"/></wp:cNvGraphicFramePr>` +\n `<a:graphic xmlns:a=\"${A}\"><a:graphicData uri=\"${PIC}\"><pic:pic xmlns:pic=\"${PIC}\"><pic:nvPicPr><pic:cNvPr id=\"${id}\" name=\"${n}\"${descr}/><pic:cNvPicPr/></pic:nvPicPr>` +\n `<pic:blipFill><a:blip r:embed=\"${rid}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm>` +\n `<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></${W}drawing></${W}r>`\n )\n}\n\nconst IMAGE_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'\nconst HYPERLINK_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink'\nconst IMG_TYPES: Record<string, string> = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', bmp: 'image/bmp', svg: 'image/svg+xml', webp: 'image/webp' }\n\n/** Adds an image part to the document; returns its relationship id and part path. */\nexport async function addImage(doc: DocxDocument, bytes: Uint8Array, ext: string): Promise<{ rid: string; path: string }> {\n ext = ext.toLowerCase().replace('jpeg', 'jpg')\n if (!IMG_TYPES[ext]) throw new Error(`Unsupported image type .${ext}`)\n const path = doc.pkg.freeName('word/media', 'image', ext)\n doc.pkg.setPart(path, bytes)\n await doc.pkg.ensureDefaultType(ext, IMG_TYPES[ext])\n const rid = await doc.pkg.addRel(doc.mainPath, IMAGE_REL, path)\n doc.rels = await doc.pkg.rels(doc.mainPath)\n doc.markEdited()\n return { rid, path }\n}\n\n/** External hyperlink relationship; returns the run link key ('r:rIdN'). */\nexport async function addLink(doc: DocxDocument, url: string): Promise<string> {\n const rid = await doc.pkg.addRel(doc.mainPath, HYPERLINK_REL, url, true)\n doc.rels = await doc.pkg.rels(doc.mainPath)\n return 'r:' + rid\n}\n\n// ---------------------------------------------------------------- tables\n\nconst TCPR_ORDER = ['cnfStyle', 'tcW', 'gridSpan', 'hMerge', 'vMerge', 'tcBorders', 'shd', 'noWrap', 'tcMar', 'textDirection', 'tcFitText', 'vAlign', 'hideMark']\n\nfunction rawRows(tbl: RNode): RNode[] {\n const out: RNode[] = []\n const rec = (n: RNode) => {\n for (const c of kidsOf(n)) {\n const l = local(c.q)\n if (l === 'tr') out.push(c)\n else if (l === 'sdt' || l === 'sdtContent' || l === 'customXml') rec(c)\n }\n }\n rec(tbl)\n return out\n}\n\nfunction rawCells(tr: RNode): RNode[] {\n const out: RNode[] = []\n const rec = (n: RNode) => {\n for (const c of kidsOf(n)) {\n const l = local(c.q)\n if (l === 'tc') out.push(c)\n else if (l === 'sdt' || l === 'sdtContent' || l === 'customXml') rec(c)\n }\n }\n rec(tr)\n return out\n}\n\n/** Regenerates a whole table from the editor model, reusing original row/cell properties. */\nexport async function genTable(doc: DocxDocument, spec: TableSpec): Promise<string> {\n let orig: RNode | undefined\n if (spec.item !== undefined) {\n const nodes = parseRaw(doc.items[spec.item] ?? '')\n const top = rootEl(nodes)\n if (top) {\n if (local(top.q) === 'tbl') orig = top\n else walkOoxml(top, (n) => {\n if (!orig && local(n.q) === 'tbl') orig = n\n return !!orig\n })\n }\n }\n const W = orig ? prefixOf(orig.q) || 'w:' : 'w:'\n const val = W + 'val'\n const rows = orig ? rawRows(orig) : []\n let tblPr = orig ? kidOf(orig, 'tblPr') : undefined\n if (!tblPr) {\n const style = doc.styles.has('TableGrid') ? `<${W}tblStyle ${val}=\"TableGrid\"/>` : ''\n const borders = style\n ? ''\n : `<${W}tblBorders>${['top', 'left', 'bottom', 'right', 'insideH', 'insideV'].map((b) => `<${W}${b} ${val}=\"single\" ${W}sz=\"4\" ${W}space=\"0\" ${W}color=\"auto\"/>`).join('')}</${W}tblBorders>`\n tblPr = parseRaw(`<${W}tblPr>${style}<${W}tblW ${W}w=\"0\" ${W}type=\"auto\"/>${borders}<${W}tblLook ${val}=\"04A0\" ${W}firstRow=\"1\" ${W}lastRow=\"0\" ${W}firstColumn=\"1\" ${W}lastColumn=\"0\" ${W}noHBand=\"0\" ${W}noVBand=\"1\"/></${W}tblPr>`)[0] as RNode\n }\n const grid = `<${W}tblGrid>${spec.cols.map((w) => `<${W}gridCol ${W}w=\"${Math.round(w * 20)}\"/>`).join('')}</${W}tblGrid>`\n const firstTcPr = rows.length ? kidOf(rawCells(rows[0])[0], 'tcPr') : undefined\n const nCols = spec.cols.length\n const cont: ({ left: number; span: number; tcPr?: RNode } | undefined)[] = []\n let out = `<${W}tbl${orig?.a ?? ''}>${serialize(tblPr)}${grid}`\n const tcPrFor = (src: [number, number] | undefined, g: number, span: number, vm?: 'restart' | 'continue', shd?: string) => {\n const tpl = src ? kidOf(rawCells(rows[src[0]] ?? ({ c: [] } as unknown as RNode))[src[1]], 'tcPr') : undefined\n const pr = clone(tpl ?? firstTcPr ?? el(W + 'tcPr'))\n pr.q = W + 'tcPr'\n removeKids(pr, (l) => l === 'gridSpan' || l === 'vMerge' || l === 'hMerge')\n const w = spec.cols.slice(g, g + span).reduce((a, b) => a + b, 0)\n setOrdered(pr, el(W + 'tcW', { [W + 'w']: String(Math.round(w * 20)), [W + 'type']: 'dxa' }), 'tcW', TCPR_ORDER)\n if (span > 1) setOrdered(pr, el(W + 'gridSpan', { [val]: String(span) }), 'gridSpan', TCPR_ORDER)\n if (vm) setOrdered(pr, el(W + 'vMerge', vm === 'restart' ? { [val]: 'restart' } : {}), 'vMerge', TCPR_ORDER)\n if (shd !== undefined) setOrdered(pr, shd ? el(W + 'shd', { [val]: 'clear', [W + 'color']: 'auto', [W + 'fill']: shd.replace('#', '').toUpperCase() }) : undefined, 'shd', TCPR_ORDER)\n return serialize(pr)\n }\n for (const row of spec.rows) {\n const trSrc = row.src !== undefined ? rows[row.src] : undefined\n const trPr = kidOf(trSrc, 'trPr')\n out += `<${W}tr${trSrc?.a ?? ''}>${trPr ? serialize(trPr) : ''}`\n let g = 0\n let k = 0\n const cells: CellSpec[] = row.cells\n while (g < nCols && (k < cells.length || cont[g])) {\n const c = cont[g]\n if (c && c.left > 0) {\n out += `<${W}tc>${c.tcPr ? '' : ''}${tcPrFor(undefined, g, c.span, 'continue')}<${W}p/></${W}tc>`\n c.left--\n if (!c.left) cont[g] = undefined\n g += c.span\n continue\n }\n const cell = cells[k++]\n if (!cell) break\n const span = Math.max(1, Math.min(cell.colSpan, nCols - g))\n let paras = ''\n for (const p of cell.paras) {\n const orig = p.pristine && p.pid === p.from ? origPara(doc, p.pid) : undefined\n paras += orig ? serialize(orig) : (await genParagraph(doc, p)).xml\n }\n out += `<${W}tc>${tcPrFor(cell.src, g, span, cell.rowSpan > 1 ? 'restart' : undefined, cell.shd)}${paras || `<${W}p/>`}</${W}tc>`\n if (cell.rowSpan > 1) cont[g] = { left: cell.rowSpan - 1, span }\n g += span\n }\n out += `</${W}tr>`\n }\n return out + `</${W}tbl>`\n}\n\nexport async function applyTable(doc: DocxDocument, op: TableOp): Promise<void> {\n if (!doc.ready) throw new Error('Document is still loading')\n doc.markEdited()\n const xml = op.spec ? await genTable(doc, op.spec) : ''\n if (op.item !== undefined) {\n doc.itemXml.set(op.item, xml)\n return\n }\n // new table living inside a paragraph group\n let key: string | undefined\n for (const [k, g] of doc.groups) if (g.includes(op.tid)) key = k\n if (!op.spec) {\n if (key) doc.groups.get(key)!.splice(doc.groups.get(key)!.indexOf(op.tid), 1)\n doc.genXml.delete(op.tid)\n return\n }\n if (!key) {\n const anchor = op.anchor !== undefined ? doc.info.get(op.anchor) : undefined\n if (!anchor || op.anchor === undefined) throw new Error('Table anchor paragraph not found')\n const g = groupFor(doc, `${anchor.item}:${anchor.ord}`)\n g.splice(g.indexOf(op.anchor) + 1, 0, op.tid)\n }\n doc.genXml.set(op.tid, xml)\n}\n\nexport async function saveDocx(doc: DocxDocument): Promise<Blob> {\n if (!doc.ready) throw new Error('Document is still loading')\n if (doc.groups.size || doc.itemXml.size) {\n const touched = new Set<number>()\n for (const key of doc.groups.keys()) touched.add(Number(key.split(':')[0]))\n const out: string[] = [doc.prefix]\n for (let i = 0; i < doc.items.length; i++) {\n const whole = doc.itemXml.get(i)\n if (whole !== undefined) {\n // keep whitespace that followed the item\n out.push(whole + (/\\s*$/.exec(doc.items[i])?.[0] ?? ''))\n continue\n }\n if (!touched.has(i)) {\n out.push(doc.items[i])\n continue\n }\n const nodes = parseRaw(doc.items[i])\n const paras = collectParasRaw(nodes)\n for (let o = 0; o < paras.length; o++) {\n const g = doc.groups.get(`${i}:${o}`)\n if (!g) continue\n const loc = paras[o]\n loc.list[loc.index] = g.map((pid) => doc.genXml.get(pid) ?? (origPara(doc, pid) ? serialize(origPara(doc, pid)!) : '')).join('')\n }\n out.push(serialize(nodes))\n }\n out.push(doc.suffix)\n doc.pkg.setPart(doc.mainPath, out.join(''))\n }\n return doc.pkg.save(DOCX_MIME)\n}\n","import { kid, kids, num, type XEl } from './xml'\nimport type { Theme } from './theme'\n\nexport type RGB = [number, number, number]\n\nexport function hexToRgb(hex: string): RGB {\n const h = hex.replace('#', '')\n const v = h.length === 8 ? h.slice(2) : h.padStart(6, '0').slice(0, 6)\n return [parseInt(v.slice(0, 2), 16) || 0, parseInt(v.slice(2, 4), 16) || 0, parseInt(v.slice(4, 6), 16) || 0]\n}\n\nexport function rgbToHex([r, g, b]: RGB): string {\n const c = (x: number) => Math.max(0, Math.min(255, Math.round(x))).toString(16).padStart(2, '0')\n return '#' + c(r) + c(g) + c(b)\n}\n\nexport function rgbToHsl([r, g, b]: RGB): [number, number, number] {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n if (max === min) return [0, 0, l]\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n let h = 0\n if (max === r) h = (g - b) / d + (g < b ? 6 : 0)\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n return [h / 6, s, l]\n}\n\nexport function hslToRgb([h, s, l]: [number, number, number]): RGB {\n if (s === 0) return [l * 255, l * 255, l * 255]\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n const f = (t: number) => {\n if (t < 0) t += 1\n if (t > 1) t -= 1\n if (t < 1 / 6) return p + (q - p) * 6 * t\n if (t < 1 / 2) return q\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6\n return p\n }\n return [f(h + 1 / 3) * 255, f(h) * 255, f(h - 1 / 3) * 255]\n}\n\nconst clamp01 = (x: number) => Math.max(0, Math.min(1, x))\n\n/** Excel/Word style tint (-1..1) applied in HSL luminance. */\nexport function applyTint(hex: string, tint: number): string {\n if (!tint) return hex\n const hsl = rgbToHsl(hexToRgb(hex))\n hsl[2] = tint < 0 ? hsl[2] * (1 + tint) : hsl[2] * (1 - tint) + tint\n return rgbToHex(hslToRgb(hsl))\n}\n\nconst PRESET: Record<string, string> = {\n black: '#000000', white: '#ffffff', red: '#ff0000', green: '#008000', blue: '#0000ff', yellow: '#ffff00',\n cyan: '#00ffff', magenta: '#ff00ff', gray: '#808080', grey: '#808080', ltGray: '#d3d3d3', dkGray: '#a9a9a9',\n orange: '#ffa500', purple: '#800080', navy: '#000080', maroon: '#800000', olive: '#808000', teal: '#008080',\n silver: '#c0c0c0', lime: '#00ff00', pink: '#ffc0cb', brown: '#a52a2a', gold: '#ffd700',\n}\n\nexport interface ColorCtx {\n theme?: Theme\n /** pptx clrMap: bg1→lt1 … */\n clrMap?: Record<string, string>\n /** Placeholder color for style matrix references. */\n phClr?: string\n}\n\nconst DEFAULT_MAP: Record<string, string> = { bg1: 'lt1', tx1: 'dk1', bg2: 'lt2', tx2: 'dk2' }\n\nexport const COLOR_TAGS = new Set(['srgbClr', 'schemeClr', 'sysClr', 'prstClr', 'scrgbClr', 'hslClr'])\n\n/** Resolves a DrawingML color element (srgbClr, schemeClr, …) to a CSS color. */\nexport function drawingColor(el: XEl, ctx: ColorCtx): string | undefined {\n let hex: string | undefined\n switch (el.n) {\n case 'srgbClr':\n hex = '#' + (el.a.val ?? '000000').toLowerCase()\n break\n case 'sysClr':\n hex = '#' + (el.a.lastClr ?? (el.a.val === 'window' ? 'ffffff' : '000000'))\n break\n case 'prstClr':\n hex = PRESET[el.a.val] ?? '#000000'\n break\n case 'scrgbClr':\n hex = rgbToHex([\n ((num(el.a.r) ?? 0) / 100000) * 255,\n ((num(el.a.g) ?? 0) / 100000) * 255,\n ((num(el.a.b) ?? 0) / 100000) * 255,\n ])\n break\n case 'hslClr':\n hex = rgbToHex(hslToRgb([(num(el.a.hue) ?? 0) / 21600000, (num(el.a.sat) ?? 0) / 100000, (num(el.a.lum) ?? 0) / 100000]))\n break\n case 'schemeClr': {\n const v = el.a.val\n if (v === 'phClr') hex = ctx.phClr\n else {\n const mapped = ctx.clrMap?.[v] ?? DEFAULT_MAP[v] ?? v\n hex = ctx.theme?.colors[mapped] ?? ctx.theme?.colors[v]\n }\n break\n }\n }\n if (!hex) return undefined\n return applyMods(hex, el)\n}\n\nfunction applyMods(hex: string, el: XEl): string {\n if (!el.c.length) return hex\n let rgb = hexToRgb(hex)\n let alpha = 1\n for (const m of el.c) {\n const v = (num(m.a.val) ?? 0) / 100000\n switch (m.n) {\n case 'alpha':\n alpha = v\n break\n case 'lumMod': {\n const hsl = rgbToHsl(rgb)\n hsl[2] = clamp01(hsl[2] * v)\n rgb = hslToRgb(hsl)\n break\n }\n case 'lumOff': {\n const hsl = rgbToHsl(rgb)\n hsl[2] = clamp01(hsl[2] + v)\n rgb = hslToRgb(hsl)\n break\n }\n case 'satMod': {\n const hsl = rgbToHsl(rgb)\n hsl[1] = clamp01(hsl[1] * v)\n rgb = hslToRgb(hsl)\n break\n }\n case 'tint':\n rgb = rgb.map((c) => c + (255 - c) * (1 - v)) as RGB\n break\n case 'shade':\n rgb = rgb.map((c) => c * v) as RGB\n break\n case 'inv':\n rgb = rgb.map((c) => 255 - c) as RGB\n break\n case 'gray': {\n const g = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11\n rgb = [g, g, g]\n break\n }\n }\n }\n const out = rgbToHex(rgb)\n if (alpha >= 1) return out\n const [r, g, b] = hexToRgb(out)\n return `rgba(${r},${g},${b},${+alpha.toFixed(3)})`\n}\n\n/** First color child of a fill-ish element (solidFill, fgClr, …). */\nexport function colorOf(parent: XEl | undefined, ctx: ColorCtx): string | undefined {\n if (!parent) return undefined\n for (const c of parent.c) if (COLOR_TAGS.has(c.n)) return drawingColor(c, ctx)\n return undefined\n}\n\n// SpreadsheetML legacy indexed palette\nexport const INDEXED = (\n '000000 FFFFFF FF0000 00FF00 0000FF FFFF00 FF00FF 00FFFF ' +\n '000000 FFFFFF FF0000 00FF00 0000FF FFFF00 FF00FF 00FFFF 800000 008000 000080 808000 800080 008080 C0C0C0 808080 ' +\n '9999FF 993366 FFFFCC CCFFFF 660066 FF8080 0066CC CCCCFF 000080 FF00FF FFFF00 00FFFF 800080 800000 008080 0000FF ' +\n '00CCFF CCFFFF CCFFCC FFFF99 99CCFF FF99CC CC99FF FFCC99 3366FF 33CCCC 99CC00 FFCC00 FF9900 FF6600 666699 969696 ' +\n '003366 339966 003300 333300 993300 993366 333399 333333'\n)\n .split(' ')\n .map((h) => '#' + h)\n\nconst XL_THEME_ORDER = ['lt1', 'dk1', 'lt2', 'dk2', 'accent1', 'accent2', 'accent3', 'accent4', 'accent5', 'accent6', 'hlink', 'folHlink']\n\n/** SpreadsheetML <color rgb|theme|indexed tint>. */\nexport function sheetColor(el: XEl | undefined, theme: Theme | undefined, indexed: string[] = INDEXED): string | undefined {\n if (!el || el.a.auto === '1' || el.a.auto === 'true') return undefined\n let hex: string | undefined\n if (el.a.rgb) {\n const v = el.a.rgb\n hex = '#' + (v.length === 8 ? v.slice(2) : v)\n } else if (el.a.theme !== undefined) {\n hex = theme?.colors[XL_THEME_ORDER[Number(el.a.theme)] ?? ''] ?? undefined\n } else if (el.a.indexed !== undefined) {\n const i = Number(el.a.indexed)\n if (i === 64 || i === 65) return undefined\n hex = indexed[i]\n }\n if (!hex) return undefined\n const tint = num(el.a.tint) ?? 0\n return tint ? applyTint(hex, tint) : hex.toLowerCase()\n}\n\nexport function customIndexed(stylesRoot: XEl | undefined): string[] {\n const list = kids(kid(kid(stylesRoot, 'colors'), 'indexedColors'), 'rgbColor')\n if (!list.length) return INDEXED\n return list.map((c) => '#' + (c.a.rgb ?? 'FF000000').slice(-6))\n}\n","import { colorOf, type ColorCtx } from '../color'\nimport { cssFont } from '../fonts'\nimport { OpcPackage, relOfType, type Rels } from '../opc'\nimport { parseTheme, type Theme } from '../theme'\nimport { emuToPx } from '../units'\nimport { kid, kids, num, path, textOf, type XEl } from '../xml'\nimport type { Box, Fill, PParaSpec, PresentationMeta, PRunSet, SlideEl, SlideModel, Stroke, TCell, TextBody, TPara, TRun } from './types'\nimport {\n clone, el, escText, getAttr, isNode, kidOf, kidsOf, local, parseRaw, prefixOf, removeKids, serialize, setAttr, setOrdered, walkOoxml,\n type RChild, type RNode,\n} from '../raw'\n\nexport const PPTX_MIME = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'\n\ninterface GenPara {\n k?: number\n runs: ([number, number] | undefined)[]\n}\n\nconst RPR_KIDS = ['ln', 'noFill', 'solidFill', 'gradFill', 'blipFill', 'pattFill', 'grpFill', 'effectLst', 'effectDag', 'highlight', 'uLnTx', 'uLn', 'uFillTx', 'uFill', 'latin', 'ea', 'cs', 'sym', 'hlinkClick', 'hlinkMouseOver', 'rtl', 'extLst']\nconst FILLS = new Set(['noFill', 'solidFill', 'gradFill', 'blipFill', 'pattFill', 'grpFill'])\nconst ALGN_OUT: Record<string, string> = { left: 'l', center: 'ctr', right: 'r', justify: 'just' }\n\nfunction findShape(nodes: RChild[], sid: number): RNode | undefined {\n let found: RNode | undefined\n for (const n of nodes) {\n if (!isNode(n)) continue\n walkOoxml(n, (c) => {\n if (found) return true\n if (local(c.q) !== 'sp') return\n const nv = kidOf(c, 'nvSpPr')\n const id = getAttr(kidOf(nv, 'cNvPr') ?? c, 'id')\n if (id !== undefined && Number(id) === sid) found = c\n return true\n })\n }\n return found\n}\n\nfunction applyPRunSet(rPr: RNode, set: PRunSet, A: string) {\n if (set.sz !== undefined) setAttr(rPr, 'sz', String(Math.round(set.sz * 100)))\n if (set.b !== undefined) setAttr(rPr, 'b', set.b ? '1' : '0')\n if (set.i !== undefined) setAttr(rPr, 'i', set.i ? '1' : '0')\n if (set.u !== undefined) setAttr(rPr, 'u', set.u ? 'sng' : 'none')\n if (set.strike !== undefined) setAttr(rPr, 'strike', set.strike ? 'sngStrike' : 'noStrike')\n if ('color' in set) {\n removeKids(rPr, (l) => FILLS.has(l))\n if (set.color) setOrdered(rPr, el(A + 'solidFill', {}, [el(A + 'srgbClr', { val: set.color.replace('#', '').toUpperCase() })]), 'solidFill', RPR_KIDS)\n }\n if (set.font) setOrdered(rPr, el(A + 'latin', { typeface: set.font }), 'latin', RPR_KIDS)\n if ('hl' in set) setOrdered(rPr, set.hl ? el(A + 'highlight', {}, [el(A + 'srgbClr', { val: set.hl.replace('#', '').toUpperCase() })]) : undefined, 'highlight', RPR_KIDS)\n if ('baseline' in set) setAttr(rPr, 'baseline', set.baseline ? String(Math.round(set.baseline * 1000)) : undefined)\n}\n\nconst PPR_KIDS = ['lnSpc', 'spcBef', 'spcAft', 'buClrTx', 'buClr', 'buSzTx', 'buSzPct', 'buSzPts', 'buFontTx', 'buFont', 'buNone', 'buAutoNum', 'buChar', 'buBlip', 'tabLst', 'defRPr', 'extLst']\nconst BULLETS = new Set(['buNone', 'buAutoNum', 'buChar', 'buBlip'])\n\n/** paragraph-level changes made in the editor */\nfunction applyPPr(ppr: RNode, spec: PParaSpec, A: string) {\n if (spec.algn) setAttr(ppr, 'algn', ALGN_OUT[spec.algn])\n if (spec.lvl !== undefined && String(spec.lvl) !== (getAttr(ppr, 'lvl') ?? '0')) {\n setAttr(ppr, 'lvl', spec.lvl ? String(spec.lvl) : undefined)\n // explicit margins would pin the old level's indent\n setAttr(ppr, 'marL', undefined)\n setAttr(ppr, 'indent', undefined)\n }\n if (spec.bullet) {\n removeKids(ppr, (l) => BULLETS.has(l))\n if (spec.bullet === 'none') {\n setOrdered(ppr, el(A + 'buNone'), 'buNone', PPR_KIDS)\n if (getAttr(ppr, 'indent')?.startsWith('-')) setAttr(ppr, 'indent', '0')\n } else {\n const node = spec.bullet === 'bullet' ? el(A + 'buChar', { char: '•' }) : el(A + 'buAutoNum', { type: 'arabicPeriod' })\n if (spec.bullet === 'bullet') setOrdered(ppr, el(A + 'buFont', { typeface: 'Arial' }), 'buFont', PPR_KIDS)\n setOrdered(ppr, node, spec.bullet === 'bullet' ? 'buChar' : 'buAutoNum', PPR_KIDS)\n if (!getAttr(ppr, 'marL')) {\n const lvl = Number(getAttr(ppr, 'lvl') ?? 0)\n setAttr(ppr, 'marL', String(342900 + lvl * 457200))\n setAttr(ppr, 'indent', '-342900')\n }\n }\n }\n if (spec.lnPct) setOrdered(ppr, el(A + 'lnSpc', {}, [el(A + 'spcPct', { val: String(Math.round(spec.lnPct * 100000)) })]), 'lnSpc', PPR_KIDS)\n ppr.self = ppr.c.length === 0\n}\n\ninterface RunProps {\n sz?: number\n b?: boolean\n i?: boolean\n u?: boolean\n strike?: boolean\n color?: string\n font?: string\n baseline?: number\n caps?: boolean\n hl?: string\n}\n\ninterface LvlProps {\n algn?: TPara['algn']\n marL?: number\n indent?: number\n lnPct?: number\n lnPts?: number\n bef?: { pct?: number; pts?: number }\n aft?: { pct?: number; pts?: number }\n bu?: { kind: 'none' | 'char' | 'auto'; char?: string; autoType?: string; startAt?: number }\n buClr?: string\n buFont?: string\n buSzPct?: number\n r: RunProps\n}\n\ntype Levels = LvlProps[]\n\ninterface Part {\n path: string\n root: XEl\n rels: Rels\n spTree?: XEl\n byIdx: Map<string, XEl>\n byType: Map<string, XEl>\n}\n\ninterface Master extends Part {\n theme: Theme\n clrMap: Record<string, string>\n title?: XEl\n body?: XEl\n other?: XEl\n}\n\ninterface Layout extends Part {\n master: Master\n clrMap: Record<string, string>\n}\n\nconst ALGN: Record<string, TPara['algn']> = { l: 'left', ctr: 'center', r: 'right', just: 'justify', dist: 'justify', thaiDist: 'justify', justLow: 'justify' }\nconst DASH: Record<string, string> = {\n dash: '4 3', sysDash: '3 1', dot: '1 1', sysDot: '1 1', lgDash: '8 3', dashDot: '4 3 1 3', lgDashDot: '8 3 1 3',\n lgDashDotDot: '8 3 1 3 1 3', sysDashDot: '3 1 1 1', sysDashDotDot: '3 1 1 1 1 1',\n}\n\nfunction nvPr(el: XEl): XEl | undefined {\n const nv = el.c[0]\n return nv ? kid(nv, 'nvPr') : undefined\n}\n\nfunction phOf(el: XEl): { type: string; idx?: string } | undefined {\n const ph = kid(nvPr(el), 'ph')\n if (!ph) return undefined\n return { type: ph.a.type ?? 'body', idx: ph.a.idx }\n}\n\nconst masterType = (t: string) => (t === 'ctrTitle' ? 'title' : t === 'subTitle' || t === 'obj' ? 'body' : t)\n\nfunction indexPlaceholders(spTree: XEl | undefined) {\n const byIdx = new Map<string, XEl>()\n const byType = new Map<string, XEl>()\n const visit = (tree: XEl | undefined) => {\n for (const c of tree?.c ?? []) {\n if (c.n === 'grpSp') visit(c)\n const ph = phOf(c)\n if (!ph) continue\n if (ph.idx !== undefined && !byIdx.has(ph.idx)) byIdx.set(ph.idx, c)\n if (!byType.has(ph.type)) byType.set(ph.type, c)\n }\n }\n visit(spTree)\n return { byIdx, byType }\n}\n\nfunction romanize(n: number): string {\n const map: [number, string][] = [[1000, 'm'], [900, 'cm'], [500, 'd'], [400, 'cd'], [100, 'c'], [90, 'xc'], [50, 'l'], [40, 'xl'], [10, 'x'], [9, 'ix'], [5, 'v'], [4, 'iv'], [1, 'i']]\n let s = ''\n for (const [v, r] of map) while (n >= v) (s += r), (n -= v)\n return s\n}\n\nfunction autoNum(type: string, n: number): string {\n const alpha = (k: number) => String.fromCharCode(97 + ((k - 1) % 26)).repeat(Math.floor((k - 1) / 26) + 1)\n let core = String(n)\n if (type.startsWith('alphaLc')) core = alpha(n)\n else if (type.startsWith('alphaUc')) core = alpha(n).toUpperCase()\n else if (type.startsWith('romanLc')) core = romanize(n)\n else if (type.startsWith('romanUc')) core = romanize(n).toUpperCase()\n if (type.endsWith('ParenBoth')) return `(${core})`\n if (type.endsWith('ParenR')) return `${core})`\n if (type.endsWith('Period')) return `${core}.`\n if (type.endsWith('Minus')) return `- ${core} -`\n return core\n}\n\nexport class PptxPresentation {\n private masters = new Map<string, Promise<Master>>()\n private layouts = new Map<string, Promise<Layout>>()\n private tableStyles?: Promise<Map<string, XEl>>\n readonly meta: PresentationMeta\n\n private constructor(\n readonly pkg: OpcPackage,\n readonly mainPath: string,\n private defaultTextStyle: XEl | undefined,\n meta: PresentationMeta,\n ) {\n this.meta = meta\n }\n\n static async open(pkg: OpcPackage, mainPath: string): Promise<PptxPresentation> {\n const root = await pkg.xml(mainPath)\n if (!root) throw new Error('Missing presentation part')\n const rels = await pkg.rels(mainPath)\n const sz = kid(root, 'sldSz')\n const slides: PresentationMeta['slides'] = []\n for (const s of kids(kid(root, 'sldIdLst'), 'sldId')) {\n const rel = rels.get(s.a['r:id'])\n if (rel && pkg.has(rel.target)) slides.push({ index: slides.length, path: rel.target, hidden: false })\n }\n const meta: PresentationMeta = {\n w: emuToPx(num(sz?.a.cx, 9144000)),\n h: emuToPx(num(sz?.a.cy, 6858000)),\n count: slides.length,\n slides,\n }\n return new PptxPresentation(pkg, mainPath, kid(root, 'defaultTextStyle'), meta)\n }\n\n private async part(p: string): Promise<Part> {\n const root = await this.pkg.xml(p, false)\n if (!root) throw new Error(`Missing part ${p}`)\n const spTree = path(root, 'cSld', 'spTree')\n return { path: p, root, rels: await this.pkg.rels(p), spTree, ...indexPlaceholders(spTree) }\n }\n\n private master(p: string): Promise<Master> {\n let m = this.masters.get(p)\n if (!m) {\n m = (async () => {\n const part = await this.part(p)\n const themeRel = relOfType(part.rels, 'theme')\n const theme = parseTheme(themeRel ? await this.pkg.xml(themeRel.target) : undefined)\n const clrMap = { ...(kid(part.root, 'clrMap')?.a ?? {}) }\n const tx = kid(part.root, 'txStyles')\n return { ...part, theme, clrMap, title: kid(tx, 'titleStyle'), body: kid(tx, 'bodyStyle'), other: kid(tx, 'otherStyle') }\n })()\n this.masters.set(p, m)\n }\n return m\n }\n\n private layout(p: string): Promise<Layout> {\n let l = this.layouts.get(p)\n if (!l) {\n l = (async () => {\n const part = await this.part(p)\n const mRel = relOfType(part.rels, 'slideMaster')\n if (!mRel) throw new Error(`Layout ${p} has no master`)\n const master = await this.master(mRel.target)\n return { ...part, master, clrMap: clrMapOf(part.root, master.clrMap) }\n })()\n this.layouts.set(p, l)\n }\n return l\n }\n\n private getTableStyles(): Promise<Map<string, XEl>> {\n if (!this.tableStyles) {\n this.tableStyles = (async () => {\n const map = new Map<string, XEl>()\n const rel = relOfType(await this.pkg.rels(this.mainPath), 'tableStyles')\n const root = rel ? await this.pkg.xml(rel.target) : undefined\n for (const s of kids(root, 'tblStyle')) map.set(s.a.styleId, s)\n return map\n })()\n }\n return this.tableStyles\n }\n\n async slide(index: number): Promise<SlideModel> {\n const info = this.meta.slides[index]\n if (!info) throw new Error(`No slide #${index}`)\n const slide = await this.part(info.path)\n const lRel = relOfType(slide.rels, 'slideLayout')\n const layout = lRel ? await this.layout(lRel.target) : undefined\n const master = layout?.master\n const theme = master?.theme ?? parseTheme(undefined)\n const clrMap = clrMapOf(slide.root, layout?.clrMap ?? master?.clrMap ?? {})\n const r = new SlideRenderer(this, slide, layout, master, theme, clrMap, index, await this.getTableStyles())\n const els: SlideEl[] = []\n const showSlideMaster = slide.root.a.showMasterSp !== '0'\n if (master && showSlideMaster && layout?.root.a.showMasterSp !== '0') r.walk(master, master.spTree, identity, els, true)\n if (layout && showSlideMaster) r.walk(layout, layout.spTree, identity, els, true)\n r.walk(slide, slide.spTree, identity, els, false)\n return {\n index,\n w: this.meta.w,\n h: this.meta.h,\n bg: r.background(),\n els,\n hidden: slide.root.a.show === '0',\n }\n }\n\n get defaults() {\n return this.defaultTextStyle\n }\n\n // ---------------------------------------------------------------- editing\n\n private genMaps = new Map<string, GenPara[]>()\n /** structural edits (shapes, slides) */\n touched = false\n /** shape edits (slide XML before / after) for undo; text edits drop the entries of their slide */\n undoStack: { path: string; before: string; after: string }[] = []\n redoStack: { path: string; before: string; after: string }[] = []\n private originals = new Map<string, string>()\n private lateShapes = new Map<string, string>()\n\n /**\n * Takes the slide XML that text edits use as template (their run references point into it).\n * Done lazily on the first text edit; collaboration takes it up front so every client uses the same.\n */\n async keepOriginal(path: string) {\n if (!this.originals.has(path)) this.originals.set(path, await this.pkg.text(path))\n }\n\n genMap(path: string, sid: number): GenPara[] | undefined {\n return this.genMaps.get(`${path}#${sid}`)\n }\n\n get dirty() {\n return this.genMaps.size > 0 || this.touched\n }\n\n /** Rewrites the paragraphs of shape `sid` on slide `index` and returns the re-rendered slide. */\n async setText(index: number, sid: number, paras: PParaSpec[]): Promise<SlideModel> {\n const info = this.meta.slides[index]\n if (!info) throw new Error(`No slide #${index}`)\n const p = info.path\n await this.keepOriginal(p)\n const curNodes = parseRaw(await this.pkg.text(p))\n const shape = findShape(curNodes, sid)\n // a shape added after the slide's original was taken is its own template\n const key = `${p}#${sid}`\n if (shape && !this.lateShapes.has(key) && !findShape(parseRaw(this.originals.get(p)!), sid)) this.lateShapes.set(key, serialize([shape]))\n const late = this.lateShapes.get(key)\n const origShape = late ? (parseRaw(late)[0] as RNode) : findShape(parseRaw(this.originals.get(p)!), sid)\n if (!shape || !origShape) throw new Error(`Shape ${sid} not found`)\n let txBody = kidOf(shape, 'txBody')\n const origBody = kidOf(origShape, 'txBody')\n const origParas = kidsOf(origBody, 'p')\n const P = prefixOf(shape.q)\n const A = prefixOf((kidOf(origBody, 'bodyPr') ?? origParas[0])?.q ?? 'a:x') || 'a:'\n if (!txBody) {\n txBody = el(P + 'txBody', {}, [el(A + 'bodyPr'), el(A + 'lstStyle')])\n shape.c.push(txBody)\n shape.self = false\n }\n const origRuns = origParas.map((op) => kidsOf(op).filter((c) => ['r', 'br', 'fld'].includes(local(c.q))))\n const map: GenPara[] = []\n const out: RNode[] = paras.map((spec) => {\n const tpl = spec.k !== undefined ? origParas[spec.k] : origParas[origParas.length - 1]\n const node = el(A + 'p')\n const tplPPr = kidOf(tpl, 'pPr')\n const wants = spec.algn || spec.lvl !== undefined || spec.bullet || spec.lnPct\n const ppr = tplPPr ? clone(tplPPr) : wants ? el(A + 'pPr') : undefined\n if (ppr && wants) applyPPr(ppr, spec, A)\n if (ppr) node.c.push(ppr)\n const end = kidOf(tpl, 'endParaRPr')\n const gp: GenPara = { k: spec.k, runs: [] }\n const baseRPr = (src?: [number, number]) => {\n const r = src ? origRuns[src[0]]?.[src[1]] : undefined\n const rp: RNode | undefined = kidOf(r, 'rPr') ?? (end ? { ...clone(end), q: A + 'rPr' } : undefined)\n return rp ? clone(rp) : el(A + 'rPr', { lang: 'en-US', dirty: '0' })\n }\n for (const run of spec.runs) {\n if (run.fld && run.src) {\n const f = origRuns[run.src[0]]?.[run.src[1]]\n if (f) {\n node.c.push(clone(f))\n gp.runs.push(run.src)\n }\n continue\n }\n const pieces = run.text.split('\\n')\n pieces.forEach((piece, i) => {\n const rPr = baseRPr(run.src)\n if (run.set) applyPRunSet(rPr, run.set, A)\n if (i > 0) {\n node.c.push(el(A + 'br', {}, [{ ...clone(rPr) }]))\n gp.runs.push(run.src)\n }\n if (piece) {\n node.c.push(el(A + 'r', {}, [rPr, el(A + 't', {}, [escText(piece)])]))\n gp.runs.push(run.src)\n }\n })\n }\n node.c.push(end ? clone(end) : el(A + 'endParaRPr', { lang: 'en-US', dirty: '0' }))\n node.self = false\n map.push(gp)\n return node\n })\n const keep = txBody.c.filter((c) => !(isNode(c) && local(c.q) === 'p'))\n txBody.c = [...keep, ...out]\n txBody.self = false\n this.pkg.setPart(p, serialize(curNodes))\n this.genMaps.set(`${p}#${sid}`, map)\n this.undoStack = this.undoStack.filter((e) => e.path !== p)\n this.redoStack = this.redoStack.filter((e) => e.path !== p)\n return this.slide(index)\n }\n\n save(): Promise<Blob> {\n return this.pkg.save(PPTX_MIME)\n }\n}\n\nfunction clrMapOf(root: XEl, inherited: Record<string, string>): Record<string, string> {\n const ovr = path(root, 'clrMapOvr', 'overrideClrMapping')\n return ovr ? { ...ovr.a } : inherited\n}\n\ntype Xform = (b: Box) => Box\nconst identity: Xform = (b) => b\n\nfunction readXfrm(x: XEl | undefined): Box | undefined {\n if (!x) return undefined\n const off = kid(x, 'off')\n const ext = kid(x, 'ext')\n if (!off && !ext) return undefined\n const b: Box = {\n x: emuToPx(num(off?.a.x, 0)),\n y: emuToPx(num(off?.a.y, 0)),\n w: emuToPx(num(ext?.a.cx, 0)),\n h: emuToPx(num(ext?.a.cy, 0)),\n }\n const rot = num(x.a.rot)\n if (rot) b.rot = rot / 60000\n if (x.a.flipH === '1') b.flipH = true\n if (x.a.flipV === '1') b.flipV = true\n return b\n}\n\nclass SlideRenderer {\n constructor(\n private pres: PptxPresentation,\n private slide: Part,\n private layout: Layout | undefined,\n private master: Master | undefined,\n private theme: Theme,\n private clrMap: Record<string, string>,\n private index: number,\n private tableStyles: Map<string, XEl>,\n ) {}\n\n private cc(phClr?: string): ColorCtx {\n return { theme: this.theme, clrMap: this.clrMap, phClr }\n }\n\n private font(typeface: string | undefined): string | undefined {\n if (!typeface) return undefined\n if (typeface.startsWith('+mj')) return cssFont(this.theme.major)\n if (typeface.startsWith('+mn')) return cssFont(this.theme.minor)\n return cssFont(typeface)\n }\n\n // ---- fills & lines --------------------------------------------------------\n\n fill(parent: XEl | undefined, rels: Rels, phClr?: string): Fill | undefined {\n if (!parent) return undefined\n for (const c of parent.c) {\n switch (c.n) {\n case 'noFill':\n return { t: 'none' }\n case 'solidFill': {\n const col = colorOf(c, this.cc(phClr))\n return col ? { t: 'solid', c: col } : undefined\n }\n case 'gradFill': {\n const stops = kids(kid(c, 'gsLst'), 'gs')\n .map((g) => ({ pos: (num(g.a.pos, 0)! / 1000) | 0, col: colorOf(g, this.cc(phClr)) }))\n .filter((s) => s.col)\n .sort((a, b) => a.pos - b.pos)\n if (!stops.length) return undefined\n if (stops.length === 1) return { t: 'solid', c: stops[0].col! }\n const list = stops.map((s) => `${s.col} ${s.pos}%`).join(', ')\n if (kid(c, 'path')) return { t: 'grad', css: `radial-gradient(circle, ${list})` }\n const ang = (num(kid(c, 'lin')?.a.ang, 0)! / 60000 + 90) % 360\n return { t: 'grad', css: `linear-gradient(${ang}deg, ${list})` }\n }\n case 'blipFill': {\n const id = kid(c, 'blip')?.a['r:embed']\n const rel = id ? rels.get(id) : undefined\n return rel && !rel.external ? { t: 'img', target: rel.target, tile: !!kid(c, 'tile') } : undefined\n }\n case 'pattFill': {\n const col = colorOf(kid(c, 'fgClr'), this.cc(phClr))\n return col ? { t: 'solid', c: col } : undefined\n }\n }\n }\n return undefined\n }\n\n private themeFill(ref: XEl | undefined, rels: Rels): Fill | undefined {\n if (!ref) return undefined\n const idx = num(ref.a.idx, 0)!\n if (!idx) return undefined\n const phClr = colorOf(ref, this.cc())\n const list = idx >= 1001 ? this.theme.bgFillStyles : this.theme.fillStyles\n const style = list[(idx >= 1001 ? idx - 1001 : idx - 1)]\n if (!style) return phClr ? { t: 'solid', c: phClr } : undefined\n return this.fill({ n: 'x', a: {}, c: [style], t: '' }, rels, phClr) ?? (phClr ? { t: 'solid', c: phClr } : undefined)\n }\n\n private stroke(ln: XEl | undefined, lnRef: XEl | undefined): Stroke | undefined {\n const refIdx = num(lnRef?.a.idx, 0)!\n const refLn = refIdx ? this.theme.lineStyles[refIdx - 1] : undefined\n const refColor = lnRef ? colorOf(lnRef, this.cc()) : undefined\n if (ln && kid(ln, 'noFill')) return undefined\n let color = ln ? colorOf(kid(ln, 'solidFill'), this.cc(refColor)) : undefined\n if (!color && ln) {\n const gs = path(ln, 'gradFill', 'gsLst', 'gs')\n if (gs) color = colorOf(gs, this.cc(refColor))\n }\n if (!color && refIdx) color = refColor ?? (refLn ? colorOf(kid(refLn, 'solidFill'), this.cc(refColor)) : undefined)\n if (!color) return undefined\n const wEmu = num(ln?.a.w) ?? num(refLn?.a.w) ?? 9525\n const dash = kid(ln, 'prstDash')?.a.val ?? kid(refLn, 'prstDash')?.a.val\n const s: Stroke = { c: color, w: Math.max(0.5, emuToPx(wEmu)) }\n if (dash && DASH[dash]) s.dash = DASH[dash].split(' ').map((d) => +(Number(d) * s.w).toFixed(2)).join(' ')\n const head = kid(ln, 'headEnd')?.a.type\n const tail = kid(ln, 'tailEnd')?.a.type\n if (head && head !== 'none') s.head = head\n if (tail && tail !== 'none') s.tail = tail\n return s\n }\n\n background(): Fill | undefined {\n for (const part of [this.slide, this.layout, this.master]) {\n if (!part) continue\n const bg = path(part.root, 'cSld', 'bg')\n if (!bg) continue\n const bgPr = kid(bg, 'bgPr')\n if (bgPr) {\n const f = this.fill(bgPr, part.rels)\n if (f) return f\n }\n const ref = kid(bg, 'bgRef')\n if (ref) return this.themeFill(ref, part.rels)\n }\n return { t: 'solid', c: this.theme.colors[this.clrMap.bg1 ?? 'lt1'] ?? '#ffffff' }\n }\n\n // ---- text styles -----------------------------------------------------------\n\n private readRun(rPr: XEl | undefined, out: RunProps = {}): RunProps {\n if (!rPr) return out\n const a = rPr.a\n if (a.sz) out.sz = Number(a.sz) / 100\n if (a.b !== undefined) out.b = a.b === '1' || a.b === 'true'\n if (a.i !== undefined) out.i = a.i === '1' || a.i === 'true'\n if (a.u !== undefined) out.u = a.u !== 'none'\n if (a.strike !== undefined) out.strike = a.strike !== 'noStrike'\n if (a.baseline !== undefined) out.baseline = Number(a.baseline) / 1000\n if (a.cap !== undefined) out.caps = a.cap === 'all'\n const fill = kid(rPr, 'solidFill')\n if (fill) {\n const c = colorOf(fill, this.cc())\n if (c) out.color = c\n } else {\n const gs = path(rPr, 'gradFill', 'gsLst', 'gs')\n const c = gs && colorOf(gs, this.cc())\n if (c) out.color = c\n }\n const hl = colorOf(kid(rPr, 'highlight'), this.cc())\n if (hl) out.hl = hl\n const latin = kid(rPr, 'latin')?.a.typeface ?? kid(rPr, 'ea')?.a.typeface\n const f = this.font(latin)\n if (f) out.font = f\n return out\n }\n\n private readLvl(pPr: XEl | undefined, base: LvlProps): LvlProps {\n const out: LvlProps = { ...base, r: { ...base.r } }\n if (!pPr) return out\n const a = pPr.a\n if (a.algn) out.algn = ALGN[a.algn] ?? 'left'\n if (a.marL !== undefined) out.marL = emuToPx(Number(a.marL))\n if (a.indent !== undefined) out.indent = emuToPx(Number(a.indent))\n for (const c of pPr.c) {\n switch (c.n) {\n case 'lnSpc': {\n const pct = num(kid(c, 'spcPct')?.a.val)\n const pts = num(kid(c, 'spcPts')?.a.val)\n if (pct !== undefined) (out.lnPct = pct / 100000), (out.lnPts = undefined)\n else if (pts !== undefined) (out.lnPts = pts / 100), (out.lnPct = undefined)\n break\n }\n case 'spcBef':\n case 'spcAft': {\n const pct = num(kid(c, 'spcPct')?.a.val)\n const pts = num(kid(c, 'spcPts')?.a.val)\n const v = pct !== undefined ? { pct: pct / 100000 } : { pts: (pts ?? 0) / 100 }\n if (c.n === 'spcBef') out.bef = v\n else out.aft = v\n break\n }\n case 'buNone':\n out.bu = { kind: 'none' }\n break\n case 'buChar':\n out.bu = { kind: 'char', char: c.a.char ?? '•' }\n break\n case 'buAutoNum':\n out.bu = { kind: 'auto', autoType: c.a.type ?? 'arabicPeriod', startAt: num(c.a.startAt, 1) }\n break\n case 'buClr':\n out.buClr = colorOf(c, this.cc())\n break\n case 'buFont':\n out.buFont = c.a.typeface\n break\n case 'buSzPct':\n out.buSzPct = num(c.a.val, 100000)! / 100000\n break\n case 'defRPr':\n this.readRun(c, out.r)\n break\n }\n }\n return out\n }\n\n private levels(sources: (XEl | undefined)[]): Levels {\n const out: Levels = []\n for (let l = 1; l <= 9; l++) {\n let cur: LvlProps = { r: {} }\n for (const src of sources) {\n if (!src) continue\n cur = this.readLvl(kid(src, 'defPPr'), cur)\n cur = this.readLvl(kid(src, `lvl${l}pPr`), cur)\n }\n out.push(cur)\n }\n return out\n }\n\n private textBody(\n txBody: XEl | undefined, chain: XEl[], ph: { type: string } | undefined, styleFont?: XEl, part?: Part, sid?: number,\n ): TextBody | undefined {\n if (!txBody) return undefined\n const paras = kids(txBody, 'p')\n const empty = !paras.some((p) => p.c.some((c) => c.n === 'r' || c.n === 'fld'))\n if (empty && sid === undefined) return undefined\n const gm = sid !== undefined ? this.pres.genMap(this.slide.path, sid) : undefined\n const m = this.master\n let base: XEl | undefined\n if (ph) {\n const t = masterType(ph.type)\n base = t === 'title' ? m?.title : t === 'body' ? m?.body : m?.other\n }\n const sources: (XEl | undefined)[] = ph ? [base] : [m?.other, this.pres.defaults]\n if (styleFont) {\n const col = colorOf(styleFont, this.cc())\n const fnt = styleFont.a.idx === 'major' ? this.theme.major : styleFont.a.idx === 'minor' ? this.theme.minor : undefined\n const synthetic: XEl = { n: 'lstStyle', a: {}, c: [], t: '' }\n const defRPr: XEl = { n: 'defRPr', a: {}, c: [], t: '' }\n if (col) defRPr.c.push({ n: 'solidFill', a: {}, c: [{ n: 'srgbClr', a: { val: col.replace('#', '').slice(0, 6) }, c: [], t: '' }], t: '' })\n if (fnt) defRPr.c.push({ n: 'latin', a: { typeface: fnt }, c: [], t: '' })\n synthetic.c.push({ n: 'defPPr', a: {}, c: [defRPr], t: '' })\n sources.push(synthetic)\n }\n for (const sp of chain) sources.push(path(sp, 'txBody', 'lstStyle'))\n const lv = this.levels(sources)\n\n // body properties: inherit along the chain\n const bodyAttrs: Record<string, string> = {}\n let autofit: XEl | undefined\n for (const sp of chain) {\n const bp = path(sp, 'txBody', 'bodyPr')\n if (!bp) continue\n Object.assign(bodyAttrs, bp.a)\n const na = kid(bp, 'normAutofit')\n if (na) autofit = na\n }\n const fontScale = autofit ? num(autofit.a.fontScale, 100000)! / 100000 : 1\n const lnReduce = autofit ? num(autofit.a.lnSpcReduction, 0)! / 100000 : 0\n const ins: [number, number, number, number] = [\n emuToPx(num(bodyAttrs.lIns, 91440)),\n emuToPx(num(bodyAttrs.tIns, 45720)),\n emuToPx(num(bodyAttrs.rIns, 91440)),\n emuToPx(num(bodyAttrs.bIns, 45720)),\n ]\n const counters: number[] = []\n const rels = part?.rels ?? this.slide.rels\n const out: TPara[] = paras.map((p, pi) => {\n const pPr = kid(p, 'pPr')\n const lvl = Math.min(8, num(pPr?.a.lvl, 0)!)\n const L = this.readLvl(pPr, lv[lvl])\n const runs: TRun[] = []\n let j = 0\n for (const c of p.c) {\n const src: [number, number] | undefined = c.n === 'r' || c.n === 'fld' || c.n === 'br' ? (gm ? gm[pi]?.runs[j++] : [pi, j++]) : undefined\n if (c.n === 'r' || c.n === 'fld') {\n const rp = this.readRun(kid(c, 'rPr'), { ...L.r })\n let text = textOf(kid(c, 't'))\n if (c.n === 'fld' && c.a.type === 'slidenum') text = String(this.index + 1)\n const hrefId = path(c, 'rPr', 'hlinkClick')?.a['r:id']\n const href = hrefId ? rels.get(hrefId)?.target : undefined\n runs.push({\n text,\n sz: (rp.sz ?? 18) * fontScale,\n b: rp.b, i: rp.i, u: rp.u || !!href, strike: rp.strike,\n color: rp.color ?? (href ? this.theme.colors.hlink : undefined),\n font: rp.font, baseline: rp.baseline, caps: rp.caps, href, hl: rp.hl, src,\n ...(c.n === 'fld' ? { fld: true } : {}),\n })\n } else if (c.n === 'br') {\n const rp = this.readRun(kid(c, 'rPr'), { ...L.r })\n runs.push({ text: '', br: true, sz: (rp.sz ?? 18) * fontScale, src })\n }\n }\n const endR = this.readRun(kid(p, 'endParaRPr'), { ...L.r })\n const firstSz = runs[0]?.sz ?? (endR.sz ?? 18) * fontScale\n const hasText = runs.some((r) => r.text)\n let bullet: TPara['bullet']\n if (L.bu && L.bu.kind !== 'none' && hasText) {\n const sz = firstSz * (L.buSzPct ?? 1)\n const color = L.buClr ?? runs[0]?.color ?? L.r.color\n if (L.bu.kind === 'char') bullet = { text: L.bu.char ?? '•', sz, color, font: L.buFont ? this.font(L.buFont) : undefined }\n else {\n counters[lvl] = (counters[lvl] ?? (L.bu.startAt ?? 1) - 1) + 1\n for (let d = lvl + 1; d < 9; d++) counters[d] = undefined as unknown as number\n bullet = { text: autoNum(L.bu.autoType ?? 'arabicPeriod', counters[lvl]), sz, color }\n }\n } else if (!L.bu || L.bu.kind === 'none') {\n for (let d = lvl; d < 9; d++) counters[d] = undefined as unknown as number\n }\n const spc = (v: LvlProps['bef']) => (!v ? 0 : v.pts !== undefined ? (v.pts * 4) / 3 : (v.pct ?? 0) * firstSz * 1.2 * (4 / 3))\n return {\n algn: L.algn ?? 'left',\n marL: L.marL ?? 0,\n indent: L.indent ?? 0,\n lnPct: L.lnPct !== undefined ? L.lnPct * (1 - lnReduce) : lnReduce ? 1 - lnReduce : undefined,\n lnPx: L.lnPts !== undefined ? (L.lnPts * 4) / 3 : undefined,\n spcBef: spc(L.bef),\n spcAft: spc(L.aft),\n bullet,\n lvl: lvl || undefined,\n buKind: L.bu?.kind === 'char' ? 'bullet' : L.bu?.kind === 'auto' ? 'number' : undefined,\n runs,\n endSz: (endR.sz ?? 18) * fontScale,\n k: gm ? gm[pi]?.k : pi,\n }\n })\n const anchor = bodyAttrs.anchor === 'ctr' ? 'ctr' : bodyAttrs.anchor === 'b' ? 'b' : 't'\n return { anchor, ins, wrap: bodyAttrs.wrap !== 'none', vert: bodyAttrs.vert && bodyAttrs.vert !== 'horz' ? bodyAttrs.vert : undefined, paras: out, empty: empty || undefined }\n }\n\n // ---- shape tree ----------------------------------------------------------------\n\n private inheritChain(el: XEl, part: Part): { chain: XEl[]; ph?: { type: string; idx?: string } } {\n const ph = phOf(el)\n if (!ph) return { chain: [el] }\n const chain: XEl[] = []\n const t = masterType(ph.type)\n if (part === this.slide) {\n const lph = this.layout ? (ph.idx !== undefined ? this.layout.byIdx.get(ph.idx) : undefined) ?? this.layout.byType.get(ph.type) : undefined\n const lt = lph ? phOf(lph)?.type ?? t : t\n const mph = this.master?.byType.get(masterType(lt)) ?? this.master?.byType.get(t)\n if (mph) chain.push(mph)\n if (lph) chain.push(lph)\n } else if (part === this.layout) {\n const mph = this.master?.byType.get(t)\n if (mph) chain.push(mph)\n }\n chain.push(el)\n return { chain, ph }\n }\n\n walk(part: Part, tree: XEl | undefined, xf: Xform, out: SlideEl[], skipPh: boolean, top?: number): void {\n if (!tree) return\n for (const c of tree.c) {\n if (skipPh && (c.n === 'sp' || c.n === 'pic') && phOf(c)) continue\n const idAttr = kid(c.c[0], 'cNvPr')?.a.id\n const myTop = top ?? (part === this.slide && idAttr ? Number(idAttr) : undefined)\n const start = out.length\n try {\n switch (c.n) {\n case 'sp':\n case 'cxnSp':\n this.shape(c, part, xf, out)\n break\n case 'pic':\n this.pic(c, part, xf, out)\n break\n case 'grpSp':\n this.group(c, part, xf, out, skipPh, myTop)\n break\n case 'graphicFrame':\n this.frame(c, part, xf, out)\n break\n }\n } catch {\n // a single malformed shape must not break the slide\n }\n if (myTop !== undefined) for (let k = start; k < out.length; k++) out[k].top = myTop\n }\n }\n\n private boxOf(chain: XEl[], xfrmPath: string[], xf: Xform): Box | undefined {\n for (let i = chain.length - 1; i >= 0; i--) {\n const b = readXfrm(path(chain[i], ...xfrmPath))\n if (b) return xf(b)\n }\n return undefined\n }\n\n private shape(el: XEl, part: Part, xf: Xform, out: SlideEl[]) {\n const { chain, ph } = this.inheritChain(el, part)\n const box = this.boxOf(chain, ['spPr', 'xfrm'], xf)\n if (!box) return\n const style = kid(el, 'style')\n let fill: Fill | undefined\n // inherited placeholder fills resolve media against the current part (image fills on layouts are rare)\n for (let i = chain.length - 1; i >= 0 && !fill; i--) fill = this.fill(kid(chain[i], 'spPr'), part.rels)\n if (!fill && style) fill = this.themeFill(kid(style, 'fillRef'), part.rels)\n let ln: XEl | undefined\n for (let i = chain.length - 1; i >= 0 && !ln; i--) ln = path(chain[i], 'spPr', 'ln')\n const stroke = this.stroke(ln, kid(style, 'lnRef'))\n let geom = 'rect'\n let adj: Record<string, number> | undefined\n let pathD: string | undefined\n for (let i = chain.length - 1; i >= 0; i--) {\n const pg = path(chain[i], 'spPr', 'prstGeom')\n if (pg) {\n geom = pg.a.prst ?? 'rect'\n const gds = kids(kid(pg, 'avLst'), 'gd')\n if (gds.length) {\n adj = {}\n for (const g of gds) {\n const m = /val\\s+(-?\\d+)/.exec(g.a.fmla ?? '')\n if (m) adj[g.a.name] = Number(m[1])\n }\n }\n break\n }\n const cg = path(chain[i], 'spPr', 'custGeom')\n if (cg) {\n geom = 'custom'\n pathD = customPath(cg, box)\n break\n }\n }\n if (el.n === 'cxnSp' && geom === 'rect') geom = 'line'\n const idAttr = path(el, 'nvSpPr', 'cNvPr')?.a.id\n const sid = part === this.slide && el.n === 'sp' && idAttr ? Number(idAttr) : undefined\n const text = el.n === 'sp' ? this.textBody(kid(el, 'txBody'), chain, ph, kid(style, 'fontRef'), part, sid) : undefined\n if ((!fill || fill.t === 'none') && !stroke && !text) return\n out.push({ t: 'shape', box, geom, adj, fill, stroke, text, path: pathD, sid })\n }\n\n private pic(el: XEl, part: Part, xf: Xform, out: SlideEl[]) {\n const { chain } = this.inheritChain(el, part)\n const box = this.boxOf(chain, ['spPr', 'xfrm'], xf)\n if (!box) return\n const bf = kid(el, 'blipFill')\n const id = kid(bf, 'blip')?.a['r:embed']\n const rel = id ? part.rels.get(id) : undefined\n const sr = kid(bf, 'srcRect')\n const crop: [number, number, number, number] | undefined = sr\n ? [num(sr.a.l, 0)! / 100000, num(sr.a.t, 0)! / 100000, num(sr.a.r, 0)! / 100000, num(sr.a.b, 0)! / 100000]\n : undefined\n const video = !!kid(nvPr(el), 'videoFile') || !!kid(nvPr(el), 'audioFile')\n out.push({\n t: 'pic',\n box,\n target: rel && !rel.external ? rel.target : undefined,\n crop: crop && crop.some((v) => v !== 0) ? crop : undefined,\n stroke: this.stroke(path(el, 'spPr', 'ln'), path(el, 'style', 'lnRef')),\n geom: path(el, 'spPr', 'prstGeom')?.a.prst,\n video,\n })\n }\n\n private group(el: XEl, part: Part, xf: Xform, out: SlideEl[], skipPh: boolean, top?: number) {\n const x = path(el, 'grpSpPr', 'xfrm')\n const off = kid(x, 'off')\n const ext = kid(x, 'ext')\n const chOff = kid(x, 'chOff')\n const chExt = kid(x, 'chExt')\n if (!off || !ext) return this.walk(part, el, xf, out, skipPh, top)\n const ox = emuToPx(num(off.a.x, 0))\n const oy = emuToPx(num(off.a.y, 0))\n const cx = emuToPx(num(chOff?.a.x, 0))\n const cy = emuToPx(num(chOff?.a.y, 0))\n const sx = chExt && num(chExt.a.cx) ? num(ext.a.cx, 0)! / num(chExt.a.cx, 1)! : 1\n const sy = chExt && num(chExt.a.cy) ? num(ext.a.cy, 0)! / num(chExt.a.cy, 1)! : 1\n const local: Xform = (b) => xf({ ...b, x: ox + (b.x - cx) * sx, y: oy + (b.y - cy) * sy, w: b.w * sx, h: b.h * sy })\n this.walk(part, el, local, out, skipPh, top)\n }\n\n private frame(el: XEl, part: Part, xf: Xform, out: SlideEl[]) {\n const raw = readXfrm(kid(el, 'xfrm'))\n if (!raw) return\n const box = xf(raw)\n const gd = path(el, 'graphic', 'graphicData')\n if (!gd) return\n const tbl = kid(gd, 'tbl')\n if (tbl) return void out.push(this.table(tbl, box, part))\n const ole = kid(gd, 'oleObj')\n const olePic = kid(ole, 'pic')\n if (olePic) {\n const id = path(olePic, 'blipFill', 'blip')?.a['r:embed']\n const rel = id ? part.rels.get(id) : undefined\n return void out.push({ t: 'pic', box, target: rel?.target })\n }\n const uri = gd.a.uri ?? ''\n const label = uri.includes('chart') ? 'Chart' : uri.includes('diagram') ? 'SmartArt' : uri.includes('ole') ? 'Embedded object' : 'Object'\n out.push({ t: 'placeholder', box, label })\n }\n\n private table(tbl: XEl, box: Box, part: Part): SlideEl {\n const cols = kids(kid(tbl, 'tblGrid'), 'gridCol').map((g) => emuToPx(num(g.a.w, 0)))\n const tblPr = kid(tbl, 'tblPr')\n const flag = (k: string) => tblPr?.a[k] === '1' || tblPr?.a[k] === 'true'\n const styleId = kid(tblPr, 'tableStyleId')?.t.trim()\n const ts = styleId ? this.tableStyles.get(styleId) : undefined\n const trs = kids(tbl, 'tr')\n const nRows = trs.length\n const nCols = cols.length\n const tableFill = this.fill(tblPr, part.rels)\n\n const parts = (ri: number, ci: number): XEl[] => {\n const out: XEl[] = []\n const add = (n: string) => {\n const p = kid(ts, n)\n if (p) out.push(p)\n }\n add('wholeTbl')\n const bodyRi = ri - (flag('firstRow') ? 1 : 0)\n if (flag('bandRow') && bodyRi >= 0) add(bodyRi % 2 === 0 ? 'band1H' : 'band2H')\n const bodyCi = ci - (flag('firstCol') ? 1 : 0)\n if (flag('bandCol') && bodyCi >= 0) add(bodyCi % 2 === 0 ? 'band1V' : 'band2V')\n if (flag('firstCol') && ci === 0) add('firstCol')\n if (flag('lastCol') && ci === nCols - 1) add('lastCol')\n if (flag('lastRow') && ri === nRows - 1) add('lastRow')\n if (flag('firstRow') && ri === 0) add('firstRow')\n return out\n }\n\n const fallback = !ts && styleId ? defaultTableLook(this.theme, flag('firstRow'), flag('bandRow')) : undefined\n\n const rows = trs.map((tr, ri) => {\n const cells: TCell[] = kids(tr, 'tc').map((tc, ci) => {\n const tcPr = kid(tc, 'tcPr')\n let fill: Fill | undefined\n let bold: boolean | undefined\n let color: string | undefined\n const bord: Record<string, Stroke | undefined> = {}\n for (const sp of parts(ri, ci)) {\n const tcStyle = kid(sp, 'tcStyle')\n const f = this.fill(kid(tcStyle, 'fill'), part.rels) ?? this.themeFill(kid(tcStyle, 'fillRef'), part.rels)\n if (f) fill = f\n const bdr = kid(tcStyle, 'tcBdr')\n for (const side of bdr?.c ?? []) {\n const s = this.stroke(kid(side, 'ln'), kid(side, 'lnRef'))\n bord[side.n] = s\n }\n const tx = kid(sp, 'tcTxStyle')\n if (tx) {\n if (tx.a.b) bold = tx.a.b === 'on'\n const c = colorOf(tx, this.cc()) ?? colorOf(kid(tx, 'fontRef'), this.cc())\n if (c) color = c\n }\n }\n if (fallback) {\n const fb = fallback(ri)\n fill = fb.fill\n if (fb.color) color = fb.color\n if (fb.bold) bold = true\n bord.insideH = bord.insideV = { c: '#ffffff', w: 1 }\n }\n const own = this.fill(tcPr, part.rels)\n if (own) fill = own\n const edge = (tag: string, side: 'left' | 'right' | 'top' | 'bottom', inner: 'insideV' | 'insideH', outer: boolean) => {\n const el = kid(tcPr, tag)\n if (el) return this.stroke(el, undefined)\n return outer ? bord[side] : bord[inner] ?? bord[side]\n }\n const textEl = kid(tc, 'txBody')\n let text = this.textBody(textEl, textEl ? [tc] : [], undefined, undefined, part)\n if (text) {\n text.ins = [\n emuToPx(num(tcPr?.a.marL, 91440)), emuToPx(num(tcPr?.a.marT, 45720)),\n emuToPx(num(tcPr?.a.marR, 91440)), emuToPx(num(tcPr?.a.marB, 45720)),\n ]\n text.anchor = tcPr?.a.anchor === 'ctr' ? 'ctr' : tcPr?.a.anchor === 'b' ? 'b' : 't'\n if (bold !== undefined || color) {\n for (const p of text.paras) for (const r of p.runs) {\n if (bold && r.b === undefined) r.b = true\n if (color && !r.color) r.color = color\n }\n }\n } else text = undefined\n return {\n text,\n fill: fill ?? tableFill,\n bl: edge('lnL', 'left', 'insideV', ci === 0),\n br: edge('lnR', 'right', 'insideV', ci === nCols - 1),\n bt: edge('lnT', 'top', 'insideH', ri === 0),\n bb: edge('lnB', 'bottom', 'insideH', ri === nRows - 1),\n colSpan: num(tc.a.gridSpan, 1)!,\n rowSpan: num(tc.a.rowSpan, 1)!,\n hidden: tc.a.hMerge === '1' || tc.a.vMerge === '1' || tc.a.hMerge === 'true' || tc.a.vMerge === 'true',\n }\n })\n return { h: emuToPx(num(tr.a.h, 0)), cells }\n })\n return { t: 'table', box, cols, rows }\n }\n}\n\n/** Approximation of PowerPoint's default \"Medium Style 2 – Accent 1\" when the style isn't embedded. */\nfunction defaultTableLook(theme: Theme, firstRow: boolean, bandRow: boolean) {\n const accent = theme.colors.accent1 ?? '#4472c4'\n return (ri: number): { fill?: Fill; color?: string; bold?: boolean } => {\n if (firstRow && ri === 0) return { fill: { t: 'solid', c: accent }, color: '#ffffff', bold: true }\n const bi = ri - (firstRow ? 1 : 0)\n const tint = bandRow && bi % 2 === 0 ? 0.6 : 0.8\n return { fill: { t: 'solid', c: mix(accent, '#ffffff', tint) } }\n }\n}\n\nfunction mix(a: string, b: string, t: number): string {\n const pa = [1, 3, 5].map((i) => parseInt(a.slice(i, i + 2), 16))\n const pb = [1, 3, 5].map((i) => parseInt(b.slice(i, i + 2), 16))\n return '#' + pa.map((v, i) => Math.round(v + (pb[i] - v) * t).toString(16).padStart(2, '0')).join('')\n}\n\n/** custGeom → SVG path in box-local px coordinates. */\nfunction customPath(cg: XEl, box: Box): string | undefined {\n const paths = kids(kid(cg, 'pathLst'), 'path')\n let d = ''\n for (const p of paths) {\n const pw = num(p.a.w) || 1\n const ph = num(p.a.h) || 1\n const sx = box.w / pw\n const sy = box.h / ph\n const pt = (el: XEl | undefined) => `${(num(el?.a.x, 0)! * sx).toFixed(2)} ${(num(el?.a.y, 0)! * sy).toFixed(2)}`\n let cx = 0\n let cy = 0\n for (const c of p.c) {\n const pts = kids(c, 'pt')\n switch (c.n) {\n case 'moveTo':\n d += `M${pt(pts[0])} `\n cx = num(pts[0]?.a.x, 0)! * sx\n cy = num(pts[0]?.a.y, 0)! * sy\n break\n case 'lnTo':\n d += `L${pt(pts[0])} `\n cx = num(pts[0]?.a.x, 0)! * sx\n cy = num(pts[0]?.a.y, 0)! * sy\n break\n case 'cubicBezTo':\n d += `C${pts.map(pt).join(' ')} `\n cx = num(pts[2]?.a.x, 0)! * sx\n cy = num(pts[2]?.a.y, 0)! * sy\n break\n case 'quadBezTo':\n d += `Q${pts.map(pt).join(' ')} `\n cx = num(pts[1]?.a.x, 0)! * sx\n cy = num(pts[1]?.a.y, 0)! * sy\n break\n case 'arcTo': {\n const wR = num(c.a.wR, 0)! * sx\n const hR = num(c.a.hR, 0)! * sy\n const st = (num(c.a.stAng, 0)! / 60000) * (Math.PI / 180)\n const sw = (num(c.a.swAng, 0)! / 60000) * (Math.PI / 180)\n const ccx = cx - wR * Math.cos(st)\n const ccy = cy - hR * Math.sin(st)\n const ex = ccx + wR * Math.cos(st + sw)\n const ey = ccy + hR * Math.sin(st + sw)\n d += `A${wR.toFixed(2)} ${hR.toFixed(2)} 0 ${Math.abs(sw) > Math.PI ? 1 : 0} ${sw > 0 ? 1 : 0} ${ex.toFixed(2)} ${ey.toFixed(2)} `\n cx = ex\n cy = ey\n break\n }\n case 'close':\n d += 'Z '\n break\n }\n }\n }\n return d.trim() || undefined\n}\n","/**\n * Random-access byte sources. The ZIP reader only touches the bytes it needs\n * (central directory + requested entries), so a 500 MB file is never read in full.\n */\nexport interface ByteSource {\n readonly size: number\n readonly name?: string\n read(offset: number, length: number): Promise<Uint8Array>\n stream(offset: number, length: number): ReadableStream<Uint8Array>\n /** Zero-copy sub-Blob when available (used when re-zipping unchanged entries). */\n slice?(offset: number, length: number): Blob\n}\n\nexport type ProgressFn = (loaded: number, total: number) => void\n\nexport class BlobSource implements ByteSource {\n readonly size: number\n constructor(private blob: Blob, readonly name?: string) {\n this.size = blob.size\n }\n async read(offset: number, length: number): Promise<Uint8Array> {\n return new Uint8Array(await this.blob.slice(offset, offset + length).arrayBuffer())\n }\n stream(offset: number, length: number): ReadableStream<Uint8Array> {\n return this.blob.slice(offset, offset + length).stream() as ReadableStream<Uint8Array>\n }\n slice(offset: number, length: number): Blob {\n return this.blob.slice(offset, offset + length)\n }\n}\n\nexport class BufferSource implements ByteSource {\n readonly size: number\n private bytes: Uint8Array\n constructor(data: ArrayBuffer | Uint8Array, readonly name?: string) {\n this.bytes = data instanceof Uint8Array ? data : new Uint8Array(data)\n this.size = this.bytes.byteLength\n }\n async read(offset: number, length: number): Promise<Uint8Array> {\n return this.bytes.subarray(offset, offset + length)\n }\n stream(offset: number, length: number): ReadableStream<Uint8Array> {\n const bytes = this.bytes\n const end = Math.min(offset + length, bytes.byteLength)\n let pos = offset\n const CHUNK = 1 << 20\n return new ReadableStream<Uint8Array>({\n pull(ctrl) {\n if (pos >= end) return ctrl.close()\n const next = Math.min(pos + CHUNK, end)\n ctrl.enqueue(bytes.slice(pos, next))\n pos = next\n },\n })\n }\n}\n\nexport interface HttpSourceOptions {\n headers?: Record<string, string>\n credentials?: RequestCredentials\n /** Block size used for cached range reads (default 256 KB). */\n blockSize?: number\n /** Max cached blocks (default 128 → 32 MB). */\n maxBlocks?: number\n onProgress?: ProgressFn\n signal?: AbortSignal\n}\n\n/**\n * HTTP source using Range requests. Falls back to a full download when the\n * server does not honour ranges (or CORS hides the needed headers).\n */\nexport class HttpRangeSource implements ByteSource {\n private cache = new Map<number, Uint8Array>()\n private inflight = new Map<number, Promise<void>>()\n private blockSize: number\n private maxBlocks: number\n\n private constructor(\n readonly url: string,\n readonly size: number,\n private opts: HttpSourceOptions,\n readonly name?: string,\n ) {\n this.blockSize = opts.blockSize ?? 256 * 1024\n this.maxBlocks = opts.maxBlocks ?? 128\n }\n\n static async open(url: string, opts: HttpSourceOptions = {}): Promise<ByteSource> {\n const name = decodeURIComponent(url.split(/[?#]/)[0].split('/').pop() || '') || undefined\n const init: RequestInit = { headers: { ...opts.headers }, credentials: opts.credentials, signal: opts.signal }\n let size = -1\n try {\n const res = await fetch(url, { ...init, headers: { ...opts.headers, Range: 'bytes=0-0' } })\n if (res.status === 206) {\n const cr = res.headers.get('Content-Range')\n const m = cr && /\\/(\\d+)\\s*$/.exec(cr)\n if (m) size = Number(m[1])\n await res.body?.cancel()\n if (size < 0) {\n const head = await fetch(url, { ...init, method: 'HEAD' })\n const len = head.headers.get('Content-Length')\n if (head.ok && len) size = Number(len)\n }\n if (size > 0) return new HttpRangeSource(url, size, opts, name)\n } else if (res.ok) {\n // Server ignored the Range header and is sending the whole file: just use it.\n return new BlobSource(await readWithProgress(res, opts.onProgress), name)\n }\n } catch (err) {\n if ((err as Error)?.name === 'AbortError') throw err\n // Likely a CORS preflight failure for the Range header → plain GET below.\n }\n const res = await fetch(url, init)\n if (!res.ok) throw new Error(`HTTP ${res.status} while fetching ${url}`)\n return new BlobSource(await readWithProgress(res, opts.onProgress), name)\n }\n\n private async fetchRange(start: number, endExcl: number): Promise<Uint8Array> {\n const res = await fetch(this.url, {\n headers: { ...this.opts.headers, Range: `bytes=${start}-${endExcl - 1}` },\n credentials: this.opts.credentials,\n signal: this.opts.signal,\n })\n if (res.status !== 206 && !res.ok) throw new Error(`HTTP ${res.status} (range ${start}-${endExcl - 1})`)\n const buf = new Uint8Array(await res.arrayBuffer())\n // A 200 means the server sent everything; slice what we asked for.\n return res.status === 206 ? buf : buf.subarray(start, endExcl)\n }\n\n private async ensureBlocks(first: number, last: number): Promise<void> {\n const waits: Promise<void>[] = []\n let runStart = -1\n const flush = (endBlock: number) => {\n if (runStart < 0) return\n const a = runStart\n const b = endBlock\n const p = this.fetchRange(a * this.blockSize, Math.min((b + 1) * this.blockSize, this.size)).then((buf) => {\n for (let k = a; k <= b; k++) {\n const off = (k - a) * this.blockSize\n this.cache.set(k, buf.subarray(off, Math.min(off + this.blockSize, buf.length)))\n this.inflight.delete(k)\n }\n this.evict()\n })\n for (let k = a; k <= b; k++) this.inflight.set(k, p)\n waits.push(p)\n runStart = -1\n }\n for (let k = first; k <= last; k++) {\n if (this.cache.has(k)) {\n flush(k - 1)\n // refresh LRU position\n const v = this.cache.get(k)!\n this.cache.delete(k)\n this.cache.set(k, v)\n } else if (this.inflight.has(k)) {\n flush(k - 1)\n waits.push(this.inflight.get(k)!)\n } else if (runStart < 0) runStart = k\n }\n flush(last)\n await Promise.all(waits)\n }\n\n private evict() {\n while (this.cache.size > this.maxBlocks) {\n const oldest = this.cache.keys().next().value as number\n this.cache.delete(oldest)\n }\n }\n\n async read(offset: number, length: number): Promise<Uint8Array> {\n const end = Math.min(offset + length, this.size)\n if (end <= offset) return new Uint8Array(0)\n // big reads would thrash the block cache: fetch directly\n if (end - offset > (this.maxBlocks * this.blockSize) / 2) return this.fetchRange(offset, end)\n const bs = this.blockSize\n const first = Math.floor(offset / bs)\n const last = Math.floor((end - 1) / bs)\n await this.ensureBlocks(first, last)\n const out = new Uint8Array(end - offset)\n for (let k = first; k <= last; k++) {\n const blk = this.cache.get(k)\n if (!blk) throw new Error('range block evicted before use')\n const blkStart = k * bs\n const from = Math.max(offset, blkStart)\n const to = Math.min(end, blkStart + blk.length)\n out.set(blk.subarray(from - blkStart, to - blkStart), from - offset)\n }\n return out\n }\n\n stream(offset: number, length: number): ReadableStream<Uint8Array> {\n // Large entries: one streaming range request, bypassing the block cache.\n if (length > 2 * this.blockSize) {\n const { url, opts } = this\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined\n return new ReadableStream<Uint8Array>({\n async start() {\n const res = await fetch(url, {\n headers: { ...opts.headers, Range: `bytes=${offset}-${offset + length - 1}` },\n credentials: opts.credentials,\n signal: opts.signal,\n })\n if (res.status !== 206) throw new Error(`Range request not honoured (HTTP ${res.status})`)\n reader = res.body!.getReader()\n },\n async pull(ctrl) {\n const { done, value } = await reader!.read()\n if (done) ctrl.close()\n else ctrl.enqueue(value)\n },\n cancel() {\n return reader?.cancel()\n },\n })\n }\n let pos = offset\n const end = offset + length\n return new ReadableStream<Uint8Array>({\n pull: async (ctrl) => {\n if (pos >= end) return ctrl.close()\n const n = Math.min(this.blockSize, end - pos)\n ctrl.enqueue(await this.read(pos, n))\n pos += n\n },\n })\n }\n}\n\nasync function readWithProgress(res: Response, onProgress?: ProgressFn): Promise<Blob> {\n const total = Number(res.headers.get('Content-Length') || 0)\n if (!res.body || !onProgress) return res.blob()\n const reader = res.body.getReader()\n const parts: Uint8Array[] = []\n let loaded = 0\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n parts.push(value)\n loaded += value.length\n onProgress(loaded, total)\n }\n return new Blob(parts as BlobPart[])\n}\n\nexport type DocSource = Blob | File | ArrayBuffer | Uint8Array | string | URL\n\nexport async function openSource(src: DocSource, opts: HttpSourceOptions & { name?: string } = {}): Promise<ByteSource> {\n if (typeof src === 'string' || src instanceof URL) return HttpRangeSource.open(String(src), opts)\n if (src instanceof Uint8Array || src instanceof ArrayBuffer) return new BufferSource(src, opts.name)\n if (typeof Blob !== 'undefined' && src instanceof Blob) {\n return new BlobSource(src, opts.name ?? (src as File).name)\n }\n throw new Error('Unsupported document source')\n}\n","/** Core value / reference / provider types of the formula engine. */\n\nexport type ErrorCode = '#DIV/0!' | '#VALUE!' | '#REF!' | '#NAME?' | '#N/A' | '#NUM!' | '#NULL!'\n\n/** ERROR.TYPE order (1-based). */\nexport const ERROR_CODES: readonly ErrorCode[] = ['#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', '#N/A']\n\nexport class FormulaError {\n constructor(readonly code: ErrorCode) {}\n toString(): string {\n return this.code\n }\n}\n\n/** null = empty cell */\nexport type Value = number | string | boolean | FormulaError | null\n\n/** 0-based cell reference. */\nexport interface CellRef {\n sheet?: string\n r: number\n c: number\n absR: boolean\n absC: boolean\n}\n\n/** 0-based inclusive range. Whole column A:A => r0=0, r1=MAX_ROW; whole row 1:1 => c0=0, c1=MAX_COL. */\nexport interface RangeRef {\n sheet?: string\n r0: number\n c0: number\n r1: number\n c1: number\n}\n\nexport interface CellProvider {\n /** value of a cell; formula cells return their current computed value */\n value(sheet: string | undefined, r: number, c: number): Value\n /** used extent of a sheet, to clip whole-row/column ranges (optional) */\n bounds?(sheet: string | undefined): { rows: number; cols: number }\n /** sheet exists? (unknown sheet -> #REF!) optional */\n hasSheet?(name: string): boolean\n date1904?: boolean\n now?(): Date\n}\n\nexport interface EvalContext {\n provider: CellProvider\n /** sheet the formula lives on (unqualified refs resolve here) */\n sheet?: string\n /** 0-based position of the formula cell */\n r: number\n c: number\n}\n\nexport const MAX_ROW = 1048575\nexport const MAX_COL = 16383\n\nexport const ERR = {\n DIV0: new FormulaError('#DIV/0!'),\n VALUE: new FormulaError('#VALUE!'),\n REF: new FormulaError('#REF!'),\n NAME: new FormulaError('#NAME?'),\n NA: new FormulaError('#N/A'),\n NUM: new FormulaError('#NUM!'),\n NULL: new FormulaError('#NULL!'),\n} as const\n","/** A1 reference helpers: column letters, sheet quoting, reference text. */\nimport { MAX_COL, MAX_ROW } from './types'\n\n/** Parsed A1 reference as written in a formula (0-based, inclusive, normalized r0<=r1, c0<=c1). */\nexport interface RefAddr {\n sheet?: string\n kind: 'cell' | 'area' | 'cols' | 'rows'\n r0: number\n c0: number\n r1: number\n c1: number\n ar0: boolean\n ac0: boolean\n ar1: boolean\n ac1: boolean\n}\n\nexport function colName(c: number): string {\n let s = ''\n let n = c + 1\n while (n > 0) {\n const m = (n - 1) % 26\n s = String.fromCharCode(65 + m) + s\n n = Math.floor((n - 1) / 26)\n }\n return s\n}\n\nexport function colIndex(letters: string): number {\n let n = 0\n const up = letters.toUpperCase()\n for (let i = 0; i < up.length; i++) n = n * 26 + (up.charCodeAt(i) - 64)\n return n - 1\n}\n\nexport function sameSheet(a: string | undefined, b: string | undefined): boolean {\n if (a === undefined || b === undefined) return a === b\n return a.toLowerCase() === b.toLowerCase()\n}\n\n/** Sheet name as it must appear before '!' (quoted when needed). */\nexport function quoteSheet(name: string): string {\n const plain =\n /^[A-Za-z_\\u00A1-\\uFFFF][\\w.\\u00A1-\\uFFFF]*$/.test(name) &&\n !/^[A-Za-z]{1,3}\\d+$/.test(name) &&\n !/^(R\\d*C?\\d*|C\\d*)$/i.test(name) &&\n !/^(TRUE|FALSE)$/i.test(name)\n return plain ? name : `'${name.replace(/'/g, \"''\")}'`\n}\n\nconst cellText = (r: number, c: number, ar: boolean, ac: boolean) =>\n `${ac ? '$' : ''}${colName(c)}${ar ? '$' : ''}${r + 1}`\n\n/** Reference text. `sheetText` (raw prefix without '!') is reused when given to preserve original quoting. */\nexport function fmtRef(a: RefAddr, sheetText?: string): string {\n const pre = a.sheet === undefined ? '' : `${sheetText ?? quoteSheet(a.sheet)}!`\n switch (a.kind) {\n case 'cell':\n return pre + cellText(a.r0, a.c0, a.ar0, a.ac0)\n case 'area':\n return `${pre}${cellText(a.r0, a.c0, a.ar0, a.ac0)}:${cellText(a.r1, a.c1, a.ar1, a.ac1)}`\n case 'cols':\n return `${pre}${a.ac0 ? '$' : ''}${colName(a.c0)}:${a.ac1 ? '$' : ''}${colName(a.c1)}`\n case 'rows':\n return `${pre}${a.ar0 ? '$' : ''}${a.r0 + 1}:${a.ar1 ? '$' : ''}${a.r1 + 1}`\n }\n}\n\n/** Swap ends (with their $ flags) so r0<=r1 and c0<=c1. Mutates. */\nexport function normalizeRef(a: RefAddr): RefAddr {\n if (a.r0 > a.r1) {\n ;[a.r0, a.r1] = [a.r1, a.r0]\n ;[a.ar0, a.ar1] = [a.ar1, a.ar0]\n }\n if (a.c0 > a.c1) {\n ;[a.c0, a.c1] = [a.c1, a.c0]\n ;[a.ac0, a.ac1] = [a.ac1, a.ac0]\n }\n return a\n}\n\nexport function refInBounds(a: RefAddr): boolean {\n return a.r0 >= 0 && a.c0 >= 0 && a.r1 <= MAX_ROW && a.c1 <= MAX_COL && a.r1 >= 0 && a.c1 >= 0\n}\n","/** Tokenizer for OOXML formula text (no leading '='). Tokens carry source spans so transforms can splice text. */\nimport { colIndex, normalizeRef, type RefAddr } from './refs'\nimport { MAX_COL, MAX_ROW, type ErrorCode } from './types'\n\nexport class FormulaSyntaxError extends Error {\n constructor(\n message: string,\n readonly pos: number,\n ) {\n super(message)\n this.name = 'FormulaSyntaxError'\n }\n}\n\ninterface Span {\n s: number\n e: number\n}\n\nexport type Token = Span &\n (\n | { t: 'num'; v: number }\n | { t: 'str'; v: string }\n | { t: 'bool'; v: boolean }\n | { t: 'err'; v: ErrorCode; sheet?: string }\n | { t: 'ref'; ref: RefAddr; sheetText?: string }\n | { t: 'func'; v: string }\n | { t: 'name'; v: string; sheet?: string }\n | { t: 'op'; v: string }\n | { t: 'punc'; v: string }\n | { t: 'ws' }\n )\n\nconst ERRS: [string, ErrorCode][] = [\n ['#DIV/0!', '#DIV/0!'],\n ['#VALUE!', '#VALUE!'],\n ['#REF!', '#REF!'],\n ['#NAME?', '#NAME?'],\n ['#N/A', '#N/A'],\n ['#NUM!', '#NUM!'],\n ['#NULL!', '#NULL!'],\n]\n\nconst IDENT = /[\\w.$\\\\\\u00A1-\\uFFFF]/\nconst RE_AREA = /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d+):(\\$?)([A-Za-z]{1,3})(\\$?)(\\d+)/y\nconst RE_CELL = /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d+)/y\nconst RE_COLS = /(\\$?)([A-Za-z]{1,3}):(\\$?)([A-Za-z]{1,3})/y\nconst RE_ROWS = /(\\$?)(\\d+):(\\$?)(\\d+)/y\nconst RE_NUM = /(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?/y\nconst PREFIXES = ['_XLFN.', '_XLWS.', '_XLUDF.']\n\nfunction at(re: RegExp, s: string, i: number): RegExpExecArray | null {\n re.lastIndex = i\n return re.exec(s)\n}\n\nconst isIdent = (ch: string | undefined) => ch !== undefined && IDENT.test(ch)\n\nfunction row(s: string): number {\n const n = Number(s) - 1\n return n >= 0 && n <= MAX_ROW ? n : -1\n}\nfunction col(s: string): number {\n const n = colIndex(s)\n return n <= MAX_COL ? n : -1\n}\n\n/** Try to read an A1 reference (cell, area, A:B, 1:2) at i. */\nexport function readRef(src: string, i: number): { ref: RefAddr; end: number } | null {\n let m: RegExpExecArray | null\n let ref: RefAddr | null = null\n if ((m = at(RE_AREA, src, i))) {\n const [r0, c0, r1, c1] = [row(m[4]), col(m[2]), row(m[8]), col(m[6])]\n if (r0 >= 0 && c0 >= 0 && r1 >= 0 && c1 >= 0)\n ref = { kind: 'area', r0, c0, r1, c1, ac0: !!m[1], ar0: !!m[3], ac1: !!m[5], ar1: !!m[7] }\n }\n if (!ref && (m = at(RE_CELL, src, i))) {\n const [r, c] = [row(m[4]), col(m[2])]\n if (r >= 0 && c >= 0) ref = { kind: 'cell', r0: r, c0: c, r1: r, c1: c, ac0: !!m[1], ar0: !!m[3], ac1: !!m[1], ar1: !!m[3] }\n }\n if (!ref && (m = at(RE_COLS, src, i))) {\n const [c0, c1] = [col(m[2]), col(m[4])]\n if (c0 >= 0 && c1 >= 0) ref = { kind: 'cols', r0: 0, c0, r1: MAX_ROW, c1, ac0: !!m[1], ar0: false, ac1: !!m[3], ar1: false }\n }\n if (!ref && (m = at(RE_ROWS, src, i))) {\n const [r0, r1] = [row(m[2]), row(m[4])]\n if (r0 >= 0 && r1 >= 0) ref = { kind: 'rows', r0, c0: 0, r1, c1: MAX_COL, ac0: false, ar0: !!m[1], ac1: false, ar1: !!m[3] }\n }\n if (!ref || !m) return null\n const end = i + m[0].length\n const next = src[end]\n if (isIdent(next) || next === '(' || next === '!') return null\n return { ref: normalizeRef(ref), end }\n}\n\nfunction readError(src: string, i: number): [ErrorCode, number] | null {\n const up = src.slice(i, i + 7).toUpperCase()\n for (const [txt, code] of ERRS) if (up.startsWith(txt)) return [code, i + txt.length]\n return null\n}\n\nexport function stripFnPrefix(name: string): string {\n let n = name.toUpperCase()\n for (let again = true; again; ) {\n again = false\n for (const p of PREFIXES)\n if (n.startsWith(p)) {\n n = n.slice(p.length)\n again = true\n }\n }\n return n\n}\n\nexport function tokenize(src: string): Token[] {\n const out: Token[] = []\n const n = src.length\n let i = 0\n\n /** after `Sheet!` -> ref / error / scoped name */\n const afterSheet = (s: number, k: number, sheet: string, sheetText: string) => {\n if (src[k] === '#') {\n const e = readError(src, k)\n if (!e) throw new FormulaSyntaxError('bad error literal', k)\n out.push({ t: 'err', v: e[0], sheet, s, e: e[1] })\n return e[1]\n }\n const r = readRef(src, k)\n if (r) {\n r.ref.sheet = sheet\n out.push({ t: 'ref', ref: r.ref, sheetText, s, e: r.end })\n return r.end\n }\n let j = k\n while (j < n && isIdent(src[j])) j++\n if (j === k) throw new FormulaSyntaxError('expected reference after !', k)\n out.push({ t: 'name', v: src.slice(k, j), sheet, s, e: j })\n return j\n }\n\n while (i < n) {\n const ch = src[i]\n const s = i\n if (ch === ' ' || ch === '\\n' || ch === '\\r' || ch === '\\t' || ch === '\\u00A0') {\n while (i < n && /[\\s\\u00A0]/.test(src[i])) i++\n out.push({ t: 'ws', s, e: i })\n continue\n }\n if (ch === '\"') {\n let v = ''\n i++\n for (;;) {\n if (i >= n) throw new FormulaSyntaxError('unterminated string', s)\n if (src[i] === '\"') {\n if (src[i + 1] === '\"') {\n v += '\"'\n i += 2\n continue\n }\n i++\n break\n }\n v += src[i++]\n }\n out.push({ t: 'str', v, s, e: i })\n continue\n }\n if (ch === '#') {\n const e = readError(src, i)\n if (!e) throw new FormulaSyntaxError('bad error literal', i)\n out.push({ t: 'err', v: e[0], s, e: e[1] })\n i = e[1]\n continue\n }\n if (ch === \"'\") {\n let name = ''\n let j = i + 1\n for (;;) {\n if (j >= n) throw new FormulaSyntaxError('unterminated sheet name', s)\n if (src[j] === \"'\") {\n if (src[j + 1] === \"'\") {\n name += \"'\"\n j += 2\n continue\n }\n break\n }\n name += src[j++]\n }\n if (src[j + 1] !== '!') throw new FormulaSyntaxError(\"expected '!' after sheet name\", j + 1)\n i = afterSheet(s, j + 2, name, src.slice(i, j + 1))\n continue\n }\n if (ch === '[') {\n // external workbook prefix: [1]Sheet1!A1 (kept verbatim as part of the sheet name)\n const m = /\\[\\d+\\][\\w.\\u00A1-\\uFFFF]+!/y\n m.lastIndex = i\n if (!m.exec(src)) throw new FormulaSyntaxError(\"unexpected '['\", i)\n const end = m.lastIndex - 1\n const sheet = src.slice(i, end)\n i = afterSheet(s, end + 1, sheet, sheet)\n continue\n }\n if ('(){},;'.includes(ch)) {\n out.push({ t: 'punc', v: ch, s, e: ++i })\n continue\n }\n const two = src.slice(i, i + 2)\n if (two === '<=' || two === '>=' || two === '<>') {\n out.push({ t: 'op', v: two, s, e: (i += 2) })\n continue\n }\n if ('+-*/^&=<>%:'.includes(ch)) {\n out.push({ t: 'op', v: ch, s, e: ++i })\n continue\n }\n const isDigit = ch >= '0' && ch <= '9'\n if (isDigit || (ch === '.' && /\\d/.test(src[i + 1] ?? '')) || (ch === '$' && /\\d/.test(src[i + 1] ?? ''))) {\n const r = readRef(src, i)\n if (r && r.ref.kind === 'rows') {\n out.push({ t: 'ref', ref: r.ref, s, e: r.end })\n i = r.end\n continue\n }\n const m = at(RE_NUM, src, i)\n if (!m || ch === '$') throw new FormulaSyntaxError('bad number', i)\n i += m[0].length\n out.push({ t: 'num', v: Number(m[0]), s, e: i })\n continue\n }\n if (isIdent(ch)) {\n let j = i\n while (j < n && isIdent(src[j])) j++\n const word = src.slice(i, j)\n if (src[j] === '!') {\n i = afterSheet(s, j + 1, word, word)\n continue\n }\n if (src[j] === '(') {\n out.push({ t: 'func', v: stripFnPrefix(word), s, e: j })\n i = j\n continue\n }\n const r = readRef(src, i)\n if (r) {\n out.push({ t: 'ref', ref: r.ref, s, e: r.end })\n i = r.end\n continue\n }\n const up = word.toUpperCase()\n if (up === 'TRUE' || up === 'FALSE') {\n out.push({ t: 'bool', v: up === 'TRUE', s, e: j })\n i = j\n continue\n }\n if (src[j] === '[') {\n // structured reference Table[...]: swallow balanced brackets\n let depth = 0\n do {\n if (src[j] === '[') depth++\n else if (src[j] === ']') depth--\n j++\n } while (j < n && depth > 0)\n if (depth > 0) throw new FormulaSyntaxError('unterminated [', i)\n }\n out.push({ t: 'name', v: src.slice(i, j), s, e: j })\n i = j\n continue\n }\n throw new FormulaSyntaxError(`unexpected character '${ch}'`, i)\n }\n return out\n}\n\n/** Parse a plain reference string (INDIRECT): `A1`, `Sheet1!A1:B2`, `'x y'!C:C`, `3:3`. */\nexport function parseRefText(text: string): RefAddr | null {\n let toks: Token[]\n try {\n toks = tokenize(text.trim()).filter((t) => t.t !== 'ws')\n } catch {\n return null\n }\n const a = toks[0]\n if (!a || a.t !== 'ref') return null\n if (toks.length === 1) return a.ref\n const op = toks[1]\n const b = toks[2]\n if (toks.length !== 3 || op.t !== 'op' || op.v !== ':' || b.t !== 'ref') return null\n if (b.ref.sheet !== undefined && (a.ref.sheet ?? '').toLowerCase() !== b.ref.sheet.toLowerCase()) return null\n return normalizeRef({\n ...a.ref,\n kind: 'area',\n r0: Math.min(a.ref.r0, b.ref.r0),\n c0: Math.min(a.ref.c0, b.ref.c0),\n r1: Math.max(a.ref.r1, b.ref.r1),\n c1: Math.max(a.ref.c1, b.ref.c1),\n })\n}\n","/** Recursive-descent parser with Excel precedence: `:` > unary +/- > % > ^ > * / > + - > & > comparisons. */\nimport { FormulaSyntaxError, tokenize, type Token } from './lexer'\nimport type { RefAddr } from './refs'\nimport type { ErrorCode, Value } from './types'\nimport { FormulaError } from './types'\n\nexport type BinOp = '+' | '-' | '*' | '/' | '^' | '&' | '=' | '<>' | '<' | '>' | '<=' | '>='\n\nexport type Ast =\n | { type: 'num'; value: number }\n | { type: 'str'; value: string }\n | { type: 'bool'; value: boolean }\n | { type: 'err'; code: ErrorCode }\n | { type: 'missing' }\n | { type: 'ref'; ref: RefAddr }\n | { type: 'name'; name: string; sheet?: string }\n | { type: 'array'; rows: Value[][] }\n | { type: 'unary'; op: '-' | '+'; arg: Ast }\n | { type: 'percent'; arg: Ast }\n | { type: 'binary'; op: BinOp; left: Ast; right: Ast }\n | { type: 'range'; left: Ast; right: Ast }\n | { type: 'union'; items: Ast[] }\n | { type: 'call'; name: string; args: Ast[] }\n\nconst CMP = new Set(['=', '<>', '<', '>', '<=', '>='])\n\nclass Parser {\n i = 0\n constructor(private readonly toks: Token[]) {}\n\n private peek(): Token | undefined {\n return this.toks[this.i]\n }\n private isOp(...ops: string[]): string | undefined {\n const t = this.toks[this.i]\n return t && t.t === 'op' && ops.includes(t.v) ? t.v : undefined\n }\n private isPunc(p: string): boolean {\n const t = this.toks[this.i]\n return !!t && t.t === 'punc' && t.v === p\n }\n private fail(msg: string): never {\n const t = this.toks[this.i]\n throw new FormulaSyntaxError(msg, t ? t.s : -1)\n }\n private expectPunc(p: string): void {\n if (!this.isPunc(p)) this.fail(`expected '${p}'`)\n this.i++\n }\n\n expr(): Ast {\n let l = this.concat()\n for (let op = this.cmpOp(); op; op = this.cmpOp()) {\n this.i++\n l = { type: 'binary', op: op as BinOp, left: l, right: this.concat() }\n }\n return l\n }\n private cmpOp(): string | undefined {\n const t = this.peek()\n return t && t.t === 'op' && CMP.has(t.v) ? t.v : undefined\n }\n private concat(): Ast {\n let l = this.add()\n while (this.isOp('&')) {\n this.i++\n l = { type: 'binary', op: '&', left: l, right: this.add() }\n }\n return l\n }\n private add(): Ast {\n let l = this.mul()\n for (let op = this.isOp('+', '-'); op; op = this.isOp('+', '-')) {\n this.i++\n l = { type: 'binary', op: op as BinOp, left: l, right: this.mul() }\n }\n return l\n }\n private mul(): Ast {\n let l = this.pow()\n for (let op = this.isOp('*', '/'); op; op = this.isOp('*', '/')) {\n this.i++\n l = { type: 'binary', op: op as BinOp, left: l, right: this.pow() }\n }\n return l\n }\n private pow(): Ast {\n let l = this.postfix()\n while (this.isOp('^')) {\n this.i++\n l = { type: 'binary', op: '^', left: l, right: this.postfix() }\n }\n return l\n }\n private postfix(): Ast {\n let x = this.unary()\n while (this.isOp('%')) {\n this.i++\n x = { type: 'percent', arg: x }\n }\n return x\n }\n private unary(): Ast {\n const op = this.isOp('-', '+')\n if (op) {\n this.i++\n return { type: 'unary', op: op as '-' | '+', arg: this.unary() }\n }\n return this.range()\n }\n private range(): Ast {\n let l = this.primary()\n while (this.isOp(':')) {\n this.i++\n l = { type: 'range', left: l, right: this.primary() }\n }\n return l\n }\n\n private primary(): Ast {\n const t = this.peek()\n if (!t) this.fail('unexpected end of formula')\n this.i++\n switch (t.t) {\n case 'num':\n return { type: 'num', value: t.v }\n case 'str':\n return { type: 'str', value: t.v }\n case 'bool':\n return { type: 'bool', value: t.v }\n case 'err':\n return { type: 'err', code: t.v }\n case 'ref':\n return { type: 'ref', ref: t.ref }\n case 'name':\n return t.sheet === undefined ? { type: 'name', name: t.v } : { type: 'name', name: t.v, sheet: t.sheet }\n case 'func': {\n this.expectPunc('(')\n return { type: 'call', name: t.v, args: this.args() }\n }\n case 'punc':\n if (t.v === '(') {\n const first = this.expr()\n if (!this.isPunc(',')) {\n this.expectPunc(')')\n return first\n }\n const items = [first]\n while (this.isPunc(',')) {\n this.i++\n items.push(this.expr())\n }\n this.expectPunc(')')\n return { type: 'union', items }\n }\n if (t.v === '{') return this.array()\n }\n this.i--\n return this.fail('unexpected token')\n }\n\n private args(): Ast[] {\n const args: Ast[] = []\n if (this.isPunc(')')) {\n this.i++\n return args\n }\n for (;;) {\n args.push(this.isPunc(',') || this.isPunc(')') ? { type: 'missing' } : this.expr())\n if (this.isPunc(')')) {\n this.i++\n return args\n }\n this.expectPunc(',')\n }\n }\n\n private array(): Ast {\n const rows: Value[][] = [[]]\n for (;;) {\n rows[rows.length - 1].push(this.arrayItem())\n const t = this.peek()\n if (!t || t.t !== 'punc') this.fail('bad array constant')\n this.i++\n if (t.v === '}') break\n if (t.v === ';') rows.push([])\n else if (t.v !== ',') this.fail('bad array constant')\n }\n if (rows.some((r) => r.length !== rows[0].length)) this.fail('array rows differ in length')\n return { type: 'array', rows }\n }\n private arrayItem(): Value {\n const sign = this.isOp('-', '+')\n if (sign) this.i++\n const t = this.peek()\n if (!t) this.fail('bad array constant')\n this.i++\n if (t.t === 'num') return sign === '-' ? -t.v : t.v\n if (sign) this.fail('bad array constant')\n if (t.t === 'str' || t.t === 'bool') return t.v\n if (t.t === 'err') return new FormulaError(t.v)\n this.i--\n return this.fail('bad array constant')\n }\n}\n\n/** Parse formula text (OOXML stored form, without '='; a leading '=' is tolerated). Throws FormulaSyntaxError. */\nexport function parseFormula(text: string): Ast {\n const src = text.startsWith('=') ? text.slice(1) : text\n const toks = tokenize(src).filter((t) => t.t !== 'ws')\n if (!toks.length) throw new FormulaSyntaxError('empty formula', 0)\n const p = new Parser(toks)\n const ast = p.expr()\n if (p.i < toks.length) throw new FormulaSyntaxError('unexpected token', toks[p.i].s)\n return ast\n}\n","/** Date serials (1900 system with the Lotus leap-year bug, or 1904), date/time text parsing, TEXT() formatting. */\n\nconst MS_DAY = 86400000\nconst EPOCH_1900 = Date.UTC(1899, 11, 30)\nconst EPOCH_1904 = Date.UTC(1904, 0, 1)\n\n/** Active date system for the evaluation in progress (set/restored by evaluate()). */\nlet date1904 = false\nexport function getDate1904(): boolean {\n return date1904\n}\nexport function setDate1904(v: boolean): void {\n date1904 = v\n}\n\nfunction utc(y: number, m: number, d: number): number {\n const t = new Date(0)\n t.setUTCFullYear(y, m - 1, d)\n return t.getTime()\n}\n\n/** Serial for y/m/d (m 1-based; month/day overflow normalized like DATE()). */\nexport function ymdToSerial(y: number, m: number, d: number): number {\n const t = utc(y, m, d)\n if (date1904) return Math.round((t - EPOCH_1904) / MS_DAY)\n const s = Math.round((t - EPOCH_1900) / MS_DAY)\n return s < 61 ? s - 1 : s\n}\n\nexport interface DateParts {\n y: number\n m: number\n d: number\n /** 0 = Sunday */\n dow: number\n}\n\nexport function serialToYmd(serial: number): DateParts {\n const n = Math.floor(serial)\n if (date1904) {\n const dt = new Date(EPOCH_1904 + n * MS_DAY)\n return { y: dt.getUTCFullYear(), m: dt.getUTCMonth() + 1, d: dt.getUTCDate(), dow: (((n + 5) % 7) + 7) % 7 }\n }\n const dow = (((n - 1) % 7) + 7) % 7\n if (n === 60) return { y: 1900, m: 2, d: 29, dow }\n if (n === 0) return { y: 1900, m: 1, d: 0, dow }\n const dt = new Date(EPOCH_1900 + (n < 60 ? n + 1 : n) * MS_DAY)\n return { y: dt.getUTCFullYear(), m: dt.getUTCMonth() + 1, d: dt.getUTCDate(), dow }\n}\n\n/** Seconds of the day (rounded to the nearest second). */\nexport function serialSeconds(serial: number): number {\n return Math.round((serial - Math.floor(serial)) * 86400) % 86400\n}\n\nexport function daysInMonth(y: number, m: number): number {\n return new Date(utc(y, m + 1, 0)).getUTCDate()\n}\n\n/** Serial of a JS Date using its local calendar components. */\nexport function dateToSerial(dt: Date): number {\n const day = ymdToSerial(dt.getFullYear(), dt.getMonth() + 1, dt.getDate())\n const secs = dt.getHours() * 3600 + dt.getMinutes() * 60 + dt.getSeconds() + dt.getMilliseconds() / 1000\n return day + secs / 86400\n}\n\nconst TIME_RE = /^(\\d{1,4}):(\\d{1,2})(?::(\\d{1,2}(?:\\.\\d+)?))?\\s*([ap]m?)?$/i\nconst ISO_RE = /^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})(?:[T\\s]+(.+))?$/i\nconst US_RE = /^(\\d{1,2})[-/](\\d{1,2})[-/](\\d{4}|\\d{2})(?:\\s+(.+))?$/\n\nfunction parseTime(s: string): number | null {\n const m = TIME_RE.exec(s.trim())\n if (!m) return null\n let h = Number(m[1])\n const mi = Number(m[2])\n const sec = m[3] ? Number(m[3]) : 0\n if (mi > 59 || sec >= 60) return null\n if (m[4]) {\n if (h < 1 || h > 12) return null\n const pm = m[4][0].toLowerCase() === 'p'\n h = (h % 12) + (pm ? 12 : 0)\n }\n return (h * 3600 + mi * 60 + sec) / 86400\n}\n\nfunction dateSerial(y: number, m: number, d: number): number | null {\n if (m < 1 || m > 12 || d < 1 || d > daysInMonth(y, m)) return null\n const s = ymdToSerial(y, m, d)\n return s < 0 ? null : s\n}\n\n/** Parse date/time text: `yyyy-mm-dd [time]`, `m/d/yyyy [time]`, `hh:mm[:ss] [AM/PM]`. */\nexport function parseDateText(s: string): number | null {\n let m = ISO_RE.exec(s)\n let day: number | null = null\n let rest: string | undefined\n if (m) {\n day = dateSerial(Number(m[1]), Number(m[2]), Number(m[3]))\n rest = m[4]\n } else if ((m = US_RE.exec(s))) {\n let y = Number(m[3])\n if (m[3].length === 2) y += y < 30 ? 2000 : 1900\n day = dateSerial(y, Number(m[1]), Number(m[2]))\n rest = m[4]\n } else return parseTime(s)\n if (day === null) return null\n if (rest === undefined) return day\n const t = parseTime(rest)\n return t === null ? null : day + t\n}\n\n// ---------------------------------------------------------------- TEXT()\n\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\nconst DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n\nexport function splitSections(fmt: string): string[] {\n const out: string[] = []\n let cur = ''\n let q = false\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt[i]\n if (c === '\\\\' && !q) {\n cur += c + (fmt[i + 1] ?? '')\n i++\n continue\n }\n if (c === '\"') q = !q\n if (c === ';' && !q) {\n out.push(cur)\n cur = ''\n } else cur += c\n }\n out.push(cur)\n return out\n}\n\n/** Strip quoted text, escapes and [..] blocks: used to classify a section. */\nfunction bare(sec: string): string {\n return sec.replace(/\"[^\"]*\"/g, '').replace(/\\\\./g, '').replace(/\\[[^\\]]*\\]/g, '').replace(/[_*]./g, '')\n}\n\nexport function isDateFormat(sec: string): boolean {\n return /[ymdhs]/i.test(bare(sec)) || /\\[(h+|m+|s+)\\]/i.test(sec)\n}\n\ntype DTok = { k: 'lit'; v: string } | { k: 'y' | 'M' | 'd' | 'h' | 'm' | 's' | 'H' | 'N' | 'S'; n: number } | { k: 'ap'; v: string }\n\nexport function formatDate(serial: number, sec: string): string {\n const toks: DTok[] = []\n for (let i = 0; i < sec.length; ) {\n const c = sec[i]\n const lc = c.toLowerCase()\n if (c === '\"') {\n const j = sec.indexOf('\"', i + 1)\n const end = j < 0 ? sec.length : j\n toks.push({ k: 'lit', v: sec.slice(i + 1, end) })\n i = end + 1\n } else if (c === '\\\\') {\n toks.push({ k: 'lit', v: sec[i + 1] ?? '' })\n i += 2\n } else if (c === '_') {\n toks.push({ k: 'lit', v: ' ' })\n i += 2\n } else if (c === '*') i += 2\n else if (c === '[') {\n const j = sec.indexOf(']', i)\n const inner = sec.slice(i + 1, j < 0 ? sec.length : j).toLowerCase()\n if (/^h+$/.test(inner)) toks.push({ k: 'H', n: inner.length })\n else if (/^m+$/.test(inner)) toks.push({ k: 'N', n: inner.length })\n else if (/^s+$/.test(inner)) toks.push({ k: 'S', n: inner.length })\n i = j < 0 ? sec.length : j + 1\n } else if (sec.slice(i, i + 5).toUpperCase() === 'AM/PM') {\n toks.push({ k: 'ap', v: sec.slice(i, i + 5) })\n i += 5\n } else if (sec.slice(i, i + 3).toUpperCase() === 'A/P') {\n toks.push({ k: 'ap', v: sec.slice(i, i + 3) })\n i += 3\n } else if ('ymdhs'.includes(lc)) {\n let j = i\n while (j < sec.length && sec[j].toLowerCase() === lc) j++\n toks.push({ k: lc === 'm' ? 'M' : (lc as 'y' | 'd' | 'h' | 's'), n: j - i })\n i = j\n } else {\n toks.push({ k: 'lit', v: c })\n i++\n }\n }\n // month vs minute: m after h / before s => minutes\n const parts = toks.filter((t) => t.k !== 'lit')\n parts.forEach((t, idx) => {\n if (t.k !== 'M' || t.n > 2) return\n const prev = parts[idx - 1]\n const next = parts[idx + 1]\n if ((prev && (prev.k === 'h' || prev.k === 'H')) || (next && (next.k === 's' || next.k === 'S'))) (t as { k: string }).k = 'm'\n })\n const hasAp = toks.some((t) => t.k === 'ap')\n let day = Math.floor(serial)\n let secs = Math.round((serial - day) * 86400)\n if (secs >= 86400) {\n day++\n secs -= 86400\n }\n const p = serialToYmd(day)\n const H = Math.floor(secs / 3600)\n const N = Math.floor((secs % 3600) / 60)\n const S = secs % 60\n const pad = (v: number, n: number) => String(v).padStart(n, '0')\n let out = ''\n for (const t of toks) {\n switch (t.k) {\n case 'lit':\n out += t.v\n break\n case 'y':\n out += t.n <= 2 ? pad(p.y % 100, 2) : pad(p.y, 4)\n break\n case 'M':\n out += t.n === 1 ? p.m : t.n === 2 ? pad(p.m, 2) : t.n === 3 ? MONTHS[p.m - 1].slice(0, 3) : t.n === 4 ? MONTHS[p.m - 1] : MONTHS[p.m - 1][0]\n break\n case 'd':\n out += t.n === 1 ? p.d : t.n === 2 ? pad(p.d, 2) : t.n === 3 ? DAYS[p.dow].slice(0, 3) : DAYS[p.dow]\n break\n case 'h': {\n const h = hasAp ? H % 12 || 12 : H\n out += t.n >= 2 ? pad(h, 2) : h\n break\n }\n case 'm':\n out += t.n >= 2 ? pad(N, 2) : N\n break\n case 's':\n out += t.n >= 2 ? pad(S, 2) : S\n break\n case 'H':\n out += pad(day * 24 + H, t.n)\n break\n case 'N':\n out += pad((day * 24 + H) * 60 + N, t.n)\n break\n case 'S':\n out += pad(((day * 24 + H) * 60 + N) * 60 + S, t.n)\n break\n case 'ap': {\n const am = H < 12\n const full = t.v.length === 5\n const src = full ? (am ? t.v.slice(0, 2) : t.v.slice(3, 5)) : am ? t.v[0] : t.v[2]\n out += src\n break\n }\n }\n }\n return out\n}\n","/** Runtime values (references, arrays), coercions, comparison, wildcard & criteria matching. */\nimport { parseDateText } from './dates'\nimport { ERR, ERROR_CODES, FormulaError, type ErrorCode, type Value } from './types'\n\n/** Reference to a rectangular block of cells (0-based inclusive). */\nexport class RangeV {\n constructor(\n readonly sheet: string | undefined,\n readonly r0: number,\n readonly c0: number,\n readonly r1: number,\n readonly c1: number,\n ) {}\n get h(): number {\n return this.r1 - this.r0 + 1\n }\n get w(): number {\n return this.c1 - this.c0 + 1\n }\n}\n\n/** In-memory array (array constants and array-evaluated results). Always at least 1x1. */\nexport class ArrayV {\n constructor(readonly data: Value[][]) {}\n get h(): number {\n return this.data.length\n }\n get w(): number {\n return this.data[0]?.length ?? 0\n }\n}\n\n/** Multi-area reference `(A1:B2,D4)`. */\nexport class UnionV {\n constructor(readonly areas: RangeV[]) {}\n}\n\nexport type Val = Value | RangeV | ArrayV | UnionV\n\nexport const isErr = (v: unknown): v is FormulaError => v instanceof FormulaError\n\n// ---------------------------------------------------------------- numbers <-> text\n\nconst NUM_RE = /^([+-])?\\s*\\$?\\s*((?:\\d{1,3}(?:,\\d{3})+|\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*(%?)$/\n\n/** Numeric text -> number (plain, 1,234.5, 50%, $3, 1E3, dates, times); null when not numeric. */\nexport function parseNumberText(s: string): number | null {\n const t = s.trim()\n if (!t) return null\n const m = NUM_RE.exec(t)\n if (m && /\\d/.test(m[2])) {\n const n = Number(m[2].replace(/,/g, ''))\n if (!Number.isNaN(n)) return ((m[1] === '-' ? -n : n) / (m[3] ? 100 : 1))\n }\n return parseDateText(t)\n}\n\n/** Excel \"General\" text of a number (15 significant digits). */\nexport function numToText(n: number): string {\n if (!Number.isFinite(n)) return '#NUM!'\n if (n === 0) return '0'\n const [mant, ex] = Math.abs(n).toExponential(14).split('e')\n const e = Number(ex)\n const digits = mant.replace('.', '').replace(/0+$/, '')\n const sign = n < 0 ? '-' : ''\n if (e >= 15 || e < -9) {\n const m = digits[0] + (digits.length > 1 ? `.${digits.slice(1)}` : '')\n return `${sign}${m}E${e < 0 ? '-' : '+'}${String(Math.abs(e)).padStart(2, '0')}`\n }\n if (e < 0) return `${sign}0.${'0'.repeat(-e - 1)}${digits}`\n const int = digits.slice(0, e + 1).padEnd(e + 1, '0')\n const frac = digits.slice(e + 1)\n return sign + int + (frac ? `.${frac}` : '')\n}\n\n// ---------------------------------------------------------------- coercion (non-throwing)\n\nexport function toNum(v: Value): number | FormulaError {\n if (typeof v === 'number') return v\n if (v === null) return 0\n if (typeof v === 'boolean') return v ? 1 : 0\n if (typeof v === 'string') {\n const n = parseNumberText(v)\n return n === null ? ERR.VALUE : n\n }\n return v\n}\n\nexport function toStr(v: Value): string | FormulaError {\n if (typeof v === 'string') return v\n if (typeof v === 'number') return numToText(v)\n if (v === null) return ''\n if (typeof v === 'boolean') return v ? 'TRUE' : 'FALSE'\n return v\n}\n\nexport function toBool(v: Value): boolean | FormulaError {\n if (typeof v === 'boolean') return v\n if (typeof v === 'number') return v !== 0\n if (v === null) return false\n if (typeof v === 'string') {\n const u = v.toUpperCase()\n return u === 'TRUE' ? true : u === 'FALSE' ? false : ERR.VALUE\n }\n return v\n}\n\n// ---------------------------------------------------------------- coercion (throwing; used inside functions)\n\nexport function num(v: Value): number {\n const n = toNum(v)\n if (n instanceof FormulaError) throw n\n return n\n}\nexport function int(v: Value): number {\n return Math.trunc(num(v))\n}\nexport function str(v: Value): string {\n const s = toStr(v)\n if (s instanceof FormulaError) throw s\n return s\n}\nexport function bool(v: Value): boolean {\n const b = toBool(v)\n if (b instanceof FormulaError) throw b\n return b\n}\n/** Throw if v is an error, else return it. */\nexport function check<T extends Value>(v: T): Exclude<T, FormulaError> {\n if (v instanceof FormulaError) throw v\n return v as Exclude<T, FormulaError>\n}\n\n// ---------------------------------------------------------------- comparison\n\nexport function numEq(a: number, b: number): boolean {\n return a === b || Math.abs(a - b) <= Math.max(Math.abs(a), Math.abs(b)) * 1e-15\n}\n\nconst rank = (v: number | string | boolean) => (typeof v === 'number' ? 0 : typeof v === 'string' ? 1 : 2)\n\n/** Excel ordering: numbers < text < booleans; text case-insensitive; empty adopts the other side's type. Errors not allowed. */\nexport function compare(a: Value, b: Value): number {\n if (a === null) a = typeof b === 'string' ? '' : typeof b === 'boolean' ? false : 0\n if (b === null) b = typeof a === 'string' ? '' : typeof a === 'boolean' ? false : 0\n if (a instanceof FormulaError || b instanceof FormulaError) return 0\n const ra = rank(a)\n const rb = rank(b)\n if (ra !== rb) return ra < rb ? -1 : 1\n if (typeof a === 'number') {\n const y = b as number\n return numEq(a, y) ? 0 : a < y ? -1 : 1\n }\n if (typeof a === 'string') {\n const x = a.toLowerCase()\n const y = (b as string).toLowerCase()\n return x < y ? -1 : x > y ? 1 : 0\n }\n return (a ? 1 : 0) - (b ? 1 : 0)\n}\n\n/** Lookup equality: same type, text case-insensitive. */\nexport function valueEq(a: Value, b: Value): boolean {\n if (a === null || b === null) return a === b\n if (a instanceof FormulaError || b instanceof FormulaError) return false\n return typeof a === typeof b && compare(a, b) === 0\n}\n\n// ---------------------------------------------------------------- wildcards & criteria\n\nexport const hasWildcard = (s: string) => /[*?~]/.test(s)\n\nexport function wildcardRe(pat: string, anchored = true): RegExp {\n let re = ''\n for (let i = 0; i < pat.length; i++) {\n const ch = pat[i]\n if (ch === '~' && i + 1 < pat.length && '*?~'.includes(pat[i + 1])) re += `\\\\${pat[++i]}`\n else if (ch === '*') re += '[\\\\s\\\\S]*'\n else if (ch === '?') re += '[\\\\s\\\\S]'\n else re += ch.replace(/[.*+?^${}()|[\\]\\\\/]/g, '\\\\$&')\n }\n return new RegExp(anchored ? `^${re}$` : re, 'i')\n}\n\nexport type Matcher = (v: Value) => boolean\n\nfunction cmpOp(op: string, c: number): boolean {\n switch (op) {\n case '<':\n return c < 0\n case '<=':\n return c <= 0\n case '>':\n return c > 0\n case '>=':\n return c >= 0\n case '<>':\n return c !== 0\n default:\n return c === 0\n }\n}\n\nconst errCode = (s: string): ErrorCode | undefined => ERROR_CODES.find((c) => c === s.toUpperCase())\n\n/** Criteria of COUNTIF/SUMIF/...: \"<5\", \">=10\", \"<>x\", \"=abc\", \"a*c\", 3, TRUE, \"\" (blank). */\nexport function criteria(crit: Value): Matcher {\n if (crit instanceof FormulaError) {\n const code = crit.code\n return (v) => v instanceof FormulaError && v.code === code\n }\n if (crit === null) crit = 0\n if (typeof crit === 'number') {\n const n = crit\n return (v) => (typeof v === 'number' && numEq(v, n)) || (typeof v === 'string' && parseNumberText(v) === n)\n }\n if (typeof crit === 'boolean') {\n const b = crit\n return (v) => v === b\n }\n const m = /^(<=|>=|<>|<|>|=)?([\\s\\S]*)$/.exec(crit)!\n const op = m[1] ?? ''\n const rest = m[2]\n const eq = op === '' || op === '='\n if (rest === '') {\n if (op === '') return (v) => v === null || v === ''\n if (op === '=') return (v) => v === null\n if (op === '<>') return (v) => v !== null && v !== ''\n return () => false\n }\n const n = parseNumberText(rest)\n if (n !== null) {\n if (eq) return (v) => (typeof v === 'number' && numEq(v, n)) || (typeof v === 'string' && parseNumberText(v) === n)\n if (op === '<>') return (v) => !(typeof v === 'number' && numEq(v, n))\n return (v) => typeof v === 'number' && cmpOp(op, compare(v, n))\n }\n const up = rest.toUpperCase()\n if (up === 'TRUE' || up === 'FALSE') {\n const b = up === 'TRUE'\n if (eq) return (v) => v === b\n if (op === '<>') return (v) => v !== b\n return (v) => typeof v === 'boolean' && cmpOp(op, compare(v, b))\n }\n const ec = errCode(rest)\n if (ec) {\n const hit = (v: Value) => v instanceof FormulaError && v.code === ec\n return op === '<>' ? (v) => !hit(v) : (v) => hit(v)\n }\n if (eq || op === '<>') {\n const re = wildcardRe(rest)\n const hit = (v: Value) => typeof v === 'string' && re.test(v)\n return op === '<>' ? (v) => !hit(v) : hit\n }\n return (v) => typeof v === 'string' && cmpOp(op, compare(v, rest))\n}\n","/** Function-definition plumbing: evaluator interface, arity, array lifting, argument visitors. */\nimport type { Ast } from './parser'\nimport { ERR, FormulaError, type Value } from './types'\nimport { ArrayV, RangeV, UnionV, toNum, type Val } from './values'\n\n/** What a function implementation may ask of the evaluator. */\nexport interface Ev {\n readonly sheet: string | undefined\n /** 0-based formula cell position */\n readonly r: number\n readonly c: number\n eval(ast: Ast, top: boolean): Val\n cell(sheet: string | undefined, r: number, c: number): Value\n /** visit cells of a range (whole-row/col ranges clipped to the provider's bounds) */\n forEach(rg: RangeV, cb: (v: Value, i: number, j: number) => void): void\n /** 2-D values of a range/array/scalar (clipped like forEach); unions -> #VALUE! thrown */\n toArray(v: Val): Value[][]\n /** single value: 1x1 range -> cell, larger range -> implicit intersection, array -> top-left */\n scalar(v: Val): Value\n /** operator operand: scalar, or 2-D data when array-evaluated (top=false) */\n operand(v: Val, top: boolean): Value | Value[][]\n hasSheet(name: string): boolean\n now(): Date\n}\n\nexport type EagerFn = (args: Val[], ev: Ev, top: boolean) => Val\nexport type LazyFn = (args: Ast[], ev: Ev, top: boolean) => Val\n\nexport type FnDef =\n /** args evaluated first; `scalarArgs` => args inherit the caller's top-level (implicit intersection) context */\n | { kind: 'eager'; min: number; max: number; scalarArgs: boolean; fn: EagerFn }\n /** receives unevaluated args (IF, IFERROR, CHOOSE, ...) */\n | { kind: 'lazy'; min: number; max: number; fn: LazyFn }\n\nexport const INF = Number.POSITIVE_INFINITY\n\n/** Run f, converting a thrown FormulaError into a value. */\nexport function guard<T>(f: () => T): T | FormulaError {\n try {\n return f()\n } catch (e) {\n if (e instanceof FormulaError) return e\n throw e\n }\n}\n\n/** Pick (i,j) from 2-D data with 1-row/1-col broadcasting; out of shape -> #N/A. */\nexport function pick(d: Value[][], i: number, j: number): Value {\n const r = d.length === 1 ? 0 : i\n const c = d[0].length === 1 ? 0 : j\n return r < d.length && c < d[0].length ? d[r][c] : ERR.NA\n}\n\n/**\n * Scalar function, lifted element-wise over array arguments (array formulas / SUMPRODUCT(LEN(A1:A3))).\n * At the formula top level a multi-cell range argument is implicitly intersected instead.\n */\nexport function S(min: number, max: number, f: (a: Value[], ev: Ev) => Value): FnDef {\n return {\n kind: 'eager',\n min,\n max,\n scalarArgs: true,\n fn: (args, ev, top) => {\n let h = 1\n let w = 1\n let lifted = false\n const xs = args.map((a): Value | Value[][] => {\n if (a instanceof RangeV) {\n if (a.h === 1 && a.w === 1) return ev.cell(a.sheet, a.r0, a.c0)\n if (top) return ev.scalar(a)\n } else if (a instanceof ArrayV) {\n if (a.h === 1 && a.w === 1) return a.data[0][0]\n } else if (a instanceof UnionV) return ERR.VALUE\n else return a\n const d = ev.toArray(a)\n lifted = true\n h = Math.max(h, d.length)\n w = Math.max(w, d[0].length)\n return d\n })\n if (!lifted) return guard(() => f(xs as Value[], ev))\n const out: Value[][] = []\n for (let i = 0; i < h; i++) {\n const row: Value[] = []\n for (let j = 0; j < w; j++) {\n const vals = xs.map((x) => (Array.isArray(x) ? pick(x, i, j) : x))\n row.push(guard(() => f(vals, ev)))\n }\n out.push(row)\n }\n return new ArrayV(out)\n },\n }\n}\n\n/** Function taking ranges/arrays as-is (args evaluated in array context). */\nexport function A(min: number, max: number, fn: EagerFn): FnDef {\n return { kind: 'eager', min, max, scalarArgs: false, fn }\n}\n\n/** Lazy function (receives ASTs). */\nexport function L(min: number, max: number, fn: LazyFn): FnDef {\n return { kind: 'lazy', min, max, fn }\n}\n\n/** Visit every value of an argument: cells/array items via `inRange`, direct scalars via `direct`. */\nexport function visit(a: Val, ev: Ev, inRange: (v: Value) => void, direct: (v: Value) => void): void {\n if (a instanceof RangeV) ev.forEach(a, inRange)\n else if (a instanceof UnionV) for (const r of a.areas) ev.forEach(r, inRange)\n else if (a instanceof ArrayV) for (const row of a.data) for (const v of row) inRange(v)\n else direct(a)\n}\n\n/** Numbers of aggregate args: ranges contribute numbers only, direct scalars coerce; errors throw. */\nexport function eachNum(args: Val[], ev: Ev, cb: (n: number) => void): void {\n for (const a of args)\n visit(\n a,\n ev,\n (v) => {\n if (typeof v === 'number') cb(v)\n else if (v instanceof FormulaError) throw v\n },\n (v) => {\n const n = toNum(v)\n if (n instanceof FormulaError) throw n\n cb(n)\n },\n )\n}\n\nexport function nums(args: Val[], ev: Ev): number[] {\n const out: number[] = []\n eachNum(args, ev, (n) => out.push(n))\n return out\n}\n\n/** Flatten a range/array to a row-major list. */\nexport function flat(d: Value[][]): Value[] {\n return d.length === 1 ? d[0] : d.flat()\n}\n\n/** Optional numeric arg i (missing argument => 0 like Excel; absent => def). */\nexport function opt(a: Value[], i: number, def: number): number {\n if (a.length <= i) return def\n const n = toNum(a[i])\n if (n instanceof FormulaError) throw n\n return n\n}\n","/** Date & time functions (serial numbers; 1900 system with Lotus bug or 1904). */\nimport { dateToSerial, daysInMonth, serialSeconds, serialToYmd, ymdToSerial } from './dates'\nimport { A, nums, opt, S, type FnDef } from './fn'\nimport { ERR, type Value } from './types'\nimport { num, str } from './values'\n\nfunction serial(v: Value): number {\n const n = num(v)\n if (n < 0) throw ERR.NUM\n return n\n}\nconst day = (v: Value) => Math.floor(serial(v))\n\nfunction addMonths(start: number, months: number, eom: boolean): number {\n const p = serialToYmd(start)\n const total = p.y * 12 + (p.m - 1) + Math.trunc(months)\n const y = Math.floor(total / 12)\n const m = (total % 12) + 1\n const d = eom ? daysInMonth(y, m) : Math.min(p.d, daysInMonth(y, m))\n const s = ymdToSerial(y, m, d)\n if (s < 0) throw ERR.NUM\n return s\n}\n\nconst WEEKDAY_START: Record<number, [number, number]> = {\n // type: [day the week starts on (0=Sun), number of the first day]\n 1: [0, 1],\n 2: [1, 1],\n 3: [1, 0],\n 11: [1, 1],\n 12: [2, 1],\n 13: [3, 1],\n 14: [4, 1],\n 15: [5, 1],\n 16: [6, 1],\n 17: [0, 1],\n}\n\nfunction datedif(s: number, e: number, unit: string): number {\n if (s > e) throw ERR.NUM\n const a = serialToYmd(s)\n const b = serialToYmd(e)\n const months = (b.y - a.y) * 12 + (b.m - a.m) - (b.d < a.d ? 1 : 0)\n switch (unit.toUpperCase()) {\n case 'D':\n return e - s\n case 'M':\n return months\n case 'Y':\n return Math.floor(months / 12)\n case 'YM':\n return months % 12\n case 'MD': {\n if (b.d >= a.d) return b.d - a.d\n const pm = b.m === 1 ? 12 : b.m - 1\n const py = b.m === 1 ? b.y - 1 : b.y\n return daysInMonth(py, pm) - a.d + b.d\n }\n case 'YD': {\n let anniv = ymdToSerial(b.y, a.m, Math.min(a.d, daysInMonth(b.y, a.m)))\n if (anniv > e) anniv = ymdToSerial(b.y - 1, a.m, Math.min(a.d, daysInMonth(b.y - 1, a.m)))\n return e - anniv\n }\n }\n throw ERR.NUM\n}\n\nfunction networkdays(s: number, e: number, holidays: Set<number>): number {\n const sign = s <= e ? 1 : -1\n const [lo, hi] = s <= e ? [s, e] : [e, s]\n let n = 0\n for (let d = lo; d <= hi; d++) {\n const dow = serialToYmd(d).dow\n if (dow !== 0 && dow !== 6 && !holidays.has(d)) n++\n }\n return sign * n\n}\n\nexport const DATE: Record<string, FnDef> = {\n TODAY: A(0, 0, (_a, ev) => Math.floor(dateToSerial(ev.now()))),\n NOW: A(0, 0, (_a, ev) => dateToSerial(ev.now())),\n DATE: S(3, 3, ([y, m, d]) => {\n let yy = Math.trunc(num(y))\n if (yy >= 0 && yy < 1900) yy += 1900\n if (yy < 0 || yy > 9999) throw ERR.NUM\n const s = ymdToSerial(yy, Math.trunc(num(m)), Math.trunc(num(d)))\n if (s < 0) throw ERR.NUM\n return s\n }),\n TIME: S(3, 3, ([h, m, s]) => {\n const t = Math.trunc(num(h)) * 3600 + Math.trunc(num(m)) * 60 + Math.trunc(num(s))\n if (t < 0) throw ERR.NUM\n return (t % 86400) / 86400\n }),\n YEAR: S(1, 1, ([x]) => serialToYmd(day(x)).y),\n MONTH: S(1, 1, ([x]) => serialToYmd(day(x)).m),\n DAY: S(1, 1, ([x]) => serialToYmd(day(x)).d),\n HOUR: S(1, 1, ([x]) => Math.floor(serialSeconds(serial(x)) / 3600)),\n MINUTE: S(1, 1, ([x]) => Math.floor((serialSeconds(serial(x)) % 3600) / 60)),\n SECOND: S(1, 1, ([x]) => serialSeconds(serial(x)) % 60),\n WEEKDAY: S(1, 2, (a) => {\n const dow = serialToYmd(day(a[0])).dow\n const spec = WEEKDAY_START[Math.trunc(opt(a, 1, 1))]\n if (!spec) throw ERR.NUM\n return ((dow - spec[0] + 7) % 7) + spec[1]\n }),\n EDATE: S(2, 2, ([s, m]) => addMonths(day(s), num(m), false)),\n EOMONTH: S(2, 2, ([s, m]) => addMonths(day(s), num(m), true)),\n DATEDIF: S(3, 3, ([s, e, u]) => datedif(day(s), day(e), str(u))),\n DAYS: S(2, 2, ([e, s]) => Math.floor(num(e)) - Math.floor(num(s))),\n NETWORKDAYS: A(2, 3, (a, ev) => {\n const hol = new Set(a.length > 2 ? nums([a[2]], ev).map(Math.floor) : [])\n return networkdays(day(ev.scalar(a[0])), day(ev.scalar(a[1])), hol)\n }),\n}\n","/** Logical and information functions. */\nimport { A, INF, L, pick, S, visit, type Ev, type FnDef } from './fn'\nimport type { Ast } from './parser'\nimport { ERR, ERROR_CODES, FormulaError, type Value } from './types'\nimport { ArrayV, bool, compare, int, num, toBool, valueEq, type Val } from './values'\n\n/** Evaluate an argument of a pass-through function (missing => 0). */\nconst arg = (a: Ast, ev: Ev, top: boolean): Val => (a.type === 'missing' ? 0 : ev.eval(a, top))\n\nfunction logicals(args: Val[], ev: Ev): boolean[] {\n const out: boolean[] = []\n for (const a of args)\n visit(\n a,\n ev,\n (v) => {\n if (typeof v === 'boolean') out.push(v)\n else if (typeof v === 'number') out.push(v !== 0)\n else if (v instanceof FormulaError) throw v\n },\n (v) => out.push(bool(v)),\n )\n if (!out.length) throw ERR.VALUE\n return out\n}\n\n/** IF; element-wise when the condition is an array (array formulas). */\nconst IF = L(2, 3, (a, ev, top) => {\n const cond = ev.operand(ev.eval(a[0], top), top)\n const thenA = a[1]\n const elseA = a[2] as Ast | undefined\n if (!Array.isArray(cond)) {\n const b = toBool(cond)\n if (b instanceof FormulaError) return b\n if (b) return arg(thenA, ev, top)\n return elseA ? arg(elseA, ev, top) : false\n }\n const t = ev.operand(arg(thenA, ev, false), false)\n const f = elseA ? ev.operand(arg(elseA, ev, false), false) : false\n const out = cond.map((row, i) =>\n row.map((c, j): Value => {\n const b = toBool(c)\n if (b instanceof FormulaError) return b\n const src = b ? t : f\n return Array.isArray(src) ? pick(src, i, j) : src\n }),\n )\n return new ArrayV(out)\n})\n\n/** IFERROR / IFNA; element-wise over arrays. */\nfunction iferror(naOnly: boolean) {\n return L(2, 2, (a, ev, top) => {\n const raw = ev.eval(a[0], top)\n const v = ev.operand(raw, top)\n const hit = (x: Value) => x instanceof FormulaError && (!naOnly || x.code === '#N/A')\n if (Array.isArray(v)) {\n if (!v.some((row) => row.some(hit))) return raw\n const alt = ev.scalar(arg(a[1], ev, false))\n return new ArrayV(v.map((row) => row.map((x) => (hit(x) ? alt : x))))\n }\n return hit(v) ? arg(a[1], ev, top) : v\n })\n}\n\nexport const LOGIC: Record<string, FnDef> = {\n IF,\n IFS: L(2, INF, (a, ev, top) => {\n if (a.length % 2) return ERR.VALUE\n for (let i = 0; i < a.length; i += 2) {\n const c = ev.scalar(ev.eval(a[i], top))\n if (c instanceof FormulaError) return c\n if (bool(c)) return arg(a[i + 1], ev, top)\n }\n return ERR.NA\n }),\n IFERROR: iferror(false),\n IFNA: iferror(true),\n AND: A(1, INF, (a, ev) => logicals(a, ev).every(Boolean)),\n OR: A(1, INF, (a, ev) => logicals(a, ev).some(Boolean)),\n XOR: A(1, INF, (a, ev) => logicals(a, ev).filter(Boolean).length % 2 === 1),\n NOT: S(1, 1, ([x]) => !bool(x)),\n TRUE: A(0, 0, () => true),\n FALSE: A(0, 0, () => false),\n SWITCH: L(3, INF, (a, ev, top) => {\n const x = ev.scalar(ev.eval(a[0], top))\n if (x instanceof FormulaError) return x\n let i = 1\n for (; i + 1 < a.length; i += 2) {\n const v = ev.scalar(arg(a[i], ev, top))\n if (v instanceof FormulaError) return v\n if (valueEq(x, v) || (x === null && compare(x, v) === 0)) return arg(a[i + 1], ev, top)\n }\n return i < a.length ? arg(a[i], ev, top) : ERR.NA\n }),\n CHOOSE: L(2, INF, (a, ev, top) => {\n const i = int(ev.scalar(ev.eval(a[0], top)))\n if (i < 1 || i >= a.length) return ERR.VALUE\n return arg(a[i], ev, top)\n }),\n\n ISBLANK: S(1, 1, ([x]) => x === null),\n ISNUMBER: S(1, 1, ([x]) => typeof x === 'number'),\n ISTEXT: S(1, 1, ([x]) => typeof x === 'string'),\n ISNONTEXT: S(1, 1, ([x]) => typeof x !== 'string'),\n ISLOGICAL: S(1, 1, ([x]) => typeof x === 'boolean'),\n ISERROR: S(1, 1, ([x]) => x instanceof FormulaError),\n ISERR: S(1, 1, ([x]) => x instanceof FormulaError && x.code !== '#N/A'),\n ISNA: S(1, 1, ([x]) => x instanceof FormulaError && x.code === '#N/A'),\n ISEVEN: S(1, 1, ([x]) => Math.trunc(num(x)) % 2 === 0),\n ISODD: S(1, 1, ([x]) => Math.abs(Math.trunc(num(x))) % 2 === 1),\n NA: A(0, 0, () => ERR.NA),\n 'ERROR.TYPE': S(1, 1, ([x]) => (x instanceof FormulaError ? ERROR_CODES.indexOf(x.code) + 1 : ERR.NA)),\n N: S(1, 1, ([x]) => {\n if (x instanceof FormulaError) return x\n return typeof x === 'number' ? x : typeof x === 'boolean' ? (x ? 1 : 0) : 0\n }),\n T: S(1, 1, ([x]) => (x instanceof FormulaError ? x : typeof x === 'string' ? x : '')),\n}\n","/** Lookup & reference functions. */\nimport { A, flat, type Ev, type FnDef } from './fn'\nimport { parseRefText } from './lexer'\nimport type { RefAddr } from './refs'\nimport { ERR, FormulaError, MAX_COL, MAX_ROW, type Value } from './types'\nimport { ArrayV, bool, compare, hasWildcard, int, num, RangeV, str, UnionV, valueEq, wildcardRe, type Val } from './values'\n\n/** Index of the first exact match (case-insensitive; wildcards when `wild` and x is text), -1 if none. */\nfunction findExact(list: Value[], x: Value, wild: boolean): number {\n if (wild && typeof x === 'string' && hasWildcard(x)) {\n const re = wildcardRe(x)\n return list.findIndex((v) => typeof v === 'string' && re.test(v))\n }\n return list.findIndex((v) => valueEq(v, x))\n}\n\n/**\n * Approximate match on sorted data. dir=1: last value <= x (ascending); dir=-1: last value >= x (descending).\n * Values of another type are skipped, like Excel's binary search on well-formed data.\n */\nfunction findApprox(list: Value[], x: Value, dir: 1 | -1): number {\n let best = -1\n for (let i = 0; i < list.length; i++) {\n const v = list[i]\n if (v === null || v instanceof FormulaError || typeof v !== typeof x) continue\n const c = compare(v, x)\n if (dir === 1 ? c <= 0 : c >= 0) best = i\n else break\n }\n return best\n}\n\nfunction lookupValue(v: Val, ev: Ev): Value {\n const x = ev.scalar(v)\n if (x instanceof FormulaError) throw x\n return x\n}\n\nfunction grid(v: Val, ev: Ev): Value[][] {\n if (v instanceof UnionV) throw ERR.VALUE\n return ev.toArray(v)\n}\n\nfunction vhlookup(a: Val[], ev: Ev, vertical: boolean): Value {\n const x = lookupValue(a[0], ev)\n const d = grid(a[1], ev)\n const idx = int(ev.scalar(a[2]))\n const approx = a.length > 3 ? bool(ev.scalar(a[3])) : true\n const size = vertical ? d[0].length : d.length\n if (idx < 1) throw ERR.VALUE\n if (idx > size) throw ERR.REF\n const keys = vertical ? d.map((row) => row[0]) : d[0]\n const i = approx ? findApprox(keys, x, 1) : findExact(keys, x, true)\n if (i < 0) throw ERR.NA\n return vertical ? d[i][idx - 1] : d[idx - 1][i]\n}\n\nfunction match(a: Val[], ev: Ev): number {\n const x = lookupValue(a[0], ev)\n const d = grid(a[1], ev)\n if (d.length > 1 && d[0].length > 1) throw ERR.NA\n const list = flat(d)\n const type = a.length > 2 ? Math.sign(num(ev.scalar(a[2]))) : 1\n const i = type === 0 ? findExact(list, x, true) : findApprox(list, x, type as 1 | -1)\n if (i < 0) throw ERR.NA\n return i + 1\n}\n\n/** Row i (vertical) or column i of a range/array, as a reference when possible. */\nfunction slice(v: Val, d: Value[][], i: number, vertical: boolean): Val {\n if (v instanceof RangeV)\n return vertical ? new RangeV(v.sheet, v.r0 + i, v.c0, v.r0 + i, v.c1) : new RangeV(v.sheet, v.r0, v.c0 + i, v.r1, v.c0 + i)\n const out = vertical ? [d[i]] : d.map((row) => [row[i]])\n return out[0].length === 1 && out.length === 1 ? out[0][0] : new ArrayV(out)\n}\n\nfunction xlookup(a: Val[], ev: Ev): Val {\n const x = lookupValue(a[0], ev)\n const look = grid(a[1], ev)\n const ret = grid(a[2], ev)\n const vertical = look[0].length === 1\n if (!vertical && look.length !== 1) throw ERR.VALUE\n if (vertical ? ret.length !== look.length : ret[0].length !== look[0].length) throw ERR.VALUE\n const notFound = a.length > 3 && a[3] !== null ? a[3] : undefined\n const mode = a.length > 4 ? int(ev.scalar(a[4])) : 0\n const search = a.length > 5 ? int(ev.scalar(a[5])) : 1\n let list = flat(look)\n const rev = search < 0\n if (rev) list = [...list].reverse()\n let i = -1\n if (mode === 0 || mode === 2) i = findExact(list, x, mode === 2)\n else if (mode === 1 || mode === -1) {\n i = findExact(list, x, false)\n if (i < 0) {\n // next larger (1) / next smaller (-1)\n let best: Value = null\n for (let k = 0; k < list.length; k++) {\n const v = list[k]\n if (v === null || v instanceof FormulaError || typeof v !== typeof x) continue\n const c = compare(v, x)\n if (mode === 1 ? c > 0 && (best === null || compare(v, best) < 0) : c < 0 && (best === null || compare(v, best) > 0)) {\n best = v\n i = k\n }\n }\n }\n } else throw ERR.VALUE\n if (i < 0) {\n if (notFound !== undefined) return notFound\n throw ERR.NA\n }\n if (rev) i = list.length - 1 - i\n return slice(a[2], ret, i, vertical)\n}\n\nfunction lookup(a: Val[], ev: Ev): Value {\n const x = lookupValue(a[0], ev)\n const d = grid(a[1], ev)\n let keys: Value[]\n let vals: Value[]\n if (a.length > 2) {\n keys = flat(d)\n vals = flat(grid(a[2], ev))\n } else if (d[0].length > d.length) {\n keys = d[0]\n vals = d[d.length - 1]\n } else {\n keys = d.map((r) => r[0])\n vals = d.map((r) => r[r.length - 1])\n }\n const i = findApprox(keys, x, 1)\n if (i < 0 || i >= vals.length) throw ERR.NA\n return vals[i]\n}\n\nfunction index(a: Val[], ev: Ev): Val {\n let src = a[0]\n if (src instanceof UnionV) {\n const k = a.length > 3 ? int(ev.scalar(a[3])) : 1\n if (k < 1 || k > src.areas.length) throw ERR.REF\n src = src.areas[k - 1]\n }\n const h = src instanceof RangeV || src instanceof ArrayV ? src.h : 1\n const w = src instanceof RangeV || src instanceof ArrayV ? src.w : 1\n let r = int(ev.scalar(a[1]))\n let c: number\n if (a.length > 2) c = int(ev.scalar(a[2]))\n else if (h === 1) [r, c] = [1, r]\n else if (w === 1) c = 1\n else c = 0\n if (r < 0 || c < 0 || r > h || c > w) throw ERR.REF\n if (src instanceof RangeV) {\n const [r0, r1] = r ? [src.r0 + r - 1, src.r0 + r - 1] : [src.r0, src.r1]\n const [c0, c1] = c ? [src.c0 + c - 1, src.c0 + c - 1] : [src.c0, src.c1]\n return new RangeV(src.sheet, r0, c0, r1, c1)\n }\n if (src instanceof ArrayV) {\n const rows = r ? [src.data[r - 1]] : src.data\n const out = rows.map((row) => (c ? [row[c - 1]] : row))\n return out.length === 1 && out[0].length === 1 ? out[0][0] : new ArrayV(out)\n }\n return src\n}\n\nfunction offset(a: Val[], ev: Ev): Val {\n const ref = a[0]\n if (!(ref instanceof RangeV)) throw ERR.VALUE\n const dr = int(ev.scalar(a[1]))\n const dc = int(ev.scalar(a[2]))\n const h = a.length > 3 && a[3] !== null ? int(ev.scalar(a[3])) : ref.h\n const w = a.length > 4 && a[4] !== null ? int(ev.scalar(a[4])) : ref.w\n if (h === 0 || w === 0) throw ERR.REF\n let r0 = ref.r0 + dr\n let c0 = ref.c0 + dc\n let r1 = r0 + h - 1\n let c1 = c0 + w - 1\n if (h < 0) [r0, r1] = [r0 + h + 1, r0]\n if (w < 0) [c0, c1] = [c0 + w + 1, c0]\n if (r0 < 0 || c0 < 0 || r1 > MAX_ROW || c1 > MAX_COL) throw ERR.REF\n return new RangeV(ref.sheet, r0, c0, r1, c1)\n}\n\n/** R1C1 text (absolute R2C3 or relative R[1]C[-1]) relative to the formula cell. */\nfunction parseR1C1(text: string, ev: Ev): RefAddr | null {\n const m = /^(?:(?:'((?:[^']|'')+)'|([^'!]+))!)?(R(\\[-?\\d+\\]|\\d*)C(\\[-?\\d+\\]|\\d*))(?::(R(\\[-?\\d+\\]|\\d*)C(\\[-?\\d+\\]|\\d*)))?$/i.exec(text.trim())\n if (!m) return null\n const part = (t: string, base: number) => (t === '' ? base : t[0] === '[' ? base + Number(t.slice(1, -1)) : Number(t) - 1)\n const r0 = part(m[4], ev.r)\n const c0 = part(m[5], ev.c)\n const r1 = m[6] ? part(m[7], ev.r) : r0\n const c1 = m[6] ? part(m[8], ev.c) : c0\n const sheet = m[1] !== undefined ? m[1].replace(/''/g, \"'\") : m[2]\n return {\n sheet,\n kind: 'area',\n r0: Math.min(r0, r1),\n c0: Math.min(c0, c1),\n r1: Math.max(r0, r1),\n c1: Math.max(c0, c1),\n ar0: true,\n ac0: true,\n ar1: true,\n ac1: true,\n }\n}\n\nfunction indirect(a: Val[], ev: Ev): Val {\n const text = str(ev.scalar(a[0]))\n const a1 = a.length > 1 ? bool(ev.scalar(a[1])) : true\n const ref = a1 ? parseRefText(text) : parseR1C1(text, ev)\n if (!ref || ref.r0 < 0 || ref.c0 < 0 || ref.r1 > MAX_ROW || ref.c1 > MAX_COL) throw ERR.REF\n if (ref.sheet !== undefined && !ev.hasSheet(ref.sheet)) throw ERR.REF\n return new RangeV(ref.sheet ?? ev.sheet, ref.r0, ref.c0, ref.r1, ref.c1)\n}\n\nfunction rowcol(a: Val[], ev: Ev, top: boolean, isRow: boolean): Val {\n if (!a.length || a[0] === null) return (isRow ? ev.r : ev.c) + 1\n const v = a[0]\n if (!(v instanceof RangeV)) throw ERR.VALUE\n const start = isRow ? v.r0 : v.c0\n const n = isRow ? v.h : v.w\n if (n === 1 || top) return start + 1\n const seq = Array.from({ length: n }, (_, k) => start + k + 1)\n return new ArrayV(isRow ? seq.map((x) => [x]) : [seq])\n}\n\nfunction dims(v: Val, rows: boolean): number {\n if (v instanceof RangeV || v instanceof ArrayV) return rows ? v.h : v.w\n if (v instanceof UnionV) throw ERR.REF\n if (v instanceof FormulaError) throw v\n return 1\n}\n\nexport const LOOKUP: Record<string, FnDef> = {\n VLOOKUP: A(3, 4, (a, ev) => vhlookup(a, ev, true)),\n HLOOKUP: A(3, 4, (a, ev) => vhlookup(a, ev, false)),\n XLOOKUP: A(3, 6, xlookup),\n MATCH: A(2, 3, match),\n LOOKUP: A(2, 3, lookup),\n INDEX: A(2, 4, index),\n OFFSET: A(3, 5, offset),\n INDIRECT: A(1, 2, indirect),\n ROW: A(0, 1, (a, ev, top) => rowcol(a, ev, top, true)),\n COLUMN: A(0, 1, (a, ev, top) => rowcol(a, ev, top, false)),\n ROWS: A(1, 1, ([v]) => dims(v, true)),\n COLUMNS: A(1, 1, ([v]) => dims(v, false)),\n}\n","/** Small number-format engine for TEXT(): 0, 0.00, #,##0, 0%, literals, sections, dates/times. */\nimport { formatDate, isDateFormat, splitSections } from './dates'\nimport { ERR, FormulaError, type Value } from './types'\nimport { numToText, parseNumberText } from './values'\n\n/** Round half away from zero to d decimals, removing binary noise first. */\nexport function roundHalf(x: number, d: number): number {\n if (d > 15) return x\n const f = Math.pow(10, Math.abs(d))\n const ax = Math.abs(x)\n let y = d >= 0 ? ax * f : ax / f\n y = Math.floor(Number(y.toPrecision(15)) + 0.5)\n const r = d >= 0 ? y / f : y * f\n return x < 0 ? -r : r\n}\n\nfunction formatNumber(x: number, sec: string, signed: boolean): string {\n let prefix = ''\n let suffix = ''\n let pattern = ''\n let pct = 0\n const lit = (s: string) => {\n if (pattern) suffix += s\n else prefix += s\n }\n for (let i = 0; i < sec.length; i++) {\n const c = sec[i]\n if (c === '\"') {\n const j = sec.indexOf('\"', i + 1)\n const end = j < 0 ? sec.length : j\n lit(sec.slice(i + 1, end))\n i = end\n } else if (c === '\\\\') lit(sec[++i] ?? '')\n else if (c === '_') {\n lit(' ')\n i++\n } else if (c === '*') i++\n else if (c === '[') {\n const j = sec.indexOf(']', i)\n i = j < 0 ? sec.length : j\n } else if ('0#?'.includes(c) || ((c === '.' || c === ',') && !suffix)) pattern += c\n else {\n if (c === '%') pct++\n lit(c)\n }\n }\n let p = pattern\n let v = x * Math.pow(100, pct)\n while (p.endsWith(',')) {\n p = p.slice(0, -1)\n v /= 1000\n }\n const dot = p.indexOf('.')\n const ip = dot < 0 ? p : p.slice(0, dot)\n const dp = dot < 0 ? '' : p.slice(dot + 1)\n const decs = (dp.match(/[0#?]/g) ?? []).length\n const minDec = (dp.match(/[0?]/g) ?? []).length\n const minInt = (ip.match(/[0?]/g) ?? []).length\n const r = roundHalf(Math.abs(v), decs)\n let [is, ds = ''] = r.toFixed(decs).split('.')\n if (is === '0' && minInt === 0) is = ''\n is = is.padStart(minInt, '0')\n if (ip.includes(',')) is = is.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n while (ds.length > minDec && ds.endsWith('0')) ds = ds.slice(0, -1)\n const body = p === '' ? '' : is + (dot >= 0 ? `.${ds}` : '')\n const neg = signed && v < 0 && r !== 0\n return (neg ? '-' : '') + prefix + body + suffix\n}\n\n/** TEXT(value, format). Throws FormulaError on invalid input. */\nexport function formatText(v: Value, fmt: string): string {\n if (v instanceof FormulaError) throw v\n if (typeof v === 'boolean') return v ? 'TRUE' : 'FALSE'\n let n: number\n const sections = splitSections(fmt)\n if (typeof v === 'string') {\n const p = parseNumberText(v)\n if (p === null) {\n const textSec = sections.length > 3 ? sections[3] : sections.find((s) => s.includes('@'))\n return textSec === undefined ? v : textSec.replace(/\"([^\"]*)\"/g, '$1').replace(/@/g, v)\n }\n n = p\n } else n = v ?? 0\n let sec = sections[0]\n let signed = true\n if (n < 0 && sections.length > 1 && sections[1] !== '') {\n sec = sections[1]\n signed = false\n } else if (n === 0 && sections.length > 2 && sections[2] !== '') sec = sections[2]\n if (/^\\s*general\\s*$/i.test(sec) || sec === '') return numToText(signed ? n : Math.abs(n))\n if (isDateFormat(sec)) {\n if (n < 0) throw ERR.VALUE\n return formatDate(n, sec)\n }\n return formatNumber(signed ? n : Math.abs(n), sec, signed)\n}\n","/** Math functions. */\nimport { A, INF, nums, opt, S, type Ev, type FnDef } from './fn'\nimport { roundHalf } from './format'\nimport { ERR } from './types'\nimport { int, num, type Val } from './values'\n\n/** Remove binary noise (15 significant digits). */\nconst clean = (x: number) => Number(x.toPrecision(15))\n\nfunction roundDir(x: number, d: number, up: boolean): number {\n if (d > 15) return x\n const f = Math.pow(10, Math.abs(d))\n const ax = Math.abs(x)\n let y = clean(d >= 0 ? ax * f : ax / f)\n y = up ? Math.ceil(y) : Math.floor(y)\n const r = d >= 0 ? y / f : y * f\n return x < 0 ? -r : r\n}\n\nfunction finite(x: number): number {\n if (!Number.isFinite(x)) throw ERR.NUM\n return x\n}\n\n/** multiple of `sig` via ceil/floor of the (noise-free) quotient */\nconst multiple = (x: number, sig: number, up: boolean) => clean((up ? Math.ceil : Math.floor)(clean(x / sig)) * sig)\n\nfunction gcd2(a: number, b: number): number {\n while (b) [a, b] = [b, a % b]\n return a\n}\n\nfunction intArgs(args: Val[], ev: Ev): number[] {\n return nums(args, ev).map((n) => {\n if (n < 0) throw ERR.NUM\n return Math.trunc(n)\n })\n}\n\nexport const MATH: Record<string, FnDef> = {\n ABS: S(1, 1, ([x]) => Math.abs(num(x))),\n ROUND: S(2, 2, ([x, d]) => roundHalf(num(x), int(d))),\n ROUNDUP: S(2, 2, ([x, d]) => roundDir(num(x), int(d), true)),\n ROUNDDOWN: S(2, 2, ([x, d]) => roundDir(num(x), int(d), false)),\n TRUNC: S(1, 2, (a) => roundDir(num(a[0]), Math.trunc(opt(a, 1, 0)), false)),\n INT: S(1, 1, ([x]) => Math.floor(num(x))),\n MOD: S(2, 2, ([x, y]) => {\n const n = num(x)\n const d = num(y)\n if (d === 0) throw ERR.DIV0\n return clean(n - d * Math.floor(n / d))\n }),\n POWER: S(2, 2, ([x, y]) => {\n const b = num(x)\n const e = num(y)\n if (b === 0 && e === 0) throw ERR.NUM\n if (b === 0 && e < 0) throw ERR.DIV0\n const r = Math.pow(b, e)\n if (Number.isNaN(r)) throw ERR.NUM\n return finite(r)\n }),\n SQRT: S(1, 1, ([x]) => {\n const n = num(x)\n if (n < 0) throw ERR.NUM\n return Math.sqrt(n)\n }),\n EXP: S(1, 1, ([x]) => finite(Math.exp(num(x)))),\n LN: S(1, 1, ([x]) => {\n const n = num(x)\n if (n <= 0) throw ERR.NUM\n return Math.log(n)\n }),\n LOG: S(1, 2, (a) => {\n const n = num(a[0])\n const b = opt(a, 1, 10)\n if (n <= 0 || b <= 0) throw ERR.NUM\n if (b === 1) throw ERR.DIV0\n return clean(Math.log(n) / Math.log(b))\n }),\n LOG10: S(1, 1, ([x]) => {\n const n = num(x)\n if (n <= 0) throw ERR.NUM\n return Math.log10(n)\n }),\n PI: A(0, 0, () => Math.PI),\n SIGN: S(1, 1, ([x]) => Math.sign(num(x))),\n CEILING: S(1, 2, (a) => {\n const x = num(a[0])\n const sig = opt(a, 1, 1)\n if (sig === 0 || x === 0) return 0\n if (x > 0 && sig < 0) throw ERR.NUM\n return multiple(x, sig, true)\n }),\n FLOOR: S(1, 2, (a) => {\n const x = num(a[0])\n const sig = opt(a, 1, 1)\n if (sig === 0) throw ERR.DIV0\n if (x > 0 && sig < 0) throw ERR.NUM\n return multiple(x, sig, false)\n }),\n 'CEILING.MATH': S(1, 3, (a) => {\n const x = num(a[0])\n const sig = Math.abs(opt(a, 1, 1))\n if (sig === 0 || x === 0) return 0\n if (x < 0 && opt(a, 2, 0) !== 0) return -multiple(-x, sig, true)\n return multiple(x, sig, true)\n }),\n 'FLOOR.MATH': S(1, 3, (a) => {\n const x = num(a[0])\n const sig = Math.abs(opt(a, 1, 1))\n if (sig === 0 || x === 0) return 0\n if (x < 0 && opt(a, 2, 0) !== 0) return -multiple(-x, sig, false)\n return multiple(x, sig, false)\n }),\n RAND: A(0, 0, () => Math.random()),\n RANDBETWEEN: S(2, 2, ([a, b]) => {\n const lo = Math.ceil(num(a))\n const hi = Math.floor(num(b))\n if (lo > hi) throw ERR.NUM\n return lo + Math.floor(Math.random() * (hi - lo + 1))\n }),\n FACT: S(1, 1, ([x]) => {\n const n = Math.trunc(num(x))\n if (n < 0) throw ERR.NUM\n let r = 1\n for (let i = 2; i <= n; i++) r *= i\n return finite(r)\n }),\n EVEN: S(1, 1, ([x]) => {\n const n = num(x)\n const v = Math.ceil(clean(Math.abs(n) / 2)) * 2\n return n < 0 ? -v : v\n }),\n ODD: S(1, 1, ([x]) => {\n const n = num(x)\n let v = Math.ceil(clean(Math.abs(n)))\n if (v % 2 === 0) v++\n return n < 0 ? -v : v\n }),\n GCD: A(1, INF, (a, ev) => intArgs(a, ev).reduce((g, n) => gcd2(g, n), 0)),\n LCM: A(1, INF, (a, ev) =>\n finite(intArgs(a, ev).reduce((l, n) => (l === 0 || n === 0 ? 0 : (l / gcd2(l, n)) * n), 1)),\n ),\n}\n","/** Aggregate, statistical and criteria (*IF/*IFS) functions. */\nimport { A, eachNum, flat, INF, nums, visit, type Ev, type FnDef } from './fn'\nimport { ERR, FormulaError, type Value } from './types'\nimport { ArrayV, criteria, num, parseNumberText, RangeV, UnionV, type Val } from './values'\n\nfunction sum(xs: number[]): number {\n let s = 0\n for (const x of xs) s += x\n return s\n}\n\nfunction mean(xs: number[]): number {\n if (!xs.length) throw ERR.DIV0\n return sum(xs) / xs.length\n}\n\nfunction variance(xs: number[], sample: boolean): number {\n const n = xs.length\n if (n < (sample ? 2 : 1)) throw ERR.DIV0\n const m = sum(xs) / n\n let ss = 0\n for (const x of xs) ss += (x - m) * (x - m)\n return ss / (sample ? n - 1 : n)\n}\n\nfunction median(xs: number[]): number {\n if (!xs.length) throw ERR.NUM\n const s = [...xs].sort((a, b) => a - b)\n const h = s.length >> 1\n return s.length % 2 ? s[h] : (s[h - 1] + s[h]) / 2\n}\n\nfunction mode(xs: number[]): number {\n const counts = new Map<number, number>()\n let best = 0\n let bestN = 1\n for (const x of xs) {\n const n = (counts.get(x) ?? 0) + 1\n counts.set(x, n)\n if (n > bestN) {\n best = x\n bestN = n\n }\n }\n if (bestN < 2) throw ERR.NA\n // first value reaching the max count in order of appearance\n for (const x of xs) if (counts.get(x) === bestN) return x\n return best\n}\n\n/** Numbers from a single range/array argument (k-th largest etc.). */\nfunction rangeNums(a: Val, ev: Ev): number[] {\n return nums([a], ev)\n}\n\nfunction kth(a: Val[], ev: Ev, largest: boolean): number {\n const xs = rangeNums(a[0], ev)\n const k = Math.ceil(num(ev.scalar(a[1])))\n if (k < 1 || k > xs.length) throw ERR.NUM\n xs.sort((x, y) => (largest ? y - x : x - y))\n return xs[k - 1]\n}\n\nfunction rank(a: Val[], ev: Ev): number {\n const x = num(ev.scalar(a[0]))\n const xs = rangeNums(a[1], ev)\n const asc = a.length > 2 && num(ev.scalar(a[2])) !== 0\n if (!xs.includes(x)) throw ERR.NA\n let r = 1\n for (const y of xs) if (asc ? y < x : y > x) r++\n return r\n}\n\n/** 2-D data of a criteria/value range argument. */\nfunction grid(v: Val, ev: Ev): Value[][] {\n if (v instanceof UnionV) throw ERR.VALUE\n return ev.toArray(v)\n}\n\n/** Value range of SUMIF/AVERAGEIF: resized to the criteria range's shape from its top-left. */\nfunction resized(v: Val, h: number, w: number, ev: Ev): Value[][] {\n if (v instanceof RangeV) return ev.toArray(new RangeV(v.sheet, v.r0, v.c0, v.r0 + h - 1, v.c0 + w - 1))\n return grid(v, ev)\n}\n\n/** Values of `values` where every (range, criteria) pair matches. Shapes must agree (#VALUE!). */\nfunction matched(values: Value[][] | null, pairs: Val[], ev: Ev, base?: Value[][]): Value[] {\n const ranges: Value[][][] = []\n const tests: ((v: Value) => boolean)[] = []\n for (let i = 0; i < pairs.length; i += 2) {\n ranges.push(i === 0 && base ? base : grid(pairs[i], ev))\n tests.push(criteria(ev.scalar(pairs[i + 1])))\n }\n const h = ranges[0].length\n const w = ranges[0][0].length\n for (const r of ranges) if (r.length !== h || r[0].length !== w) throw ERR.VALUE\n if (values && (values.length !== h || values[0].length !== w)) throw ERR.VALUE\n const out: Value[] = []\n for (let i = 0; i < h; i++)\n for (let j = 0; j < w; j++) {\n let ok = true\n for (let k = 0; ok && k < ranges.length; k++) ok = tests[k](ranges[k][i][j])\n if (ok) out.push(values ? values[i][j] : true)\n }\n return out\n}\n\n/** Numbers among matched values (errors propagate). */\nfunction numsOf(vs: Value[]): number[] {\n const out: number[] = []\n for (const v of vs) {\n if (typeof v === 'number') out.push(v)\n else if (v instanceof FormulaError) throw v\n }\n return out\n}\n\n/** *IF(range, criteria, [value_range]) */\nfunction ifOne(a: Val[], ev: Ev): number[] {\n const base = grid(a[0], ev)\n const values = a.length > 2 && a[2] !== null ? resized(a[2], base.length, base[0].length, ev) : base\n return numsOf(matched(values, [a[0], a[1]], ev, base))\n}\n\n/** *IFS(value_range, range1, crit1, ...) */\nfunction ifMany(a: Val[], ev: Ev): number[] {\n if (a.length % 2 === 0) throw ERR.VALUE\n return numsOf(matched(grid(a[0], ev), a.slice(1), ev))\n}\n\nfunction sumproduct(a: Val[], ev: Ev): number {\n const arrays = a.map((v) => grid(v, ev))\n const h = arrays[0].length\n const w = arrays[0][0].length\n for (const d of arrays) if (d.length !== h || d[0].length !== w) throw ERR.VALUE\n let s = 0\n for (let i = 0; i < h; i++)\n for (let j = 0; j < w; j++) {\n let p = 1\n for (const d of arrays) {\n const v = d[i][j]\n if (v instanceof FormulaError) throw v\n p *= typeof v === 'number' ? v : 0\n }\n s += p\n }\n return s\n}\n\nfunction minmax(xs: number[], max: boolean): number {\n if (!xs.length) return 0\n let m = xs[0]\n for (const x of xs) if (max ? x > m : x < m) m = x\n return m\n}\n\nexport const STATS: Record<string, FnDef> = {\n SUM: A(0, INF, (a, ev) => {\n let s = 0\n eachNum(a, ev, (n) => (s += n))\n return s\n }),\n PRODUCT: A(0, INF, (a, ev) => {\n const xs = nums(a, ev)\n return xs.length ? xs.reduce((p, x) => p * x, 1) : 0\n }),\n AVERAGE: A(1, INF, (a, ev) => mean(nums(a, ev))),\n MIN: A(1, INF, (a, ev) => {\n let m = INF\n eachNum(a, ev, (n) => (m = Math.min(m, n)))\n return m === INF ? 0 : m\n }),\n MAX: A(1, INF, (a, ev) => {\n let m = -INF\n eachNum(a, ev, (n) => (m = Math.max(m, n)))\n return m === -INF ? 0 : m\n }),\n COUNT: A(0, INF, (a, ev) => {\n let n = 0\n for (const x of a)\n visit(\n x,\n ev,\n (v) => typeof v === 'number' && n++,\n (v) =>\n (typeof v === 'number' || typeof v === 'boolean' || (typeof v === 'string' && parseNumberText(v) !== null)) &&\n n++,\n )\n return n\n }),\n COUNTA: A(1, INF, (a, ev) => {\n let n = 0\n for (const x of a)\n visit(\n x,\n ev,\n (v) => v !== null && n++,\n () => n++,\n )\n return n\n }),\n COUNTBLANK: A(1, 1, ([x], ev) => {\n if (x instanceof RangeV) {\n let seen = 0\n let blanks = 0\n ev.forEach(x, (v) => {\n seen++\n if (v === null || v === '') blanks++\n })\n return blanks + (x.h * x.w - seen)\n }\n if (x instanceof ArrayV) return flat(x.data).filter((v) => v === null || v === '').length\n throw ERR.VALUE\n }),\n MEDIAN: A(1, INF, (a, ev) => median(nums(a, ev))),\n MODE: A(1, INF, (a, ev) => mode(nums(a, ev))),\n 'MODE.SNGL': A(1, INF, (a, ev) => mode(nums(a, ev))),\n STDEV: A(1, INF, (a, ev) => Math.sqrt(variance(nums(a, ev), true))),\n 'STDEV.S': A(1, INF, (a, ev) => Math.sqrt(variance(nums(a, ev), true))),\n 'STDEV.P': A(1, INF, (a, ev) => Math.sqrt(variance(nums(a, ev), false))),\n STDEVP: A(1, INF, (a, ev) => Math.sqrt(variance(nums(a, ev), false))),\n VAR: A(1, INF, (a, ev) => variance(nums(a, ev), true)),\n 'VAR.S': A(1, INF, (a, ev) => variance(nums(a, ev), true)),\n 'VAR.P': A(1, INF, (a, ev) => variance(nums(a, ev), false)),\n VARP: A(1, INF, (a, ev) => variance(nums(a, ev), false)),\n LARGE: A(2, 2, (a, ev) => kth(a, ev, true)),\n SMALL: A(2, 2, (a, ev) => kth(a, ev, false)),\n RANK: A(2, 3, rank),\n 'RANK.EQ': A(2, 3, rank),\n SUMPRODUCT: A(1, INF, sumproduct),\n SUMIF: A(2, 3, (a, ev) => sum(ifOne(a, ev))),\n SUMIFS: A(3, INF, (a, ev) => sum(ifMany(a, ev))),\n AVERAGEIF: A(2, 3, (a, ev) => mean(ifOne(a, ev))),\n AVERAGEIFS: A(3, INF, (a, ev) => mean(ifMany(a, ev))),\n COUNTIF: A(2, 2, (a, ev) => matched(null, a, ev).length),\n COUNTIFS: A(2, INF, (a, ev) => {\n if (a.length % 2) throw ERR.VALUE\n return matched(null, a, ev).length\n }),\n MINIFS: A(3, INF, (a, ev) => minmax(ifMany(a, ev), false)),\n MAXIFS: A(3, INF, (a, ev) => minmax(ifMany(a, ev), true)),\n}\n","/** Text functions. */\nimport { A, INF, opt, S, visit, type FnDef } from './fn'\nimport { formatText } from './format'\nimport { ERR, FormulaError, type Value } from './types'\nimport { bool, num, parseNumberText, str, wildcardRe } from './values'\n\nconst MAX_TEXT = 32767\n\nfunction len(n: number): number {\n const k = Math.trunc(n)\n if (k < 0) throw ERR.VALUE\n return k\n}\n\nfunction proper(s: string): string {\n let out = ''\n let prevLetter = false\n for (const ch of s) {\n const isLetter = ch.toLowerCase() !== ch.toUpperCase()\n out += isLetter ? (prevLetter ? ch.toLowerCase() : ch.toUpperCase()) : ch\n prevLetter = isLetter\n }\n return out\n}\n\nfunction find(needle: string, hay: string, start: number, ci: boolean): number {\n if (start < 1 || start > hay.length + 1) throw ERR.VALUE\n if (needle === '') return start\n if (!ci) {\n const i = hay.indexOf(needle, start - 1)\n if (i < 0) throw ERR.VALUE\n return i + 1\n }\n const re = wildcardRe(needle, false)\n const m = re.exec(hay.slice(start - 1))\n if (!m) throw ERR.VALUE\n return m.index + start\n}\n\nexport const TEXT: Record<string, FnDef> = {\n CONCATENATE: S(1, INF, (a) => a.map(str).join('')),\n CONCAT: A(1, INF, (a, ev) => {\n let s = ''\n const add = (v: Value) => (s += str(v))\n for (const x of a) visit(x, ev, add, add)\n if (s.length > MAX_TEXT) throw ERR.VALUE\n return s\n }),\n TEXTJOIN: A(3, INF, (a, ev) => {\n const delim = str(ev.scalar(a[0]))\n const skipEmpty = bool(ev.scalar(a[1]))\n const parts: string[] = []\n const add = (v: Value) => {\n const s = str(v)\n if (!skipEmpty || s !== '') parts.push(s)\n }\n for (const x of a.slice(2)) visit(x, ev, add, add)\n const s = parts.join(delim)\n if (s.length > MAX_TEXT) throw ERR.VALUE\n return s\n }),\n LEFT: S(1, 2, (a) => str(a[0]).slice(0, len(opt(a, 1, 1)))),\n RIGHT: S(1, 2, (a) => {\n const s = str(a[0])\n return s.slice(Math.max(0, s.length - len(opt(a, 1, 1))))\n }),\n MID: S(3, 3, ([t, st, n]) => {\n const start = Math.trunc(num(st))\n if (start < 1) throw ERR.VALUE\n return str(t).substr(start - 1, len(num(n)))\n }),\n LEN: S(1, 1, ([x]) => str(x).length),\n UPPER: S(1, 1, ([x]) => str(x).toUpperCase()),\n LOWER: S(1, 1, ([x]) => str(x).toLowerCase()),\n PROPER: S(1, 1, ([x]) => proper(str(x))),\n TRIM: S(1, 1, ([x]) => str(x).replace(/ {2,}/g, ' ').replace(/^ | $/g, '')),\n SUBSTITUTE: S(3, 4, (a) => {\n const s = str(a[0])\n const from = str(a[1])\n const to = str(a[2])\n if (from === '') return s\n if (a.length < 4) return s.split(from).join(to)\n const nth = Math.trunc(num(a[3]))\n if (nth < 1) throw ERR.VALUE\n let idx = -1\n for (let k = 0; k < nth; k++) {\n idx = s.indexOf(from, idx + (k ? from.length : 1))\n if (idx < 0) return s\n }\n return s.slice(0, idx) + to + s.slice(idx + from.length)\n }),\n REPLACE: S(4, 4, ([t, st, n, nw]) => {\n const s = str(t)\n const start = Math.trunc(num(st))\n if (start < 1) throw ERR.VALUE\n const k = len(num(n))\n return s.slice(0, start - 1) + str(nw) + s.slice(start - 1 + k)\n }),\n REPT: S(2, 2, ([t, n]) => {\n const s = str(t)\n const k = len(num(n))\n if (s.length * k > MAX_TEXT) throw ERR.VALUE\n return s.repeat(k)\n }),\n FIND: S(2, 3, (a) => find(str(a[0]), str(a[1]), Math.trunc(opt(a, 2, 1)), false)),\n SEARCH: S(2, 3, (a) => find(str(a[0]), str(a[1]), Math.trunc(opt(a, 2, 1)), true)),\n EXACT: S(2, 2, ([x, y]) => str(x) === str(y)),\n VALUE: S(1, 1, ([x]) => {\n if (typeof x === 'number') return x\n if (x === null) return 0\n if (typeof x !== 'string') throw x instanceof FormulaError ? x : ERR.VALUE\n const n = parseNumberText(x)\n if (n === null) throw ERR.VALUE\n return n\n }),\n TEXT: S(2, 2, ([v, f]) => formatText(v, str(f))),\n CHAR: S(1, 1, ([x]) => {\n const n = Math.trunc(num(x))\n if (n < 1 || n > 255) throw ERR.VALUE\n return String.fromCharCode(n)\n }),\n CODE: S(1, 1, ([x]) => {\n const s = str(x)\n if (!s) throw ERR.VALUE\n return s.charCodeAt(0)\n }),\n}\n","/** Function registry (upper-case names, `_xlfn.` prefixes already stripped by the lexer). */\nimport { DATE } from './fn-date'\nimport { LOGIC } from './fn-logic'\nimport { LOOKUP } from './fn-lookup'\nimport { MATH } from './fn-math'\nimport { STATS } from './fn-stats'\nimport { TEXT } from './fn-text'\nimport type { FnDef } from './fn'\n\nexport const FUNCTIONS: Readonly<Record<string, FnDef>> = {\n ...MATH,\n ...STATS,\n ...LOGIC,\n ...TEXT,\n ...DATE,\n ...LOOKUP,\n SINGLE: { kind: 'eager', min: 1, max: 1, scalarArgs: false, fn: ([v], ev) => ev.scalar(v) },\n}\n\n/** Names of all supported functions. */\nexport function supportedFunctions(): string[] {\n return Object.keys(FUNCTIONS).sort()\n}\n","/** Tree-walking evaluator. Top-level operands use implicit intersection; inside functions ranges are array-evaluated. */\nimport { getDate1904, setDate1904 } from './dates'\nimport { guard, pick, type Ev } from './fn'\nimport { FUNCTIONS } from './functions'\nimport { FormulaSyntaxError } from './lexer'\nimport { parseFormula, type Ast, type BinOp } from './parser'\nimport { sameSheet, type RefAddr } from './refs'\nimport { ERR, FormulaError, MAX_COL, MAX_ROW, type CellProvider, type EvalContext, type Value } from './types'\nimport { ArrayV, compare, RangeV, toNum, toStr, UnionV, type Val } from './values'\n\nfunction arith(op: BinOp, x: number, y: number): Value {\n let r: number\n switch (op) {\n case '+':\n r = x + y\n break\n case '-':\n r = x - y\n break\n case '*':\n r = x * y\n break\n case '/':\n if (y === 0) return ERR.DIV0\n r = x / y\n break\n default:\n if (x === 0 && y === 0) return ERR.NUM\n if (x === 0 && y < 0) return ERR.DIV0\n r = Math.pow(x, y)\n }\n return Number.isFinite(r) ? r : ERR.NUM\n}\n\nexport function binop(op: BinOp, a: Value, b: Value): Value {\n if (a instanceof FormulaError) return a\n if (b instanceof FormulaError) return b\n switch (op) {\n case '&':\n return (toStr(a) as string) + (toStr(b) as string)\n case '=':\n return compare(a, b) === 0\n case '<>':\n return compare(a, b) !== 0\n case '<':\n return compare(a, b) < 0\n case '>':\n return compare(a, b) > 0\n case '<=':\n return compare(a, b) <= 0\n case '>=':\n return compare(a, b) >= 0\n }\n const x = toNum(a)\n if (x instanceof FormulaError) return x\n const y = toNum(b)\n if (y instanceof FormulaError) return y\n return arith(op, x, y)\n}\n\ntype Operand = Value | Value[][]\n\nfunction map1(v: Operand, f: (x: Value) => Value): Val {\n return Array.isArray(v) ? new ArrayV(v.map((row) => row.map(f))) : f(v)\n}\n\nfunction map2(a: Operand, b: Operand, f: (x: Value, y: Value) => Value): Val {\n if (!Array.isArray(a) && !Array.isArray(b)) return f(a, b)\n const da = Array.isArray(a) ? a : [[a]]\n const db = Array.isArray(b) ? b : [[b]]\n const h = Math.max(da.length, db.length)\n const w = Math.max(da[0].length, db[0].length)\n const out: Value[][] = []\n for (let i = 0; i < h; i++) {\n const row: Value[] = []\n for (let j = 0; j < w; j++) row.push(f(pick(da, i, j), pick(db, i, j)))\n out.push(row)\n }\n return new ArrayV(out)\n}\n\nexport class Evaluator implements Ev {\n readonly provider: CellProvider\n readonly sheet: string | undefined\n readonly r: number\n readonly c: number\n\n constructor(ctx: EvalContext) {\n this.provider = ctx.provider\n this.sheet = ctx.sheet\n this.r = ctx.r\n this.c = ctx.c\n }\n\n eval(ast: Ast, top: boolean): Val {\n switch (ast.type) {\n case 'num':\n case 'str':\n case 'bool':\n return ast.value\n case 'err':\n return new FormulaError(ast.code)\n case 'missing':\n return null\n case 'name':\n return ERR.NAME\n case 'array':\n return new ArrayV(ast.rows)\n case 'ref':\n return this.ref(ast.ref)\n case 'range':\n return this.rangeOp(ast.left, ast.right)\n case 'union': {\n const areas: RangeV[] = []\n for (const it of ast.items) {\n const v = this.eval(it, false)\n if (v instanceof RangeV) areas.push(v)\n else if (v instanceof UnionV) areas.push(...v.areas)\n else return v instanceof FormulaError ? v : ERR.VALUE\n }\n return new UnionV(areas)\n }\n case 'unary': {\n const v = this.operand(this.eval(ast.arg, top), top)\n if (ast.op === '+') return Array.isArray(v) ? new ArrayV(v) : v\n return map1(v, (x) => {\n const n = toNum(x)\n return n instanceof FormulaError ? n : n === 0 ? 0 : -n\n })\n }\n case 'percent':\n return map1(this.operand(this.eval(ast.arg, top), top), (x) => {\n const n = toNum(x)\n return n instanceof FormulaError ? n : n / 100\n })\n case 'binary': {\n const l = this.operand(this.eval(ast.left, top), top)\n const r = this.operand(this.eval(ast.right, top), top)\n const op = ast.op\n return map2(l, r, (a, b) => binop(op, a, b))\n }\n case 'call':\n return this.call(ast.name, ast.args, top)\n }\n }\n\n private ref(a: RefAddr): Val {\n if (a.sheet !== undefined && !this.hasSheet(a.sheet)) return ERR.REF\n return new RangeV(a.sheet ?? this.sheet, a.r0, a.c0, a.r1, a.c1)\n }\n\n private rangeOp(left: Ast, right: Ast): Val {\n const l = this.eval(left, false)\n if (l instanceof FormulaError) return l\n const r = this.eval(right, false)\n if (r instanceof FormulaError) return r\n if (!(l instanceof RangeV) || !(r instanceof RangeV) || !sameSheet(l.sheet, r.sheet)) return ERR.VALUE\n return new RangeV(l.sheet, Math.min(l.r0, r.r0), Math.min(l.c0, r.c0), Math.max(l.r1, r.r1), Math.max(l.c1, r.c1))\n }\n\n private call(name: string, args: Ast[], top: boolean): Val {\n if (!Object.hasOwn(FUNCTIONS, name)) return ERR.NAME\n const def = FUNCTIONS[name]\n if (args.length < def.min || args.length > def.max) return ERR.VALUE\n if (def.kind === 'lazy') return guard(() => def.fn(args, this, top))\n const vals = args.map((a) => this.eval(a, def.scalarArgs && top))\n return guard(() => def.fn(vals, this, top))\n }\n\n hasSheet(name: string): boolean {\n return this.provider.hasSheet ? this.provider.hasSheet(name) : true\n }\n\n now(): Date {\n return this.provider.now?.() ?? new Date()\n }\n\n cell(sheet: string | undefined, r: number, c: number): Value {\n const v = this.provider.value(sheet, r, c)\n return v === undefined ? null : v\n }\n\n /** Clip whole-row/whole-column style ranges to the provider's used extent. */\n private clip(rg: RangeV): { r1: number; c1: number } {\n let { r1, c1 } = rg\n if ((r1 === MAX_ROW || c1 === MAX_COL) && this.provider.bounds) {\n const b = this.provider.bounds(rg.sheet)\n if (r1 === MAX_ROW) r1 = Math.max(rg.r0, Math.min(r1, b.rows - 1))\n if (c1 === MAX_COL) c1 = Math.max(rg.c0, Math.min(c1, b.cols - 1))\n }\n return { r1, c1 }\n }\n\n forEach(rg: RangeV, cb: (v: Value, i: number, j: number) => void): void {\n const { r1, c1 } = this.clip(rg)\n for (let r = rg.r0; r <= r1; r++) for (let c = rg.c0; c <= c1; c++) cb(this.cell(rg.sheet, r, c), r - rg.r0, c - rg.c0)\n }\n\n toArray(v: Val): Value[][] {\n if (v instanceof RangeV) {\n const { r1, c1 } = this.clip(v)\n const out: Value[][] = []\n for (let r = v.r0; r <= r1; r++) {\n const row: Value[] = []\n for (let c = v.c0; c <= c1; c++) row.push(this.cell(v.sheet, r, c))\n out.push(row)\n }\n return out\n }\n if (v instanceof ArrayV) return v.data\n if (v instanceof UnionV) throw ERR.VALUE\n return [[v]]\n }\n\n /** Implicit intersection of a range with the formula cell's row/column. */\n intersect(rg: RangeV): Value {\n if (rg.h === 1 && rg.w === 1) return this.cell(rg.sheet, rg.r0, rg.c0)\n if (rg.w === 1 && this.r >= rg.r0 && this.r <= rg.r1) return this.cell(rg.sheet, this.r, rg.c0)\n if (rg.h === 1 && this.c >= rg.c0 && this.c <= rg.c1) return this.cell(rg.sheet, rg.r0, this.c)\n return ERR.VALUE\n }\n\n scalar(v: Val): Value {\n if (v instanceof RangeV) return this.intersect(v)\n if (v instanceof ArrayV) return v.data[0][0]\n if (v instanceof UnionV) return ERR.VALUE\n return v\n }\n\n operand(v: Val, top: boolean): Operand {\n if (v instanceof RangeV) {\n if (v.h === 1 && v.w === 1) return this.cell(v.sheet, v.r0, v.c0)\n return top ? this.intersect(v) : this.toArray(v)\n }\n if (v instanceof ArrayV) return v.h === 1 && v.w === 1 ? v.data[0][0] : v.data\n if (v instanceof UnionV) return ERR.VALUE\n return v\n }\n}\n\n/** Evaluate a parsed formula for the cell at ctx.{sheet,r,c}. Never throws; errors come back as FormulaError. */\nexport function evaluate(ast: Ast, ctx: EvalContext): Value {\n const prev = getDate1904()\n setDate1904(!!ctx.provider.date1904)\n try {\n const ev = new Evaluator(ctx)\n const v = ev.eval(ast, true)\n const x = v instanceof RangeV ? ev.intersect(v) : v instanceof ArrayV ? v.data[0][0] : v instanceof UnionV ? ERR.VALUE : v\n if (x === null) return 0\n if (typeof x === 'number') return Number.isFinite(x) ? x + 0 : ERR.NUM\n return x\n } catch (e) {\n return e instanceof FormulaError ? e : ERR.VALUE\n } finally {\n setDate1904(prev)\n }\n}\n\n/** Parse + evaluate. Syntax errors evaluate to #NAME?. */\nexport function evaluateFormula(text: string, ctx: EvalContext): Value {\n let ast: Ast\n try {\n ast = parseFormula(text)\n } catch (e) {\n if (e instanceof FormulaSyntaxError) return ERR.NAME\n return ERR.VALUE\n }\n return evaluate(ast, ctx)\n}\n","/** Formula text rewriting (fill/copy, row/col insert/delete, sheet rename) and dependency extraction. */\nimport { tokenize, type Token } from './lexer'\nimport type { Ast } from './parser'\nimport { fmtRef, normalizeRef, quoteSheet, refInBounds, sameSheet, type RefAddr } from './refs'\nimport { MAX_COL, MAX_ROW, type CellRef, type RangeRef } from './types'\n\n/** Re-emit `text`, replacing tokens for which `map` returns a string. Unlexable text is returned unchanged. */\nfunction rewrite(text: string, map: (t: Token) => string | undefined): string {\n const lead = text.startsWith('=') ? '=' : ''\n const src = text.slice(lead.length)\n let toks: Token[]\n try {\n toks = tokenize(src)\n } catch {\n return text\n }\n let out = lead\n let pos = 0\n for (const t of toks) {\n const rep = map(t)\n if (rep === undefined) continue\n out += src.slice(pos, t.s) + rep\n pos = t.e\n }\n return out + src.slice(pos)\n}\n\nconst refError = (t: Token & { t: 'ref' }) => (t.ref.sheet === undefined ? '' : `${t.sheetText ?? quoteSheet(t.ref.sheet)}!`) + '#REF!'\n\n/** Copy/fill: shift relative parts of every reference by (dr, dc). Out-of-sheet results become #REF!. */\nexport function translateFormula(text: string, dr: number, dc: number): string {\n if (!dr && !dc) return text\n return rewrite(text, (t) => {\n if (t.t !== 'ref') return undefined\n const a: RefAddr = { ...t.ref }\n if (a.kind !== 'cols') {\n if (!a.ar0) a.r0 += dr\n if (!a.ar1) a.r1 += dr\n }\n if (a.kind !== 'rows') {\n if (!a.ac0) a.c0 += dc\n if (!a.ac1) a.c1 += dc\n }\n if (!refInBounds(a)) return refError(t)\n return fmtRef(normalizeRef(a), t.sheetText)\n })\n}\n\n/** New [lo, hi] after inserting (delta>0) / deleting (delta<0) at `at`; null when entirely deleted. */\nfunction shiftSpan(lo: number, hi: number, at: number, delta: number, max: number): [number, number] | null {\n if (delta > 0) {\n if (lo >= at) lo += delta\n if (hi >= at) hi += delta\n if (lo > max) return null\n return [lo, Math.min(hi, max)]\n }\n const n = -delta\n const end = at + n\n if (hi < at) return [lo, hi]\n if (lo >= end) return [lo - n, hi - n]\n if (lo >= at && hi < end) return null\n return [lo < at ? lo : at, hi >= end ? hi - n : at - 1]\n}\n\nexport interface ShiftOp {\n /** sheet whose rows/cols change (undefined: the formula's own sheet) */\n sheet?: string\n /** sheet the formula lives on (unqualified refs belong to it; undefined: same as `sheet`) */\n formulaSheet?: string\n axis: 'row' | 'col'\n /** 0-based index of the first inserted/deleted row/col */\n at: number\n /** >0 insert count, <0 delete count */\n delta: number\n}\n\n/** Rewrite references after inserting/deleting rows or columns. */\nexport function shiftFormula(text: string, op: ShiftOp): string {\n if (!op.delta) return text\n const affects = (refSheet: string | undefined): boolean => {\n if (op.sheet === undefined) return refSheet === undefined || (op.formulaSheet !== undefined && sameSheet(refSheet, op.formulaSheet))\n const s = refSheet ?? op.formulaSheet\n return s === undefined || sameSheet(s, op.sheet)\n }\n return rewrite(text, (t) => {\n if (t.t !== 'ref' || !affects(t.ref.sheet)) return undefined\n const a: RefAddr = { ...t.ref }\n if (op.axis === 'row') {\n if (a.kind === 'cols') return undefined\n const s = shiftSpan(a.r0, a.r1, op.at, op.delta, MAX_ROW)\n if (!s) return refError(t)\n ;[a.r0, a.r1] = s\n } else {\n if (a.kind === 'rows') return undefined\n const s = shiftSpan(a.c0, a.c1, op.at, op.delta, MAX_COL)\n if (!s) return refError(t)\n ;[a.c0, a.c1] = s\n }\n if (a.r0 === t.ref.r0 && a.r1 === t.ref.r1 && a.c0 === t.ref.c0 && a.c1 === t.ref.c1) return undefined\n return fmtRef(a, t.sheetText)\n })\n}\n\n/** Rename sheet qualifiers (`Old!A1`, `'Old'!A1:B2`, `Old!#REF!`, `Old!Name`). */\nexport function renameSheetInFormula(text: string, oldName: string, newName: string): string {\n const pre = `${quoteSheet(newName)}!`\n return rewrite(text, (t) => {\n if (t.t === 'ref' && t.ref.sheet !== undefined && sameSheet(t.ref.sheet, oldName))\n return fmtRef({ ...t.ref, sheet: newName })\n if ((t.t === 'err' || t.t === 'name') && t.sheet !== undefined && sameSheet(t.sheet, oldName)) return pre + t.v\n return undefined\n })\n}\n\nfunction toRef(a: RefAddr): CellRef | RangeRef {\n const sheet = a.sheet === undefined ? {} : { sheet: a.sheet }\n if (a.kind === 'cell') return { ...sheet, r: a.r0, c: a.c0, absR: a.ar0, absC: a.ac0 }\n return { ...sheet, r0: a.r0, c0: a.c0, r1: a.r1, c1: a.c1 }\n}\n\n/** Every cell/range the formula reads directly (static references; INDIRECT/OFFSET targets are dynamic). */\nexport function references(ast: Ast): (CellRef | RangeRef)[] {\n const out: (CellRef | RangeRef)[] = []\n const walk = (n: Ast): void => {\n switch (n.type) {\n case 'ref':\n out.push(toRef(n.ref))\n break\n case 'range':\n if (n.left.type === 'ref' && n.right.type === 'ref' && sameSheet(n.left.ref.sheet, n.right.ref.sheet)) {\n const l = n.left.ref\n const r = n.right.ref\n out.push(\n toRef({ ...l, kind: 'area', r0: Math.min(l.r0, r.r0), c0: Math.min(l.c0, r.c0), r1: Math.max(l.r1, r.r1), c1: Math.max(l.c1, r.c1) }),\n )\n } else {\n walk(n.left)\n walk(n.right)\n }\n break\n case 'unary':\n case 'percent':\n walk(n.arg)\n break\n case 'binary':\n walk(n.left)\n walk(n.right)\n break\n case 'union':\n n.items.forEach(walk)\n break\n case 'call':\n n.args.forEach(walk)\n break\n }\n }\n walk(ast)\n return out\n}\n","/**\n * Workbook recalculation: formula values are kept in the cell entries; after an edit\n * only the dependents (transitively) of the changed cells are re-evaluated.\n */\nimport { evaluate, FormulaError, parseFormula, references, type Ast, type CellProvider, type Value } from './formula'\nimport { MAX_COL, T_BOOL, T_EMPTY, T_ERR, T_NUM, T_SST, T_STR, type SheetData, type XlsxWorkbook } from './workbook'\n\ntype Id = string // `${sheet}:${key}`\nconst idOf = (sheet: number, key: number) => `${sheet}:${key}`\n\ninterface RangeDep {\n sheet: number\n r0: number\n c0: number\n r1: number\n c1: number\n dep: Id\n}\n\nexport class Calc {\n private asts = new Map<Id, Ast | null>()\n private cellDeps = new Map<Id, Set<Id>>()\n private rangeDeps: RangeDep[] = []\n private indexed = false\n\n constructor(private wb: XlsxWorkbook) {}\n\n invalidate() {\n this.indexed = false\n this.asts.clear()\n this.cellDeps.clear()\n this.rangeDeps = []\n }\n\n private sheetIndex(name: string | undefined, self: number): number {\n if (!name) return self\n const i = this.wb.sheets.findIndex((s) => s.name.toLowerCase() === name.toLowerCase())\n return i\n }\n\n private ast(sheet: number, key: number): Ast | null {\n const id = idOf(sheet, key)\n let a = this.asts.get(id)\n if (a === undefined) {\n const f = this.wb.sheetsData.get(sheet)?.formulas.get(key)\n try {\n a = f ? parseFormula(f) : null\n } catch {\n a = null\n }\n this.asts.set(id, a)\n }\n return a\n }\n\n private index() {\n if (this.indexed) return\n this.indexed = true\n for (const [sheet, d] of this.wb.sheetsData) {\n for (const key of d.formulas.keys()) this.addDeps(sheet, key)\n }\n }\n\n private addDeps(sheet: number, key: number) {\n const a = this.ast(sheet, key)\n if (!a) return\n const dep = idOf(sheet, key)\n for (const ref of references(a)) {\n const s = this.sheetIndex(ref.sheet, sheet)\n if (s < 0) continue\n if ('r' in ref) {\n const id = idOf(s, ref.r * MAX_COL + ref.c)\n let set = this.cellDeps.get(id)\n if (!set) this.cellDeps.set(id, (set = new Set()))\n set.add(dep)\n } else this.rangeDeps.push({ sheet: s, r0: ref.r0, c0: ref.c0, r1: ref.r1, c1: ref.c1, dep })\n }\n }\n\n /** a formula was added / changed / removed at (sheet, key) */\n formulaChanged(sheet: number, key: number) {\n if (!this.indexed) return\n const id = idOf(sheet, key)\n this.asts.delete(id)\n for (const set of this.cellDeps.values()) set.delete(id)\n this.rangeDeps = this.rangeDeps.filter((r) => r.dep !== id)\n this.addDeps(sheet, key)\n }\n\n /** current value of a cell as the formula engine sees it */\n private value(sheet: number, r: number, c: number): Value {\n const row = this.wb.sheetsData.get(sheet)?.rows[r]\n if (!row) return null\n for (let k = 0; k < row.length; k += 4) {\n if (row[k] !== c) continue\n const t = row[k + 1] as number\n const v = row[k + 2]\n switch (t) {\n case T_NUM:\n return v as number\n case T_SST:\n return this.wb.sst[v as number] ?? ''\n case T_STR:\n return String(v)\n case T_BOOL:\n return !!v\n case T_ERR:\n return new FormulaError(String(v) as ConstructorParameters<typeof FormulaError>[0])\n case T_EMPTY:\n return null\n default:\n return String(v)\n }\n }\n return null\n }\n\n private provider(pending: Set<Id>, visiting: Set<Id>): CellProvider {\n return {\n value: (sheetName, r, c) => {\n const s = this.sheetIndex(sheetName, this.cur)\n if (s < 0) return new FormulaError('#REF!')\n const id = idOf(s, r * MAX_COL + c)\n if (pending.has(id)) this.compute(id, pending, visiting)\n return this.value(s, r, c)\n },\n bounds: (sheetName) => {\n const d = this.wb.sheetsData.get(this.sheetIndex(sheetName, this.cur))\n return { rows: (d?.maxRow ?? -1) + 1, cols: (d?.maxCol ?? -1) + 1 }\n },\n hasSheet: (name) => this.sheetIndex(name, -1) >= 0,\n date1904: this.wb.date1904,\n }\n }\n\n private cur = 0\n\n private compute(id: Id, pending: Set<Id>, visiting: Set<Id>) {\n pending.delete(id)\n const [sheet, key] = id.split(':').map(Number)\n const d = this.wb.sheetsData.get(sheet)\n if (!d || !d.formulas.has(key)) return\n if (visiting.has(id)) {\n store(d, key, new FormulaError('#REF!'))\n return\n }\n visiting.add(id)\n const a = this.ast(sheet, key)\n const prev = this.cur\n this.cur = sheet\n let v: Value\n try {\n v = a ? evaluate(a, { provider: this.provider(pending, visiting), sheet: this.wb.sheets[sheet]?.name, r: Math.floor(key / MAX_COL), c: key % MAX_COL }) : new FormulaError('#NAME?')\n } catch {\n v = new FormulaError('#VALUE!')\n }\n this.cur = prev\n visiting.delete(id)\n store(d, key, v)\n }\n\n /** Evaluates the given formula cells and everything that depends on the changed cells. */\n recalc(changed: { sheet: number; key: number }[], formulas: { sheet: number; key: number }[] = []): Set<number> {\n this.index()\n const pending = new Set<Id>()\n const queue: Id[] = []\n const push = (id: Id) => {\n if (pending.has(id)) return\n pending.add(id)\n queue.push(id)\n }\n for (const f of formulas) push(idOf(f.sheet, f.key))\n const seen = new Set<Id>()\n const visit = (id: Id) => {\n if (seen.has(id)) return\n seen.add(id)\n const [s, key] = id.split(':').map(Number)\n const r = Math.floor(key / MAX_COL)\n const c = key % MAX_COL\n for (const dep of this.cellDeps.get(id) ?? []) {\n push(dep)\n visit(dep)\n }\n for (const rd of this.rangeDeps) {\n if (rd.sheet === s && r >= rd.r0 && r <= rd.r1 && c >= rd.c0 && c <= rd.c1) {\n push(rd.dep)\n visit(rd.dep)\n }\n }\n }\n for (const ch of changed) visit(idOf(ch.sheet, ch.key))\n for (const f of formulas) visit(idOf(f.sheet, f.key))\n const sheets = new Set<number>()\n const visiting = new Set<Id>()\n for (const id of queue) {\n if (!pending.has(id)) continue\n this.compute(id, pending, visiting)\n sheets.add(Number(id.split(':')[0]))\n }\n return sheets\n }\n\n /** formulas whose value is missing (files written without cached values) */\n computeMissing(sheet: number, keys: number[]) {\n if (!keys.length) return\n this.recalc([], keys.map((key) => ({ sheet, key })))\n }\n}\n\nfunction store(d: SheetData, key: number, v: Value) {\n const r = Math.floor(key / MAX_COL)\n const c = key % MAX_COL\n let row = d.rows[r]\n if (!row) d.rows[r] = row = []\n let t: number\n let val: unknown\n if (v instanceof FormulaError) {\n t = T_ERR\n val = v.code\n } else if (typeof v === 'number') {\n t = T_NUM\n val = Number.isFinite(v) ? v : 0\n } else if (typeof v === 'boolean') {\n t = T_BOOL\n val = v ? 1 : 0\n } else if (v === null) {\n t = T_NUM\n val = 0\n } else {\n t = T_STR\n val = v\n }\n for (let k = 0; k < row.length; k += 4) {\n if (row[k] === c) {\n row[k + 1] = t\n row[k + 2] = val\n return\n }\n }\n let k = 0\n while (k < row.length && (row[k] as number) < c) k += 4\n row.splice(k, 0, c, t, val, 0)\n}\n","/** Excel number-format subset: General, fixed/grouped/percent/scientific/fraction, dates & times, sections & colors. */\n\nexport const BUILTIN_FORMATS: Record<number, string> = {\n 0: 'General', 1: '0', 2: '0.00', 3: '#,##0', 4: '#,##0.00', 9: '0%', 10: '0.00%', 11: '0.00E+00',\n 12: '# ?/?', 13: '# ??/??', 14: 'm/d/yyyy', 15: 'd-mmm-yy', 16: 'd-mmm', 17: 'mmm-yy', 18: 'h:mm AM/PM',\n 19: 'h:mm:ss AM/PM', 20: 'h:mm', 21: 'h:mm:ss', 22: 'm/d/yyyy h:mm', 37: '#,##0 ;(#,##0)',\n 38: '#,##0 ;[Red](#,##0)', 39: '#,##0.00;(#,##0.00)', 40: '#,##0.00;[Red](#,##0.00)', 45: 'mm:ss',\n 46: '[h]:mm:ss', 47: 'mmss.0', 48: '##0.0E+0', 49: '@',\n // common locale-dependent ids\n 27: 'yyyy\"年\"m\"月\"', 30: 'm/d/yy', 31: 'yyyy\"年\"m\"月\"d\"日\"', 50: 'yyyy\"年\"m\"月\"', 57: 'yyyy\"年\"m\"月\"', 58: 'm\"月\"d\"日\"',\n}\n\ntype Tok =\n | { k: 'lit'; v: string }\n | { k: 'digit'; v: '0' | '#' | '?' }\n | { k: 'dot' }\n | { k: 'comma' }\n | { k: 'pct' }\n | { k: 'exp'; sign: boolean }\n | { k: 'slash' }\n | { k: 'date'; v: string }\n | { k: 'text' }\n | { k: 'elapsed'; v: 'h' | 'm' | 's' }\n\ninterface Section {\n toks: Tok[]\n color?: string\n isDate: boolean\n cond?: { op: string; v: number }\n hasDigits: boolean\n}\n\nconst COLORS: Record<string, string> = {\n black: '#000000', red: '#ff0000', green: '#00a000', blue: '#0000ff', yellow: '#c0c000', magenta: '#ff00ff',\n cyan: '#00c0c0', white: '#ffffff',\n}\n\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\nconst DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n\nfunction splitSections(fmt: string): string[] {\n const out: string[] = []\n let cur = ''\n let q = false\n let br = false\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt[i]\n if (c === '\\\\' && !q) {\n cur += c + (fmt[i + 1] ?? '')\n i++\n continue\n }\n if (c === '\"') q = !q\n else if (!q && c === '[') br = true\n else if (!q && c === ']') br = false\n if (c === ';' && !q && !br) {\n out.push(cur)\n cur = ''\n } else cur += c\n }\n out.push(cur)\n return out\n}\n\nfunction parseSection(src: string): Section {\n const toks: Tok[] = []\n let color: string | undefined\n let cond: Section['cond']\n let isDate = false\n let i = 0\n const lit = (v: string) => {\n const last = toks[toks.length - 1]\n if (last?.k === 'lit') last.v += v\n else toks.push({ k: 'lit', v })\n }\n const lower = src.toLowerCase()\n while (i < src.length) {\n const c = src[i]\n const lc = lower[i]\n if (c === '\"') {\n const e = src.indexOf('\"', i + 1)\n lit(src.slice(i + 1, e < 0 ? undefined : e))\n i = e < 0 ? src.length : e + 1\n } else if (c === '\\\\') {\n lit(src[i + 1] ?? '')\n i += 2\n } else if (c === '_') {\n lit(' ')\n i += 2\n } else if (c === '*') {\n i += 2\n } else if (c === '[') {\n const e = src.indexOf(']', i)\n const body = src.slice(i + 1, e < 0 ? undefined : e)\n const bl = body.toLowerCase()\n if (COLORS[bl]) color = COLORS[bl]\n else if (/^color\\s*\\d+$/.test(bl)) color = undefined\n else if (/^(h+|m+|s+)$/.test(bl)) {\n toks.push({ k: 'elapsed', v: bl[0] as 'h' | 'm' | 's' })\n isDate = true\n } else if (body.startsWith('$')) {\n const sym = body.slice(1).split('-')[0]\n if (sym) lit(sym)\n } else {\n const m = /^(<=|>=|<>|<|>|=)\\s*(-?[\\d.]+)$/.exec(body)\n if (m) cond = { op: m[1], v: Number(m[2]) }\n }\n i = e < 0 ? src.length : e + 1\n } else if (c === '0' || c === '#' || c === '?') {\n toks.push({ k: 'digit', v: c })\n i++\n } else if (c === '.') {\n // \".0\" after seconds = fractional seconds; treat as date token\n if (isDate && src[i + 1] === '0') {\n let j = i + 1\n while (src[j] === '0') j++\n toks.push({ k: 'date', v: src.slice(i, j) })\n i = j\n } else {\n toks.push({ k: 'dot' })\n i++\n }\n } else if (c === ',') {\n toks.push({ k: 'comma' })\n i++\n } else if (c === '%') {\n toks.push({ k: 'pct' })\n i++\n } else if ((lc === 'e') && (src[i + 1] === '+' || src[i + 1] === '-')) {\n toks.push({ k: 'exp', sign: src[i + 1] === '+' })\n i += 2\n } else if (c === '/' && toks.some((t) => t.k === 'digit')) {\n toks.push({ k: 'slash' })\n i++\n } else if (c === '@') {\n toks.push({ k: 'text' })\n i++\n } else if (lower.startsWith('am/pm', i)) {\n toks.push({ k: 'date', v: 'AM/PM' })\n isDate = true\n i += 5\n } else if (lower.startsWith('a/p', i)) {\n toks.push({ k: 'date', v: 'A/P' })\n isDate = true\n i += 3\n } else if ('ymdhs'.includes(lc) || (lc === 'g' && lower.startsWith('ge', i)) || lc === 'b') {\n let j = i\n while (lower[j] === lc) j++\n if (lc === 'b' || lc === 'g') lit('')\n else {\n toks.push({ k: 'date', v: lower.slice(i, j) })\n isDate = true\n }\n i = j\n } else {\n lit(c)\n i++\n }\n }\n return { toks, color, isDate, cond, hasDigits: toks.some((t) => t.k === 'digit') }\n}\n\nconst cache = new Map<string, Section[]>()\n\nfunction compile(fmt: string): Section[] {\n let s = cache.get(fmt)\n if (!s) {\n s = splitSections(fmt).map(parseSection)\n if (cache.size > 2000) cache.clear()\n cache.set(fmt, s)\n }\n return s\n}\n\nexport function isDateFormat(fmt: string): boolean {\n if (!fmt || fmt === 'General') return false\n return compile(fmt)[0].isDate\n}\n\nexport function formatGeneral(v: number): string {\n if (!Number.isFinite(v)) return String(v)\n if (Number.isInteger(v) && Math.abs(v) < 1e11) return String(v)\n const a = Math.abs(v)\n if (a >= 1e11 || (a < 1e-9 && a !== 0)) {\n const [m, e] = v.toExponential(5).split('e')\n const mant = m.includes('.') ? m.replace(/0+$/, '').replace(/\\.$/, '') : m\n return mant + 'E' + (e[0] === '-' ? '-' : '+') + e.replace(/^[+-]/, '').padStart(2, '0')\n }\n const digits = Math.max(0, 10 - Math.floor(Math.log10(a || 1)))\n let s = v.toFixed(Math.min(digits, 15))\n if (s.includes('.')) s = s.replace(/0+$/, '').replace(/\\.$/, '')\n return s\n}\n\nfunction group(intStr: string): string {\n return intStr.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')\n}\n\nfunction formatNumber(v: number, sec: Section): string {\n const toks = sec.toks\n let val = Math.abs(v)\n const pctCount = toks.filter((t) => t.k === 'pct').length\n val *= Math.pow(100, pctCount)\n const dotIdx = toks.findIndex((t) => t.k === 'dot')\n const expIdx = toks.findIndex((t) => t.k === 'exp')\n const slashIdx = toks.findIndex((t) => t.k === 'slash')\n const firstDigit = toks.findIndex((t) => t.k === 'digit')\n let lastDigit = -1\n toks.forEach((t, i) => t.k === 'digit' && (lastDigit = i))\n\n // trailing commas after last digit placeholder scale by 1000\n let scale = 0\n for (let i = lastDigit + 1; i < toks.length && toks[i].k === 'comma'; i++) scale++\n val /= Math.pow(1000, scale)\n const grouping = toks.some((t, i) => t.k === 'comma' && i > firstDigit && i < lastDigit)\n\n if (slashIdx >= 0) return formatFraction(val, sec, v < 0)\n\n const intEnd = dotIdx >= 0 ? dotIdx : expIdx >= 0 ? expIdx : lastDigit + 1\n const decToks = dotIdx >= 0 ? toks.slice(dotIdx + 1, expIdx >= 0 ? expIdx : undefined).filter((t) => t.k === 'digit') : []\n const decCount = decToks.length\n\n let mant = val\n let exp = 0\n if (expIdx >= 0) {\n const intPlaces = toks.slice(0, intEnd).filter((t) => t.k === 'digit').length || 1\n if (mant !== 0) {\n exp = Math.floor(Math.log10(mant))\n // engineering-style when multiple int placeholders (##0.0E+0)\n if (intPlaces > 1) exp = Math.floor(exp / intPlaces) * intPlaces\n mant = mant / Math.pow(10, exp)\n }\n }\n let fixed = mant.toFixed(decCount)\n if (expIdx >= 0 && Number(fixed) >= 10 && toks.slice(0, intEnd).filter((t) => t.k === 'digit').length <= 1) {\n exp += 1\n fixed = (mant / 10).toFixed(decCount)\n }\n let [intPart, decPart = ''] = fixed.split('.')\n // decimals: # trims trailing zeros, ? pads with spaces\n if (decCount) {\n const chars = decPart.split('')\n for (let i = decCount - 1; i >= 0; i--) {\n if (chars[i] !== '0') break\n const ph = (decToks[i] as { v: string }).v\n if (ph === '#') chars[i] = ''\n else if (ph === '?') chars[i] = ' '\n else break\n }\n decPart = chars.join('')\n }\n\n const intToks = toks.slice(0, intEnd)\n const intDigitToks = intToks.filter((t) => t.k === 'digit') as { k: 'digit'; v: string }[]\n const minInt = intDigitToks.filter((t) => t.v === '0').length\n if (intPart === '0' && minInt === 0) intPart = ''\n while (intPart.length < minInt) intPart = '0' + intPart\n const hasInnerLit = intToks.some((t, i) => t.k === 'lit' && i > firstDigit && i < intEnd)\n\n let out = ''\n if (!hasInnerLit) {\n let placed = false\n const body = grouping ? group(intPart) : intPart\n for (let i = 0; i < intEnd; i++) {\n const t = toks[i]\n if (t.k === 'digit') {\n if (!placed) {\n out += body\n placed = true\n }\n } else if (t.k === 'lit') out += t.v\n else if (t.k === 'pct') out += '%'\n }\n if (!placed) out += body\n } else {\n // right-to-left fill (phone-number style patterns)\n let digits = intPart\n let res = ''\n for (let i = intEnd - 1; i >= 0; i--) {\n const t = toks[i]\n if (t.k === 'digit') {\n if (digits.length) {\n res = digits[digits.length - 1] + res\n digits = digits.slice(0, -1)\n } else if (t.v === '0') res = '0' + res\n else if (t.v === '?') res = ' ' + res\n if (i === firstDigit && digits.length) {\n res = digits + res\n digits = ''\n }\n } else if (t.k === 'lit') res = t.v + res\n else if (t.k === 'pct') res = '%' + res\n }\n out = res\n }\n if (dotIdx >= 0) {\n out += decPart.length || decToks.some((t) => (t as { v: string }).v === '0') ? '.' + decPart : decCount ? '.' : ''\n }\n const tailStart = expIdx >= 0 ? expIdx : dotIdx >= 0 ? dotIdx + 1 : intEnd\n for (let i = tailStart; i < toks.length; i++) {\n const t = toks[i]\n if (t.k === 'exp') {\n const expDigits = toks.slice(i + 1).filter((x) => x.k === 'digit').length || 1\n out += 'E' + (exp < 0 ? '-' : t.sign ? '+' : '') + String(Math.abs(exp)).padStart(expDigits, '0')\n // skip exponent digit tokens\n while (i + 1 < toks.length && toks[i + 1].k === 'digit') i++\n } else if (t.k === 'lit') out += t.v\n else if (t.k === 'pct') out += '%'\n }\n return out\n}\n\nfunction formatFraction(val: number, sec: Section, neg: boolean): string {\n const toks = sec.toks\n const slash = toks.findIndex((t) => t.k === 'slash')\n const denToks = toks.slice(slash + 1).filter((t) => t.k === 'digit')\n const fixedDen = toks.slice(slash + 1).find((t) => t.k === 'lit' && /^\\d+$/.test(t.v.trim())) as { v: string } | undefined\n const maxDen = fixedDen ? Number(fixedDen.v) : Math.pow(10, denToks.length || 1) - 1\n const hasWhole = toks.slice(0, slash).some((t) => t.k === 'lit' && t.v.includes(' '))\n const whole = hasWhole ? Math.floor(val) : 0\n const frac = val - whole\n let bestN = 0\n let bestD = 1\n if (fixedDen) {\n bestD = maxDen\n bestN = Math.round(frac * maxDen)\n } else {\n let err = Infinity\n for (let d = 1; d <= maxDen; d++) {\n const n = Math.round(frac * d)\n const e = Math.abs(frac - n / d)\n if (e < err - 1e-12) {\n err = e\n bestN = n\n bestD = d\n }\n }\n }\n const sign = neg ? '-' : ''\n if (bestN === 0) return sign + (hasWhole ? String(whole) : '0')\n if (bestN === bestD) return sign + String(whole + 1)\n return sign + (hasWhole && whole ? whole + ' ' : '') + bestN + '/' + bestD\n}\n\nexport function serialToDate(serial: number, date1904 = false): Date {\n let days = Math.floor(serial)\n const ms = Math.round((serial - days) * 86400000)\n let base: number\n if (date1904) base = Date.UTC(1904, 0, 1)\n else if (days < 60) base = Date.UTC(1899, 11, 31)\n else {\n base = Date.UTC(1899, 11, 30)\n if (days === 60) days = 61\n }\n return new Date(base + days * 86400000 + ms)\n}\n\nfunction formatDate(v: number, sec: Section, date1904: boolean): string {\n const d = serialToDate(v, date1904)\n const toks = sec.toks\n const hasAmPm = toks.some((t) => t.k === 'date' && (t.v === 'AM/PM' || t.v === 'A/P'))\n const Y = d.getUTCFullYear()\n const M = d.getUTCMonth()\n const D = d.getUTCDate()\n const H = d.getUTCHours()\n const Mi = d.getUTCMinutes()\n const S = d.getUTCSeconds()\n const msec = d.getUTCMilliseconds()\n const pad = (n: number, w = 2) => String(n).padStart(w, '0')\n let out = ''\n // decide month vs minute for 'm'/'mm'\n const isMinute = (idx: number) => {\n for (let j = idx - 1; j >= 0; j--) {\n const t = toks[j]\n if (t.k === 'date') return t.v[0] === 'h'\n if (t.k === 'elapsed') return t.v === 'h'\n }\n for (let j = idx + 1; j < toks.length; j++) {\n const t = toks[j]\n if (t.k === 'date') return t.v[0] === 's'\n if (t.k === 'elapsed') return t.v === 's'\n }\n return false\n }\n toks.forEach((t, idx) => {\n if (t.k === 'lit') return (out += t.v)\n if (t.k === 'elapsed') {\n const total = v * 86400\n if (t.v === 'h') out += Math.floor(total / 3600)\n else if (t.v === 'm') out += Math.floor(total / 60)\n else out += Math.round(total)\n return\n }\n if (t.k !== 'date') {\n if (t.k === 'digit') out += t.v === '0' ? '0' : ''\n else if (t.k === 'dot') out += '.'\n else if (t.k === 'comma') out += ','\n else if (t.k === 'pct') out += '%'\n else if (t.k === 'slash') out += '/'\n return\n }\n const tv = t.v\n switch (tv[0]) {\n case 'y':\n out += tv.length <= 2 ? pad(Y % 100) : String(Y)\n break\n case 'm':\n if (tv.length <= 2 && isMinute(idx)) out += tv.length === 2 ? pad(Mi) : String(Mi)\n else if (tv.length === 1) out += M + 1\n else if (tv.length === 2) out += pad(M + 1)\n else if (tv.length === 3) out += MONTHS[M].slice(0, 3)\n else if (tv.length === 5) out += MONTHS[M][0]\n else out += MONTHS[M]\n break\n case 'd':\n if (tv.length === 1) out += D\n else if (tv.length === 2) out += pad(D)\n else if (tv.length === 3) out += DAYS[d.getUTCDay()].slice(0, 3)\n else out += DAYS[d.getUTCDay()]\n break\n case 'h': {\n let h = H\n if (hasAmPm) h = h % 12 || 12\n out += tv.length >= 2 ? pad(h) : String(h)\n break\n }\n case 's':\n out += tv.length >= 2 ? pad(S) : String(S)\n break\n case '.':\n out += '.' + pad(Math.floor(msec / Math.pow(10, 3 - (tv.length - 1))), tv.length - 1)\n break\n case 'A':\n out += tv === 'AM/PM' ? (H < 12 ? 'AM' : 'PM') : H < 12 ? 'A' : 'P'\n break\n }\n })\n return out\n}\n\nexport interface Formatted {\n text: string\n color?: string\n}\n\nexport function formatValue(v: number, fmt: string | undefined, date1904 = false): Formatted {\n if (!fmt || fmt === 'General' || fmt === 'general') return { text: formatGeneral(v) }\n const secs = compile(fmt)\n let sec = secs[0]\n let val = v\n const hasCond = secs.some((s) => s.cond)\n if (hasCond) {\n const test = (s: Section) => {\n if (!s.cond) return false\n const { op, v: c } = s.cond\n return op === '<' ? v < c : op === '<=' ? v <= c : op === '>' ? v > c : op === '>=' ? v >= c : op === '=' ? v === c : v !== c\n }\n sec = secs.find(test) ?? secs.find((s) => !s.cond) ?? secs[0]\n } else if (secs.length >= 3 && v === 0 && secs[2].toks.length) sec = secs[2]\n else if (secs.length >= 2 && v < 0 && secs[1].toks.length) {\n sec = secs[1]\n val = -v\n }\n if (sec.isDate) {\n if (v < 0 || v > 2958465) return { text: '#'.repeat(8) }\n return { text: formatDate(v, sec, date1904), color: sec.color }\n }\n if (!sec.hasDigits) {\n // pure literal / text section (\"-\" for zero etc.)\n const lit = sec.toks.map((t) => (t.k === 'lit' ? t.v : t.k === 'pct' ? '%' : t.k === 'text' ? formatGeneral(val) : '')).join('')\n if (sec.toks.some((t) => t.k === 'text') || lit) return { text: lit, color: sec.color }\n return { text: formatGeneral(v), color: sec.color }\n }\n const neg = val < 0\n let text = formatNumber(val, sec)\n if (neg) text = '-' + text\n return { text, color: sec.color }\n}\n\nexport function formatText(s: string, fmt: string | undefined): string {\n if (!fmt || !fmt.includes('@')) return s\n const secs = compile(fmt)\n const sec = secs.length >= 4 ? secs[3] : secs.find((x) => x.toks.some((t) => t.k === 'text'))\n if (!sec) return s\n return sec.toks.map((t) => (t.k === 'lit' ? t.v : t.k === 'text' ? s : '')).join('')\n}\n","import { customIndexed, sheetColor } from '../color'\nimport { cssFont } from '../fonts'\nimport type { Theme } from '../theme'\nimport { kid, kids, num, onOff, type XEl } from '../xml'\nimport { BUILTIN_FORMATS } from './numfmt'\nimport type { CellCss } from './types'\n\ninterface Font {\n b?: boolean\n i?: boolean\n u?: string\n strike?: boolean\n sz?: number\n color?: string\n name?: string\n}\n\nconst BORDER: Record<string, [number, string]> = {\n thin: [1, 'solid'], medium: [2, 'solid'], thick: [3, 'solid'], dashed: [1, 'dashed'], dotted: [1, 'dotted'],\n double: [3, 'double'], hair: [1, 'dotted'], mediumDashed: [2, 'dashed'], dashDot: [1, 'dashed'],\n mediumDashDot: [2, 'dashed'], dashDotDot: [1, 'dotted'], mediumDashDotDot: [2, 'dotted'], slantDashDot: [2, 'dashed'],\n}\n\nexport interface XfInfo {\n numFmt: string\n /** font size in pt */\n fontPt: number\n css: CellCss\n /** explicit horizontal alignment */\n hAlign?: string\n wrap: boolean\n}\n\nexport interface SheetStyles {\n xfs: XfInfo[]\n baseFont: CellCss\n}\n\nexport function parseSheetStyles(root: XEl | undefined, theme: Theme): SheetStyles {\n const indexed = customIndexed(root)\n const col = (el: XEl | undefined) => sheetColor(el, theme, indexed)\n const numFmts = new Map<number, string>()\n for (const f of kids(kid(root, 'numFmts'), 'numFmt')) numFmts.set(Number(f.a.numFmtId), f.a.formatCode ?? 'General')\n\n const fonts: Font[] = kids(kid(root, 'fonts'), 'font').map((f) => ({\n b: onOff(kid(f, 'b')),\n i: onOff(kid(f, 'i')),\n u: kid(f, 'u') ? kid(f, 'u')!.a.val ?? 'single' : undefined,\n strike: onOff(kid(f, 'strike')),\n sz: num(kid(f, 'sz')?.a.val),\n color: col(kid(f, 'color')),\n name: kid(f, 'name')?.a.val,\n }))\n const fills: (string | undefined)[] = kids(kid(root, 'fills'), 'fill').map((f) => {\n const pf = kid(f, 'patternFill')\n if (pf) {\n const t = pf.a.patternType\n if (!t || t === 'none') return undefined\n if (t === 'solid') return col(kid(pf, 'fgColor')) ?? col(kid(pf, 'bgColor'))\n return col(kid(pf, 'fgColor')) ?? '#d9d9d9'\n }\n const gf = kid(f, 'gradientFill')\n if (gf) {\n const stops = kids(gf, 'stop').map((s) => col(kid(s, 'color'))).filter(Boolean)\n if (stops.length >= 2) return `linear-gradient(${num(gf.a.degree, 90)! + 90}deg, ${stops.join(', ')})`\n return stops[0]\n }\n return undefined\n })\n const borders: CellCss[] = kids(kid(root, 'borders'), 'border').map((b) => {\n const css: CellCss = {}\n const side = (el: XEl | undefined, key: string) => {\n const st = el?.a.style\n if (!st || st === 'none') return\n const [w, s] = BORDER[st] ?? [1, 'solid']\n css[key] = `${w}px ${s} ${col(kid(el, 'color')) ?? '#000'}`\n }\n side(kid(b, 'left') ?? kid(b, 'start'), 'borderLeft')\n side(kid(b, 'right') ?? kid(b, 'end'), 'borderRight')\n side(kid(b, 'top'), 'borderTop')\n side(kid(b, 'bottom'), 'borderBottom')\n return css\n })\n\n const f0 = fonts[0] ?? {}\n const baseFont: CellCss = {\n fontFamily: cssFont(f0.name ?? 'Calibri')!,\n fontSize: `${f0.sz ?? 11}pt`,\n color: f0.color ?? '#000000',\n }\n\n const xfs: XfInfo[] = kids(kid(root, 'cellXfs'), 'xf').map((xf) => {\n const css: CellCss = {}\n const id = num(xf.a.numFmtId, 0)!\n const font = fonts[num(xf.a.fontId, 0)!]\n if (font) {\n if (font.b) css.fontWeight = 700\n if (font.i) css.fontStyle = 'italic'\n const deco = [font.u && font.u !== 'none' ? 'underline' : '', font.strike ? 'line-through' : ''].filter(Boolean).join(' ')\n if (deco) css.textDecoration = deco\n if (font.u === 'double' || font.u === 'doubleAccounting') css.textDecorationStyle = 'double'\n if (font.sz && font.sz !== f0.sz) css.fontSize = `${font.sz}pt`\n if (font.color && font.color !== f0.color) css.color = font.color\n if (font.name && font.name !== f0.name) css.fontFamily = cssFont(font.name)!\n }\n const fill = fills[num(xf.a.fillId, 0)!]\n if (fill) css.background = fill\n Object.assign(css, borders[num(xf.a.borderId, 0)!])\n const al = kid(xf, 'alignment')\n let hAlign: string | undefined\n let wrap = false\n if (al) {\n const h = al.a.horizontal\n if (h && h !== 'general') {\n hAlign = h\n css.textAlign = h === 'center' || h === 'centerContinuous' ? 'center' : h === 'right' ? 'right' : h === 'justify' || h === 'distributed' ? 'justify' : 'left'\n }\n const v = al.a.vertical\n css.alignItems = v === 'top' ? 'flex-start' : v === 'center' ? 'center' : 'flex-end'\n wrap = al.a.wrapText === '1' || al.a.wrapText === 'true'\n if (wrap) css.whiteSpace = 'pre-wrap'\n const ind = num(al.a.indent)\n if (ind) css[hAlign === 'right' ? 'paddingRight' : 'paddingLeft'] = `${ind * 9 + 2}px`\n const rot = num(al.a.textRotation)\n if (rot) css.textRotate = rot === 255 ? 255 : rot > 90 ? 90 - rot : rot\n }\n return { numFmt: numFmts.get(id) ?? BUILTIN_FORMATS[id] ?? 'General', fontPt: font?.sz ?? f0.sz ?? 11, css, hAlign, wrap }\n })\n if (!xfs.length) xfs.push({ numFmt: 'General', fontPt: f0.sz ?? 11, css: {}, wrap: false })\n return { xfs, baseFont }\n}\n","import { OpcPackage, relOfType, type Rels } from '../opc'\nimport { parseTheme, type Theme } from '../theme'\nimport { Calc } from './calc'\nimport { kid, kids, num, parseXmlStream, type Attrs, type SaxHandler } from '../xml'\nimport { formatValue, formatText } from './numfmt'\nimport { parseSheetStyles, type SheetStyles } from './styles'\nimport type { BlockOut, CellDetail, CellOut, ColInfo, FindMatch, FindOptions, Merge, RowOut, SheetInfo, SheetProgress, WorkbookMeta } from './types'\n\nexport const T_NUM = 0\nexport const T_SST = 1\nexport const T_STR = 2\nexport const T_BOOL = 3\nexport const T_ERR = 4\nexport const T_DATE = 5\nexport const T_EMPTY = 6\n\nexport const MAX_COL = 16384\n\nconst decodeX = (s: string) => (s.indexOf('_x') >= 0 ? s.replace(/_x([0-9A-Fa-f]{4})_/g, (_, h: string) => String.fromCharCode(parseInt(h, 16))) : s)\n\nexport function colIndex(letters: string): number {\n let c = 0\n for (let i = 0; i < letters.length; i++) {\n const code = letters.charCodeAt(i)\n if (code < 65) break\n c = c * 26 + ((code & ~32) - 64)\n }\n return c - 1\n}\n\nexport function colName(c: number): string {\n let s = ''\n c++\n while (c > 0) {\n const m = (c - 1) % 26\n s = String.fromCharCode(65 + m) + s\n c = Math.floor((c - 1) / 26)\n }\n return s\n}\n\nexport function parseRef(ref: string): [number, number] {\n let i = 0\n while (i < ref.length && ref.charCodeAt(i) >= 65) i++\n return [Number(ref.slice(i)) - 1, colIndex(ref.slice(0, i))]\n}\n\nexport function parseRange(ref: string): Merge | undefined {\n const [a, b] = ref.replace(/\\$/g, '').split(':')\n if (!a) return undefined\n const [r0, c0] = parseRef(a)\n const [r1, c1] = b ? parseRef(b) : [r0, c0]\n return { r0, c0, r1, c1 }\n}\n\nexport class SheetData {\n /** shared formula groups: si → master cell key + formula text */\n shared = new Map<number, { master: number; text: string }>()\n /** dependent cell key → shared formula si */\n depOf = new Map<number, number>()\n /** edited cell keys (r * MAX_COL + c) */\n edited = new Set<number>()\n /** row heights in pt / hidden flags (from the file or the editor) */\n rowAttrs = new Map<number, { ht?: number; hidden?: boolean }>()\n /** rows grown to fit a large font (no explicit height in the file): px */\n autoRowH = new Map<number, number>()\n /** whole-sheet rewrite needed (rows/cols inserted or deleted) */\n structural = false\n /** sections to regenerate on save */\n dirtyCols = false\n dirtyMerges = false\n dirtyView = false\n /** rows whose height/visibility changed */\n dirtyRows = new Set<number>()\n /** formulas rewritten because another sheet changed */\n formulaChanged = false\n /** formula cells stored without a cached value (to compute after load) */\n uncached: number[] = []\n rows: (unknown[] | undefined)[] = []\n maxRow = -1\n maxCol = -1\n formulas = new Map<number, string>()\n merges: Merge[] = []\n colInfo: ColInfo[] = []\n defaultColW = 64\n defaultRowH = 20\n frozen = { rows: 0, cols: 0 }\n gridLines = true\n done = false\n error?: string\n loading?: Promise<void>\n}\n\nclass SheetHandler implements SaxHandler {\n private row = -1\n private rowCells: unknown[] | null = null\n private col = -1\n private cType = ''\n private cStyle = 0\n private val = ''\n private formula = ''\n private hasVal = false\n private capture = 0 // 1 v, 2 f, 3 inline t\n private fShared = -1\n private inIs = false\n newSizes: [number, number][] = []\n headerReady = false\n private rowHasHt = false\n private rowMaxPt = 0\n\n /** fontPt: font size per cell format, used to auto-grow rows without explicit height */\n constructor(private d: SheetData, private fontPt: number[] = [], private basePt = 11) {}\n\n open(name: string, a: Attrs): boolean | void {\n switch (name) {\n case 'c': {\n const r = a.r\n this.col = r ? parseRef(r)[1] : this.col + 1\n this.cType = a.t ?? ''\n this.cStyle = a.s ? Number(a.s) : 0\n this.val = ''\n this.formula = ''\n this.hasVal = false\n return\n }\n case 'v':\n this.capture = 1\n this.hasVal = true\n return\n case 'f':\n this.capture = 2\n this.fShared = a.t === 'shared' && a.si !== undefined ? Number(a.si) : -1\n return\n case 'is':\n this.inIs = true\n this.hasVal = true\n return\n case 't':\n if (this.inIs) this.capture = 3\n return\n case 'rPh':\n return true\n case 'row': {\n this.headerReady = true\n this.row = a.r ? Number(a.r) - 1 : this.row + 1\n this.col = -1\n this.rowCells = []\n const hidden = a.hidden === '1' || a.hidden === 'true'\n if (hidden || a.ht) this.d.rowAttrs.set(this.row, { ht: a.ht ? Number(a.ht) : undefined, hidden: hidden || undefined })\n this.rowHasHt = hidden || !!a.ht\n this.rowMaxPt = 0\n if (hidden) this.newSizes.push([this.row, 0])\n else if (a.ht) {\n const px = Math.round((Number(a.ht) * 4) / 3)\n if (px !== this.d.defaultRowH) this.newSizes.push([this.row, px])\n }\n return\n }\n case 'sheetFormatPr': {\n const h = num(a.defaultRowHeight)\n if (h) this.d.defaultRowH = Math.round((h * 4) / 3)\n const w = num(a.defaultColWidth)\n const base = num(a.baseColWidth)\n if (w) this.d.defaultColW = Math.round(w * 7)\n else if (base !== undefined) this.d.defaultColW = Math.round(base * 7 + 8)\n return\n }\n case 'col': {\n const min = Number(a.min) - 1\n const max = Math.min(Number(a.max) - 1, MAX_COL - 1)\n const hidden = a.hidden === '1' || a.hidden === 'true'\n const w = hidden ? 0 : a.width ? Math.round(Number(a.width) * 7) : this.d.defaultColW\n this.d.colInfo.push({ min, max, w })\n return\n }\n case 'pane':\n if (a.state === 'frozen' || a.state === 'frozenSplit') {\n this.d.frozen = { rows: Math.round(num(a.ySplit, 0)!), cols: Math.round(num(a.xSplit, 0)!) }\n }\n return\n case 'sheetView':\n if (a.showGridLines === '0' || a.showGridLines === 'false') this.d.gridLines = false\n return\n case 'sheetData':\n this.headerReady = true\n return\n case 'mergeCell': {\n const m = a.ref ? parseRange(a.ref) : undefined\n if (m) this.d.merges.push(m)\n return\n }\n case 'extLst':\n case 'conditionalFormatting':\n case 'dataValidations':\n case 'headerFooter':\n return true\n }\n }\n\n close(name: string): void {\n switch (name) {\n case 'v':\n case 'f':\n case 't':\n this.capture = 0\n return\n case 'is':\n this.inIs = false\n return\n case 'c': {\n const cells = this.rowCells\n if (!cells) return\n const c = this.col\n if (c > this.d.maxCol) this.d.maxCol = c\n const key = this.row * MAX_COL + c\n if (this.formula) this.d.formulas.set(key, this.formula)\n if (this.fShared >= 0) {\n if (this.formula) this.d.shared.set(this.fShared, { master: key, text: this.formula })\n else this.d.depOf.set(key, this.fShared)\n this.fShared = -1\n }\n if (!this.hasVal || (this.formula && this.val === '' && this.cType !== 'str')) {\n if (this.formula) {\n this.d.uncached.push(this.row * MAX_COL + c)\n cells.push(c, T_EMPTY, '', this.cStyle)\n } else if (this.cStyle) cells.push(c, T_EMPTY, '', this.cStyle)\n return\n }\n let type = T_NUM\n let v: unknown\n switch (this.cType) {\n case 's':\n type = T_SST\n v = Number(this.val)\n break\n case 'str':\n case 'inlineStr':\n type = T_STR\n v = decodeX(this.val)\n break\n case 'b':\n type = T_BOOL\n v = this.val === '1' || this.val === 'true' ? 1 : 0\n break\n case 'e':\n type = T_ERR\n v = this.val\n break\n case 'd':\n type = T_DATE\n v = this.val\n break\n default: {\n const n = Number(this.val)\n if (this.val === '' || Number.isNaN(n)) {\n type = this.val === '' ? T_EMPTY : T_STR\n v = this.val\n } else v = n\n }\n }\n cells.push(c, type, v, this.cStyle)\n if (!this.rowHasHt) {\n const pt = this.fontPt[this.cStyle] ?? this.basePt\n if (pt > this.rowMaxPt) this.rowMaxPt = pt\n }\n return\n }\n case 'row':\n if (!this.rowHasHt && this.rowMaxPt > this.basePt * 1.15) {\n const px = Math.round(this.rowMaxPt * (4 / 3) * 1.3 + 3)\n if (px > this.d.defaultRowH) {\n this.newSizes.push([this.row, px])\n this.d.autoRowH.set(this.row, px)\n }\n }\n if (this.rowCells && this.rowCells.length) this.d.rows[this.row] = this.rowCells\n if (this.row > this.d.maxRow) this.d.maxRow = this.row\n this.rowCells = null\n return\n }\n }\n\n text(t: string): void {\n if (this.capture === 1) this.val += t\n else if (this.capture === 2) this.formula += t\n else if (this.capture === 3) this.val += t\n }\n}\n\nclass SstHandler implements SaxHandler {\n strings: string[] = []\n private cur = ''\n private capture = false\n open(name: string): boolean | void {\n if (name === 'si') this.cur = ''\n else if (name === 't') this.capture = true\n else if (name === 'rPh' || name === 'phoneticPr') return true\n }\n close(name: string): void {\n if (name === 't') this.capture = false\n else if (name === 'si') this.strings.push(decodeX(this.cur))\n }\n text(t: string): void {\n if (this.capture) this.cur += t\n }\n}\n\nexport class XlsxWorkbook {\n sheetsData = new Map<number, SheetData>()\n readonly calc = new Calc(this)\n sst: string[] = []\n private sstLoading?: Promise<void>\n\n private constructor(\n readonly pkg: OpcPackage,\n readonly mainPath: string,\n readonly rels: Rels,\n readonly sheets: SheetInfo[],\n public styles: SheetStyles,\n readonly date1904: boolean,\n readonly theme: Theme,\n ) {}\n\n static async open(pkg: OpcPackage, mainPath: string): Promise<XlsxWorkbook> {\n const root = await pkg.xml(mainPath)\n const rels = await pkg.rels(mainPath)\n const sheets: SheetInfo[] = []\n for (const s of kids(kid(root, 'sheets'), 'sheet')) {\n const rel = rels.get(s.a['r:id'])\n if (!rel || !rel.type.endsWith('/worksheet')) continue\n sheets.push({ name: s.a.name ?? `Sheet${sheets.length + 1}`, index: sheets.length, path: rel.target, hidden: !!s.a.state && s.a.state !== 'visible' })\n }\n const themeRel = relOfType(rels, 'theme')\n const theme = parseTheme(themeRel ? await pkg.xml(themeRel.target) : undefined)\n const stylesRel = relOfType(rels, 'styles')\n const styles = parseSheetStyles(stylesRel ? await pkg.xml(stylesRel.target) : undefined, theme)\n const pr = kid(root, 'workbookPr')\n const date1904 = pr?.a.date1904 === '1' || pr?.a.date1904 === 'true'\n return new XlsxWorkbook(pkg, mainPath, rels, sheets, styles, date1904, theme)\n }\n\n meta(): WorkbookMeta {\n return {\n sheets: this.sheets,\n styles: this.styles.xfs.map((x) => x.css),\n formats: this.styles.xfs.map((x) => x.numFmt),\n baseFont: this.styles.baseFont,\n date1904: this.date1904,\n }\n }\n\n private loadSst(onProgress?: (loaded: number, total: number) => void): Promise<void> {\n if (!this.sstLoading) {\n this.sstLoading = (async () => {\n const rel = relOfType(this.rels, 'sharedStrings')\n if (!rel || !this.pkg.has(rel.target)) return\n const h = new SstHandler()\n this.sst = h.strings\n await parseXmlStream(await this.pkg.stream(rel.target, onProgress), h)\n })()\n }\n return this.sstLoading\n }\n\n /**\n * Streams a sheet into memory, reporting progress so the UI can grow while parsing.\n * Calling again for a loaded/in-flight sheet is a no-op.\n */\n loadSheet(index: number, emit: (p: SheetProgress) => void, onBytes?: (phase: string, loaded: number, total: number) => void): Promise<void> {\n const existing = this.sheetsData.get(index)\n if (existing) {\n emit(this.snapshot(index, existing, rowSizesOf(existing), true))\n return existing.loading ?? Promise.resolve()\n }\n const d = new SheetData()\n this.sheetsData.set(index, d)\n d.loading = (async () => {\n const info = this.sheets[index]\n if (!info) throw new Error(`No sheet #${index}`)\n try {\n await this.loadSst((l, t) => onBytes?.('strings', l, t))\n const h = new SheetHandler(d, this.styles.xfs.map((x) => x.fontPt), this.styles.xfs[0]?.fontPt ?? 11)\n let sentHeader = false\n let last = 0\n await parseXmlStream(await this.pkg.stream(info.path, (l, t) => onBytes?.('sheet', l, t)), h, {\n onChunk: async () => {\n const now = Date.now()\n if (!sentHeader && h.headerReady) {\n sentHeader = true\n emit(this.snapshot(index, d, h.newSizes.splice(0), true))\n last = now\n await new Promise((r) => setTimeout(r, 0))\n } else if (now - last > 150) {\n last = now\n emit(this.snapshot(index, d, h.newSizes.splice(0), false))\n await new Promise((r) => setTimeout(r, 0))\n }\n },\n })\n d.done = true\n emit({ ...this.snapshot(index, d, h.newSizes.splice(0), !sentHeader), merges: d.merges })\n if (d.uncached.length) {\n // files written by libraries often omit cached formula results: compute them (other sheets may be referenced)\n const keys = d.uncached.splice(0)\n void (async () => {\n await Promise.all(this.sheets.map((s) => (s.index === index ? null : this.loadSheet(s.index, () => {}))))\n this.calc.invalidate()\n this.calc.computeMissing(index, keys)\n emit({ ...this.snapshot(index, d, [], false), recalc: true })\n })()\n }\n } catch (e) {\n d.done = true\n d.error = (e as Error).message\n emit({ ...this.snapshot(index, d, [], true), error: d.error })\n }\n })()\n return d.loading\n }\n\n private snapshot(sheet: number, d: SheetData, rowSizes: [number, number][], header: boolean): SheetProgress {\n const p: SheetProgress = { sheet, rows: d.maxRow + 1, cols: d.maxCol + 1, rowSizes, done: d.done }\n if (header) {\n p.colInfo = d.colInfo\n p.defaultColW = d.defaultColW\n p.defaultRowH = d.defaultRowH\n p.frozen = d.frozen\n p.gridLines = d.gridLines\n }\n if (d.done) p.merges = d.merges\n if (d.error) p.error = d.error\n return p\n }\n\n /** Formatted cells for rows [r0, r1). */\n block(sheet: number, r0: number, r1: number): BlockOut {\n const d = this.sheetsData.get(sheet)\n const rows: RowOut[] = []\n if (!d) return { sheet, r0, r1, rows, complete: false }\n const xfs = this.styles.xfs\n const end = Math.min(r1, d.rows.length)\n for (let r = r0; r < end; r++) {\n const row = d.rows[r]\n if (!row) continue\n const cells: CellOut[] = []\n for (let k = 0; k < row.length; k += 4) {\n const c = row[k] as number\n const t = row[k + 1] as number\n const v = row[k + 2]\n const s = row[k + 3] as number\n const xf = xfs[s] ?? xfs[0]\n switch (t) {\n case T_NUM: {\n const f = formatValue(v as number, xf.numFmt, this.date1904)\n cells.push(f.color ? [c, f.text, s, 1, f.color] : [c, f.text, s, 1])\n break\n }\n case T_SST:\n cells.push([c, formatText(this.sst[v as number] ?? '', xf.numFmt), s, 0])\n break\n case T_STR:\n cells.push([c, formatText(v as string, xf.numFmt), s, 0])\n break\n case T_BOOL:\n cells.push([c, v ? 'TRUE' : 'FALSE', s, 2])\n break\n case T_ERR:\n cells.push([c, v as string, s, 2])\n break\n case T_DATE:\n cells.push([c, (v as string).replace('T00:00:00', '').replace('T', ' ').replace(/Z$/, ''), s, 1])\n break\n default:\n cells.push([c, '', s, 0])\n }\n }\n rows.push({ r, cells })\n }\n return { sheet, r0, r1, rows, complete: d.done || r1 <= d.maxRow }\n }\n\n /** cells whose shown value (or formula) contains `query`, in row order */\n find(sheet: number, query: string, opts: FindOptions = {}, limit = 20_000): FindMatch[] {\n const d = this.sheetsData.get(sheet)\n const out: FindMatch[] = []\n if (!d || !query) return out\n const norm = (t: string) => (opts.matchCase ? t : t.toLowerCase())\n const q = norm(query)\n const xfs = this.styles.xfs\n for (let r = 0; r < d.rows.length && out.length < limit; r++) {\n const row = d.rows[r]\n if (!row) continue\n for (let k = 0; k < row.length && out.length < limit; k += 4) {\n const c = row[k] as number\n const t = row[k + 1] as number\n const v = row[k + 2]\n const f = opts.formulas ? d.formulas.get(r * MAX_COL + c) : undefined\n let text: string\n if (f) text = '=' + f\n else if (t === T_NUM) text = formatValue(v as number, (xfs[row[k + 3] as number] ?? xfs[0])?.numFmt, this.date1904).text\n else if (t === T_SST) text = this.sst[v as number] ?? ''\n else if (t === T_BOOL) text = v ? 'TRUE' : 'FALSE'\n else if (t === T_EMPTY) text = ''\n else text = String(v)\n if (!text) continue\n const h = norm(text)\n if (opts.whole ? h === q : h.includes(q)) out.push({ r, c, text })\n }\n }\n return out\n }\n\n cell(sheet: number, r: number, c: number): CellDetail | undefined {\n const d = this.sheetsData.get(sheet)\n const row = d?.rows[r]\n const formula = d?.formulas.get(r * MAX_COL + c)\n if (!row) return formula ? { value: '', formula: '=' + formula, type: 'formula' } : undefined\n for (let k = 0; k < row.length; k += 4) {\n if (row[k] !== c) continue\n const t = row[k + 1] as number\n const v = row[k + 2]\n const value = t === T_SST ? this.sst[v as number] ?? '' : t === T_BOOL ? (v ? 'TRUE' : 'FALSE') : String(v)\n const type = ['number', 'string', 'string', 'boolean', 'error', 'date', 'empty'][t]\n return { value, formula: formula ? '=' + formula : undefined, type }\n }\n return formula ? { value: '', formula: '=' + formula, type: 'formula' } : undefined\n }\n\n unload(sheet: number) {\n const d = this.sheetsData.get(sheet)\n if (d?.done) this.sheetsData.delete(sheet)\n }\n}\n\n/** pixel heights of every non-default row: explicit heights / hidden rows win over font-grown ones */\nexport function rowSizesOf(d: SheetData): [number, number][] {\n const out: [number, number][] = []\n for (const [r, px] of d.autoRowH) if (!d.rowAttrs.has(r)) out.push([r, px])\n for (const [r, a] of d.rowAttrs) out.push([r, a.hidden ? 0 : a.ht !== undefined ? Math.round((a.ht * 4) / 3) : (d.autoRowH.get(r) ?? d.defaultRowH)])\n return out\n}\n","/**\n * Structural sheet edits on the in-memory SheetData: insert/delete rows & columns,\n * merges, sizes. Formulas (this sheet and others pointing at it) are shifted.\n */\nimport { shiftFormula, translateFormula } from './formula'\nimport type { ColInfo, Merge, Range } from './types'\nimport { MAX_COL, type SheetData } from './workbook'\n\nexport interface Snapshot {\n rows: (unknown[] | undefined)[]\n formulas: Map<number, string>\n merges: Merge[]\n colInfo: ColInfo[]\n rowAttrs: Map<number, { ht?: number; hidden?: boolean }>\n autoRowH: Map<number, number>\n maxRow: number\n maxCol: number\n frozen: { rows: number; cols: number }\n}\n\nexport function snapshot(d: SheetData): Snapshot {\n return {\n rows: d.rows.map((r) => (r ? r.slice() : r)),\n formulas: new Map(d.formulas),\n merges: d.merges.map((m) => ({ ...m })),\n colInfo: d.colInfo.map((c) => ({ ...c })),\n rowAttrs: new Map([...d.rowAttrs].map(([k, v]) => [k, { ...v }])),\n autoRowH: new Map(d.autoRowH),\n maxRow: d.maxRow,\n maxCol: d.maxCol,\n frozen: { ...d.frozen },\n }\n}\n\nexport function restore(d: SheetData, s: Snapshot) {\n d.rows = s.rows.map((r) => (r ? r.slice() : r))\n d.formulas = new Map(s.formulas)\n d.merges = s.merges.map((m) => ({ ...m }))\n d.colInfo = s.colInfo.map((c) => ({ ...c }))\n d.rowAttrs = new Map([...s.rowAttrs].map(([k, v]) => [k, { ...v }]))\n d.autoRowH = new Map(s.autoRowH)\n d.maxRow = s.maxRow\n d.maxCol = s.maxCol\n d.frozen = { ...s.frozen }\n d.structural = true\n d.dirtyCols = d.dirtyMerges = d.dirtyView = true\n}\n\n/** shared formulas → explicit per-cell formulas (needed before rows/cols move) */\nexport function materializeShared(d: SheetData) {\n for (const [key, si] of d.depOf) {\n const g = d.shared.get(si)\n if (!g || d.formulas.has(key)) continue\n const dr = Math.floor(key / MAX_COL) - Math.floor(g.master / MAX_COL)\n const dc = (key % MAX_COL) - (g.master % MAX_COL)\n d.formulas.set(key, translateFormula(g.text, dr, dc))\n }\n d.depOf.clear()\n d.shared.clear()\n}\n\nfunction shiftMerges(ms: Merge[], axis: 'row' | 'col', at: number, delta: number): Merge[] {\n const out: Merge[] = []\n for (const m of ms) {\n let [a0, a1] = axis === 'row' ? [m.r0, m.r1] : [m.c0, m.c1]\n if (delta > 0) {\n if (a0 >= at) a0 += delta\n if (a1 >= at) a1 += delta\n } else {\n const end = at - delta // exclusive end of deleted band\n const cut = (v: number) => (v < at ? v : v >= end ? v + delta : at)\n if (a0 >= at && a1 < end) continue\n a0 = cut(a0)\n a1 = a1 >= end ? a1 + delta : a1 >= at ? at - 1 : a1\n if (a1 < a0) continue\n }\n const n = axis === 'row' ? { ...m, r0: a0, r1: a1 } : { ...m, c0: a0, c1: a1 }\n if (n.r0 === n.r1 && n.c0 === n.c1) continue\n out.push(n)\n }\n return out\n}\n\n/** Moves rows or columns; delta > 0 inserts at `at`, delta < 0 deletes -delta starting at `at`. */\nexport function shiftSheet(d: SheetData, sheetName: string, axis: 'row' | 'col', at: number, delta: number, others: { name: string; d: SheetData }[]) {\n materializeShared(d)\n const end = at - delta\n if (axis === 'row') {\n if (delta > 0) d.rows.splice(at, 0, ...new Array<undefined>(delta).fill(undefined))\n else d.rows.splice(at, -delta)\n d.maxRow = Math.max(-1, d.maxRow + (d.maxRow >= at ? delta : 0))\n const attrs = new Map<number, { ht?: number; hidden?: boolean }>()\n for (const [r, v] of d.rowAttrs) {\n if (delta < 0 && r >= at && r < end) continue\n attrs.set(r >= at ? r + delta : r, v)\n }\n d.rowAttrs = attrs\n const auto = new Map<number, number>()\n for (const [r, px] of d.autoRowH) {\n if (delta < 0 && r >= at && r < end) continue\n auto.set(r >= at ? r + delta : r, px)\n }\n d.autoRowH = auto\n } else {\n for (let r = 0; r < d.rows.length; r++) {\n const row = d.rows[r]\n if (!row) continue\n const out: unknown[] = []\n for (let k = 0; k < row.length; k += 4) {\n const c = row[k] as number\n if (delta < 0 && c >= at && c < end) continue\n out.push(c >= at ? c + delta : c, row[k + 1], row[k + 2], row[k + 3])\n }\n d.rows[r] = out.length ? out : undefined\n }\n d.maxCol = Math.max(-1, d.maxCol + (d.maxCol >= at ? delta : 0))\n const cols: ColInfo[] = []\n for (const ci of d.colInfo) {\n let { min, max } = ci\n if (delta > 0) {\n if (min >= at) min += delta\n if (max >= at) max += delta\n } else {\n if (min >= at && max < end) continue\n min = min < at ? min : min >= end ? min + delta : at\n max = max >= end ? max + delta : max >= at ? at - 1 : max\n if (max < min) continue\n }\n cols.push({ ...ci, min, max })\n }\n d.colInfo = cols\n d.dirtyCols = true\n }\n // formulas of this sheet: move keys + rewrite references\n const op = { sheet: sheetName, formulaSheet: sheetName, axis, at, delta }\n const formulas = new Map<number, string>()\n for (const [key, f] of d.formulas) {\n let r = Math.floor(key / MAX_COL)\n let c = key % MAX_COL\n const v = axis === 'row' ? r : c\n if (delta < 0 && v >= at && v < end) continue\n if (v >= at) {\n if (axis === 'row') r += delta\n else c += delta\n }\n formulas.set(r * MAX_COL + c, shiftFormula(f, op))\n }\n d.formulas = formulas\n for (const o of others) {\n if (o.d === d) continue\n let changed = false\n for (const [key, f] of o.d.formulas) {\n const g = shiftFormula(f, { ...op, formulaSheet: o.name })\n if (g !== f) {\n o.d.formulas.set(key, g)\n o.d.edited.add(key)\n changed = true\n }\n }\n if (changed) o.d.formulaChanged = true\n }\n d.merges = shiftMerges(d.merges, axis, at, delta)\n if (axis === 'row' && d.frozen.rows > at) d.frozen = { ...d.frozen, rows: Math.max(0, d.frozen.rows + (delta > 0 ? delta : Math.max(delta, at - d.frozen.rows))) }\n if (axis === 'col' && d.frozen.cols > at) d.frozen = { ...d.frozen, cols: Math.max(0, d.frozen.cols + (delta > 0 ? delta : Math.max(delta, at - d.frozen.cols))) }\n d.structural = true\n d.dirtyMerges = true\n d.dirtyView = true\n}\n\nexport function setMerge(d: SheetData, range: Range, merge: boolean) {\n const hit = (m: Merge) => m.r1 >= range.r0 && m.r0 <= range.r1 && m.c1 >= range.c0 && m.c0 <= range.c1\n d.merges = d.merges.filter((m) => !hit(m))\n if (merge && (range.r0 !== range.r1 || range.c0 !== range.c1)) d.merges.push({ ...range })\n d.dirtyMerges = true\n}\n\nexport function setColWidth(d: SheetData, c0: number, c1: number, px: number) {\n const out: ColInfo[] = []\n for (const ci of d.colInfo) {\n if (ci.max < c0 || ci.min > c1) out.push(ci)\n else {\n if (ci.min < c0) out.push({ ...ci, max: c0 - 1 })\n if (ci.max > c1) out.push({ ...ci, min: c1 + 1 })\n }\n }\n out.push({ min: c0, max: c1, w: Math.max(0, Math.round(px)) })\n d.colInfo = out.sort((a, b) => a.min - b.min)\n d.dirtyCols = true\n}\n\nexport function setRowHeight(d: SheetData, r0: number, r1: number, px: number) {\n for (let r = r0; r <= r1; r++) {\n d.rowAttrs.set(r, px > 0 ? { ht: +(px * 0.75).toFixed(2) } : { ...(d.rowAttrs.get(r) ?? {}), hidden: true })\n d.dirtyRows.add(r)\n }\n}\n","/**\n * XLSX editing: cell values/formats live in the worker's SheetData; on save each\n * edited sheet is streamed through a rewriter that only touches edited rows.\n */\nimport { relOfType, relsPathFor } from '../opc'\nimport {\n clone, el, escText, relIdAttrs, getAttr, isNode, kidOf, kidsOf, local, parseRaw, prefixOf, rootEl, serialize, setAttr, setOrdered,\n type RChild, type RNode,\n} from '../raw'\nimport { parseXml } from '../xml'\nimport { BUILTIN_FORMATS, isDateFormat } from './numfmt'\nimport { parseSheetStyles } from './styles'\nimport type { BookOp, BorderKind, CellInput, ColInfo, FindOptions, FmtPatch, Merge, Range, SheetOp, SheetProgress, XlsxEditResult } from './types'\nimport { materializeShared, restore, setColWidth, setMerge, setRowHeight, shiftSheet, snapshot, type Snapshot } from './structure'\nimport { renameSheetInFormula, translateFormula } from './formula'\nimport {\n colName, MAX_COL, parseRef, rowSizesOf, SheetData, T_BOOL, T_DATE, T_EMPTY, T_ERR, T_NUM, T_SST, T_STR, XlsxWorkbook,\n} from './workbook'\n\nexport const XLSX_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\ntype Entry = [number, unknown, number]\ninterface CellChange {\n key: number\n prev: Entry | null\n prevF?: string\n next: Entry | null\n nextF?: string\n}\ninterface LayoutState {\n merges?: Merge[]\n colInfo?: ColInfo[]\n rowAttrs?: [number, { ht?: number; hidden?: boolean }][]\n frozen?: { rows: number; cols: number }\n gridLines?: boolean\n}\n\nexport interface Change {\n sheet: number\n cells: CellChange[]\n range: Range\n /** cheap layout state (merges, sizes, panes) before/after */\n lay?: { before: LayoutState; after: LayoutState }\n /** whole-sheet snapshots (row/column insert/delete) */\n full?: { before: Snapshot; after: Snapshot }\n}\n\nconst FONT_ORDER = ['b', 'i', 'strike', 'condense', 'extend', 'outline', 'shadow', 'u', 'vertAlign', 'sz', 'color', 'name', 'family', 'charset', 'scheme']\nconst WB_ORDER = [\n 'fileVersion', 'fileSharing', 'workbookPr', 'workbookProtection', 'bookViews', 'sheets', 'functionGroups', 'externalReferences',\n 'definedNames', 'calcPr', 'oleSize', 'customWorkbookViews', 'pivotCaches', 'smartTagPr', 'smartTagTypes', 'webPublishing',\n 'fileRecoveryPr', 'webPublishObjects', 'extLst',\n]\nconst SS_ORDER = ['numFmts', 'fonts', 'fills', 'borders', 'cellStyleXfs', 'cellXfs', 'cellStyles', 'dxfs', 'tableStyles', 'colors', 'extLst']\n\n// ---------------------------------------------------------------- cell storage helpers\n\nfunction rowOf(d: SheetData, r: number, create: boolean): unknown[] | undefined {\n let row = d.rows[r]\n if (!row && create) d.rows[r] = row = []\n return row\n}\n\nexport function getEntry(d: SheetData, r: number, c: number): Entry | null {\n const row = d.rows[r]\n if (!row) return null\n for (let k = 0; k < row.length; k += 4) if (row[k] === c) return [row[k + 1] as number, row[k + 2], row[k + 3] as number]\n return null\n}\n\nfunction setEntry(d: SheetData, r: number, c: number, e: Entry | null) {\n const row = rowOf(d, r, !!e)\n if (!row) return\n let k = 0\n for (; k < row.length; k += 4) if ((row[k] as number) >= c) break\n const exists = k < row.length && row[k] === c\n if (!e) {\n if (exists) row.splice(k, 4)\n if (!row.length) d.rows[r] = undefined\n return\n }\n if (exists) {\n row[k + 1] = e[0]\n row[k + 2] = e[1]\n row[k + 3] = e[2]\n } else row.splice(k, 0, c, e[0], e[1], e[2])\n if (r > d.maxRow) d.maxRow = r\n if (c > d.maxCol) d.maxCol = c\n}\n\nfunction dateSerial(t: string): number | undefined {\n let m = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{2})(?::(\\d{2}))?)?$/.exec(t)\n let y: number, mo: number, d: number\n if (m) [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])]\n else {\n m = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})(?: (\\d{1,2}):(\\d{2})(?::(\\d{2}))?)?$/.exec(t)\n if (!m) return undefined\n ;[d, mo, y] = [Number(m[1]), Number(m[2]), Number(m[3])]\n }\n const ms = Date.UTC(y, mo - 1, d, Number(m[4] ?? 0), Number(m[5] ?? 0), Number(m[6] ?? 0))\n if (!Number.isFinite(ms)) return undefined\n return ms / 86400000 + 25569\n}\n\nfunction parseInput(input: string, style: number, isDate = false): { e: Entry | null; f?: string } {\n if (input === '') return { e: style ? [T_EMPTY, '', style] : null }\n if (input.startsWith('=') && input.length > 1) return { e: [T_STR, input, style], f: input.slice(1) }\n const t = input.trim()\n if (/^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(t)) return { e: [T_NUM, Number(t), style] }\n if (/^[-+]?(\\d+\\.?\\d*|\\.\\d+)%$/.test(t)) return { e: [T_NUM, Number(t.slice(0, -1)) / 100, style] }\n if (/^(true|false)$/i.test(t)) return { e: [T_BOOL, /^true$/i.test(t) ? 1 : 0, style] }\n if (isDate) {\n const serial = dateSerial(t)\n if (serial !== undefined) return { e: [T_NUM, serial, style] }\n }\n return { e: [T_STR, input, style] }\n}\n\n// ---------------------------------------------------------------- styles\n\nclass StyleEditor {\n nodes: RChild[]\n root: RNode\n P: string\n private cache = new Map<string, number>()\n changed = false\n\n constructor(xml: string) {\n this.nodes = parseRaw(xml)\n this.root = rootEl(this.nodes)!\n this.P = prefixOf(this.root.q)\n }\n\n private section(name: string): RNode {\n let n = kidOf(this.root, name)\n if (!n) {\n n = el(this.P + name, { count: '0' })\n setOrdered(this.root, n, name, SS_ORDER)\n }\n return n\n }\n\n private append(sectionName: string, node: RNode): number {\n const sec = this.section(sectionName)\n sec.c.push(node)\n sec.self = false\n const n = kidsOf(sec).length\n setAttr(sec, 'count', String(n))\n this.changed = true\n return n - 1\n }\n\n private numFmtId(code: string): number {\n for (const [id, c] of Object.entries(BUILTIN_FORMATS)) if (c === code) return Number(id)\n const sec = kidOf(this.root, 'numFmts')\n let max = 163\n for (const f of kidsOf(sec, 'numFmt')) {\n const id = Number(getAttr(f, 'numFmtId'))\n if (getAttr(f, 'formatCode') === code) return id\n max = Math.max(max, id)\n }\n this.append('numFmts', el(this.P + 'numFmt', { numFmtId: String(max + 1), formatCode: code }))\n return max + 1\n }\n\n derive(xfIndex: number, patch: FmtPatch): number {\n const key = xfIndex + JSON.stringify(patch)\n const hit = this.cache.get(key)\n if (hit !== undefined) return hit\n const P = this.P\n const xfs = kidsOf(this.section('cellXfs'), 'xf')\n const xf = clone(xfs[xfIndex] ?? xfs[0] ?? el(P + 'xf', { numFmtId: '0', fontId: '0', fillId: '0', borderId: '0' }))\n const fontKeys = ['b', 'i', 'u', 'strike', 'color', 'sz', 'font'] as const\n if (fontKeys.some((k) => k in patch)) {\n const fonts = kidsOf(this.section('fonts'), 'font')\n const font = clone(fonts[Number(getAttr(xf, 'fontId') ?? 0)] ?? fonts[0] ?? el(P + 'font'))\n const put = (l: string, n: RNode | undefined) => setOrdered(font, n, l, FONT_ORDER)\n if (patch.b !== undefined) put('b', patch.b ? el(P + 'b') : undefined)\n if (patch.i !== undefined) put('i', patch.i ? el(P + 'i') : undefined)\n if (patch.strike !== undefined) put('strike', patch.strike ? el(P + 'strike') : undefined)\n if (patch.u !== undefined) put('u', patch.u ? el(P + 'u') : undefined)\n if (patch.sz !== undefined) put('sz', el(P + 'sz', { val: String(patch.sz) }))\n if ('color' in patch) put('color', patch.color ? el(P + 'color', { rgb: 'FF' + patch.color.replace('#', '').toUpperCase() }) : undefined)\n if (patch.font) {\n put('name', el(P + 'name', { val: patch.font }))\n put('scheme', undefined)\n }\n setAttr(xf, 'fontId', String(this.append('fonts', font)))\n setAttr(xf, 'applyFont', '1')\n }\n if ('fill' in patch) {\n if (!patch.fill) setAttr(xf, 'fillId', '0')\n else {\n const fill = parseRaw(\n `<${P}fill><${P}patternFill patternType=\"solid\"><${P}fgColor rgb=\"FF${patch.fill.replace('#', '').toUpperCase()}\"/><${P}bgColor indexed=\"64\"/></${P}patternFill></${P}fill>`,\n )[0] as RNode\n setAttr(xf, 'fillId', String(this.append('fills', fill)))\n }\n setAttr(xf, 'applyFill', '1')\n }\n if (patch.border) {\n const sides = (patch as FmtPatch & { sides?: Record<string, boolean> }).sides ?? {}\n const borders = kidsOf(this.section('borders'), 'border')\n const b = clone(borders[Number(getAttr(xf, 'borderId') ?? 0)] ?? borders[0] ?? el(P + 'border'))\n const color = (patch.borderColor ?? '#000000').replace('#', '').toUpperCase()\n const order = ['left', 'start', 'right', 'end', 'top', 'bottom', 'diagonal', 'vertical', 'horizontal']\n for (const side of ['left', 'right', 'top', 'bottom']) {\n if (!(side in sides)) continue\n const node = sides[side] ? el(P + side, { style: patch.borderStyle ?? 'thin' }, [el(P + 'color', { rgb: 'FF' + color })]) : el(P + side)\n setOrdered(b, node, side, order)\n }\n if (!kidOf(b, 'diagonal')) setOrdered(b, el(P + 'diagonal'), 'diagonal', order)\n setAttr(xf, 'borderId', String(this.append('borders', b)))\n setAttr(xf, 'applyBorder', '1')\n }\n if ('align' in patch || 'wrap' in patch || 'valign' in patch || 'rotate' in patch) {\n const al = clone(kidOf(xf, 'alignment') ?? el(P + 'alignment'))\n if ('align' in patch) setAttr(al, 'horizontal', patch.align ?? undefined)\n if ('valign' in patch) setAttr(al, 'vertical', patch.valign && patch.valign !== 'bottom' ? patch.valign : undefined)\n if ('wrap' in patch) setAttr(al, 'wrapText', patch.wrap ? '1' : undefined)\n if ('rotate' in patch) {\n const v = patch.rotate\n // OOXML: 1-90 counter-clockwise, 91-180 clockwise (90 + deg), 255 vertical\n setAttr(al, 'textRotation', !v ? undefined : v === 255 ? '255' : v > 0 ? String(Math.min(90, v)) : String(90 + Math.min(90, -v)))\n }\n setOrdered(xf, al.a.trim() ? al : undefined, 'alignment', ['alignment', 'protection', 'extLst'])\n setAttr(xf, 'applyAlignment', '1')\n }\n if (patch.numFmt !== undefined) {\n setAttr(xf, 'numFmtId', String(this.numFmtId(patch.numFmt)))\n setAttr(xf, 'applyNumberFormat', '1')\n }\n const idx = this.append('cellXfs', xf)\n this.cache.set(key, idx)\n return idx\n }\n\n xml() {\n return serialize(this.nodes)\n }\n\n /** collaboration: sizes of the growing sections (to drop what a rolled-back operation derived) */\n mark(): Record<string, number> {\n const out: Record<string, number> = {}\n for (const name of ['numFmts', 'fonts', 'fills', 'borders', 'cellXfs']) out[name] = kidsOf(kidOf(this.root, name)).length\n return out\n }\n\n truncate(m: Record<string, number>) {\n for (const [name, len] of Object.entries(m)) {\n const sec = kidOf(this.root, name)\n const kids = kidsOf(sec)\n if (!sec || kids.length <= len) continue\n const drop = new Set<RChild>(kids.slice(len))\n sec.c = sec.c.filter((c) => !drop.has(c))\n setAttr(sec, 'count', String(len))\n }\n for (const [k, v] of this.cache) if (v >= m.cellXfs) this.cache.delete(k)\n }\n}\n\n// ---------------------------------------------------------------- editor\n\nexport class XlsxEditor {\n private undoStack: Change[] = []\n private redoStack: Change[] = []\n private styleEd?: StyleEditor\n private stylesPath?: string\n private formulaTouched = false\n\n constructor(private wb: XlsxWorkbook) {}\n\n get dirty() {\n return [...this.wb.sheetsData.values()].some(needsWrite) || !!this.styleEd?.changed || this.bookChanged\n }\n\n private sheet(i: number): SheetData {\n const d = this.wb.sheetsData.get(i)\n if (!d || !d.done) throw new Error('Sheet is still loading')\n return d\n }\n\n private lastRecalc: number[] = []\n\n private apply(d: SheetData, cells: CellChange[], which: 'prev' | 'next') {\n const sheet = [...this.wb.sheetsData].find(([, x]) => x === d)?.[0] ?? 0\n const formulaKeys: { sheet: number; key: number }[] = []\n this.applyRaw(d, cells, which)\n for (const ch of cells) {\n const f0 = which === 'prev' ? ch.nextF : ch.prevF\n const f1 = which === 'prev' ? ch.prevF : ch.nextF\n if (f0 !== f1) this.wb.calc.formulaChanged(sheet, ch.key)\n if (f1) formulaKeys.push({ sheet, key: ch.key })\n }\n // only value changes matter for dependents (formatting doesn't)\n const changed = cells.filter((c) => {\n if (which === 'prev' ? c.prevF : c.nextF) return false\n const a = c.prev\n const b = c.next\n return !a || !b || a[0] !== b[0] || a[1] !== b[1] || c.prevF !== c.nextF\n })\n this.lastRecalc = changed.length || formulaKeys.length ? [...this.wb.calc.recalc(changed.map((c) => ({ sheet, key: c.key })), formulaKeys)] : []\n }\n\n private applyRaw(d: SheetData, cells: CellChange[], which: 'prev' | 'next') {\n for (const ch of cells) {\n const r = Math.floor(ch.key / MAX_COL)\n const c = ch.key % MAX_COL\n setEntry(d, r, c, which === 'prev' ? ch.prev : ch.next)\n const f = which === 'prev' ? ch.prevF : ch.nextF\n if (f) d.formulas.set(ch.key, f)\n else d.formulas.delete(ch.key)\n d.edited.add(ch.key)\n if (ch.prevF || ch.nextF) this.formulaTouched = true\n }\n }\n\n private record(sheet: number, cells: CellChange[], range: Range): XlsxEditResult {\n this.undoStack.push({ sheet, cells, range })\n if (this.undoStack.length > 200) this.undoStack.shift()\n this.redoStack = []\n return { sheet, range, recalc: this.lastRecalc }\n }\n\n /** after rows/columns moved: rebuild the dependency graph and recompute every formula */\n private recalcAll(): number[] {\n this.wb.calc.invalidate()\n const all: { sheet: number; key: number }[] = []\n for (const [sheet, d] of this.wb.sheetsData) for (const key of d.formulas.keys()) all.push({ sheet, key })\n return [...this.wb.calc.recalc([], all)]\n }\n\n setCells(sheet: number, inputs: CellInput[]): XlsxEditResult {\n const d = this.sheet(sheet)\n const changes: CellChange[] = []\n const range = { r0: Infinity, c0: Infinity, r1: -1, c1: -1 }\n for (const { r, c, input } of inputs) {\n const key = r * MAX_COL + c\n const prev = getEntry(d, r, c)\n const st = prev?.[2] ?? 0\n const { e, f } = parseInput(input, st, isDateFormat(this.wb.styles.xfs[st]?.numFmt ?? ''))\n changes.push({ key, prev, prevF: d.formulas.get(key), next: e, nextF: f })\n range.r0 = Math.min(range.r0, r)\n range.c0 = Math.min(range.c0, c)\n range.r1 = Math.max(range.r1, r)\n range.c1 = Math.max(range.c1, c)\n }\n this.apply(d, changes, 'next')\n return this.record(sheet, changes, range)\n }\n\n private async styles(): Promise<StyleEditor> {\n if (!this.styleEd) {\n const rel = relOfType(this.wb.rels, 'styles')\n this.stylesPath = rel?.target ?? 'xl/styles.xml'\n const xml = this.wb.pkg.has(this.stylesPath)\n ? await this.wb.pkg.text(this.stylesPath)\n : '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><fonts count=\"1\"><font><sz val=\"11\"/><name val=\"Calibri\"/></font></fonts><fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills><borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs><cellXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/></cellXfs></styleSheet>'\n this.styleEd = new StyleEditor(xml)\n }\n return this.styleEd\n }\n\n async format(sheet: number, range: Range, patch: FmtPatch): Promise<XlsxEditResult> {\n const d = this.sheet(sheet)\n const ed = await this.styles()\n const before = this.wb.styles.xfs.length\n const changes: CellChange[] = []\n const r1 = Math.min(range.r1, range.r0 + 200_000)\n let budget = 300_000\n for (let r = range.r0; r <= r1 && budget > 0; r++) {\n for (let c = range.c0; c <= range.c1 && budget > 0; c++, budget--) {\n const key = r * MAX_COL + c\n const prev = getEntry(d, r, c)\n const cellPatch = patch.border ? { ...patch, sides: borderSides(patch.border, range, r, c) } : patch\n if (patch.border && !Object.keys((cellPatch as { sides: object }).sides).length) continue\n const s = patch.clear ? 0 : patch.xf !== undefined ? patch.xf : ed.derive(prev?.[2] ?? 0, cellPatch)\n const next: Entry = prev ? [prev[0], prev[1], s] : [T_EMPTY, '', s]\n const f = d.formulas.get(key)\n changes.push({ key, prev, prevF: f, next, nextF: f })\n }\n }\n this.apply(d, changes, 'next')\n // re-derive css for the grown style table\n const xml = ed.xml()\n this.wb.pkg.setPart(this.stylesPath!, xml)\n this.wb.styles = parseSheetStyles(parseXml(xml), this.wb.theme)\n const res = this.record(sheet, changes, range)\n res.styles = this.wb.styles.xfs.slice(before).map((x, i) => ({ index: before + i, css: x.css, format: x.numFmt }))\n return res\n }\n\n private step(ch: Change, which: 'prev' | 'next'): XlsxEditResult {\n const d = this.sheet(ch.sheet)\n this.lastRecalc = []\n if (ch.full) restore(d, which === 'prev' ? ch.full.before : ch.full.after)\n this.apply(d, ch.cells, which)\n if (ch.lay) applyLayout(d, which === 'prev' ? ch.lay.before : ch.lay.after)\n const recalc = ch.full ? this.recalcAll() : this.lastRecalc\n return { sheet: ch.sheet, range: ch.range, layout: ch.full || ch.lay ? this.layout(ch.sheet) : undefined, recalc }\n }\n\n undo(): XlsxEditResult | null {\n const ch = this.undoStack.pop()\n if (!ch) return null\n this.redoStack.push(ch)\n return this.step(ch, 'prev')\n }\n\n redo(): XlsxEditResult | null {\n const ch = this.redoStack.pop()\n if (!ch) return null\n this.undoStack.push(ch)\n return this.step(ch, 'next')\n }\n\n // ---------------------------------------------------------------- collaboration\n\n /** takes the change recorded by the last operation out of the (unused) undo history */\n takeRecord(): Change | undefined {\n const ch = this.undoStack.pop()\n this.undoStack = []\n this.redoStack = []\n return ch\n }\n\n /** exactly undoes a recorded change (rolling back an unconfirmed operation) */\n revertRecord(ch: Change): XlsxEditResult {\n return this.step(ch, 'prev')\n }\n\n /** sets the cells / layout touched by `ch` to its `which` state, recorded as a new change */\n restoreRecord(ch: Change, which: 'prev' | 'next'): XlsxEditResult {\n const d = this.sheet(ch.sheet)\n const cells: CellChange[] = ch.cells.map((c) => ({\n key: c.key,\n prev: getEntry(d, Math.floor(c.key / MAX_COL), c.key % MAX_COL),\n prevF: d.formulas.get(c.key),\n next: which === 'prev' ? c.prev : c.next,\n nextF: which === 'prev' ? c.prevF : c.nextF,\n }))\n const counter: Change = {\n sheet: ch.sheet,\n cells,\n range: ch.range,\n lay: ch.lay ? { before: layoutState(d), after: which === 'prev' ? ch.lay.before : ch.lay.after } : undefined,\n full: ch.full ? { before: snapshot(d), after: which === 'prev' ? ch.full.before : ch.full.after } : undefined,\n }\n const res = this.step(counter, 'next')\n this.undoStack.push(counter)\n return res\n }\n\n /** style table sizes before an operation */\n async styleMark(): Promise<Record<string, number>> {\n return (await this.styles()).mark()\n }\n\n /** drops styles derived after `m` (the operations that used them were rolled back) */\n async styleTruncate(m: Record<string, number>) {\n const ed = await this.styles()\n const before = ed.xml()\n ed.truncate(m)\n const xml = ed.xml()\n if (xml === before) return\n this.wb.pkg.setPart(this.stylesPath!, xml)\n this.wb.styles = parseSheetStyles(parseXml(xml), this.wb.theme)\n }\n\n /** style index of a cell (0 when empty) */\n styleAt(sheet: number, r: number, c: number): number {\n return getEntry(this.sheet(sheet), r, c)?.[2] ?? 0\n }\n\n /** current layout of a sheet (after structural edits) */\n layout(sheet: number): SheetProgress {\n const d = this.sheet(sheet)\n const rowSizes = rowSizesOf(d)\n return {\n sheet, rows: d.maxRow + 1, cols: d.maxCol + 1, rowSizes, done: true, colInfo: d.colInfo, defaultColW: d.defaultColW,\n defaultRowH: d.defaultRowH, frozen: d.frozen, gridLines: d.gridLines, merges: d.merges,\n }\n }\n\n private async allSheets(): Promise<{ name: string; d: SheetData }[]> {\n await Promise.all(this.wb.sheets.map((s) => this.wb.loadSheet(s.index, () => {})))\n return this.wb.sheets.map((s) => ({ name: s.name, d: this.wb.sheetsData.get(s.index)! }))\n }\n\n async sheetOp(sheet: number, op: SheetOp): Promise<XlsxEditResult> {\n const d = this.sheet(sheet)\n const name = this.wb.sheets[sheet].name\n const all: Range = { r0: 0, c0: 0, r1: Math.max(0, d.maxRow + 50), c1: Math.max(0, d.maxCol + 10) }\n const lay = (fn: () => void, range = all): XlsxEditResult => {\n const before = layoutState(d)\n fn()\n const ch: Change = { sheet, cells: [], range, lay: { before, after: layoutState(d) } }\n this.undoStack.push(ch)\n this.redoStack = []\n return { sheet, range, layout: this.layout(sheet) }\n }\n switch (op.op) {\n case 'insertRows':\n case 'deleteRows':\n case 'insertCols':\n case 'deleteCols': {\n const others = await this.allSheets()\n const before = snapshot(d)\n const axis = op.op.endsWith('Rows') ? 'row' : 'col'\n shiftSheet(d, name, axis, op.at, op.op.startsWith('insert') ? op.n : -op.n, others)\n this.formulaTouched = true\n const recalc = this.recalcAll()\n const ch: Change = { sheet, cells: [], range: all, full: { before, after: snapshot(d) } }\n this.undoStack.push(ch)\n this.redoStack = []\n return { sheet, range: all, layout: this.layout(sheet), recalc }\n }\n case 'merge':\n case 'unmerge': {\n const R = op.range\n const blocks: Range[] =\n op.op === 'unmerge' || !op.mode || op.mode === 'all'\n ? [R]\n : op.mode === 'across'\n ? Array.from({ length: R.r1 - R.r0 + 1 }, (_, i) => ({ r0: R.r0 + i, r1: R.r0 + i, c0: R.c0, c1: R.c1 }))\n : Array.from({ length: R.c1 - R.c0 + 1 }, (_, i) => ({ r0: R.r0, r1: R.r1, c0: R.c0 + i, c1: R.c0 + i }))\n const res = lay(() => {\n setMerge(d, R, false)\n if (op.op === 'merge') for (const b of blocks) setMerge(d, b, true)\n }, R)\n if (op.op === 'merge') {\n // like Excel: only the top-left value of each merged block survives\n const clear: CellInput[] = []\n for (const b of blocks)\n for (let r = b.r0; r <= b.r1; r++)\n for (let c = b.c0; c <= b.c1; c++) if ((r !== b.r0 || c !== b.c0) && getEntry(d, r, c) && getEntry(d, r, c)?.[1] !== '') clear.push({ r, c, input: '' })\n if (clear.length) {\n this.setCells(sheet, clear)\n const last = this.undoStack.pop()!\n this.undoStack[this.undoStack.length - 1].cells = last.cells\n }\n }\n return res\n }\n case 'hideRows':\n return lay(() => {\n for (let r = op.a; r <= op.b; r++) {\n const cur = d.rowAttrs.get(r)\n if (op.hidden) d.rowAttrs.set(r, { ...(cur ?? {}), hidden: true })\n else if (cur) {\n const { hidden: _h, ...rest } = cur\n if (rest.ht !== undefined) d.rowAttrs.set(r, rest)\n else d.rowAttrs.delete(r)\n }\n d.dirtyRows.add(r)\n }\n })\n case 'hideCols':\n return lay(() => hideCols(d, op.a, op.b, op.hidden))\n case 'gridlines':\n return lay(() => {\n d.gridLines = op.show\n d.dirtyView = true\n })\n case 'colWidth':\n return lay(() => setColWidth(d, op.c0, op.c1, op.px))\n case 'rowHeight':\n return lay(() => setRowHeight(d, op.r0, op.r1, op.px))\n case 'freeze':\n return lay(() => {\n d.frozen = { rows: op.rows, cols: op.cols }\n d.dirtyView = true\n })\n case 'fill':\n return this.fill(sheet, d, op.range, op.dir)\n case 'sort':\n return this.sort(sheet, d, op.range, op.col, !!op.desc)\n }\n }\n\n /** replaces `query` in matching cells (one undo step); `at` limits it to one cell */\n replace(sheet: number, query: string, by: string, opts: FindOptions = {}, at?: { r: number; c: number }): XlsxEditResult | null {\n const d = this.sheet(sheet)\n const re = new RegExp(opts.whole ? `^${escRe(query)}$` : escRe(query), opts.matchCase ? 'g' : 'gi')\n const inputs: CellInput[] = []\n const cells = at ? [at] : this.wb.find(sheet, query, opts, 1e9)\n for (const { r, c } of cells) {\n const f = d.formulas.get(r * MAX_COL + c)\n const raw = opts.formulas && f ? '=' + f : this.wb.cell(sheet, r, c)?.value\n if (raw === undefined || (f && !opts.formulas)) continue\n const next = raw.replace(re, by)\n if (next !== raw) inputs.push({ r, c, input: next })\n }\n return inputs.length ? this.setCells(sheet, inputs) : null\n }\n\n private fill(sheet: number, d: SheetData, range: Range, dir: 'down' | 'right'): XlsxEditResult {\n materializeShared(d)\n const changes: CellChange[] = []\n for (let r = range.r0; r <= range.r1; r++) {\n for (let c = range.c0; c <= range.c1; c++) {\n const sr = dir === 'down' ? range.r0 : r\n const sc = dir === 'right' ? range.c0 : c\n if (sr === r && sc === c) continue\n const key = r * MAX_COL + c\n const src = getEntry(d, sr, sc)\n const sf = d.formulas.get(sr * MAX_COL + sc)\n const nf = sf ? translateFormula(sf, r - sr, c - sc) : undefined\n changes.push({ key, prev: getEntry(d, r, c), prevF: d.formulas.get(key), next: src ? [src[0], nf ? '=' + nf : src[1], src[2]] : null, nextF: nf })\n }\n }\n this.apply(d, changes, 'next')\n return this.record(sheet, changes, range)\n }\n\n private sort(sheet: number, d: SheetData, range: Range, col: number, desc: boolean): XlsxEditResult {\n materializeShared(d)\n const rows: { r: number; cells: (Entry | null)[]; f: (string | undefined)[]; key: unknown }[] = []\n for (let r = range.r0; r <= range.r1; r++) {\n const cells: (Entry | null)[] = []\n const f: (string | undefined)[] = []\n for (let c = range.c0; c <= range.c1; c++) {\n cells.push(getEntry(d, r, c))\n f.push(d.formulas.get(r * MAX_COL + c))\n }\n const e = getEntry(d, r, col)\n const v = e ? (e[0] === T_SST ? this.wb.sst[e[1] as number] : e[1]) : null\n rows.push({ r, cells, f, key: v === '' ? null : v })\n }\n const cmp = (a: unknown, b: unknown) => {\n if (a === null || a === undefined) return 1\n if (b === null || b === undefined) return -1\n if (typeof a === 'number' && typeof b === 'number') return a - b\n if (typeof a === 'number') return -1\n if (typeof b === 'number') return 1\n return String(a).localeCompare(String(b), undefined, { sensitivity: 'base', numeric: true })\n }\n const sorted = [...rows].sort((a, b) => {\n const k = cmp(a.key, b.key)\n return desc && a.key !== null && b.key !== null ? -k : k\n })\n const changes: CellChange[] = []\n sorted.forEach((src, i) => {\n const r = range.r0 + i\n for (let c = range.c0; c <= range.c1; c++) {\n const k = c - range.c0\n const key = r * MAX_COL + c\n const nf = src.f[k] ? translateFormula(src.f[k]!, r - src.r, 0) : undefined\n const e = src.cells[k]\n changes.push({ key, prev: getEntry(d, r, c), prevF: d.formulas.get(key), next: e ? [e[0], nf ? '=' + nf : e[1], e[2]] : null, nextF: nf })\n }\n })\n this.apply(d, changes, 'next')\n return this.record(sheet, changes, range)\n }\n\n // ---------------------------------------------------------------- workbook (sheet list)\n\n async bookOp(op: BookOp): Promise<XlsxEditResult> {\n const pkg = this.wb.pkg\n const nodes = parseRaw(await pkg.text(this.wb.mainPath))\n const root = rootEl(nodes)!\n const P = prefixOf(root.q)\n const sheetsEl = kidOf(root, 'sheets')!\n const entries = kidsOf(sheetsEl, 'sheet')\n const sheets = this.wb.sheets\n const remap = (order: number[]) => {\n // order[newIndex] = oldIndex\n const data = new Map(this.wb.sheetsData)\n this.wb.sheetsData.clear()\n order.forEach((old, i) => {\n const d = data.get(old)\n if (d) this.wb.sheetsData.set(i, d)\n })\n const next = order.map((old, i) => ({ ...sheets[old], index: i }))\n sheets.splice(0, sheets.length, ...next)\n }\n switch (op.op) {\n case 'add': {\n const path = pkg.freeName('xl/worksheets', 'sheet', 'xml')\n this.newSheets.set(path, '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/><sheetData/></worksheet>')\n pkg.setPart(path, '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/><sheetData/></worksheet>')\n await pkg.setContentType(path, 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml')\n const rid = await pkg.addRel(this.wb.mainPath, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', path)\n const ids = entries.map((e) => Number(getAttr(e, 'sheetId') ?? 0))\n let name = op.name ?? `Sheet${sheets.length + 1}`\n while (sheets.some((s) => s.name.toLowerCase() === name.toLowerCase())) name += '_'\n const node = el(P + 'sheet', { name, sheetId: String(Math.max(0, ...ids) + 1), ...relIdAttrs(root, 'id', rid) })\n const after = op.after ?? sheets.length - 1\n const at = after + 1 >= entries.length ? sheetsEl.c.length : sheetsEl.c.indexOf(entries[after + 1])\n sheetsEl.c.splice(at, 0, node)\n sheetsEl.self = false\n const info = { name, index: after + 1, path, hidden: false }\n const order = sheets.map((_, i) => i)\n sheets.push({ ...info, index: sheets.length })\n order.splice(after + 1, 0, sheets.length - 1)\n remap(order)\n break\n }\n case 'rename': {\n const old = sheets[op.index]\n const name = op.name.trim().slice(0, 31).replace(/[\\\\/?*[\\]:]/g, '_')\n if (!old || !name || sheets.some((s, i) => i !== op.index && s.name.toLowerCase() === name.toLowerCase())) throw new Error('Invalid sheet name')\n setAttr(entries[op.index], 'name', name)\n for (const s of await this.allSheets()) {\n for (const [k, f] of s.d.formulas) {\n const g = renameSheetInFormula(f, old.name, name)\n if (g !== f) {\n s.d.formulas.set(k, g)\n s.d.edited.add(k)\n }\n }\n }\n old.name = name\n break\n }\n case 'delete': {\n if (sheets.length <= 1) throw new Error('A workbook needs at least one sheet')\n const s = sheets[op.index]\n sheetsEl.c.splice(sheetsEl.c.indexOf(entries[op.index]), 1)\n pkg.setPart(s.path, null)\n if (pkg.has(relsPathFor(s.path))) pkg.setPart(relsPathFor(s.path), null)\n await pkg.removeRelsTo(this.wb.mainPath, s.path)\n await pkg.setContentType(s.path, null)\n remap(sheets.map((_, i) => i).filter((i) => i !== op.index))\n // localSheetId indexes in definedNames would now be off; drop the ones of the deleted sheet\n const dn = kidOf(root, 'definedNames')\n if (dn) dn.c = dn.c.filter((c) => !(isNode(c) && getAttr(c, 'localSheetId') === String(op.index)))\n break\n }\n case 'move': {\n const node = entries[op.from]\n sheetsEl.c.splice(sheetsEl.c.indexOf(node), 1)\n const rest = kidsOf(sheetsEl, 'sheet')\n sheetsEl.c.splice(op.to >= rest.length ? sheetsEl.c.length : sheetsEl.c.indexOf(rest[op.to]), 0, node)\n const order = sheets.map((_, i) => i)\n order.splice(op.from, 1)\n order.splice(op.to, 0, op.from)\n remap(order)\n break\n }\n }\n pkg.setPart(this.wb.mainPath, serialize(nodes))\n this.bookChanged = true\n this.undoStack = []\n this.redoStack = []\n return { sheet: 0, range: { r0: 0, c0: 0, r1: 0, c1: 0 }, sheets: sheets.map((s) => ({ ...s })) }\n }\n\n private bookChanged = false\n /** XML of sheets created in this session (no original to stream from) */\n private newSheets = new Map<string, string>()\n\n // ---------------------------------------------------------------- save\n\n async save(): Promise<Blob> {\n const pkg = this.wb.pkg\n let any = false\n for (const [index, d] of this.wb.sheetsData) {\n if (!needsWrite(d)) continue\n any = true\n const info = this.wb.sheets[index]\n pkg.setPart(info.path, () => this.rewrite(info.path, d))\n }\n if (any) {\n // stale cached values / calc chain: let Excel recalculate on open\n const wbNodes = parseRaw(await pkg.text(this.wb.mainPath))\n const root = rootEl(wbNodes)!\n const P = prefixOf(root.q)\n const calc = clone(kidOf(root, 'calcPr') ?? el(P + 'calcPr'))\n setAttr(calc, 'fullCalcOnLoad', '1')\n setOrdered(root, calc, 'calcPr', WB_ORDER)\n pkg.setPart(this.wb.mainPath, serialize(wbNodes))\n const chain = relOfType(this.wb.rels, 'calcChain')\n if (chain && this.formulaTouched && pkg.has(chain.target)) {\n pkg.setPart(chain.target, null)\n await pkg.removeRelsTo(this.wb.mainPath, chain.target)\n await pkg.setContentType(chain.target, null)\n }\n }\n return pkg.save(XLSX_MIME)\n }\n\n /** Streams the original sheet XML, patching only rows that contain edits. */\n private rewrite(path: string, d: SheetData): ReadableStream<Uint8Array> {\n const pkg = this.wb.pkg\n const wb = this.wb\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n // shared formula groups whose master was overwritten → dependents get explicit formulas\n const fix = new Map<number, string>()\n const broken = new Set<number>()\n for (const [si, g] of d.shared) if (d.edited.has(g.master)) broken.add(si)\n if (broken.size) {\n for (const [key, si] of d.depOf) {\n if (!broken.has(si) || d.edited.has(key)) continue\n const g = d.shared.get(si)!\n const dr = Math.floor(key / MAX_COL) - Math.floor(g.master / MAX_COL)\n const dc = (key % MAX_COL) - (g.master % MAX_COL)\n fix.set(key, translateFormula(g.text, dr, dc))\n }\n }\n const rowCols = new Map<number, Set<number>>()\n for (const r of d.dirtyRows) if (!rowCols.has(r)) rowCols.set(r, new Set())\n for (const key of [...d.edited, ...fix.keys()]) {\n const r = Math.floor(key / MAX_COL)\n let s = rowCols.get(r)\n if (!s) rowCols.set(r, (s = new Set()))\n s.add(key % MAX_COL)\n }\n const rows = [...rowCols.keys()].sort((a, b) => a - b)\n const enc = new TextEncoder()\n return new ReadableStream<Uint8Array>({\n async start(ctrl) {\n const rw = new RowPatcher(rows, rowCols, d, fix, wb)\n const base = self.newSheets.get(path)\n const reader = (base !== undefined ? new Blob([base]).stream() : await pkg.zip.stream(path)).getReader()\n const dec = new TextDecoder()\n for (;;) {\n const { done, value } = await reader.read()\n const text = done ? dec.decode() : dec.decode(value, { stream: true })\n for (const part of rw.push(text, done)) if (part) ctrl.enqueue(enc.encode(part))\n if (done) break\n }\n ctrl.close()\n },\n })\n }\n}\n\nfunction cellXml(d: SheetData, r: number, c: number, P: string, wb: XlsxWorkbook): string {\n const key = r * MAX_COL + c\n const e = getEntry(d, r, c)\n const f = d.formulas.get(key)\n if (!e && !f) return ''\n const ref = colName(c) + (r + 1)\n const s = e?.[2] ? ` s=\"${e[2]}\"` : ''\n if (f) {\n const [t, v] = e ?? [T_EMPTY, '']\n const fx = `<${P}f>${escText(f)}</${P}f>`\n if (t === T_NUM) return `<${P}c r=\"${ref}\"${s}>${fx}<${P}v>${String(v)}</${P}v></${P}c>`\n if (t === T_BOOL) return `<${P}c r=\"${ref}\"${s} t=\"b\">${fx}<${P}v>${v ? 1 : 0}</${P}v></${P}c>`\n if (t === T_ERR) return `<${P}c r=\"${ref}\"${s} t=\"e\">${fx}<${P}v>${escText(String(v))}</${P}v></${P}c>`\n if (t === T_STR && !String(v).startsWith('=')) return `<${P}c r=\"${ref}\"${s} t=\"str\">${fx}<${P}v>${escText(String(v))}</${P}v></${P}c>`\n return `<${P}c r=\"${ref}\"${s}>${fx}</${P}c>`\n }\n const [t, v] = e!\n switch (t) {\n case T_NUM:\n return `<${P}c r=\"${ref}\"${s}><${P}v>${String(v)}</${P}v></${P}c>`\n case T_SST:\n case T_STR: {\n const text = t === T_SST ? wb.sst[v as number] ?? '' : String(v)\n return `<${P}c r=\"${ref}\"${s} t=\"inlineStr\"><${P}is><${P}t xml:space=\"preserve\">${escText(text)}</${P}t></${P}is></${P}c>`\n }\n case T_BOOL:\n return `<${P}c r=\"${ref}\"${s} t=\"b\"><${P}v>${v ? 1 : 0}</${P}v></${P}c>`\n case T_ERR:\n return `<${P}c r=\"${ref}\"${s} t=\"e\"><${P}v>${escText(String(v))}</${P}v></${P}c>`\n case T_DATE:\n return `<${P}c r=\"${ref}\"${s} t=\"d\"><${P}v>${escText(String(v))}</${P}v></${P}c>`\n default:\n return `<${P}c r=\"${ref}\"${s}/>`\n }\n}\n\nfunction needsWrite(d: SheetData): boolean {\n return d.edited.size > 0 || d.structural || d.dirtyCols || d.dirtyMerges || d.dirtyView || d.dirtyRows.size > 0 || d.formulaChanged\n}\n\nfunction layoutState(d: SheetData): LayoutState {\n return {\n merges: d.merges.map((m) => ({ ...m })),\n colInfo: d.colInfo.map((c) => ({ ...c })),\n rowAttrs: [...d.rowAttrs].map(([k, v]) => [k, { ...v }]),\n frozen: { ...d.frozen },\n gridLines: d.gridLines,\n }\n}\n\nfunction applyLayout(d: SheetData, l: LayoutState) {\n if (l.merges) d.merges = l.merges.map((m) => ({ ...m }))\n if (l.colInfo) d.colInfo = l.colInfo.map((c) => ({ ...c }))\n if (l.rowAttrs) {\n for (const r of d.rowAttrs.keys()) d.dirtyRows.add(r)\n d.rowAttrs = new Map(l.rowAttrs.map(([k, v]) => [k, { ...v }]))\n for (const r of d.rowAttrs.keys()) d.dirtyRows.add(r)\n }\n if (l.frozen) d.frozen = { ...l.frozen }\n if (l.gridLines !== undefined) d.gridLines = l.gridLines\n d.dirtyCols = d.dirtyMerges = d.dirtyView = true\n}\n\n/** hides / shows columns a..b (the width before hiding is kept for unhiding) */\nfunction hideCols(d: SheetData, a: number, b: number, hidden: boolean) {\n const out: ColInfo[] = []\n const covered: [number, number][] = []\n for (const ci of d.colInfo) {\n if (ci.max < a || ci.min > b) {\n out.push(ci)\n continue\n }\n if (ci.min < a) out.push({ ...ci, max: a - 1 })\n if (ci.max > b) out.push({ ...ci, min: b + 1 })\n const lo = Math.max(ci.min, a)\n const hi = Math.min(ci.max, b)\n covered.push([lo, hi])\n if (hidden) out.push(ci.w ? { ...ci, min: lo, max: hi, w: 0, prevW: ci.w } : { ...ci, min: lo, max: hi })\n else out.push(ci.w ? { ...ci, min: lo, max: hi } : { min: lo, max: hi, w: ci.prevW || d.defaultColW })\n }\n if (hidden) {\n // columns without an explicit width\n covered.sort((x, y) => x[0] - y[0])\n let at = a\n for (const [lo, hi] of [...covered, [b + 1, b + 1] as [number, number]]) {\n if (lo > at) out.push({ min: at, max: Math.min(lo - 1, b), w: 0, prevW: d.defaultColW })\n at = Math.max(at, hi + 1)\n }\n }\n d.colInfo = out.sort((x, y) => x.min - y.min)\n d.dirtyCols = true\n}\n\nfunction borderSides(kind: BorderKind, R: Range, r: number, c: number): Record<string, boolean> {\n const out: Record<string, boolean> = {}\n const edge = { top: r === R.r0, bottom: r === R.r1, left: c === R.c0, right: c === R.c1 }\n for (const side of ['top', 'bottom', 'left', 'right'] as const) {\n if (kind === 'all') out[side] = true\n else if (kind === 'none') out[side] = false\n else if (kind === 'outer') {\n if (edge[side]) out[side] = true\n } else if (kind === 'inner') {\n if (!edge[side]) out[side] = true\n } else if (kind === side && edge[side]) out[side] = true\n }\n return out\n}\n\n/**\n * Streaming sheet rewriter: finds <row> elements with plain string search and copies\n * everything verbatim except rows that contain edits (those are re-serialized).\n * Structural edits regenerate the whole <sheetData>; <cols>, panes and <mergeCells> are patched.\n */\nclass RowPatcher {\n private buf = ''\n private P = ''\n private next = 0\n private lastRow = -1\n private phase: 'head' | 'data' | 'skip' | 'tail' = 'head'\n private tail = ''\n\n constructor(\n private rows: number[],\n private rowCols: Map<number, Set<number>>,\n private d: SheetData,\n private fix: Map<number, string>,\n private wb: XlsxWorkbook,\n ) {}\n\n private newRow(r: number): string {\n const cols = [...(this.rowCols.get(r) ?? [])].sort((a, b) => a - b)\n const cells = cols.map((c) => cellXml(this.d, r, c, this.P, this.wb)).join('')\n const attrs = this.rowAttrXml(r)\n return cells || attrs ? `<${this.P}row r=\"${r + 1}\"${attrs}>${cells}</${this.P}row>` : ''\n }\n\n private rowAttrXml(r: number): string {\n const a = this.d.rowAttrs.get(r)\n if (!a) return ''\n return (a.ht !== undefined ? ` ht=\"${a.ht}\" customHeight=\"1\"` : '') + (a.hidden ? ' hidden=\"1\"' : '')\n }\n\n private before(r: number): string {\n let out = ''\n while (this.next < this.rows.length && this.rows[this.next] < r) out += this.newRow(this.rows[this.next++])\n return out\n }\n\n /** every row of the sheet, regenerated from the model (structural edits) */\n private *allRows(): Generator<string> {\n const d = this.d\n const last = Math.max(d.rows.length - 1, ...d.rowAttrs.keys(), -1)\n let chunk = ''\n for (let r = 0; r <= last; r++) {\n const row = d.rows[r]\n const attrs = this.rowAttrXml(r)\n if (!row?.length && !attrs) continue\n let cells = ''\n if (row) {\n const cols: number[] = []\n for (let k = 0; k < row.length; k += 4) cols.push(row[k] as number)\n for (const c of cols.sort((a, b) => a - b)) cells += cellXml(d, r, c, this.P, this.wb)\n }\n chunk += `<${this.P}row r=\"${r + 1}\"${attrs}>${cells}</${this.P}row>`\n if (chunk.length > 1 << 16) {\n yield chunk\n chunk = ''\n }\n }\n if (chunk) yield chunk\n }\n\n private colsXml(): string {\n const P = this.P\n const cols = [...this.d.colInfo].sort((a, b) => a.min - b.min)\n if (!cols.length) return ''\n return `<${P}cols>${cols.map((c) => `<${P}col min=\"${c.min + 1}\" max=\"${c.max + 1}\" width=\"${+((c.w || c.prevW || 0) / 7).toFixed(4)}\" customWidth=\"1\"${c.w ? '' : ' hidden=\"1\"'}/>`).join('')}</${P}cols>`\n }\n\n private headFix(head: string): string {\n const d = this.d\n const P = this.P\n let h = head\n if (d.dirtyCols || d.structural) {\n const re = new RegExp(`<${P}cols\\\\b[\\\\s\\\\S]*?<\\\\/${P}cols>|<${P}cols\\\\s*\\\\/>`)\n h = re.test(h) ? h.replace(re, this.colsXml()) : h + this.colsXml()\n }\n if (d.dirtyView || d.structural) {\n const { rows, cols } = d.frozen\n const pane = rows || cols\n ? `<${P}pane${cols ? ` xSplit=\"${cols}\"` : ''}${rows ? ` ySplit=\"${rows}\"` : ''} topLeftCell=\"${colName(cols)}${rows + 1}\" activePane=\"${rows && cols ? 'bottomRight' : rows ? 'bottomLeft' : 'topRight'}\" state=\"frozen\"/>`\n : ''\n const re = new RegExp(`<${P}sheetViews>[\\\\s\\\\S]*?<\\\\/${P}sheetViews>`)\n const m = re.exec(h)\n if (m) {\n const nodes = parseRaw(m[0])\n const view = kidOf(rootEl(nodes), 'sheetView')\n if (view) {\n view.c = view.c.filter((c) => !(isNode(c) && (local(c.q) === 'pane' || local(c.q) === 'selection')))\n if (pane) view.c.unshift(pane)\n setAttr(view, 'showGridLines', d.gridLines ? undefined : '0')\n view.self = view.c.length === 0\n h = h.replace(m[0], serialize(nodes))\n }\n } else if (pane || !d.gridLines) {\n const block = `<${P}sheetViews><${P}sheetView${d.gridLines ? '' : ' showGridLines=\"0\"'} workbookViewId=\"0\">${pane}</${P}sheetView></${P}sheetViews>`\n const at = h.search(new RegExp(`<${P}(sheetFormatPr|cols)\\\\b`))\n h = at >= 0 ? h.slice(0, at) + block + h.slice(at) : h + block\n }\n }\n if (d.structural) {\n h = h.replace(new RegExp(`<${P}dimension\\\\b[^>]*\\\\/>`), `<${P}dimension ref=\"A1:${colName(Math.max(0, d.maxCol))}${Math.max(1, d.maxRow + 1)}\"/>`)\n }\n return h\n }\n\n private tailFix(tail: string): string {\n const d = this.d\n if (!d.dirtyMerges && !d.structural) return tail\n const P = this.P\n const ms = d.merges\n const xml = ms.length ? `<${P}mergeCells count=\"${ms.length}\">${ms.map((m) => `<${P}mergeCell ref=\"${colName(m.c0)}${m.r0 + 1}:${colName(m.c1)}${m.r1 + 1}\"/>`).join('')}</${P}mergeCells>` : ''\n const re = new RegExp(`<${P}mergeCells\\\\b[\\\\s\\\\S]*?<\\\\/${P}mergeCells>|<${P}mergeCells\\\\b[^>]*\\\\/>`)\n if (re.test(tail)) return tail.replace(re, xml)\n // after the elements that precede mergeCells in the schema\n let at = 0\n const before = /<(\\w+:)?(sheetCalcPr|sheetProtection|protectedRanges|scenarios|autoFilter|sortState|dataConsolidate|customSheetViews)\\b[\\s\\S]*?(\\/>|<\\/(\\w+:)?\\2>)/g\n for (let m = before.exec(tail); m; m = before.exec(tail)) at = m.index + m[0].length\n return tail.slice(0, at) + xml + tail.slice(at)\n }\n\n /** feeds decoded text; returns what can be written so far */\n push(text: string, final: boolean): string[] {\n const s = this.buf + text\n this.buf = ''\n const out: string[] = []\n if (this.phase === 'tail') {\n this.tail += s\n if (final) out.push(this.tailFix(this.tail))\n return out\n }\n let i = 0\n if (this.phase === 'head') {\n const m = /<([\\w.-]+:)?sheetData(\\s[^>]*)?(\\/?)>/.exec(s)\n if (!m) {\n if (final) out.push(this.headFix(s))\n else this.buf = s\n return out\n }\n this.P = m[1] ?? ''\n out.push(this.headFix(s.slice(0, m.index)))\n const end = m.index + m[0].length\n if (m[3] === '/') {\n out.push(`<${this.P}sheetData>`)\n if (this.d.structural) out.push(...this.allRows())\n else {\n let rows = ''\n while (this.next < this.rows.length) rows += this.newRow(this.rows[this.next++])\n out.push(rows)\n }\n out.push(`</${this.P}sheetData>`)\n this.phase = 'tail'\n return [...out, ...this.push(s.slice(end), final)]\n }\n out.push(m[0])\n i = end\n this.phase = this.d.structural ? 'skip' : 'data'\n }\n const dataClose = `</${this.P}sheetData>`\n if (this.phase === 'skip') {\n const dc = s.indexOf(dataClose, i)\n if (dc < 0) {\n this.buf = s.slice(Math.max(i, s.length - dataClose.length))\n return out\n }\n out.push(...this.allRows(), dataClose)\n this.phase = 'tail'\n return [...out, ...this.push(s.slice(dc + dataClose.length), final)]\n }\n const rowOpen = `<${this.P}row`\n let chunk = ''\n let dc = s.indexOf(dataClose, i)\n while (i < s.length) {\n const ro = s.indexOf(rowOpen, i)\n if (dc >= 0 && dc < i) dc = s.indexOf(dataClose, i)\n if (dc >= 0 && (ro < 0 || dc < ro)) {\n chunk += s.slice(i, dc) + this.before(Infinity) + dataClose\n out.push(chunk)\n this.phase = 'tail'\n return [...out, ...this.push(s.slice(dc + dataClose.length), final)]\n }\n if (ro < 0) break\n const gt = s.indexOf('>', ro)\n if (gt < 0) {\n chunk += s.slice(i, ro)\n i = ro\n break\n }\n const tag = s.slice(ro, gt + 1)\n const after = tag.charCodeAt(rowOpen.length)\n if (after !== 32 && after !== 62 && after !== 47 && after !== 9 && after !== 10 && after !== 13) {\n chunk += s.slice(i, gt + 1)\n i = gt + 1\n continue\n }\n const m = /\\sr=\"(\\d+)\"/.exec(tag)\n const r = m ? Number(m[1]) - 1 : this.lastRow + 1\n this.lastRow = r\n const self = tag.endsWith('/>')\n let end: number\n if (self) end = gt + 1\n else {\n const ce = s.indexOf(`</${this.P}row>`, gt)\n if (ce < 0) {\n chunk += s.slice(i, ro)\n i = ro\n this.lastRow = r - 1\n break\n }\n end = ce + this.P.length + 6\n }\n chunk += s.slice(i, ro) + this.before(r)\n if (this.next < this.rows.length && this.rows[this.next] === r) {\n this.next++\n chunk += this.patchRow(s.slice(ro, end), r)\n } else chunk += s.slice(ro, end)\n i = end\n }\n out.push(chunk)\n this.buf = s.slice(i)\n if (final) out.push(this.buf)\n return out\n }\n\n private patchRow(xml: string, r: number): string {\n const nodes = parseRaw(xml)\n const row = rootEl(nodes)\n if (!row) return xml\n const P = prefixOf(row.q)\n setAttr(row, 'spans', undefined)\n if (this.d.dirtyRows.has(r)) {\n const a = this.d.rowAttrs.get(r)\n setAttr(row, 'ht', a?.ht !== undefined ? String(a.ht) : undefined)\n setAttr(row, 'customHeight', a?.ht !== undefined ? '1' : undefined)\n setAttr(row, 'hidden', a?.hidden ? '1' : undefined)\n }\n const cols = [...(this.rowCols.get(r) ?? [])].sort((a, b) => a - b)\n // index existing cells by column\n const pos = new Map<number, number>()\n let prev = -1\n row.c.forEach((n, i) => {\n if (!isNode(n) || local(n.q) !== 'c') return\n const ref = getAttr(n, 'r')\n const c = ref ? parseRef(ref)[1] : prev + 1\n prev = c\n pos.set(c, i)\n })\n const replacements = new Map<number, RChild>()\n const inserts: { c: number; node: string }[] = []\n for (const c of cols) {\n const key = r * MAX_COL + c\n const at = pos.get(c)\n if (this.d.edited.has(key)) {\n const xml = cellXml(this.d, r, c, P, this.wb)\n if (at !== undefined) replacements.set(at, xml)\n else if (xml) inserts.push({ c, node: xml })\n } else if (at !== undefined && this.fix.has(key)) {\n const cell = row.c[at] as RNode\n const f = kidOf(cell, 'f')\n if (f) {\n f.a = ''\n f.c = [escText(this.fix.get(key)!)]\n f.self = false\n }\n }\n }\n for (const [i, x] of replacements) row.c[i] = x\n if (inserts.length) {\n // place new cells before the first existing cell with a greater column\n const ordered = [...pos.entries()].sort((a, b) => a[0] - b[0])\n for (const ins of inserts.reverse()) {\n const after = ordered.find(([c]) => c > ins.c)\n const idx = after ? after[1] : row.c.length\n row.c.splice(idx, 0, ins.node)\n for (const o of ordered) if (o[1] >= idx) o[1]++\n }\n row.self = false\n }\n return serialize(nodes)\n }\n}\n\nconst escRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n","/**\n * PPTX structural editing: shape geometry/fill/order, inserts, and slide list operations.\n * Works on the raw slide XML so everything not touched is preserved.\n */\nimport { relOfType, relsPathFor, relsOfType } from '../opc'\nimport {\n clone, el, getAttr, relIdAttrs, isNode, kidOf, kidsOf, local, parseRaw, prefixOf, removeKids, rootEl, serialize, setAttr, setOrdered, walkOoxml,\n escText, type RChild, type RNode,\n} from '../raw'\nimport { EMU_PER_PX } from '../units'\nimport type { PptxPresentation } from './parser'\nimport type { Box, PresentationMeta, ShapeOp, SlideModel, SlideOp } from './types'\n\nconst NS_A = 'http://schemas.openxmlformats.org/drawingml/2006/main'\nconst NS_R = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\nconst NS_P = 'http://schemas.openxmlformats.org/presentationml/2006/main'\nconst SLIDE_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide'\nconst LAYOUT_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout'\nconst IMAGE_REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'\nconst SLIDE_CT = 'application/vnd.openxmlformats-officedocument.presentationml.slide+xml'\nconst IMG_TYPES: Record<string, string> = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', bmp: 'image/bmp', svg: 'image/svg+xml', webp: 'image/webp' }\nconst SPPR_ORDER = ['xfrm', 'custGeom', 'prstGeom', 'noFill', 'solidFill', 'gradFill', 'blipFill', 'pattFill', 'grpFill', 'ln', 'effectLst', 'effectDag', 'scene3d', 'sp3d', 'extLst']\nconst FILLS = new Set(['noFill', 'solidFill', 'gradFill', 'blipFill', 'pattFill', 'grpFill'])\n\nconst emu = (px: number) => String(Math.round(px * EMU_PER_PX))\n\nfunction spTreeOf(nodes: RChild[]): RNode {\n const root = rootEl(nodes)!\n const tree = kidOf(kidOf(root, 'cSld'), 'spTree')\n if (!tree) throw new Error('Slide has no shape tree')\n return tree\n}\n\nfunction idOf(n: RNode): number | undefined {\n const nv = kidsOf(n).find((c) => /^nv.*Pr$/.test(local(c.q)))\n const id = nv ? getAttr(kidOf(nv, 'cNvPr') ?? nv, 'id') : undefined\n return id !== undefined ? Number(id) : undefined\n}\n\nfunction maxId(nodes: RChild[]): number {\n let max = 1\n for (const n of nodes) {\n if (!isNode(n)) continue\n walkOoxml(n, (c) => {\n if (local(c.q) === 'cNvPr') max = Math.max(max, Number(getAttr(c, 'id') ?? 0))\n })\n }\n return max\n}\n\nfunction aPrefix(nodes: RChild[]): string {\n let a = ''\n for (const n of nodes) {\n if (!isNode(n)) continue\n walkOoxml(n, (c) => {\n if (!a && /:(off|ext|t|p|bodyPr)$/.test(c.q)) a = prefixOf(c.q)\n return !!a\n })\n }\n return a || 'a:'\n}\n\nfunction setXfrm(node: RNode, box: Box, A: string, P: string) {\n const l = local(node.q)\n let host: RNode\n if (l === 'graphicFrame') host = node\n else {\n const prName = l === 'grpSp' ? 'grpSpPr' : 'spPr'\n let pr = kidOf(node, prName)\n if (!pr) {\n pr = el(P + prName)\n node.c.splice(1, 0, pr)\n }\n host = pr\n }\n let x = kidOf(host, 'xfrm')\n if (!x) {\n x = el((l === 'graphicFrame' ? P : A) + 'xfrm')\n if (l === 'graphicFrame') host.c.splice(1, 0, x)\n else setOrdered(host, x, 'xfrm', SPPR_ORDER)\n }\n const put = (name: string, attrs: Record<string, string>) => {\n let n = kidOf(x!, name)\n if (!n) {\n n = el(A + name)\n x!.c.splice(name === 'off' ? 0 : name === 'ext' ? 1 : x!.c.length, 0, n)\n }\n for (const [k, v] of Object.entries(attrs)) setAttr(n, k, v)\n }\n put('off', { x: emu(box.x), y: emu(box.y) })\n put('ext', { cx: emu(Math.max(1, box.w)), cy: emu(Math.max(1, box.h)) })\n setAttr(x, 'rot', box.rot ? String(Math.round((((box.rot % 360) + 360) % 360) * 60000)) : undefined)\n if (box.flipH !== undefined) setAttr(x, 'flipH', box.flipH ? '1' : undefined)\n if (box.flipV !== undefined) setAttr(x, 'flipV', box.flipV ? '1' : undefined)\n x.self = false\n host.self = false\n}\n\nfunction fillXml(A: string, color: string | null) {\n return color ? el(A + 'solidFill', {}, [el(A + 'srgbClr', { val: color.replace('#', '').toUpperCase() })]) : el(A + 'noFill')\n}\n\nfunction shapeXml(kind: string, id: number, box: Box, A: string, P: string, text?: string, rid?: string): string {\n const off = `<${A}off x=\"${emu(box.x)}\" y=\"${emu(box.y)}\"/><${A}ext cx=\"${emu(box.w)}\" cy=\"${emu(box.h)}\"/>`\n if (kind === 'image') {\n return (\n `<${P}pic><${P}nvPicPr><${P}cNvPr id=\"${id}\" name=\"Picture ${id}\"/><${P}cNvPicPr><${A}picLocks noChangeAspect=\"1\"/></${P}cNvPicPr><${P}nvPr/></${P}nvPicPr>` +\n `<${P}blipFill><${A}blip r:embed=\"${rid}\"/><${A}stretch><${A}fillRect/></${A}stretch></${P}blipFill>` +\n `<${P}spPr><${A}xfrm>${off}</${A}xfrm><${A}prstGeom prst=\"rect\"><${A}avLst/></${A}prstGeom></${P}spPr></${P}pic>`\n )\n }\n const para = (t: string) => `<${A}p><${A}r><${A}rPr lang=\"en-US\" dirty=\"0\"/><${A}t>${escText(t)}</${A}t></${A}r></${A}p>`\n if (kind === 'text') {\n return (\n `<${P}sp><${P}nvSpPr><${P}cNvPr id=\"${id}\" name=\"TextBox ${id}\"/><${P}cNvSpPr txBox=\"1\"/><${P}nvPr/></${P}nvSpPr>` +\n `<${P}spPr><${A}xfrm>${off}</${A}xfrm><${A}prstGeom prst=\"rect\"><${A}avLst/></${A}prstGeom><${A}noFill/></${P}spPr>` +\n `<${P}txBody><${A}bodyPr wrap=\"square\" rtlCol=\"0\"><${A}spAutoFit/></${A}bodyPr><${A}lstStyle/>${para(text ?? 'Text')}</${P}txBody></${P}sp>`\n )\n }\n if (kind === 'line') {\n return (\n `<${P}cxnSp><${P}nvCxnSpPr><${P}cNvPr id=\"${id}\" name=\"Connector ${id}\"/><${P}cNvCxnSpPr/><${P}nvPr/></${P}nvCxnSpPr>` +\n `<${P}spPr><${A}xfrm>${off}</${A}xfrm><${A}prstGeom prst=\"line\"><${A}avLst/></${A}prstGeom><${A}ln w=\"19050\"><${A}solidFill><${A}schemeClr val=\"tx1\"/></${A}solidFill></${A}ln></${P}spPr></${P}cxnSp>`\n )\n }\n return (\n `<${P}sp><${P}nvSpPr><${P}cNvPr id=\"${id}\" name=\"Shape ${id}\"/><${P}cNvSpPr/><${P}nvPr/></${P}nvSpPr>` +\n `<${P}spPr><${A}xfrm>${off}</${A}xfrm><${A}prstGeom prst=\"${kind}\"><${A}avLst/></${A}prstGeom></${P}spPr>` +\n `<${P}style><${A}lnRef idx=\"2\"><${A}schemeClr val=\"accent1\"><${A}shade val=\"50000\"/></${A}schemeClr></${A}lnRef><${A}fillRef idx=\"1\"><${A}schemeClr val=\"accent1\"/></${A}fillRef>` +\n `<${A}effectRef idx=\"0\"><${A}schemeClr val=\"accent1\"/></${A}effectRef><${A}fontRef idx=\"minor\"><${A}schemeClr val=\"lt1\"/></${A}fontRef></${P}style>` +\n `<${P}txBody><${A}bodyPr rtlCol=\"0\" anchor=\"ctr\"/><${A}lstStyle/><${A}p><${A}pPr algn=\"ctr\"/>${text ? `<${A}r><${A}rPr lang=\"en-US\" dirty=\"0\"/><${A}t>${escText(text)}</${A}t></${A}r>` : ''}<${A}endParaRPr lang=\"en-US\" dirty=\"0\"/></${A}p></${P}txBody></${P}sp>`\n )\n}\n\n/** solid slide background (or back to the layout's when null) */\nfunction setBackground(nodes: RChild[], A: string, P: string, color: string | null) {\n const cSld = kidOf(rootEl(nodes), 'cSld')\n if (!cSld) return\n cSld.c = cSld.c.filter((c) => !(isNode(c) && local(c.q) === 'bg'))\n if (!color) return\n const bg = parseRaw(`<${P}bg><${P}bgPr><${A}solidFill><${A}srgbClr val=\"${color.replace('#', '').toUpperCase()}\"/></${A}solidFill><${A}effectLst/></${P}bgPr></${P}bg>`)[0] as RNode\n cSld.c.unshift(bg)\n cSld.self = false\n}\n\nasync function editSlide(pres: PptxPresentation, index: number, fn: (nodes: RChild[], tree: RNode, A: string, P: string) => void | Promise<void>): Promise<SlideModel> {\n const info = pres.meta.slides[index]\n if (!info) throw new Error(`No slide #${index}`)\n const before = await pres.pkg.text(info.path)\n const nodes = parseRaw(before)\n const tree = spTreeOf(nodes)\n await fn(nodes, tree, aPrefix(nodes), prefixOf(tree.q))\n const after = serialize(nodes)\n pres.pkg.setPart(info.path, after)\n pres.touched = true\n if (after !== before) {\n pres.undoStack.push({ path: info.path, before, after })\n if (pres.undoStack.length > 200) pres.undoStack.shift()\n pres.redoStack = []\n }\n return pres.slide(index)\n}\n\n/** undoes / redoes the last shape edit; returns the slide index and its new model */\nexport async function undoShapes(pres: PptxPresentation, redo = false): Promise<{ index: number; model: SlideModel } | null> {\n const e = (redo ? pres.redoStack : pres.undoStack).pop()\n if (!e) return null\n ;(redo ? pres.undoStack : pres.redoStack).push(e)\n pres.pkg.setPart(e.path, redo ? e.after : e.before)\n const index = pres.meta.slides.findIndex((s) => s.path === e.path)\n if (index < 0) return null\n return { index, model: await pres.slide(index) }\n}\n\nexport async function addSlideImage(pres: PptxPresentation, index: number, bytes: Uint8Array, ext: string): Promise<string> {\n ext = ext.toLowerCase().replace('jpeg', 'jpg')\n if (!IMG_TYPES[ext]) throw new Error(`Unsupported image type .${ext}`)\n const info = pres.meta.slides[index]\n const path = pres.pkg.freeName('ppt/media', 'image', ext)\n pres.pkg.setPart(path, bytes)\n await pres.pkg.ensureDefaultType(ext, IMG_TYPES[ext])\n return pres.pkg.addRel(info.path, IMAGE_REL, path)\n}\n\nexport function shapeOps(pres: PptxPresentation, index: number, ops: ShapeOp[]): Promise<SlideModel> {\n return editSlide(pres, index, (nodes, tree, A, P) => {\n const find = (top: number) => {\n const i = tree.c.findIndex((c) => isNode(c) && idOf(c) === top)\n return i >= 0 ? { node: tree.c[i] as RNode, i } : undefined\n }\n for (const op of ops) {\n if (op.op === 'insert') {\n const id = maxId(nodes) + 1\n const xml = shapeXml(op.kind, id, op.box, A, P, op.text, op.rid)\n tree.c.push(parseRaw(xml)[0])\n continue\n }\n if (op.op === 'bg') {\n setBackground(nodes, A, P, op.color)\n continue\n }\n if (op.op === 'anchor') {\n let body: RNode | undefined\n walkOoxml(tree, (c) => {\n if (body) return true\n if (local(c.q) === 'sp' && Number(getAttr(kidOf(kidOf(c, 'nvSpPr'), 'cNvPr') ?? c, 'id')) === op.sid) body = kidOf(kidOf(c, 'txBody'), 'bodyPr')\n })\n if (body) setAttr(body, 'anchor', op.anchor)\n continue\n }\n const hit = find(op.top)\n if (!hit) continue\n const { node, i } = hit\n switch (op.op) {\n case 'xfrm':\n setXfrm(node, op.box, A, P)\n break\n case 'delete':\n tree.c.splice(i, 1)\n break\n case 'order': {\n const shapes = () => tree.c.map((c, k) => (isNode(c) && !/^(nvGrpSpPr|grpSpPr|extLst)$/.test(local(c.q)) ? k : -1)).filter((k) => k >= 0)\n const before = shapes()\n const pos = before.indexOf(i)\n tree.c.splice(i, 1)\n const rest = shapes()\n if (op.to === 'front') tree.c.splice(rest.length ? rest[rest.length - 1] + 1 : tree.c.length, 0, node)\n else if (op.to === 'back') tree.c.splice(rest.length ? rest[0] : tree.c.length, 0, node)\n else {\n // one step: swap with the neighbour shape\n const to = op.to === 'forward' ? Math.min(rest.length, pos + 1) : Math.max(0, pos - 1)\n tree.c.splice(to < rest.length ? rest[to] : rest.length ? rest[rest.length - 1] + 1 : tree.c.length, 0, node)\n }\n break\n }\n case 'duplicate': {\n const copy = clone(node)\n let id = maxId(nodes)\n walkOoxml(copy, (c) => {\n if (local(c.q) === 'cNvPr') setAttr(c, 'id', String(++id))\n })\n const off = (() => {\n let o: RNode | undefined\n walkOoxml(copy, (c) => {\n if (!o && local(c.q) === 'off') o = c\n return !!o\n })\n return o\n })()\n if (off) {\n setAttr(off, 'x', String(Number(getAttr(off, 'x') ?? 0) + Math.round((op.dx ?? 16) * EMU_PER_PX)))\n setAttr(off, 'y', String(Number(getAttr(off, 'y') ?? 0) + Math.round((op.dy ?? 16) * EMU_PER_PX)))\n }\n tree.c.splice(i + 1, 0, copy)\n break\n }\n case 'fill':\n case 'line': {\n const l = local(node.q)\n if (l !== 'sp' && l !== 'cxnSp' && l !== 'pic') break\n let pr = kidOf(node, 'spPr')\n if (!pr) {\n pr = el(P + 'spPr')\n node.c.splice(1, 0, pr)\n }\n if (op.op === 'fill') {\n removeKids(pr, (k) => FILLS.has(k))\n setOrdered(pr, fillXml(A, op.color), op.color ? 'solidFill' : 'noFill', SPPR_ORDER)\n } else {\n const ln = clone(kidOf(pr, 'ln') ?? el(A + 'ln'))\n if ('color' in op) {\n removeKids(ln, (k) => FILLS.has(k))\n ln.c.unshift(fillXml(A, op.color ?? null))\n } else if (!ln.c.some((c) => isNode(c) && FILLS.has(local(c.q)))) {\n // weight / dash on a shape whose outline comes from its style: make it visible\n ln.c.unshift(el(A + 'solidFill', {}, [el(A + 'schemeClr', { val: 'tx1' })]))\n }\n if (op.dash !== undefined) {\n removeKids(ln, (k) => k === 'prstDash' || k === 'custDash')\n const at = ln.c.findIndex((c) => isNode(c) && !FILLS.has(local(c.q)))\n ln.c.splice(at < 0 ? ln.c.length : at, 0, el(A + 'prstDash', { val: op.dash }))\n }\n ln.self = false\n if (op.w !== undefined) setAttr(ln, 'w', String(Math.round(op.w * 12700)))\n setOrdered(pr, ln, 'ln', SPPR_ORDER)\n }\n pr.self = false\n break\n }\n }\n }\n })\n}\n\n// ---------------------------------------------------------------- slides\n\nasync function presNodes(pres: PptxPresentation) {\n const nodes = parseRaw(await pres.pkg.text(pres.mainPath))\n const root = rootEl(nodes)!\n const P = prefixOf(root.q)\n let lst = kidOf(root, 'sldIdLst')\n if (!lst) {\n lst = el(P + 'sldIdLst')\n const at = root.c.findIndex((c) => isNode(c) && local(c.q) === 'sldMasterIdLst')\n root.c.splice(at + 1, 0, lst)\n }\n return { nodes, root, P, lst }\n}\n\n/** Re-reads the slide list from presentation.xml into `pres.meta`. */\nasync function refreshMeta(pres: PptxPresentation): Promise<PresentationMeta> {\n const rels = await pres.pkg.rels(pres.mainPath)\n const { lst } = await presNodes(pres)\n const slides: PresentationMeta['slides'] = []\n for (const s of kidsOf(lst, 'sldId')) {\n const rel = rels.get(getAttr(s, 'r:id') ?? getAttr(s, 'id', true) ?? '')\n if (rel && pres.pkg.has(rel.target)) slides.push({ index: slides.length, path: rel.target, hidden: false })\n }\n for (const s of slides) {\n const head = (await pres.pkg.text(s.path)).slice(0, 600)\n s.hidden = /<[\\w:]*sld\\b[^>]*\\sshow=\"0\"/.test(head)\n }\n pres.meta.slides = slides\n pres.meta.count = slides.length\n return pres.meta\n}\n\nasync function pickLayout(pres: PptxPresentation, refSlide: string | undefined, want: string): Promise<string | undefined> {\n const ref = refSlide ? relOfType(await pres.pkg.rels(refSlide), 'slideLayout')?.target : undefined\n let masterPath = ref ? relOfType(await pres.pkg.rels(ref), 'slideMaster')?.target : undefined\n if (!masterPath) masterPath = relOfType(await pres.pkg.rels(pres.mainPath), 'slideMaster')?.target\n if (!masterPath) return ref\n const layouts = relsOfType(await pres.pkg.rels(masterPath), 'slideLayout').map((r) => r.target)\n const types = await Promise.all(layouts.map(async (l) => /<[\\w:]*sldLayout\\b[^>]*\\stype=\"([^\"]+)\"/.exec((await pres.pkg.text(l)).slice(0, 800))?.[1]))\n const want2 = want === 'title' ? ['title'] : want === 'blank' ? ['blank'] : ['obj', 'txAndObj', 'tx']\n const i = types.findIndex((t) => t && want2.includes(t))\n return i >= 0 ? layouts[i] : ref ?? layouts[0]\n}\n\nasync function newSlideXml(pres: PptxPresentation, layoutPath: string | undefined): Promise<string> {\n let shapes = ''\n if (layoutPath) {\n const nodes = parseRaw(await pres.pkg.text(layoutPath))\n const tree = kidOf(kidOf(rootEl(nodes), 'cSld'), 'spTree')\n let id = 2\n for (const sp of kidsOf(tree, 'sp')) {\n const ph = kidOf(kidOf(kidOf(sp, 'nvSpPr'), 'nvPr'), 'ph')\n if (!ph) continue\n const type = getAttr(ph, 'type')\n if (type && ['dt', 'ftr', 'sldNum'].includes(type)) continue\n const name = getAttr(kidOf(kidOf(sp, 'nvSpPr'), 'cNvPr') ?? sp, 'name') ?? `Placeholder ${id}`\n const phXml = `<p:ph${type ? ` type=\"${type}\"` : ''}${getAttr(ph, 'idx') ? ` idx=\"${getAttr(ph, 'idx')}\"` : ''}/>`\n shapes +=\n `<p:sp><p:nvSpPr><p:cNvPr id=\"${id++}\" name=\"${escText(name)}\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr>${phXml}</p:nvPr></p:nvSpPr>` +\n `<p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang=\"en-US\" dirty=\"0\"/></a:p></p:txBody></p:sp>`\n }\n }\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<p:sld xmlns:a=\"${NS_A}\" xmlns:r=\"${NS_R}\" xmlns:p=\"${NS_P}\"><p:cSld><p:spTree>` +\n `<p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr>` +\n `${shapes}</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>`\n )\n}\n\nasync function insertSlidePart(pres: PptxPresentation, after: number, xml: string, rels: string): Promise<void> {\n const path = pres.pkg.freeName('ppt/slides', 'slide', 'xml')\n pres.pkg.setPart(path, xml)\n pres.pkg.setPart(relsPathFor(path), rels)\n await pres.pkg.setContentType(path, SLIDE_CT)\n const rid = await pres.pkg.addRel(pres.mainPath, SLIDE_REL, path)\n const { nodes, root, P, lst } = await presNodes(pres)\n const ids = kidsOf(lst, 'sldId').map((s) => Number(getAttr(s, 'id') ?? 0))\n const id = Math.max(255, ...ids) + 1\n const entry = el(P + 'sldId', { id: String(id), ...relIdAttrs(root, 'id', rid) })\n const items = kidsOf(lst, 'sldId')\n const at = after < 0 ? 0 : lst.c.indexOf(items[Math.min(after, items.length - 1)]) + 1\n lst.c.splice(at, 0, entry)\n lst.self = false\n pres.pkg.setPart(pres.mainPath, serialize(nodes))\n}\n\nexport async function slideOp(pres: PptxPresentation, op: SlideOp): Promise<PresentationMeta> {\n const slides = pres.meta.slides\n pres.touched = true\n switch (op.op) {\n case 'add': {\n const ref = slides[Math.max(0, Math.min(op.after, slides.length - 1))]?.path\n const layout = await pickLayout(pres, ref, op.layout ?? 'content')\n const xml = await newSlideXml(pres, layout)\n const rels = layout\n ? `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"${LAYOUT_REL}\" Target=\"../slideLayouts/${layout.split('/').pop()}\"/></Relationships>`\n : '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>'\n await insertSlidePart(pres, op.after, xml, rels)\n break\n }\n case 'duplicate': {\n const src = slides[op.index]\n if (!src) break\n const xml = await pres.pkg.text(src.path)\n const rp = relsPathFor(src.path)\n let rels = pres.pkg.has(rp) ? await pres.pkg.text(rp) : '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>'\n // notes belong to the original slide only\n const rn = parseRaw(rels)\n const rroot = rootEl(rn)!\n rroot.c = rroot.c.filter((c) => !(isNode(c) && /notesSlide$/.test(getAttr(c, 'Type') ?? '')))\n rels = serialize(rn)\n await insertSlidePart(pres, op.index, xml, rels)\n break\n }\n case 'delete': {\n const s = slides[op.index]\n if (!s || slides.length <= 1) break\n const { nodes, lst } = await presNodes(pres)\n const rels = await pres.pkg.rels(pres.mainPath)\n const entry = kidsOf(lst, 'sldId').find((x) => rels.get(getAttr(x, 'r:id') ?? '')?.target === s.path)\n if (entry) lst.c.splice(lst.c.indexOf(entry), 1)\n pres.pkg.setPart(pres.mainPath, serialize(nodes))\n const notes = relOfType(await pres.pkg.rels(s.path), 'notesSlide')?.target\n await pres.pkg.removeRelsTo(pres.mainPath, s.path)\n for (const part of [s.path, notes].filter(Boolean) as string[]) {\n pres.pkg.setPart(part, null)\n if (pres.pkg.has(relsPathFor(part))) pres.pkg.setPart(relsPathFor(part), null)\n await pres.pkg.setContentType(part, null)\n }\n break\n }\n case 'move': {\n const { nodes, lst } = await presNodes(pres)\n const items = kidsOf(lst, 'sldId')\n const item = items[op.from]\n if (!item || op.to < 0 || op.to >= items.length) break\n lst.c.splice(lst.c.indexOf(item), 1)\n const rest = kidsOf(lst, 'sldId')\n const at = op.to >= rest.length ? lst.c.length : lst.c.indexOf(rest[op.to])\n lst.c.splice(at, 0, item)\n pres.pkg.setPart(pres.mainPath, serialize(nodes))\n break\n }\n case 'hide': {\n const s = slides[op.index]\n if (!s) break\n const nodes = parseRaw(await pres.pkg.text(s.path))\n setAttr(rootEl(nodes)!, 'show', op.hidden ? '0' : undefined)\n pres.pkg.setPart(s.path, serialize(nodes))\n break\n }\n }\n return refreshMeta(pres)\n}\n","/** XLSX collaboration operations (shared by the main-thread adapter and the worker) + their transforms. */\nimport type { CellInput, FindOptions, FmtPatch, Range, SheetOp } from '../core/xlsx/types'\n\n/** sheets are addressed by part path: indexes move when sheets are added / reordered */\nexport type PBookOp =\n | { op: 'add'; name?: string; after?: string }\n | { op: 'rename'; path: string; name: string }\n | { op: 'delete'; path: string }\n | { op: 'move'; path: string; to: number }\n\nexport type XOp =\n | { t: 'set'; id: string; sheet: string; cells: CellInput[] }\n | { t: 'fmt'; id: string; sheet: string; range: Range; patch: FmtPatch }\n | { t: 'sheet'; id: string; sheet: string; op: SheetOp }\n | { t: 'replace'; id: string; sheet: string; query: string; by: string; opts?: FindOptions; at?: { r: number; c: number } }\n | { t: 'book'; id: string; op: PBookOp }\n /** sets the cells changed by op `target` back to their state before (`prev`) or after (`next`) it */\n | { t: 'revert'; id: string; target: string; which: 'prev' | 'next' }\n\nexport const STRUCTURAL = new Set<SheetOp['op']>(['insertRows', 'deleteRows', 'insertCols', 'deleteCols'])\n\nexport const isStructural = (o: XOp) => o.t === 'book' || (o.t === 'sheet' && STRUCTURAL.has(o.op.op))\n\n// ---------------------------------------------------------------- index shifting\n\n/** index after `n` items were inserted (n > 0) or deleted (n < 0) at `at`; null when deleted */\nexport function shiftIdx(x: number, at: number, n: number): number | null {\n if (n >= 0) return x >= at ? x + n : x\n const d = -n\n return x < at ? x : x < at + d ? null : x - d\n}\n\n/** inclusive span [a, b] after an insert / delete; null when entirely deleted */\nexport function shiftSpan(a: number, b: number, at: number, n: number): [number, number] | null {\n if (n >= 0) return [a >= at ? a + n : a, b >= at ? b + n : b]\n const d = -n\n if (b < at) return [a, b]\n if (a >= at + d) return [a - d, b - d]\n const na = a < at ? a : at\n const nb = b < at + d ? at - 1 : b - d\n return nb < na ? null : [na, nb]\n}\n\nfunction shiftRange(r: Range, axis: 'row' | 'col', at: number, n: number): Range | null {\n const s = axis === 'row' ? shiftSpan(r.r0, r.r1, at, n) : shiftSpan(r.c0, r.c1, at, n)\n if (!s) return null\n return axis === 'row' ? { ...r, r0: s[0], r1: s[1] } : { ...r, c0: s[0], c1: s[1] }\n}\n\nfunction shiftSheetOp(op: SheetOp, axis: 'row' | 'col', at: number, n: number): SheetOp | null {\n const span = (a: number, b: number, ax: 'row' | 'col') => (ax === axis ? shiftSpan(a, b, at, n) : ([a, b] as [number, number]))\n switch (op.op) {\n case 'insertRows':\n case 'insertCols': {\n if ((op.op === 'insertRows') !== (axis === 'row')) return op\n // concurrent insert at the same place: the one sequenced first stays first\n const x = n >= 0 ? (op.at >= at ? op.at + n : op.at) : op.at < at ? op.at : op.at < at - n ? at : op.at + n\n return x === op.at ? op : { ...op, at: x }\n }\n case 'deleteRows':\n case 'deleteCols': {\n if ((op.op === 'deleteRows') !== (axis === 'row')) return op\n const s = shiftSpan(op.at, op.at + op.n - 1, at, n)\n return s ? { ...op, at: s[0], n: s[1] - s[0] + 1 } : null\n }\n case 'merge':\n case 'unmerge':\n case 'fill': {\n const range = shiftRange(op.range, axis, at, n)\n return range ? { ...op, range } : null\n }\n case 'sort': {\n const range = shiftRange(op.range, axis, at, n)\n if (!range) return null\n const col = axis === 'col' ? shiftIdx(op.col, at, n) : op.col\n return col === null ? null : { ...op, range, col }\n }\n case 'hideRows':\n case 'hideCols': {\n const s = span(op.a, op.b, op.op === 'hideRows' ? 'row' : 'col')\n return s ? { ...op, a: s[0], b: s[1] } : null\n }\n case 'colWidth': {\n const s = span(op.c0, op.c1, 'col')\n return s ? { ...op, c0: s[0], c1: s[1] } : null\n }\n case 'rowHeight': {\n const s = span(op.r0, op.r1, 'row')\n return s ? { ...op, r0: s[0], r1: s[1] } : null\n }\n default:\n return op\n }\n}\n\n/** `op` adjusted to apply after `prior` (deterministic) */\nexport function transformX(op: XOp, prior: XOp): XOp | null {\n if (prior.t === 'book') {\n if (prior.op.op === 'delete' && 'sheet' in op && op.sheet === prior.op.path) return null\n return op\n }\n if (prior.t !== 'sheet' || !STRUCTURAL.has(prior.op.op) || !('sheet' in op) || op.sheet !== prior.sheet) return op\n const p = prior.op as { op: string; at: number; n: number }\n const axis = p.op.endsWith('Rows') ? 'row' : 'col'\n const n = p.op.startsWith('insert') ? p.n : -p.n\n switch (op.t) {\n case 'set': {\n const cells: CellInput[] = []\n for (const c of op.cells) {\n const x = shiftIdx(axis === 'row' ? c.r : c.c, p.at, n)\n if (x !== null) cells.push(axis === 'row' ? { ...c, r: x } : { ...c, c: x })\n }\n return cells.length ? { ...op, cells } : null\n }\n case 'fmt': {\n const range = shiftRange(op.range, axis, p.at, n)\n return range ? { ...op, range } : null\n }\n case 'sheet': {\n const next = shiftSheetOp(op.op, axis, p.at, n)\n return next === op.op ? op : next ? { ...op, op: next } : null\n }\n case 'replace': {\n if (!op.at) return op\n const x = shiftIdx(axis === 'row' ? op.at.r : op.at.c, p.at, n)\n return x === null ? null : { ...op, at: axis === 'row' ? { ...op.at, r: x } : { ...op.at, c: x } }\n }\n }\n return op\n}\n\n// ---------------------------------------------------------------- footprint (for conflict detection)\n\nconst ALL: Range = { r0: 0, c0: 0, r1: Number.MAX_SAFE_INTEGER, c1: Number.MAX_SAFE_INTEGER }\n\nexport function footprint(op: XOp): { sheet: string; range: Range } | null {\n switch (op.t) {\n case 'set': {\n let r0 = Infinity\n let c0 = Infinity\n let r1 = -1\n let c1 = -1\n for (const c of op.cells) {\n r0 = Math.min(r0, c.r)\n c0 = Math.min(c0, c.c)\n r1 = Math.max(r1, c.r)\n c1 = Math.max(c1, c.c)\n }\n return { sheet: op.sheet, range: { r0, c0, r1, c1 } }\n }\n case 'fmt':\n return { sheet: op.sheet, range: op.range }\n case 'replace':\n return { sheet: op.sheet, range: op.at ? { r0: op.at.r, c0: op.at.c, r1: op.at.r, c1: op.at.c } : ALL }\n case 'sheet': {\n const o = op.op\n if ('range' in o) return { sheet: op.sheet, range: o.range }\n if (o.op === 'hideRows') return { sheet: op.sheet, range: { ...ALL, r0: o.a, r1: o.b } }\n if (o.op === 'hideCols') return { sheet: op.sheet, range: { ...ALL, c0: o.a, c1: o.b } }\n if (o.op === 'colWidth') return { sheet: op.sheet, range: { ...ALL, c0: o.c0, c1: o.c1 } }\n if (o.op === 'rowHeight') return { sheet: op.sheet, range: { ...ALL, r0: o.r0, r1: o.r1 } }\n return { sheet: op.sheet, range: ALL }\n }\n default:\n return null\n }\n}\n\nconst overlap = (a: Range, b: Range) => a.r0 <= b.r1 && b.r0 <= a.r1 && a.c0 <= b.c1 && b.c0 <= a.c1\n\n/** whether remote ops interact with pending local ones (→ rebase) */\nexport function conflictsX(pending: XOp[], remote: XOp[]): boolean {\n if (remote.some((o) => isStructural(o) || o.t === 'revert')) return true\n if (pending.some((o) => o.t === 'revert' || isStructural(o))) return true\n // derived styles are appended to one table: keep its order identical everywhere\n const styles = (o: XOp) => o.t === 'fmt' && o.patch.xf === undefined && !o.patch.clear\n if (pending.some(styles) && remote.some(styles)) return true\n const fp = remote.map(footprint)\n return pending.some((p) => {\n const a = footprint(p)\n return !!a && fp.some((b) => !!b && b.sheet === a.sheet && overlap(a.range, b.range))\n })\n}\n","/**\n * Worker side of XLSX collaboration: runs operations on the XlsxEditor without its undo\n * history, keeping one exact record per applied operation (for rebasing and shared undo).\n */\nimport type { Change, XlsxEditor } from '../core/xlsx/editor'\nimport type { BookOp, SheetProgress, XlsxEditResult } from '../core/xlsx/types'\nimport type { XlsxWorkbook } from '../core/xlsx/workbook'\nimport { STRUCTURAL, type XOp } from './xlsx-ops'\n\ninterface Rec {\n ch?: Change\n /** style table sizes before the op, when the op derived new styles (dropped again when it is undone) */\n styles?: Record<string, number>\n op: string\n}\n\nconst MAX_RECS = 400\n\nexport class XlsxCollabWorker {\n private recs = new Map<number, Rec>()\n /** op id → record of its latest application */\n private byOp = new Map<string, number>()\n private seq = 0\n\n constructor(\n private ed: XlsxEditor,\n private wb: XlsxWorkbook,\n private emit: (p: SheetProgress) => void,\n ) {}\n\n private index(path: string): number {\n const i = this.wb.sheets.findIndex((s) => s.path === path)\n if (i < 0) throw new SkipOp()\n return i\n }\n\n private async sheet(path: string): Promise<number> {\n const i = this.index(path)\n await this.wb.loadSheet(i, this.emit)\n return i\n }\n\n /** forgets the records of a sheet (null: all), whose cell keys / indexes changed under them */\n private dropSheet(i: number | null) {\n for (const [id, r] of this.recs) {\n if (i === null || r.ch?.sheet === i) {\n this.recs.delete(id)\n this.byOp.delete(r.op)\n }\n }\n }\n\n async apply(op: XOp): Promise<{ res: XlsxEditResult | null; rec: number | null }> {\n const styles = await this.ed.styleMark()\n let res: XlsxEditResult | null\n try {\n res = await this.run(op)\n } catch (e) {\n if (e instanceof SkipOp) return { res: null, rec: null }\n throw e\n }\n const ch = this.ed.takeRecord()\n const after = await this.ed.styleMark()\n // only an op that grew the style table may shrink it back: styles derived later by others must stay\n const grew = Object.keys(after).some((k) => after[k] !== styles[k])\n if (op.t === 'book') {\n this.dropSheet(null)\n return { res, rec: null }\n }\n if (op.t === 'sheet' && STRUCTURAL.has(op.op.op)) {\n // formulas of every sheet were rewritten: older records would restore stale ones\n this.dropSheet(null)\n return { res, rec: null }\n }\n const id = ++this.seq\n this.recs.set(id, { ch, styles: grew ? styles : undefined, op: op.id })\n this.byOp.set(op.id, id)\n if (this.recs.size > MAX_RECS) {\n const [old, r] = this.recs.entries().next().value as [number, Rec]\n this.recs.delete(old)\n if (this.byOp.get(r.op) === old) this.byOp.delete(r.op)\n }\n return { res, rec: id }\n }\n\n private async run(op: XOp): Promise<XlsxEditResult | null> {\n const ed = this.ed\n switch (op.t) {\n case 'set':\n return ed.setCells(await this.sheet(op.sheet), op.cells)\n case 'fmt':\n return ed.format(await this.sheet(op.sheet), op.range, op.patch)\n case 'sheet':\n return ed.sheetOp(await this.sheet(op.sheet), op.op)\n case 'replace':\n return ed.replace(await this.sheet(op.sheet), op.query, op.by, op.opts, op.at)\n case 'book': {\n const o = op.op\n let b: BookOp\n if (o.op === 'add') b = { op: 'add', name: o.name, after: o.after ? this.index(o.after) : undefined }\n else if (o.op === 'rename') b = { op: 'rename', index: this.index(o.path), name: o.name }\n else if (o.op === 'delete') b = { op: 'delete', index: this.index(o.path) }\n else b = { op: 'move', from: this.index(o.path), to: Math.max(0, Math.min(o.to, this.wb.sheets.length - 1)) }\n try {\n return await ed.bookOp(b)\n } catch {\n // e.g. a concurrent rename to the same name: skipped everywhere alike\n throw new SkipOp()\n }\n }\n case 'revert': {\n const id = this.byOp.get(op.target)\n const r = id !== undefined ? this.recs.get(id) : undefined\n if (!r?.ch) throw new SkipOp()\n return ed.restoreRecord(r.ch, op.which)\n }\n }\n }\n\n /** exactly undoes an applied operation (rebase) */\n async revert(id: number): Promise<XlsxEditResult | null> {\n const r = this.recs.get(id)\n if (!r) return null\n this.recs.delete(id)\n if (this.byOp.get(r.op) === id) this.byOp.delete(r.op)\n const res = r.ch ? this.ed.revertRecord(r.ch) : null\n if (r.styles) await this.ed.styleTruncate(r.styles)\n return res\n }\n}\n\nclass SkipOp extends Error {}\n","/** Worker side of PPTX collaboration: operations recorded as slide XML snapshots (exact rollback, shared undo). */\nimport { addSlideImage, shapeOps, slideOp } from '../core/pptx/edit'\nimport type { PptxPresentation } from '../core/pptx/parser'\nimport type { PresentationMeta, ShapeOp, SlideModel, SlideOp } from '../core/pptx/types'\nimport type { POp } from './pptx-ops'\n\ninterface Snap {\n xml: string\n gen: [string, unknown][]\n}\n\ninterface Rec {\n path: string\n before: Snap\n after: Snap\n op: string\n}\n\nexport interface PptxCollabResult {\n /** slide index + its new model */\n slide?: number\n model?: SlideModel\n /** slide list changed */\n meta?: PresentationMeta\n /** image relationship id (image ops) */\n rid?: string\n}\n\nconst MAX_RECS = 300\n\nexport class PptxCollabWorker {\n private recs = new Map<number, Rec>()\n private byOp = new Map<string, number>()\n private seq = 0\n /** image key → relationship id, per slide */\n private images = new Map<string, string>()\n\n constructor(private pres: PptxPresentation) {}\n\n /** text templates of every slide, taken in the shared state (before any op / right after slide-list changes) */\n private async originals() {\n for (const s of this.pres.meta.slides) await this.pres.keepOriginal(s.path)\n }\n\n private ready?: Promise<void>\n\n private index(path: string): number {\n return this.pres.meta.slides.findIndex((s) => s.path === path)\n }\n\n private get genMaps(): Map<string, unknown> {\n return (this.pres as unknown as { genMaps: Map<string, unknown> }).genMaps\n }\n\n private async snap(path: string): Promise<Snap> {\n return { xml: await this.pres.pkg.text(path), gen: [...this.genMaps].filter(([k]) => k.startsWith(path + '#')) }\n }\n\n private restore(path: string, s: Snap) {\n this.pres.pkg.setPart(path, s.xml)\n for (const k of [...this.genMaps.keys()]) if (k.startsWith(path + '#')) this.genMaps.delete(k)\n for (const [k, v] of s.gen) this.genMaps.set(k, v)\n this.pres.touched = true\n }\n\n private async model(path: string): Promise<PptxCollabResult> {\n const i = this.index(path)\n return i < 0 ? {} : { slide: i, model: await this.pres.slide(i) }\n }\n\n async apply(op: POp): Promise<{ res: PptxCollabResult; rec: number | null }> {\n const pres = this.pres\n await (this.ready ??= this.originals())\n if (op.t === 'image') {\n const i = this.index(op.slide)\n if (i < 0) return { res: {}, rec: null }\n let rid = this.images.get(op.key)\n if (!rid) {\n rid = await addSlideImage(pres, i, op.bytes, op.ext)\n this.images.set(op.key, rid)\n }\n return { res: { rid }, rec: null }\n }\n if (op.t === 'slides') {\n const o = op.op\n const at = (p: string) => this.index(p)\n let s: SlideOp | null = null\n if (o.op === 'add') s = { op: 'add', after: o.after ? at(o.after) : -1, layout: o.layout }\n else if (at(o.path) >= 0) {\n if (o.op === 'duplicate') s = { op: 'duplicate', index: at(o.path) }\n else if (o.op === 'delete') s = pres.meta.slides.length > 1 ? { op: 'delete', index: at(o.path) } : null\n else if (o.op === 'move') s = { op: 'move', from: at(o.path), to: Math.max(0, Math.min(o.to, pres.meta.slides.length - 1)) }\n else s = { op: 'hide', index: at(o.path), hidden: o.hidden }\n }\n if (!s) return { res: {}, rec: null }\n const meta = await slideOp(pres, s)\n await this.originals()\n // slide parts and indexes changed: older records would restore stale slides\n this.recs.clear()\n this.byOp.clear()\n return { res: { meta: { ...meta, slides: meta.slides.map((x) => ({ ...x })) } }, rec: null }\n }\n let path: string\n let target: Rec | undefined\n if (op.t === 'revert') {\n const id = this.byOp.get(op.target)\n target = id !== undefined ? this.recs.get(id) : undefined\n if (!target) return { res: {}, rec: null }\n path = target.path\n } else path = op.slide\n const i = this.index(path)\n if (i < 0) return { res: {}, rec: null }\n const before = await this.snap(path)\n if (op.t === 'text') {\n try {\n await pres.setText(i, op.sid, op.paras)\n } catch {\n // shape deleted by a collaborator: skipped everywhere alike\n return { res: {}, rec: null }\n }\n } else if (op.t === 'shapes') {\n const ops = op.ops.map((o) => {\n if (o.op !== 'insert' || !o.key) return o as ShapeOp\n const { key, ...rest } = o\n return { ...rest, rid: this.images.get(key) } as ShapeOp\n })\n await shapeOps(pres, i, ops)\n } else if (target) this.restore(path, op.which === 'prev' ? target.before : target.after)\n // shared undo replaces the view's own shape history\n pres.undoStack = []\n pres.redoStack = []\n const id = ++this.seq\n this.recs.set(id, { path, before, after: await this.snap(path), op: op.id })\n this.byOp.set(op.id, id)\n if (this.recs.size > MAX_RECS) {\n const [old, r] = this.recs.entries().next().value as [number, Rec]\n this.recs.delete(old)\n if (this.byOp.get(r.op) === old) this.byOp.delete(r.op)\n }\n return { res: await this.model(path), rec: id }\n }\n\n /** exactly undoes an applied operation (rebase) */\n async revert(id: number): Promise<PptxCollabResult> {\n const r = this.recs.get(id)\n if (!r) return {}\n this.recs.delete(id)\n if (this.byOp.get(r.op) === id) this.byOp.delete(r.op)\n this.restore(r.path, r.before)\n return this.model(r.path)\n }\n}\n","import { DocxDocument } from '../docx/parser'\nimport { addImage, addLink, applyEdit, applyTable, ensureStyle, saveDocx } from '../docx/writer'\nimport type { CanonStyle, EditOp, TableOp } from '../docx/types'\nimport { OpcPackage, type DocKind } from '../opc'\nimport { PptxPresentation } from '../pptx/parser'\nimport { openSource, type DocSource } from '../source'\nimport { XlsxWorkbook } from '../xlsx/workbook'\nimport { XlsxEditor } from '../xlsx/editor'\nimport type { BookOp, CellInput, FindOptions, FmtPatch, Range, SheetOp } from '../xlsx/types'\nimport type { PParaSpec, ShapeOp, SlideOp } from '../pptx/types'\nimport { addSlideImage, shapeOps, slideOp, undoShapes } from '../pptx/edit'\nimport { ZipArchive } from '../zip'\nimport { XlsxCollabWorker } from '../../collab/xlsx-worker'\nimport type { XOp } from '../../collab/xlsx-ops'\nimport { PptxCollabWorker } from '../../collab/pptx-worker'\nimport type { POp } from '../../collab/pptx-ops'\nimport type { Events, Methods, OpenParams, OpenResult } from './protocol'\n\nconst WRITES = new Set<string>([\n 'docx.edit', 'docx.table', 'docx.image', 'docx.link', 'docx.style', 'save',\n 'xlsx.set', 'xlsx.format', 'xlsx.sheetOp', 'xlsx.bookOp', 'xlsx.replace', 'xlsx.undo', 'xlsx.redo', 'collab.xlsx.apply', 'collab.xlsx.revert',\n 'pptx.setText', 'pptx.shapes', 'pptx.slides', 'pptx.image', 'pptx.undo', 'collab.pptx.apply', 'collab.pptx.revert',\n])\n\ntype Emit = <K extends keyof Events>(event: K, data: Events[K]) => void\n\n/** Format-agnostic engine; runs inside the worker (or directly, e.g. in tests). */\nexport class Engine {\n private pkg?: OpcPackage\n private kind?: DocKind\n private docx?: DocxDocument\n private xlsx?: XlsxWorkbook\n private xlsxEd?: XlsxEditor\n private pptx?: PptxPresentation\n private abort = new AbortController()\n\n constructor(private emit: Emit) {}\n\n async open(src: DocSource, params: OpenParams = {}): Promise<OpenResult> {\n const source = await openSource(src, {\n ...params,\n signal: this.abort.signal,\n onProgress: (loaded, total) => this.emit('progress', { phase: 'download', loaded, total }),\n })\n const zip = await ZipArchive.open(source)\n const pkg = (this.pkg = new OpcPackage(zip))\n const main = await pkg.mainPart()\n this.kind = main.kind\n const res: OpenResult = { kind: main.kind, name: params.name ?? source.name, size: source.size }\n if (main.kind === 'docx') this.docx = await DocxDocument.open(pkg, main.path)\n else if (main.kind === 'xlsx') res.xlsx = (this.xlsx = await XlsxWorkbook.open(pkg, main.path)).meta()\n else res.pptx = (this.pptx = await PptxPresentation.open(pkg, main.path)).meta\n return res\n }\n\n private writes: Promise<unknown> = Promise.resolve()\n\n call<M extends keyof Methods>(method: M, args: unknown[]): Promise<unknown> {\n // document writes run one at a time, in call order: they await internally (list / style\n // parts, sheet loading) and a later edit reads state (paragraph locations…) the previous one sets\n if (!WRITES.has(method)) return this.dispatch(method, args)\n const run = this.writes.then(() => this.dispatch(method, args))\n this.writes = run.catch(() => {})\n return run\n }\n\n private async dispatch<M extends keyof Methods>(method: M, args: unknown[]): Promise<unknown> {\n switch (method) {\n case 'open':\n return this.open(args[0] as DocSource, args[1] as OpenParams)\n case 'part':\n return this.need(this.pkg).blob(args[0] as string)\n case 'docx.start': {\n const doc = this.need(this.docx)\n try {\n await doc.stream({\n signal: this.abort.signal,\n onBlocks: (b) => this.emit('docx:blocks', b),\n onMeta: (m) => this.emit('docx:meta', m),\n onProgress: (loaded, total) => this.emit('progress', { phase: 'parse', loaded, total }),\n })\n this.emit('docx:done', {})\n } catch (e) {\n this.emit('docx:done', { error: (e as Error).message })\n }\n return\n }\n case 'docx.edit':\n return applyEdit(this.need(this.docx), args[0] as EditOp)\n case 'docx.table':\n return applyTable(this.need(this.docx), args[0] as TableOp)\n case 'docx.image':\n return addImage(this.need(this.docx), new Uint8Array(args[0] as ArrayBuffer), args[1] as string)\n case 'docx.link':\n return addLink(this.need(this.docx), args[0] as string)\n case 'docx.style':\n return ensureStyle(this.need(this.docx), args[0] as CanonStyle)\n case 'save':\n return this.save()\n case 'dirty':\n return this.docx ? this.docx.dirty : this.xlsxEd ? this.xlsxEd.dirty : this.pptx ? this.pptx.dirty : this.need(this.pkg).dirty\n case 'xlsx.load': {\n const wb = this.need(this.xlsx)\n void wb.loadSheet(\n args[0] as number,\n (p) => this.emit('xlsx:progress', p),\n (phase, loaded, total) => this.emit('progress', { phase, loaded, total }),\n )\n return\n }\n case 'xlsx.set':\n return this.xed().setCells(args[0] as number, args[1] as CellInput[])\n case 'xlsx.format':\n return this.xed().format(args[0] as number, args[1] as Range, args[2] as FmtPatch)\n case 'xlsx.sheetOp':\n return this.xed().sheetOp(args[0] as number, args[1] as SheetOp)\n case 'xlsx.replace':\n return this.xed().replace(args[0] as number, args[1] as string, args[2] as string, args[3] as FindOptions, args[4] as { r: number; c: number } | undefined)\n case 'xlsx.bookOp':\n return this.xed().bookOp(args[0] as BookOp)\n case 'xlsx.undo':\n return this.xed().undo()\n case 'xlsx.redo':\n return this.xed().redo()\n case 'collab.xlsx.apply':\n return this.xc().apply(args[0] as XOp)\n case 'collab.xlsx.revert':\n return this.xc().revert(args[0] as number)\n case 'collab.pptx.apply':\n return (this.pcollab ??= new PptxCollabWorker(this.need(this.pptx))).apply(args[0] as POp)\n case 'collab.pptx.revert':\n return (this.pcollab ??= new PptxCollabWorker(this.need(this.pptx))).revert(args[0] as number)\n case 'xlsx.block':\n return this.need(this.xlsx).block(args[0] as number, args[1] as number, args[2] as number)\n case 'xlsx.cell':\n return this.need(this.xlsx).cell(args[0] as number, args[1] as number, args[2] as number)\n case 'xlsx.find':\n return this.need(this.xlsx).find(args[0] as number, args[1] as string, args[2] as FindOptions)\n case 'pptx.setText':\n return this.need(this.pptx).setText(args[0] as number, args[1] as number, args[2] as PParaSpec[])\n case 'pptx.shapes':\n return shapeOps(this.need(this.pptx), args[0] as number, args[1] as ShapeOp[])\n case 'pptx.slides':\n return slideOp(this.need(this.pptx), args[0] as SlideOp)\n case 'pptx.image':\n return addSlideImage(this.need(this.pptx), args[0] as number, new Uint8Array(args[1] as ArrayBuffer), args[2] as string)\n case 'pptx.slide':\n return this.need(this.pptx).slide(args[0] as number)\n case 'pptx.undo':\n return undoShapes(this.need(this.pptx), !!args[0])\n }\n throw new Error(`Unknown method ${String(method)}`)\n }\n\n private xcollab?: XlsxCollabWorker\n private pcollab?: PptxCollabWorker\n private xc(): XlsxCollabWorker {\n return (this.xcollab ??= new XlsxCollabWorker(this.xed(), this.need(this.xlsx), (p) => this.emit('xlsx:progress', p)))\n }\n\n private xed(): XlsxEditor {\n return (this.xlsxEd ??= new XlsxEditor(this.need(this.xlsx)))\n }\n\n private async save(): Promise<Blob> {\n if (this.docx) return saveDocx(this.docx)\n if (this.xlsx) return this.xed().save()\n if (this.pptx) return this.pptx.save()\n throw new Error('Saving is not supported for this document yet')\n }\n\n dispose() {\n this.abort.abort()\n }\n\n private need<T>(v: T | undefined): T {\n if (!v) throw new Error(this.kind ? `Operation not available for ${this.kind}` : 'Document not opened')\n return v\n }\n}\n","/// <reference lib=\"webworker\" />\nimport { Engine } from './engine'\nimport type { Evt, Req, Res } from './protocol'\n\nconst ctx = self as unknown as DedicatedWorkerGlobalScope\n\nconst engine = new Engine((event, data) => {\n ctx.postMessage({ event, data } satisfies Evt)\n})\n\nctx.onmessage = async (e: MessageEvent<Req>) => {\n const { id, method, args } = e.data\n try {\n const result = await engine.call(method, args)\n ctx.postMessage({ id, ok: true, result } satisfies Res)\n } catch (err) {\n ctx.postMessage({ id, ok: false, error: (err as Error)?.message ?? String(err) } satisfies Res)\n }\n}\n"],"mappings":"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"}
|