@arbidocs/blocks 0.4.110 → 0.4.111

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.
Files changed (94) hide show
  1. package/dist/{NativeDocxEditor-WODZAURG.cjs → NativeDocxEditor-AQKRZBIU.cjs} +7 -7
  2. package/dist/{NativeDocxEditor-WODZAURG.cjs.map → NativeDocxEditor-AQKRZBIU.cjs.map} +1 -1
  3. package/dist/{NativeDocxEditor-4PY4YZYC.js → NativeDocxEditor-IN2HEO5I.js} +3 -3
  4. package/dist/{NativeDocxEditor-4PY4YZYC.js.map → NativeDocxEditor-IN2HEO5I.js.map} +1 -1
  5. package/dist/agents/index.cjs +207 -207
  6. package/dist/agents/index.js +2 -2
  7. package/dist/calendar/EventEditor.d.ts +1 -1
  8. package/dist/calendar/draft.d.ts +7 -1
  9. package/dist/calendar/index.cjs +58 -10
  10. package/dist/calendar/index.cjs.map +1 -1
  11. package/dist/calendar/index.d.ts +1 -1
  12. package/dist/calendar/index.js +56 -11
  13. package/dist/calendar/index.js.map +1 -1
  14. package/dist/calendar/types.d.ts +20 -0
  15. package/dist/calls/CallSidePanel.d.ts +16 -1
  16. package/dist/calls/ControlBar.d.ts +25 -3
  17. package/dist/calls/PreJoin.d.ts +6 -2
  18. package/dist/calls/cards.d.ts +6 -2
  19. package/dist/calls/index.cjs +1078 -47
  20. package/dist/calls/index.cjs.map +1 -1
  21. package/dist/calls/index.d.ts +4 -3
  22. package/dist/calls/index.js +1067 -51
  23. package/dist/calls/index.js.map +1 -1
  24. package/dist/calls/panels.d.ts +11 -0
  25. package/dist/calls/webinar/ChatPermissionSetting.d.ts +18 -0
  26. package/dist/calls/webinar/OnStageCheck.d.ts +23 -0
  27. package/dist/calls/webinar/QAPanel.d.ts +56 -0
  28. package/dist/calls/webinar/RaiseHandButton.d.ts +14 -0
  29. package/dist/calls/webinar/WebinarAudiencePanel.d.ts +23 -0
  30. package/dist/calls/webinar/WebinarViewer.d.ts +39 -0
  31. package/dist/calls/webinar/WebinarWaiting.d.ts +19 -0
  32. package/dist/calls/webinar/hooks.d.ts +13 -0
  33. package/dist/calls/webinar/index.d.ts +14 -0
  34. package/dist/calls/webinar/live.d.ts +43 -0
  35. package/dist/calls/webinar/types.d.ts +49 -0
  36. package/dist/{chunk-GKDWQLVU.js → chunk-2C7TCVQZ.js} +172 -121
  37. package/dist/chunk-2C7TCVQZ.js.map +1 -0
  38. package/dist/{chunk-54WBIVHV.cjs → chunk-2WO5L7YT.cjs} +5 -5
  39. package/dist/{chunk-54WBIVHV.cjs.map → chunk-2WO5L7YT.cjs.map} +1 -1
  40. package/dist/{chunk-A35KT2II.js → chunk-6Z7DLJU2.js} +3 -3
  41. package/dist/{chunk-A35KT2II.js.map → chunk-6Z7DLJU2.js.map} +1 -1
  42. package/dist/{chunk-VZKBI2KJ.cjs → chunk-FXUQZFAN.cjs} +3 -3
  43. package/dist/{chunk-VZKBI2KJ.cjs.map → chunk-FXUQZFAN.cjs.map} +1 -1
  44. package/dist/{chunk-SQNAJPNR.js → chunk-GFYGYME3.js} +3 -3
  45. package/dist/{chunk-SQNAJPNR.js.map → chunk-GFYGYME3.js.map} +1 -1
  46. package/dist/chunk-GICUGQNN.cjs +76 -0
  47. package/dist/chunk-GICUGQNN.cjs.map +1 -0
  48. package/dist/chunk-JJLMCV3T.js +73 -0
  49. package/dist/chunk-JJLMCV3T.js.map +1 -0
  50. package/dist/{chunk-W7ZDBPJ3.cjs → chunk-OR4CO743.cjs} +3 -3
  51. package/dist/{chunk-W7ZDBPJ3.cjs.map → chunk-OR4CO743.cjs.map} +1 -1
  52. package/dist/{chunk-PEHLUB52.js → chunk-Q6B77ZWZ.js} +3 -3
  53. package/dist/{chunk-PEHLUB52.js.map → chunk-Q6B77ZWZ.js.map} +1 -1
  54. package/dist/{chunk-ELDUWTRR.cjs → chunk-TF47ATYS.cjs} +4 -4
  55. package/dist/{chunk-ELDUWTRR.cjs.map → chunk-TF47ATYS.cjs.map} +1 -1
  56. package/dist/{chunk-JB32KYAH.js → chunk-WTM65ZNG.js} +3 -3
  57. package/dist/{chunk-JB32KYAH.js.map → chunk-WTM65ZNG.js.map} +1 -1
  58. package/dist/{chunk-2NIL2ASF.cjs → chunk-XIGWUDOD.cjs} +170 -119
  59. package/dist/chunk-XIGWUDOD.cjs.map +1 -0
  60. package/dist/collaboration/index.cjs +1 -1
  61. package/dist/collaboration/index.js +1 -1
  62. package/dist/connect/docx.cjs +6 -6
  63. package/dist/connect/docx.js +4 -4
  64. package/dist/connect/index.cjs +31 -31
  65. package/dist/connect/index.js +7 -7
  66. package/dist/docx/AgentUndo.d.ts +4 -0
  67. package/dist/docx/index.cjs +46 -46
  68. package/dist/docx/index.js +3 -3
  69. package/dist/files/index.cjs +1 -1
  70. package/dist/files/index.js +1 -1
  71. package/dist/index.cjs +332 -332
  72. package/dist/index.js +6 -6
  73. package/dist/settings/index.cjs +48 -102
  74. package/dist/settings/index.cjs.map +1 -1
  75. package/dist/settings/index.js +10 -70
  76. package/dist/settings/index.js.map +1 -1
  77. package/dist/workflow-canvas/index.cjs +9 -9
  78. package/dist/workflow-canvas/index.js +2 -2
  79. package/node_modules/@arbidocs/coedit/dist/commands.cjs +179 -9
  80. package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -1
  81. package/node_modules/@arbidocs/coedit/dist/commands.d.cts +81 -1
  82. package/node_modules/@arbidocs/coedit/dist/commands.d.ts +81 -1
  83. package/node_modules/@arbidocs/coedit/dist/commands.js +173 -11
  84. package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -1
  85. package/node_modules/@arbidocs/coedit/dist/server.cjs +58 -2
  86. package/node_modules/@arbidocs/coedit/dist/server.cjs.map +1 -1
  87. package/node_modules/@arbidocs/coedit/dist/server.d.cts +29 -1
  88. package/node_modules/@arbidocs/coedit/dist/server.d.ts +29 -1
  89. package/node_modules/@arbidocs/coedit/dist/server.js +58 -3
  90. package/node_modules/@arbidocs/coedit/dist/server.js.map +1 -1
  91. package/node_modules/@arbidocs/coedit/package.json +1 -1
  92. package/package.json +4 -4
  93. package/dist/chunk-2NIL2ASF.cjs.map +0 -1
  94. package/dist/chunk-GKDWQLVU.js.map +0 -1
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkMUMH3Z6K_cjs = require('../chunk-MUMH3Z6K.cjs');
5
- var chunkVZKBI2KJ_cjs = require('../chunk-VZKBI2KJ.cjs');
5
+ var chunkFXUQZFAN_cjs = require('../chunk-FXUQZFAN.cjs');
6
6
  require('../chunk-ZV3BKLFY.cjs');
7
7
  require('../chunk-S5HZBXZA.cjs');
8
8
  require('../chunk-ZW6FPIFC.cjs');
@@ -14,11 +14,11 @@ require('../chunk-DVUZTGVL.cjs');
14
14
  require('../chunk-OB5F4577.cjs');
15
15
  require('../chunk-DETZZBG2.cjs');
16
16
  var chunk32HW2Q33_cjs = require('../chunk-32HW2Q33.cjs');
17
- require('../chunk-ULWRNGGE.cjs');
18
17
  require('../chunk-V4ISCZJ7.cjs');
19
18
  require('../chunk-2EI7NCUA.cjs');
20
19
  require('../chunk-C2CWWEHO.cjs');
21
20
  require('../chunk-7RGLTF76.cjs');
21
+ require('../chunk-ULWRNGGE.cjs');
22
22
  require('../chunk-B4SRYJLM.cjs');
23
23
  require('../chunk-7UTB4PHM.cjs');
24
24
  require('../chunk-FX3K6LNZ.cjs');
@@ -1615,7 +1615,7 @@ function triggerFields(trigger, clearOthers) {
1615
1615
  return {
1616
1616
  timezone: trigger.timezone,
1617
1617
  rrule: trigger.start === "repeat" ? trigger.rrule.trim() : none,
1618
- run_at: trigger.start === "once" ? chunkVZKBI2KJ_cjs.localInputToIso(trigger.runAt) : none,
1618
+ run_at: trigger.start === "once" ? chunkFXUQZFAN_cjs.localInputToIso(trigger.runAt) : none,
1619
1619
  event_kind: trigger.start === "event" ? trigger.eventKind.trim() : none,
1620
1620
  // A step signal is `workflow_signal` narrowed to one signal name.
1621
1621
  event_filter: filter ?? none,
@@ -1674,7 +1674,7 @@ function workflowRecordToBuilder(record) {
1674
1674
  ...record.skill_ref ? { workflow: record.skill_ref } : { run: { kind: "prompt", promptTemplate: record.prompt } }
1675
1675
  }
1676
1676
  ] : [];
1677
- const when = chunkVZKBI2KJ_cjs.workflowWhen(record);
1677
+ const when = chunkFXUQZFAN_cjs.workflowWhen(record);
1678
1678
  return {
1679
1679
  workflow: {
1680
1680
  id: record.external_id,
@@ -1688,7 +1688,7 @@ function workflowRecordToBuilder(record) {
1688
1688
  trigger: {
1689
1689
  ...DEFAULT_WORKFLOW_TRIGGER,
1690
1690
  start: when === "now" ? "manual" : when,
1691
- runAt: chunkVZKBI2KJ_cjs.isoToLocalInput(record.run_at),
1691
+ runAt: chunkFXUQZFAN_cjs.isoToLocalInput(record.run_at),
1692
1692
  rrule: record.rrule ?? "",
1693
1693
  timezone: record.timezone || DEFAULT_WORKFLOW_TRIGGER.timezone,
1694
1694
  eventKind: record.event_kind ?? "",
@@ -1744,7 +1744,7 @@ function triggerSummary(trigger, options = {}) {
1744
1744
  case "once":
1745
1745
  return trigger.runAt ? new Date(trigger.runAt).toLocaleString() : l.starts.once;
1746
1746
  case "repeat":
1747
- return trigger.rrule ? chunkVZKBI2KJ_cjs.describeRRule(trigger.rrule) : l.starts.repeat;
1747
+ return trigger.rrule ? chunkFXUQZFAN_cjs.describeRRule(trigger.rrule) : l.starts.repeat;
1748
1748
  case "event":
1749
1749
  if (isSignalTrigger(trigger))
1750
1750
  return trigger.signal ? l.signalSummary.replace("{signal}", trigger.signal) : l.stepSignals;
@@ -1803,7 +1803,7 @@ function TriggerInspector({
1803
1803
  }
1804
1804
  )
1805
1805
  ] }),
1806
- trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkVZKBI2KJ_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1806
+ trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkFXUQZFAN_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1807
1807
  trigger.start === "event" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1808
1808
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.event }),
1809
1809
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1855,7 +1855,7 @@ function TriggerInspector({
1855
1855
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1856
1856
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.agent }),
1857
1857
  /* @__PURE__ */ jsxRuntime.jsx(
1858
- chunkVZKBI2KJ_cjs.AgentSelect,
1858
+ chunkFXUQZFAN_cjs.AgentSelect,
1859
1859
  {
1860
1860
  agents,
1861
1861
  value: trigger.agentId,
@@ -2706,7 +2706,7 @@ function WorkflowPreview({
2706
2706
  renderIcon,
2707
2707
  testId
2708
2708
  }) {
2709
- const run = chunkVZKBI2KJ_cjs.useWorkflowPreview(workflow, {
2709
+ const run = chunkFXUQZFAN_cjs.useWorkflowPreview(workflow, {
2710
2710
  resolveWorkflow: (id) => workflows.find((w) => w.id === id),
2711
2711
  compose,
2712
2712
  answer
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useConnection } from '../chunk-OYMWV45N.js';
3
- import { workflowWhen, isoToLocalInput, describeRRule, RecurrenceBuilder, AgentSelect, useWorkflowPreview, localInputToIso } from '../chunk-A35KT2II.js';
3
+ import { workflowWhen, isoToLocalInput, describeRRule, RecurrenceBuilder, AgentSelect, useWorkflowPreview, localInputToIso } from '../chunk-6Z7DLJU2.js';
4
4
  import '../chunk-P5ST47VY.js';
5
5
  import '../chunk-4XJZ6AAY.js';
6
6
  import '../chunk-P6GHJSLR.js';
@@ -12,11 +12,11 @@ import '../chunk-5LXQPP2K.js';
12
12
  import '../chunk-S7PSMMRG.js';
13
13
  import '../chunk-EVUEIBNU.js';
14
14
  import { TONE_DOT, TONES, isTone } from '../chunk-AUS3KBHJ.js';
15
- import '../chunk-TX2ZICS7.js';
16
15
  import '../chunk-NUNKSZKU.js';
17
16
  import '../chunk-YU2KUMGE.js';
18
17
  import '../chunk-N5YEF3LC.js';
19
18
  import '../chunk-4WWM3GQ5.js';
19
+ import '../chunk-TX2ZICS7.js';
20
20
  import '../chunk-HOXKR26S.js';
21
21
  import '../chunk-AA3PT6KR.js';
22
22
  import '../chunk-SLSBJRWW.js';
@@ -17,16 +17,16 @@ function readParagraphs(root) {
17
17
  const out = [];
18
18
  const body = root.children?.find((n) => n.kind === "body") ?? root;
19
19
  const visit = (node, topLevel, pending) => {
20
- for (const child of node.children ?? []) {
21
- if (child.kind === "paragraph") {
22
- out.push(readParagraph(child, topLevel, pending.splice(0)));
23
- } else if (child.localName === "bookmarkStart") {
24
- const name = attr(child, "name");
20
+ for (const child2 of node.children ?? []) {
21
+ if (child2.kind === "paragraph") {
22
+ out.push(readParagraph(child2, topLevel, pending.splice(0)));
23
+ } else if (child2.localName === "bookmarkStart") {
24
+ const name = attr(child2, "name");
25
25
  if (name) pending.push(name);
26
- } else if (child.localName === "tbl" || child.localName === "tr" || child.localName === "tc") {
27
- visit(child, false, pending);
28
- } else if (child.localName === "sdt" || child.localName === "sdtContent") {
29
- visit(child, topLevel, pending);
26
+ } else if (child2.localName === "tbl" || child2.localName === "tr" || child2.localName === "tc") {
27
+ visit(child2, false, pending);
28
+ } else if (child2.localName === "sdt" || child2.localName === "sdtContent") {
29
+ visit(child2, topLevel, pending);
30
30
  }
31
31
  }
32
32
  };
@@ -314,6 +314,168 @@ function brokenCrossReferences(port) {
314
314
  (p) => (p.marks ?? []).filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE).map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))
315
315
  );
316
316
  }
317
+ var AGENT_UNDO_MAP = "agentUndo";
318
+ var attr2 = (node, name) => node.attributes?.find((a) => a.localName === name)?.value;
319
+ var child = (node, name) => node?.children?.find((c) => c.localName === name);
320
+ var twips = (node, name) => {
321
+ const value = node && attr2(node, name);
322
+ return value === void 0 ? void 0 : Number(value);
323
+ };
324
+ var FLAT = new Set(
325
+ store.ACCEPTED_PARAGRAPH_PROPERTIES.filter((n) => n !== "numPr" && n !== "tabs")
326
+ );
327
+ function paragraphIndex(root) {
328
+ const byParaId = /* @__PURE__ */ new Map();
329
+ const parentOf = /* @__PURE__ */ new Map();
330
+ const visit = (node) => {
331
+ for (const c of node.children ?? []) {
332
+ parentOf.set(c, node);
333
+ if (c.kind === "paragraph") {
334
+ const id = attr2(c, "paraId");
335
+ if (id) byParaId.set(id, c);
336
+ }
337
+ if (c.kind !== "textValue") visit(c);
338
+ }
339
+ };
340
+ visit(root);
341
+ const body = root.children?.find((n) => n.kind === "body") ?? root;
342
+ return { byParaId, parentOf, body };
343
+ }
344
+ function paragraphState(paragraph) {
345
+ const pPr = paragraph.children?.find((c) => c.localName === "pPr");
346
+ const properties = [];
347
+ let numbering = null;
348
+ const tabs = [];
349
+ for (const p of pPr?.children ?? []) {
350
+ if (p.localName && FLAT.has(p.localName)) {
351
+ properties.push({
352
+ localName: p.localName,
353
+ attributes: Object.fromEntries((p.attributes ?? []).map((a) => [a.localName, a.value]))
354
+ });
355
+ } else if (p.localName === "numPr") {
356
+ const numId = attr2(child(p, "numId") ?? p, "val");
357
+ if (numId) numbering = { numId, level: Number(attr2(child(p, "ilvl") ?? p, "val") ?? 0) };
358
+ } else if (p.localName === "tabs") {
359
+ for (const tab of p.children ?? []) {
360
+ const val = attr2(tab, "val");
361
+ if (!val || val === "clear") continue;
362
+ tabs.push({
363
+ positionTwips: Number(attr2(tab, "pos") ?? 0),
364
+ alignment: val === "start" ? "left" : val === "end" ? "right" : val,
365
+ ...attr2(tab, "leader") ? { leader: attr2(tab, "leader") } : {}
366
+ });
367
+ }
368
+ }
369
+ }
370
+ return { paraId: attr2(paragraph, "paraId") ?? "", properties, numbering, tabs };
371
+ }
372
+ function sectionStates(root) {
373
+ const { body } = paragraphIndex(root);
374
+ const state = (sectPr, paraId) => {
375
+ const size = child(sectPr, "pgSz");
376
+ const margin = child(sectPr, "pgMar");
377
+ const orient = size && attr2(size, "orient");
378
+ return {
379
+ paraId,
380
+ pageWidthTwips: twips(size, "w"),
381
+ pageHeightTwips: twips(size, "h"),
382
+ orientation: orient === "landscape" ? "landscape" : "portrait",
383
+ marginTopTwips: twips(margin, "top"),
384
+ marginRightTwips: twips(margin, "right"),
385
+ marginBottomTwips: twips(margin, "bottom"),
386
+ marginLeftTwips: twips(margin, "left")
387
+ };
388
+ };
389
+ const out = [];
390
+ for (const block of body.children ?? []) {
391
+ const sectPr = block.kind === "paragraph" ? child(child(block, "pPr"), "sectPr") : void 0;
392
+ if (sectPr) out.push(state(sectPr, attr2(block, "paraId") ?? null));
393
+ else if (block.localName === "sectPr") out.push(state(block, null));
394
+ }
395
+ return out;
396
+ }
397
+ function tableOf(root, paraId) {
398
+ const { byParaId, parentOf } = paragraphIndex(root);
399
+ let node = byParaId.get(paraId);
400
+ while (node && node.localName !== "tbl") node = parentOf.get(node);
401
+ return node;
402
+ }
403
+ function tableState(root, paraId) {
404
+ const table = tableOf(root, paraId);
405
+ if (!table) return null;
406
+ const style = child(child(table, "tblPr"), "tblStyle");
407
+ let headerRowCount = 0;
408
+ for (const row of table.children ?? []) {
409
+ if (row.localName !== "tr") continue;
410
+ const header = child(child(row, "trPr"), "tblHeader");
411
+ if (!header || ["0", "false", "off"].includes(attr2(header, "val") ?? "")) break;
412
+ headerRowCount++;
413
+ }
414
+ return { kind: "table", paraId, styleId: (style && attr2(style, "val")) ?? null, headerRowCount };
415
+ }
416
+ function fieldNodeIds(paragraph) {
417
+ const out = [];
418
+ let depth = 0;
419
+ const walk = (node) => {
420
+ for (const c of node.children ?? []) {
421
+ if (c.localName === "del") continue;
422
+ if (c.localName === "fldChar") {
423
+ const type = attr2(c, "fldCharType");
424
+ if (type === "begin" && depth++ === 0) out.push(c.id);
425
+ else if (type === "end") depth = Math.max(0, depth - 1);
426
+ } else if (c.kind !== "textValue") walk(c);
427
+ }
428
+ };
429
+ walk(paragraph);
430
+ return out;
431
+ }
432
+ function undoOps(root, record) {
433
+ const { byParaId, body } = paragraphIndex(root);
434
+ const ops = [];
435
+ if (record.kind === "paragraphs") {
436
+ for (const state of record.paragraphs) {
437
+ const paragraph = byParaId.get(state.paraId);
438
+ if (!paragraph) return null;
439
+ ops.push(
440
+ { op: "setParagraphProperties", paragraphId: paragraph.id, properties: state.properties },
441
+ {
442
+ op: "setListNumbering",
443
+ paragraphId: paragraph.id,
444
+ numId: state.numbering?.numId ?? null,
445
+ ...state.numbering ? { level: state.numbering.level } : {}
446
+ },
447
+ { op: "setParagraphTabStops", paragraphId: paragraph.id, stops: state.tabs }
448
+ );
449
+ }
450
+ } else if (record.kind === "sections") {
451
+ const last = [...body.children ?? []].reverse().find((b) => b.kind === "paragraph");
452
+ for (const { paraId, ...setup } of record.sections) {
453
+ const anchor = paraId === null ? last : byParaId.get(paraId);
454
+ if (!anchor) return null;
455
+ const fields = Object.fromEntries(Object.entries(setup).filter(([, v]) => v !== void 0));
456
+ ops.push({ op: "setSectionProperties", anchorParagraphId: anchor.id, ...fields });
457
+ }
458
+ } else if (record.kind === "table") {
459
+ const table = tableOf(root, record.paraId);
460
+ if (!table) return null;
461
+ ops.push({
462
+ op: "setTableProperties",
463
+ tableId: table.id,
464
+ styleId: record.styleId ?? "",
465
+ headerRowCount: record.headerRowCount
466
+ });
467
+ } else {
468
+ const updates = [];
469
+ for (const { paraId, index, text } of record.fields) {
470
+ const paragraph = byParaId.get(paraId);
471
+ const fieldNodeId = paragraph && fieldNodeIds(paragraph)[index];
472
+ if (!paragraph || !fieldNodeId) return null;
473
+ updates.push({ paragraphId: paragraph.id, fieldNodeId, text });
474
+ }
475
+ ops.push({ op: "refreshFieldResults", updates });
476
+ }
477
+ return ops;
478
+ }
317
479
 
318
480
  // src/commands/index.ts
319
481
  function documentReader(view) {
@@ -335,6 +497,7 @@ function readDocument(bytes) {
335
497
  return documentReader(opened.view);
336
498
  }
337
499
 
500
+ exports.AGENT_UNDO_MAP = AGENT_UNDO_MAP;
338
501
  exports.BROKEN_CROSS_REFERENCE_STYLE = BROKEN_CROSS_REFERENCE_STYLE;
339
502
  exports.CROSS_REFERENCE_STYLE = CROSS_REFERENCE_STYLE;
340
503
  exports.DEFINED_TERM_STYLE = DEFINED_TERM_STYLE;
@@ -345,12 +508,19 @@ exports.brokenCrossReferences = brokenCrossReferences;
345
508
  exports.crossReferences = crossReferences;
346
509
  exports.documentNumbering = documentNumbering;
347
510
  exports.documentReader = documentReader;
511
+ exports.fieldNodeIds = fieldNodeIds;
348
512
  exports.filterTargets = filterTargets;
349
513
  exports.listTargets = listTargets;
514
+ exports.paragraphIndex = paragraphIndex;
350
515
  exports.paragraphNumber = paragraphNumber;
516
+ exports.paragraphState = paragraphState;
351
517
  exports.readDocument = readDocument;
352
518
  exports.readParagraphs = readParagraphs;
519
+ exports.sectionStates = sectionStates;
353
520
  exports.staleCrossReferences = staleCrossReferences;
354
521
  exports.styleNames = styleNames;
522
+ exports.tableOf = tableOf;
523
+ exports.tableState = tableState;
524
+ exports.undoOps = undoOps;
355
525
  //# sourceMappingURL=commands.cjs.map
356
526
  //# sourceMappingURL=commands.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/read.ts","../src/commands/numbering.ts","../src/commands/references.ts","../src/commands/index.ts"],"names":["buildStyleCascadeTable","withNumberingStyleLinks","buildNumberingIndex","resolveStoryListItems","resolveNumberingLevel","openHeadlessDocument"],"mappings":"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","file":"commands.cjs","sourcesContent":["/**\n * The read side of the Word-editor commands: a document's paragraphs as the commands see them\n * (text in the engine's offset vocabulary, bookmarks, internal links, fields, note references),\n * read from the engine's OOXML tree. The same tree comes from a live editor\n * (`surface.session.part().root`) or from document bytes (`openHeadlessDocument`), so the toolbar\n * and ARBI's headless tools read a document the same way.\n */\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n/** Character style of a cross-reference: a muted blue with a dotted underline (Word's name). */\nexport const CROSS_REFERENCE_STYLE = 'CrossReference'\n/** Character style of a cross-reference whose target is gone: its last text, flagged. */\nexport const BROKEN_CROSS_REFERENCE_STYLE = 'CrossReferenceBroken'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n /** Where its text starts in the paragraph's text. */\n offset?: number\n}\n\n/** A footnote or endnote reference: one character of the paragraph, as the engine counts it. */\nexport interface DocNote {\n offset: number\n kind: 'footnote' | 'endnote'\n /** `w:id` of the note. */\n id: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n /** `w14:paraId`, the id that is the same in every replica of a collaboration room. */\n paraId?: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n /** Its complex fields: where each sits (its one-character offset), its instruction and result. */\n fields?: DocField[]\n /** Its runs in a watched character style (a broken cross-reference's mark), with their text. */\n marks?: DocMark[]\n /** Its footnote and endnote references. */\n notes?: DocNote[]\n}\n\n/** A stretch of a paragraph's text in a watched character style. */\nexport interface DocMark {\n styleId: string\n offset: number\n text: string\n}\n\n/** Character styles whose runs a paragraph read reports as marks. */\nexport const WATCHED_STYLES = new Set([BROKEN_CROSS_REFERENCE_STYLE])\n\n/** A complex field of a paragraph. */\nexport interface DocField {\n offset: number\n instruction: string\n result: string\n}\n\nexport type OoxmlNodeLike = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly OoxmlNodeLike[]\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** How a field (or a note reference) counts in a paragraph's text (the engine's model vocabulary). */\nexport const FIELD_ATOM = '\\uFFFC'\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: OoxmlNodeLike): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: OoxmlNodeLike, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: OoxmlNodeLike, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n // A field reads as ONE character (U+FFFC), as the engine counts offsets: its instruction and\n // its cached result are not text of the paragraph.\n let fieldDepth = 0\n const marks: DocMark[] = []\n /** The watched style of the run being walked, if any. */\n let runStyle: string | undefined\n const fields: DocField[] = []\n const notes: DocNote[] = []\n let current: (DocField & { inResult: boolean }) | null = null\n const field = (c: OoxmlNodeLike) => {\n const type = attr(c, 'fldCharType')\n if (type === 'begin') {\n if (fieldDepth === 0) {\n current = { offset: text.length, instruction: '', result: '', inResult: false }\n text += FIELD_ATOM\n }\n fieldDepth++\n } else if (type === 'separate' && fieldDepth === 1 && current) current.inResult = true\n else if (type === 'end') {\n fieldDepth = Math.max(0, fieldDepth - 1)\n if (fieldDepth === 0 && current) {\n const { offset, instruction, result } = current\n fields.push({ offset, instruction: instruction.trim(), result })\n current = null\n }\n }\n }\n const walk = (n: OoxmlNodeLike, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.localName === 'fldChar') {\n field(c)\n continue\n }\n if (c.localName === 'fldSimple') {\n if (fieldDepth === 0) text += FIELD_ATOM\n continue\n }\n if (c.localName === 'instrText') {\n if (fieldDepth === 1 && current)\n (current as DocField).instruction += (c.children ?? []).map((t) => t.value ?? '').join('')\n continue\n }\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'delText' || c.localName === 'del' || c.localName === 'rPr') continue\n if (c.localName === 'r') {\n const rStyle = c.children\n ?.find((x) => x.localName === 'rPr')\n ?.children?.find((x) => x.localName === 'rStyle')\n const watched = rStyle && attr(rStyle, 'val')\n runStyle = watched && WATCHED_STYLES.has(watched) ? watched : undefined\n walk(c, link)\n runStyle = undefined\n continue\n }\n if (\n (c.localName === 'footnoteReference' || c.localName === 'endnoteReference') &&\n fieldDepth === 0\n ) {\n notes.push({\n offset: text.length,\n kind: c.localName === 'footnoteReference' ? 'footnote' : 'endnote',\n id: attr(c, 'id') ?? '',\n })\n text += FIELD_ATOM\n continue\n }\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '', offset: text.length } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n if (fieldDepth > 0) {\n const open = current as (DocField & { inResult: boolean }) | null\n if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? ''\n continue\n }\n if (runStyle && c.value) {\n const last = marks[marks.length - 1]\n if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)\n last.text += c.value\n else marks.push({ styleId: runStyle, offset: text.length, text: c.value })\n }\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab' && fieldDepth === 0) text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n const paraId = attr(node, 'paraId')\n return {\n id: node.id,\n ...(paraId ? { paraId } : {}),\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n ...(fields.length ? { fields } : {}),\n ...(marks.length ? { marks } : {}),\n ...(notes.length ? { notes } : {}),\n }\n}\n\n/** Style id to style name (`Heading1` → `heading 1`), from a styles part's tree. */\nexport function styleNames(root: OoxmlNodeLike | null | undefined): Map<string, string> {\n const names = new Map<string, string>()\n for (const style of root?.children ?? []) {\n if (style.localName !== 'style') continue\n const id = attr(style, 'styleId')\n const name = style.children?.find((c) => c.localName === 'name')\n if (id) names.set(id, (name && attr(name, 'val')) || id)\n }\n return names\n}\n","/**\n * Cross-reference targets: the document's numbered paragraphs (clauses, sub-clauses, numbered\n * captions) and its headings, with the number Word's `REF \\r` shows for each.\n *\n * The number is what the editor computes for a `REF … \\r` field — and it has to be exactly that,\n * because the engine shows a field's live value only while the field's cached result matches what\n * it computes (otherwise it keeps the cached text for good). So this mirrors the engine: the\n * paragraph's own list level, preceded by each higher level whose number its level text does not\n * already show (`%1.%2` already shows level 1; `(%3)` does not show `2.1`), and one trailing\n * period dropped (`2.` reads `2`).\n */\n\nimport type { DocParagraph, OoxmlNodeLike } from './read'\nimport {\n buildNumberingIndex,\n buildStyleCascadeTable,\n resolveNumberingLevel,\n resolveStoryListItems,\n withNumberingStyleLinks,\n} from '@docx-editor.dev/core/layout'\n\n/** A paragraph's resolved list numbering (the engine's list item). */\nexport interface ListItemInfo {\n numId: string\n ilvl: number\n markerText: string\n numFmt: string\n}\n\n/** A list level's definition: its level text (`%1.%2`) and number format. */\nexport interface LevelInfo {\n lvlText: string\n numFmt: string\n}\n\nexport type LevelOf = (numId: string, ilvl: number) => LevelInfo | null\n\nconst numbers = (level: { numFmt: string; lvlText?: string; markerText?: string } | null) =>\n !!level &&\n level.numFmt !== 'bullet' &&\n level.numFmt !== 'none' &&\n (level.lvlText ?? level.markerText ?? '').length > 0\n\n/**\n * The number `REF \\r` shows for a paragraph, or null when it is not numbered. `order` is every\n * paragraph id in document order (for the markers of the levels above it).\n */\nexport function paragraphNumber(\n order: readonly string[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf,\n paragraphId: string\n): string | null {\n const item = items.get(paragraphId)\n if (!item || !numbers(item)) return null\n const at = order.indexOf(paragraphId)\n /** The marker the nearest paragraph at `ilvl` of this list had, up to the target. */\n const markerAt = (ilvl: number): string | null => {\n if (ilvl === item.ilvl) return item.markerText\n for (let i = at - 1; i >= 0; i--) {\n const other = items.get(order[i])\n if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText\n }\n return null\n }\n const chain: number[] = []\n const texts: string[] = []\n for (let u = item.ilvl; u >= 0; u--) {\n const level = levelOf(item.numId, u)\n if (!level || !numbers(level)) continue\n if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue\n chain.push(u)\n texts.push(level.lvlText)\n }\n const value = chain\n .reverse()\n .map((u) => markerAt(u) ?? '')\n .join('')\n if (!value) return null\n return value.length > 1 && value.endsWith('.') ? value.slice(0, -1) : value\n}\n\n/** One place a cross-reference can point at. */\nexport interface CrossReferenceTarget {\n paragraphId: string\n /** A numbered paragraph (clause, sub-clause, caption) or an unnumbered heading. */\n kind: 'numbered' | 'heading'\n /** What `REF \\r` shows (`8.2`), or null for an unnumbered heading. */\n number: string | null\n /** The paragraph's list marker as painted (`8.2`, `(a)`), or empty. */\n marker: string\n /** The paragraph's text (without its marker). */\n text: string\n heading: boolean\n /** Its list level (0 for a top-level clause), or 0 for a heading. */\n level: number\n}\n\n/** Every numbered paragraph and every heading, in document order. */\nexport function listTargets(\n paragraphs: readonly DocParagraph[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf\n): CrossReferenceTarget[] {\n const order = paragraphs.map((p) => p.id)\n const out: CrossReferenceTarget[] = []\n for (const p of paragraphs) {\n const text = p.text.replace(//g, '').trim()\n if (!text) continue\n const number = paragraphNumber(order, items, levelOf, p.id)\n const item = items.get(p.id)\n if (number !== null)\n out.push({\n paragraphId: p.id,\n kind: 'numbered',\n number,\n marker: item?.markerText ?? '',\n text,\n heading: p.heading,\n level: item?.ilvl ?? 0,\n })\n else if (p.heading)\n out.push({\n paragraphId: p.id,\n kind: 'heading',\n number: null,\n marker: '',\n text,\n heading: true,\n level: 0,\n })\n }\n return out\n}\n\n/** Targets whose number or text contains the query (case-insensitive). */\nexport function filterTargets(\n targets: readonly CrossReferenceTarget[],\n query: string\n): CrossReferenceTarget[] {\n const q = query.trim().toLowerCase()\n if (!q) return [...targets]\n return targets.filter(\n (t) => (t.number ?? '').toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)\n )\n}\n\n/** What the engine's numbering needs of a document: its parts' trees. */\nexport interface NumberingSource {\n /** The main document part's root. */\n root(): OoxmlNodeLike\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A document's list numbering as the engine resolves it. */\nexport interface DocumentNumbering {\n /** Each numbered paragraph's list item, by paragraph (node) id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/**\n * The numbering of a document, as the editor paints it: from a live editor's session or from a\n * headless document view alike.\n */\nexport function documentNumbering(source: NumberingSource): DocumentNumbering {\n type Index = ReturnType<typeof buildNumberingIndex>\n type Cascade = ReturnType<typeof buildStyleCascadeTable>\n let numbering: Index | undefined\n let cascade: Cascade | undefined\n const index = () => {\n if (!numbering) {\n cascade = buildStyleCascadeTable(\n source.stylesRoot() as Parameters<typeof buildStyleCascadeTable>[0],\n undefined,\n source.settingsRoot() as Parameters<typeof buildStyleCascadeTable>[2]\n )\n numbering = withNumberingStyleLinks(\n buildNumberingIndex(source.numberingRoot() as Parameters<typeof buildNumberingIndex>[0]),\n cascade\n )\n }\n return numbering\n }\n return {\n listItems: () => {\n const body = source.root().children?.find((n) => n.kind === 'body')\n const items = resolveStoryListItems(\n (body?.children ?? []) as unknown as Parameters<typeof resolveStoryListItems>[0],\n index(),\n cascade\n )\n const out = new Map<string, ListItemInfo>()\n for (const [id, item] of items)\n out.set(id, {\n numId: item.numId,\n ilvl: item.ilvl,\n markerText: item.markerText,\n numFmt: item.numFmt,\n })\n return out\n },\n levelOf: (numId, ilvl) => {\n const level = resolveNumberingLevel(index(), numId, ilvl)?.level\n return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null\n },\n }\n}\n","/**\n * The cross-references of a document (`REF` fields to `_Ref` bookmarks), each with what it shows\n * and what its target now is: current, stale (a clause renumbered, a heading reworded) or broken\n * (the target is gone).\n */\n\nimport { BROKEN_CROSS_REFERENCE_STYLE, type DocParagraph } from './read'\nimport { paragraphNumber, type LevelOf, type ListItemInfo } from './numbering'\n\n/** Prefix of Word's hidden cross-reference bookmarks. */\nexport const REF_BOOKMARK_PREFIX = '_Ref'\n\nexport type CrossReferenceMode = 'number' | 'text'\n\nconst REF_FIELD = /^REF\\s+(\\S+)((?:\\s+\\\\[A-Za-z*]+(?:\\s+MERGEFORMAT)?)*)\\s*$/i\n\n/** What reading cross-references needs of a document. */\nexport interface ReferencesReader {\n paragraphs(): DocParagraph[]\n /** Each numbered paragraph's list item, by paragraph id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/** One `REF` field to a `_Ref` bookmark. */\nexport interface CrossReference {\n paragraphId: string\n offset: number\n instruction: string\n bookmark: string\n mode: CrossReferenceMode\n /** The field's cached result (what it shows). */\n cached: string\n /** The paragraph the bookmark is in, or null when it is gone (the reference is broken). */\n target: string | null\n /** What the reference should show now, or null when that cannot be computed. */\n value: string | null\n}\n\n/** A `REF` field whose cached result no longer says what its target now is. */\nexport interface StaleReference {\n paragraphId: string\n offset: number\n instruction: string\n /** The current value, or null when the target is gone (the reference is broken). */\n value: string | null\n /** The field's cached result (what it last showed). */\n cached: string\n bookmark: string\n mode: CrossReferenceMode\n}\n\n/** A cross-reference whose target was deleted: its last text, marked in the Broken style. */\nexport interface BrokenReference {\n paragraphId: string\n offset: number\n text: string\n}\n\n/** Every cross-reference of the document, in document order. */\nexport function crossReferences(port: ReferencesReader): CrossReference[] {\n const paragraphs = port.paragraphs()\n if (!paragraphs.some((p) => p.fields?.length)) return []\n const items = port.listItems()\n const order = paragraphs.map((p) => p.id)\n const owner = new Map<string, string>()\n for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id)\n const out: CrossReference[] = []\n for (const p of paragraphs)\n for (const field of p.fields ?? []) {\n const match = REF_FIELD.exec(field.instruction)\n if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue\n const switches = match[2].toLowerCase()\n const mode: CrossReferenceMode = /\\\\[rwn]\\b/.test(switches) ? 'number' : 'text'\n const target = owner.get(match[1]) ?? null\n const value = !target\n ? null\n : mode === 'number'\n ? switches.includes('\\\\r')\n ? paragraphNumber(order, items, port.levelOf, target)\n : null\n : (paragraphs.find((x) => x.id === target)?.text ?? '').replace(//g, '').trim()\n out.push({\n paragraphId: p.id,\n offset: field.offset,\n instruction: field.instruction,\n bookmark: match[1],\n mode,\n cached: field.result,\n target,\n value,\n })\n }\n return out\n}\n\n/**\n * The cross-references whose cached result is out of date: a clause renumbered, a heading\n * reworded, or the target gone. The editor paints a field's live value only while its cached\n * result matches what it computes, so a stale cache shows the OLD number after the document is\n * reopened (and Word shows the cached result until its fields are updated).\n */\nexport function staleCrossReferences(port: ReferencesReader): StaleReference[] {\n return crossReferences(port)\n .filter((ref) => !ref.target || (ref.value && ref.value !== ref.cached.trim()))\n .map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({\n paragraphId,\n offset,\n instruction,\n value,\n cached,\n bookmark,\n mode,\n }))\n}\n\n/** The broken cross-references marked in the document, in document order. */\nexport function brokenCrossReferences(\n port: Pick<ReferencesReader, 'paragraphs'>\n): BrokenReference[] {\n return port\n .paragraphs()\n .flatMap((p) =>\n (p.marks ?? [])\n .filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE)\n .map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))\n )\n}\n","/**\n * Word-editor commands shared by the editor's toolbar and ARBI's headless tools in the\n * collaboration service. Pure functions over the engine's OOXML tree, so they run on a live\n * editor's session and on a headless document view alike.\n */\nimport { openHeadlessDocument } from '@docx-editor.dev/core/store'\nimport { readParagraphs, styleNames, type DocParagraph, type OoxmlNodeLike } from './read'\nimport { documentNumbering, type DocumentNumbering } from './numbering'\nimport type { ReferencesReader } from './references'\n\nexport * from './read'\nexport * from './numbering'\nexport * from './references'\n\n/** A document's parts as trees: a live editor's session or a headless view (`openHeadlessDocument`). */\nexport interface DocumentTrees {\n part(): { root: unknown }\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A read-only snapshot of a document: its paragraphs, numbering and style names. */\nexport interface DocumentReader extends ReferencesReader, DocumentNumbering {\n /** A style's name (`heading 1`) by its id, or the id when the document does not name it. */\n styleName(styleId: string): string\n}\n\n/** Read a document whose trees do not change while the reader is used (a headless view). */\nexport function documentReader(view: DocumentTrees): DocumentReader {\n const root = () => view.part().root as OoxmlNodeLike\n let paragraphs: DocParagraph[] | undefined\n let items: ReturnType<DocumentNumbering['listItems']> | undefined\n let names: Map<string, string> | undefined\n const numbering = documentNumbering({ ...view, root })\n return {\n paragraphs: () => (paragraphs ??= readParagraphs(root())),\n listItems: () => (items ??= numbering.listItems()),\n levelOf: numbering.levelOf,\n styleName: (id) =>\n (names ??= styleNames(view.stylesRoot() as OoxmlNodeLike | null)).get(id) ?? id,\n }\n}\n\n/** Read a document from its bytes (a collaboration room's `readRoom`). Throws on a bad package. */\nexport function readDocument(bytes: Uint8Array): DocumentReader {\n const opened = openHeadlessDocument(bytes)\n if (!opened.ok) throw new Error(`The document cannot be read (${opened.reason}).`)\n return documentReader(opened.view)\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/read.ts","../src/commands/numbering.ts","../src/commands/references.ts","../src/commands/undo.ts","../src/commands/index.ts"],"names":["child","buildStyleCascadeTable","withNumberingStyleLinks","buildNumberingIndex","resolveStoryListItems","resolveNumberingLevel","attr","ACCEPTED_PARAGRAPH_PROPERTIES","openHeadlessDocument"],"mappings":"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","file":"commands.cjs","sourcesContent":["/**\n * The read side of the Word-editor commands: a document's paragraphs as the commands see them\n * (text in the engine's offset vocabulary, bookmarks, internal links, fields, note references),\n * read from the engine's OOXML tree. The same tree comes from a live editor\n * (`surface.session.part().root`) or from document bytes (`openHeadlessDocument`), so the toolbar\n * and ARBI's headless tools read a document the same way.\n */\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n/** Character style of a cross-reference: a muted blue with a dotted underline (Word's name). */\nexport const CROSS_REFERENCE_STYLE = 'CrossReference'\n/** Character style of a cross-reference whose target is gone: its last text, flagged. */\nexport const BROKEN_CROSS_REFERENCE_STYLE = 'CrossReferenceBroken'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n /** Where its text starts in the paragraph's text. */\n offset?: number\n}\n\n/** A footnote or endnote reference: one character of the paragraph, as the engine counts it. */\nexport interface DocNote {\n offset: number\n kind: 'footnote' | 'endnote'\n /** `w:id` of the note. */\n id: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n /** `w14:paraId`, the id that is the same in every replica of a collaboration room. */\n paraId?: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n /** Its complex fields: where each sits (its one-character offset), its instruction and result. */\n fields?: DocField[]\n /** Its runs in a watched character style (a broken cross-reference's mark), with their text. */\n marks?: DocMark[]\n /** Its footnote and endnote references. */\n notes?: DocNote[]\n}\n\n/** A stretch of a paragraph's text in a watched character style. */\nexport interface DocMark {\n styleId: string\n offset: number\n text: string\n}\n\n/** Character styles whose runs a paragraph read reports as marks. */\nexport const WATCHED_STYLES = new Set([BROKEN_CROSS_REFERENCE_STYLE])\n\n/** A complex field of a paragraph. */\nexport interface DocField {\n offset: number\n instruction: string\n result: string\n}\n\nexport type OoxmlNodeLike = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly OoxmlNodeLike[]\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** How a field (or a note reference) counts in a paragraph's text (the engine's model vocabulary). */\nexport const FIELD_ATOM = '\\uFFFC'\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: OoxmlNodeLike): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: OoxmlNodeLike, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: OoxmlNodeLike, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n // A field reads as ONE character (U+FFFC), as the engine counts offsets: its instruction and\n // its cached result are not text of the paragraph.\n let fieldDepth = 0\n const marks: DocMark[] = []\n /** The watched style of the run being walked, if any. */\n let runStyle: string | undefined\n const fields: DocField[] = []\n const notes: DocNote[] = []\n let current: (DocField & { inResult: boolean }) | null = null\n const field = (c: OoxmlNodeLike) => {\n const type = attr(c, 'fldCharType')\n if (type === 'begin') {\n if (fieldDepth === 0) {\n current = { offset: text.length, instruction: '', result: '', inResult: false }\n text += FIELD_ATOM\n }\n fieldDepth++\n } else if (type === 'separate' && fieldDepth === 1 && current) current.inResult = true\n else if (type === 'end') {\n fieldDepth = Math.max(0, fieldDepth - 1)\n if (fieldDepth === 0 && current) {\n const { offset, instruction, result } = current\n fields.push({ offset, instruction: instruction.trim(), result })\n current = null\n }\n }\n }\n const walk = (n: OoxmlNodeLike, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.localName === 'fldChar') {\n field(c)\n continue\n }\n if (c.localName === 'fldSimple') {\n if (fieldDepth === 0) text += FIELD_ATOM\n continue\n }\n if (c.localName === 'instrText') {\n if (fieldDepth === 1 && current)\n (current as DocField).instruction += (c.children ?? []).map((t) => t.value ?? '').join('')\n continue\n }\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'delText' || c.localName === 'del' || c.localName === 'rPr') continue\n if (c.localName === 'r') {\n const rStyle = c.children\n ?.find((x) => x.localName === 'rPr')\n ?.children?.find((x) => x.localName === 'rStyle')\n const watched = rStyle && attr(rStyle, 'val')\n runStyle = watched && WATCHED_STYLES.has(watched) ? watched : undefined\n walk(c, link)\n runStyle = undefined\n continue\n }\n if (\n (c.localName === 'footnoteReference' || c.localName === 'endnoteReference') &&\n fieldDepth === 0\n ) {\n notes.push({\n offset: text.length,\n kind: c.localName === 'footnoteReference' ? 'footnote' : 'endnote',\n id: attr(c, 'id') ?? '',\n })\n text += FIELD_ATOM\n continue\n }\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '', offset: text.length } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n if (fieldDepth > 0) {\n const open = current as (DocField & { inResult: boolean }) | null\n if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? ''\n continue\n }\n if (runStyle && c.value) {\n const last = marks[marks.length - 1]\n if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)\n last.text += c.value\n else marks.push({ styleId: runStyle, offset: text.length, text: c.value })\n }\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab' && fieldDepth === 0) text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n const paraId = attr(node, 'paraId')\n return {\n id: node.id,\n ...(paraId ? { paraId } : {}),\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n ...(fields.length ? { fields } : {}),\n ...(marks.length ? { marks } : {}),\n ...(notes.length ? { notes } : {}),\n }\n}\n\n/** Style id to style name (`Heading1` → `heading 1`), from a styles part's tree. */\nexport function styleNames(root: OoxmlNodeLike | null | undefined): Map<string, string> {\n const names = new Map<string, string>()\n for (const style of root?.children ?? []) {\n if (style.localName !== 'style') continue\n const id = attr(style, 'styleId')\n const name = style.children?.find((c) => c.localName === 'name')\n if (id) names.set(id, (name && attr(name, 'val')) || id)\n }\n return names\n}\n","/**\n * Cross-reference targets: the document's numbered paragraphs (clauses, sub-clauses, numbered\n * captions) and its headings, with the number Word's `REF \\r` shows for each.\n *\n * The number is what the editor computes for a `REF … \\r` field — and it has to be exactly that,\n * because the engine shows a field's live value only while the field's cached result matches what\n * it computes (otherwise it keeps the cached text for good). So this mirrors the engine: the\n * paragraph's own list level, preceded by each higher level whose number its level text does not\n * already show (`%1.%2` already shows level 1; `(%3)` does not show `2.1`), and one trailing\n * period dropped (`2.` reads `2`).\n */\n\nimport type { DocParagraph, OoxmlNodeLike } from './read'\nimport {\n buildNumberingIndex,\n buildStyleCascadeTable,\n resolveNumberingLevel,\n resolveStoryListItems,\n withNumberingStyleLinks,\n} from '@docx-editor.dev/core/layout'\n\n/** A paragraph's resolved list numbering (the engine's list item). */\nexport interface ListItemInfo {\n numId: string\n ilvl: number\n markerText: string\n numFmt: string\n}\n\n/** A list level's definition: its level text (`%1.%2`) and number format. */\nexport interface LevelInfo {\n lvlText: string\n numFmt: string\n}\n\nexport type LevelOf = (numId: string, ilvl: number) => LevelInfo | null\n\nconst numbers = (level: { numFmt: string; lvlText?: string; markerText?: string } | null) =>\n !!level &&\n level.numFmt !== 'bullet' &&\n level.numFmt !== 'none' &&\n (level.lvlText ?? level.markerText ?? '').length > 0\n\n/**\n * The number `REF \\r` shows for a paragraph, or null when it is not numbered. `order` is every\n * paragraph id in document order (for the markers of the levels above it).\n */\nexport function paragraphNumber(\n order: readonly string[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf,\n paragraphId: string\n): string | null {\n const item = items.get(paragraphId)\n if (!item || !numbers(item)) return null\n const at = order.indexOf(paragraphId)\n /** The marker the nearest paragraph at `ilvl` of this list had, up to the target. */\n const markerAt = (ilvl: number): string | null => {\n if (ilvl === item.ilvl) return item.markerText\n for (let i = at - 1; i >= 0; i--) {\n const other = items.get(order[i])\n if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText\n }\n return null\n }\n const chain: number[] = []\n const texts: string[] = []\n for (let u = item.ilvl; u >= 0; u--) {\n const level = levelOf(item.numId, u)\n if (!level || !numbers(level)) continue\n if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue\n chain.push(u)\n texts.push(level.lvlText)\n }\n const value = chain\n .reverse()\n .map((u) => markerAt(u) ?? '')\n .join('')\n if (!value) return null\n return value.length > 1 && value.endsWith('.') ? value.slice(0, -1) : value\n}\n\n/** One place a cross-reference can point at. */\nexport interface CrossReferenceTarget {\n paragraphId: string\n /** A numbered paragraph (clause, sub-clause, caption) or an unnumbered heading. */\n kind: 'numbered' | 'heading'\n /** What `REF \\r` shows (`8.2`), or null for an unnumbered heading. */\n number: string | null\n /** The paragraph's list marker as painted (`8.2`, `(a)`), or empty. */\n marker: string\n /** The paragraph's text (without its marker). */\n text: string\n heading: boolean\n /** Its list level (0 for a top-level clause), or 0 for a heading. */\n level: number\n}\n\n/** Every numbered paragraph and every heading, in document order. */\nexport function listTargets(\n paragraphs: readonly DocParagraph[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf\n): CrossReferenceTarget[] {\n const order = paragraphs.map((p) => p.id)\n const out: CrossReferenceTarget[] = []\n for (const p of paragraphs) {\n const text = p.text.replace(//g, '').trim()\n if (!text) continue\n const number = paragraphNumber(order, items, levelOf, p.id)\n const item = items.get(p.id)\n if (number !== null)\n out.push({\n paragraphId: p.id,\n kind: 'numbered',\n number,\n marker: item?.markerText ?? '',\n text,\n heading: p.heading,\n level: item?.ilvl ?? 0,\n })\n else if (p.heading)\n out.push({\n paragraphId: p.id,\n kind: 'heading',\n number: null,\n marker: '',\n text,\n heading: true,\n level: 0,\n })\n }\n return out\n}\n\n/** Targets whose number or text contains the query (case-insensitive). */\nexport function filterTargets(\n targets: readonly CrossReferenceTarget[],\n query: string\n): CrossReferenceTarget[] {\n const q = query.trim().toLowerCase()\n if (!q) return [...targets]\n return targets.filter(\n (t) => (t.number ?? '').toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)\n )\n}\n\n/** What the engine's numbering needs of a document: its parts' trees. */\nexport interface NumberingSource {\n /** The main document part's root. */\n root(): OoxmlNodeLike\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A document's list numbering as the engine resolves it. */\nexport interface DocumentNumbering {\n /** Each numbered paragraph's list item, by paragraph (node) id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/**\n * The numbering of a document, as the editor paints it: from a live editor's session or from a\n * headless document view alike.\n */\nexport function documentNumbering(source: NumberingSource): DocumentNumbering {\n type Index = ReturnType<typeof buildNumberingIndex>\n type Cascade = ReturnType<typeof buildStyleCascadeTable>\n let numbering: Index | undefined\n let cascade: Cascade | undefined\n const index = () => {\n if (!numbering) {\n cascade = buildStyleCascadeTable(\n source.stylesRoot() as Parameters<typeof buildStyleCascadeTable>[0],\n undefined,\n source.settingsRoot() as Parameters<typeof buildStyleCascadeTable>[2]\n )\n numbering = withNumberingStyleLinks(\n buildNumberingIndex(source.numberingRoot() as Parameters<typeof buildNumberingIndex>[0]),\n cascade\n )\n }\n return numbering\n }\n return {\n listItems: () => {\n const body = source.root().children?.find((n) => n.kind === 'body')\n const items = resolveStoryListItems(\n (body?.children ?? []) as unknown as Parameters<typeof resolveStoryListItems>[0],\n index(),\n cascade\n )\n const out = new Map<string, ListItemInfo>()\n for (const [id, item] of items)\n out.set(id, {\n numId: item.numId,\n ilvl: item.ilvl,\n markerText: item.markerText,\n numFmt: item.numFmt,\n })\n return out\n },\n levelOf: (numId, ilvl) => {\n const level = resolveNumberingLevel(index(), numId, ilvl)?.level\n return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null\n },\n }\n}\n","/**\n * The cross-references of a document (`REF` fields to `_Ref` bookmarks), each with what it shows\n * and what its target now is: current, stale (a clause renumbered, a heading reworded) or broken\n * (the target is gone).\n */\n\nimport { BROKEN_CROSS_REFERENCE_STYLE, type DocParagraph } from './read'\nimport { paragraphNumber, type LevelOf, type ListItemInfo } from './numbering'\n\n/** Prefix of Word's hidden cross-reference bookmarks. */\nexport const REF_BOOKMARK_PREFIX = '_Ref'\n\nexport type CrossReferenceMode = 'number' | 'text'\n\nconst REF_FIELD = /^REF\\s+(\\S+)((?:\\s+\\\\[A-Za-z*]+(?:\\s+MERGEFORMAT)?)*)\\s*$/i\n\n/** What reading cross-references needs of a document. */\nexport interface ReferencesReader {\n paragraphs(): DocParagraph[]\n /** Each numbered paragraph's list item, by paragraph id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/** One `REF` field to a `_Ref` bookmark. */\nexport interface CrossReference {\n paragraphId: string\n offset: number\n instruction: string\n bookmark: string\n mode: CrossReferenceMode\n /** The field's cached result (what it shows). */\n cached: string\n /** The paragraph the bookmark is in, or null when it is gone (the reference is broken). */\n target: string | null\n /** What the reference should show now, or null when that cannot be computed. */\n value: string | null\n}\n\n/** A `REF` field whose cached result no longer says what its target now is. */\nexport interface StaleReference {\n paragraphId: string\n offset: number\n instruction: string\n /** The current value, or null when the target is gone (the reference is broken). */\n value: string | null\n /** The field's cached result (what it last showed). */\n cached: string\n bookmark: string\n mode: CrossReferenceMode\n}\n\n/** A cross-reference whose target was deleted: its last text, marked in the Broken style. */\nexport interface BrokenReference {\n paragraphId: string\n offset: number\n text: string\n}\n\n/** Every cross-reference of the document, in document order. */\nexport function crossReferences(port: ReferencesReader): CrossReference[] {\n const paragraphs = port.paragraphs()\n if (!paragraphs.some((p) => p.fields?.length)) return []\n const items = port.listItems()\n const order = paragraphs.map((p) => p.id)\n const owner = new Map<string, string>()\n for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id)\n const out: CrossReference[] = []\n for (const p of paragraphs)\n for (const field of p.fields ?? []) {\n const match = REF_FIELD.exec(field.instruction)\n if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue\n const switches = match[2].toLowerCase()\n const mode: CrossReferenceMode = /\\\\[rwn]\\b/.test(switches) ? 'number' : 'text'\n const target = owner.get(match[1]) ?? null\n const value = !target\n ? null\n : mode === 'number'\n ? switches.includes('\\\\r')\n ? paragraphNumber(order, items, port.levelOf, target)\n : null\n : (paragraphs.find((x) => x.id === target)?.text ?? '').replace(//g, '').trim()\n out.push({\n paragraphId: p.id,\n offset: field.offset,\n instruction: field.instruction,\n bookmark: match[1],\n mode,\n cached: field.result,\n target,\n value,\n })\n }\n return out\n}\n\n/**\n * The cross-references whose cached result is out of date: a clause renumbered, a heading\n * reworded, or the target gone. The editor paints a field's live value only while its cached\n * result matches what it computes, so a stale cache shows the OLD number after the document is\n * reopened (and Word shows the cached result until its fields are updated).\n */\nexport function staleCrossReferences(port: ReferencesReader): StaleReference[] {\n return crossReferences(port)\n .filter((ref) => !ref.target || (ref.value && ref.value !== ref.cached.trim()))\n .map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({\n paragraphId,\n offset,\n instruction,\n value,\n cached,\n bookmark,\n mode,\n }))\n}\n\n/** The broken cross-references marked in the document, in document order. */\nexport function brokenCrossReferences(\n port: Pick<ReferencesReader, 'paragraphs'>\n): BrokenReference[] {\n return port\n .paragraphs()\n .flatMap((p) =>\n (p.marks ?? [])\n .filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE)\n .map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))\n )\n}\n","/**\n * Undo for the changes ARBI applies directly (they cannot be tracked): a paragraph style or format,\n * a table's properties, the page setup, refreshed field results. Before the change, the state it\n * replaces is captured as a small JSON record, kept in the room (the `agentUndo` map of the room's\n * Y.Doc, keyed by the id of the comment that announces the change) so it survives a reload. Undo\n * turns the record back into store ops, addressed by `w14:paraId` so they resolve on any replica:\n * the collaboration service and a browser alike.\n */\nimport {\n ACCEPTED_PARAGRAPH_PROPERTIES,\n type OoxmlProperty,\n type TabStopWrite,\n type TreeDocOp,\n} from '@docx-editor.dev/core/store'\nimport type { OoxmlNodeLike } from './read'\n\n/** The room's Y.Map of undo records, by comment id. */\nexport const AGENT_UNDO_MAP = 'agentUndo'\n\n/** A paragraph's own properties as they were. */\nexport interface ParagraphState {\n paraId: string\n /** The flat accepted properties (`pStyle`, `jc`, `spacing`, `ind`…). */\n properties: OoxmlProperty[]\n numbering: { numId: string; level: number } | null\n tabs: TabStopWrite[]\n}\n\n/** One section's page setup as it was; `paraId` is the paragraph whose mark ends it (null: the last). */\nexport interface SectionState {\n paraId: string | null\n pageWidthTwips?: number\n pageHeightTwips?: number\n orientation?: 'portrait' | 'landscape'\n marginTopTwips?: number\n marginRightTwips?: number\n marginBottomTwips?: number\n marginLeftTwips?: number\n}\n\nexport type UndoRecord =\n | { kind: 'paragraphs'; paragraphs: ParagraphState[] }\n | { kind: 'sections'; sections: SectionState[] }\n /** A table, found by a paragraph in it. */\n | { kind: 'table'; paraId: string; styleId: string | null; headerRowCount: number }\n /** Field results as they were: the `index`-th field of the paragraph. */\n | { kind: 'fields'; fields: { paraId: string; index: number; text: string }[] }\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\nconst child = (node: OoxmlNodeLike | undefined, name: string) =>\n node?.children?.find((c) => c.localName === name)\nconst twips = (node: OoxmlNodeLike | undefined, name: string) => {\n const value = node && attr(node, name)\n return value === undefined ? undefined : Number(value)\n}\nconst FLAT = new Set<string>(\n ACCEPTED_PARAGRAPH_PROPERTIES.filter((n) => n !== 'numPr' && n !== 'tabs')\n)\n\n/** Every paragraph of a part, by `w14:paraId`, and the body's own paragraphs in order. */\nexport function paragraphIndex(root: OoxmlNodeLike) {\n const byParaId = new Map<string, OoxmlNodeLike>()\n const parentOf = new Map<OoxmlNodeLike, OoxmlNodeLike>()\n const visit = (node: OoxmlNodeLike) => {\n for (const c of node.children ?? []) {\n parentOf.set(c, node)\n if (c.kind === 'paragraph') {\n const id = attr(c, 'paraId')\n if (id) byParaId.set(id, c)\n }\n if (c.kind !== 'textValue') visit(c)\n }\n }\n visit(root)\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n return { byParaId, parentOf, body }\n}\n\n/** A paragraph's own properties, to restore later. */\nexport function paragraphState(paragraph: OoxmlNodeLike): ParagraphState {\n const pPr = paragraph.children?.find((c) => c.localName === 'pPr')\n const properties: OoxmlProperty[] = []\n let numbering: ParagraphState['numbering'] = null\n const tabs: TabStopWrite[] = []\n for (const p of pPr?.children ?? []) {\n if (p.localName && FLAT.has(p.localName)) {\n properties.push({\n localName: p.localName,\n attributes: Object.fromEntries((p.attributes ?? []).map((a) => [a.localName, a.value])),\n })\n } else if (p.localName === 'numPr') {\n const numId = attr(child(p, 'numId') ?? p, 'val')\n if (numId) numbering = { numId, level: Number(attr(child(p, 'ilvl') ?? p, 'val') ?? 0) }\n } else if (p.localName === 'tabs') {\n for (const tab of p.children ?? []) {\n const val = attr(tab, 'val')\n if (!val || val === 'clear') continue\n tabs.push({\n positionTwips: Number(attr(tab, 'pos') ?? 0),\n alignment: (val === 'start'\n ? 'left'\n : val === 'end'\n ? 'right'\n : val) as TabStopWrite['alignment'],\n ...(attr(tab, 'leader') ? { leader: attr(tab, 'leader') as TabStopWrite['leader'] } : {}),\n })\n }\n }\n }\n return { paraId: attr(paragraph, 'paraId') ?? '', properties, numbering, tabs }\n}\n\n/** Every section's page setup, to restore later. */\nexport function sectionStates(root: OoxmlNodeLike): SectionState[] {\n const { body } = paragraphIndex(root)\n const state = (sectPr: OoxmlNodeLike, paraId: string | null): SectionState => {\n const size = child(sectPr, 'pgSz')\n const margin = child(sectPr, 'pgMar')\n const orient = size && attr(size, 'orient')\n return {\n paraId,\n pageWidthTwips: twips(size, 'w'),\n pageHeightTwips: twips(size, 'h'),\n orientation: orient === 'landscape' ? 'landscape' : 'portrait',\n marginTopTwips: twips(margin, 'top'),\n marginRightTwips: twips(margin, 'right'),\n marginBottomTwips: twips(margin, 'bottom'),\n marginLeftTwips: twips(margin, 'left'),\n }\n }\n const out: SectionState[] = []\n for (const block of body.children ?? []) {\n const sectPr = block.kind === 'paragraph' ? child(child(block, 'pPr'), 'sectPr') : undefined\n if (sectPr) out.push(state(sectPr, attr(block, 'paraId') ?? null))\n else if (block.localName === 'sectPr') out.push(state(block, null))\n }\n return out\n}\n\n/** The table a paragraph is in, or undefined. */\nexport function tableOf(root: OoxmlNodeLike, paraId: string): OoxmlNodeLike | undefined {\n const { byParaId, parentOf } = paragraphIndex(root)\n let node = byParaId.get(paraId)\n while (node && node.localName !== 'tbl') node = parentOf.get(node)\n return node\n}\n\n/** A table's style and header rows, to restore later (`paraId`: a paragraph in it). */\nexport function tableState(root: OoxmlNodeLike, paraId: string): UndoRecord | null {\n const table = tableOf(root, paraId)\n if (!table) return null\n const style = child(child(table, 'tblPr'), 'tblStyle')\n let headerRowCount = 0\n for (const row of table.children ?? []) {\n if (row.localName !== 'tr') continue\n const header = child(child(row, 'trPr'), 'tblHeader')\n if (!header || ['0', 'false', 'off'].includes(attr(header, 'val') ?? '')) break\n headerRowCount++\n }\n return { kind: 'table', paraId, styleId: (style && attr(style, 'val')) ?? null, headerRowCount }\n}\n\n/** The begin `w:fldChar` node ids of a paragraph's complex fields, in order (as `DocParagraph.fields`). */\nexport function fieldNodeIds(paragraph: OoxmlNodeLike): string[] {\n const out: string[] = []\n let depth = 0\n const walk = (node: OoxmlNodeLike) => {\n for (const c of node.children ?? []) {\n if (c.localName === 'del') continue\n if (c.localName === 'fldChar') {\n const type = attr(c, 'fldCharType')\n if (type === 'begin' && depth++ === 0) out.push(c.id)\n else if (type === 'end') depth = Math.max(0, depth - 1)\n } else if (c.kind !== 'textValue') walk(c)\n }\n }\n walk(paragraph)\n return out\n}\n\n/**\n * The store ops that put back what a record captured, against the document as it now is (`root`,\n * the main part's tree). Null when what it changed is no longer there (a paragraph or table gone).\n */\nexport function undoOps(root: OoxmlNodeLike, record: UndoRecord): TreeDocOp[] | null {\n const { byParaId, body } = paragraphIndex(root)\n const ops: TreeDocOp[] = []\n if (record.kind === 'paragraphs') {\n for (const state of record.paragraphs) {\n const paragraph = byParaId.get(state.paraId)\n if (!paragraph) return null\n ops.push(\n { op: 'setParagraphProperties', paragraphId: paragraph.id, properties: state.properties },\n {\n op: 'setListNumbering',\n paragraphId: paragraph.id,\n numId: state.numbering?.numId ?? null,\n ...(state.numbering ? { level: state.numbering.level } : {}),\n },\n { op: 'setParagraphTabStops', paragraphId: paragraph.id, stops: state.tabs }\n )\n }\n } else if (record.kind === 'sections') {\n const last = [...(body.children ?? [])].reverse().find((b) => b.kind === 'paragraph')\n for (const { paraId, ...setup } of record.sections) {\n const anchor = paraId === null ? last : byParaId.get(paraId)\n if (!anchor) return null\n const fields = Object.fromEntries(Object.entries(setup).filter(([, v]) => v !== undefined))\n ops.push({ op: 'setSectionProperties', anchorParagraphId: anchor.id, ...fields })\n }\n } else if (record.kind === 'table') {\n const table = tableOf(root, record.paraId)\n if (!table) return null\n ops.push({\n op: 'setTableProperties',\n tableId: table.id,\n styleId: record.styleId ?? '',\n headerRowCount: record.headerRowCount,\n })\n } else {\n const updates = []\n for (const { paraId, index, text } of record.fields) {\n const paragraph = byParaId.get(paraId)\n const fieldNodeId = paragraph && fieldNodeIds(paragraph)[index]\n if (!paragraph || !fieldNodeId) return null\n updates.push({ paragraphId: paragraph.id, fieldNodeId, text })\n }\n ops.push({ op: 'refreshFieldResults', updates })\n }\n return ops\n}\n","/**\n * Word-editor commands shared by the editor's toolbar and ARBI's headless tools in the\n * collaboration service. Pure functions over the engine's OOXML tree, so they run on a live\n * editor's session and on a headless document view alike.\n */\nimport { openHeadlessDocument } from '@docx-editor.dev/core/store'\nimport { readParagraphs, styleNames, type DocParagraph, type OoxmlNodeLike } from './read'\nimport { documentNumbering, type DocumentNumbering } from './numbering'\nimport type { ReferencesReader } from './references'\n\nexport * from './read'\nexport * from './numbering'\nexport * from './references'\nexport * from './undo'\n\n/** A document's parts as trees: a live editor's session or a headless view (`openHeadlessDocument`). */\nexport interface DocumentTrees {\n part(): { root: unknown }\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A read-only snapshot of a document: its paragraphs, numbering and style names. */\nexport interface DocumentReader extends ReferencesReader, DocumentNumbering {\n /** A style's name (`heading 1`) by its id, or the id when the document does not name it. */\n styleName(styleId: string): string\n}\n\n/** Read a document whose trees do not change while the reader is used (a headless view). */\nexport function documentReader(view: DocumentTrees): DocumentReader {\n const root = () => view.part().root as OoxmlNodeLike\n let paragraphs: DocParagraph[] | undefined\n let items: ReturnType<DocumentNumbering['listItems']> | undefined\n let names: Map<string, string> | undefined\n const numbering = documentNumbering({ ...view, root })\n return {\n paragraphs: () => (paragraphs ??= readParagraphs(root())),\n listItems: () => (items ??= numbering.listItems()),\n levelOf: numbering.levelOf,\n styleName: (id) =>\n (names ??= styleNames(view.stylesRoot() as OoxmlNodeLike | null)).get(id) ?? id,\n }\n}\n\n/** Read a document from its bytes (a collaboration room's `readRoom`). Throws on a bad package. */\nexport function readDocument(bytes: Uint8Array): DocumentReader {\n const opened = openHeadlessDocument(bytes)\n if (!opened.ok) throw new Error(`The document cannot be read (${opened.reason}).`)\n return documentReader(opened.view)\n}\n"]}