@doxi/core 0.11.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.
Files changed (317) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/collab/port.d.ts +46 -0
  4. package/dist/collab/port.d.ts.map +1 -0
  5. package/dist/collab/port.js +11 -0
  6. package/dist/collab/port.js.map +1 -0
  7. package/dist/commands/block-commands.d.ts +62 -0
  8. package/dist/commands/block-commands.d.ts.map +1 -0
  9. package/dist/commands/block-commands.js +208 -0
  10. package/dist/commands/block-commands.js.map +1 -0
  11. package/dist/commands/command.d.ts +13 -0
  12. package/dist/commands/command.d.ts.map +1 -0
  13. package/dist/commands/command.js +13 -0
  14. package/dist/commands/command.js.map +1 -0
  15. package/dist/commands/edit-commands.d.ts +5 -0
  16. package/dist/commands/edit-commands.d.ts.map +1 -0
  17. package/dist/commands/edit-commands.js +147 -0
  18. package/dist/commands/edit-commands.js.map +1 -0
  19. package/dist/commands/image-commands.d.ts +31 -0
  20. package/dist/commands/image-commands.d.ts.map +1 -0
  21. package/dist/commands/image-commands.js +130 -0
  22. package/dist/commands/image-commands.js.map +1 -0
  23. package/dist/commands/index.d.ts +11 -0
  24. package/dist/commands/index.d.ts.map +1 -0
  25. package/dist/commands/index.js +11 -0
  26. package/dist/commands/index.js.map +1 -0
  27. package/dist/commands/keymap.d.ts +34 -0
  28. package/dist/commands/keymap.d.ts.map +1 -0
  29. package/dist/commands/keymap.js +84 -0
  30. package/dist/commands/keymap.js.map +1 -0
  31. package/dist/commands/link-commands.d.ts +54 -0
  32. package/dist/commands/link-commands.d.ts.map +1 -0
  33. package/dist/commands/link-commands.js +151 -0
  34. package/dist/commands/link-commands.js.map +1 -0
  35. package/dist/commands/list-commands.d.ts +42 -0
  36. package/dist/commands/list-commands.d.ts.map +1 -0
  37. package/dist/commands/list-commands.js +316 -0
  38. package/dist/commands/list-commands.js.map +1 -0
  39. package/dist/commands/mark-commands.d.ts +53 -0
  40. package/dist/commands/mark-commands.d.ts.map +1 -0
  41. package/dist/commands/mark-commands.js +181 -0
  42. package/dist/commands/mark-commands.js.map +1 -0
  43. package/dist/commands/selection-commands.d.ts +3 -0
  44. package/dist/commands/selection-commands.d.ts.map +1 -0
  45. package/dist/commands/selection-commands.js +11 -0
  46. package/dist/commands/selection-commands.js.map +1 -0
  47. package/dist/commands/table-commands.d.ts +109 -0
  48. package/dist/commands/table-commands.d.ts.map +1 -0
  49. package/dist/commands/table-commands.js +884 -0
  50. package/dist/commands/table-commands.js.map +1 -0
  51. package/dist/history/history.d.ts +40 -0
  52. package/dist/history/history.d.ts.map +1 -0
  53. package/dist/history/history.js +139 -0
  54. package/dist/history/history.js.map +1 -0
  55. package/dist/history/index.d.ts +2 -0
  56. package/dist/history/index.d.ts.map +1 -0
  57. package/dist/history/index.js +2 -0
  58. package/dist/history/index.js.map +1 -0
  59. package/dist/html/index.d.ts +3 -0
  60. package/dist/html/index.d.ts.map +1 -0
  61. package/dist/html/index.js +3 -0
  62. package/dist/html/index.js.map +1 -0
  63. package/dist/html/parse.d.ts +4 -0
  64. package/dist/html/parse.d.ts.map +1 -0
  65. package/dist/html/parse.js +0 -0
  66. package/dist/html/parse.js.map +1 -0
  67. package/dist/html/serialize.d.ts +4 -0
  68. package/dist/html/serialize.d.ts.map +1 -0
  69. package/dist/html/serialize.js +75 -0
  70. package/dist/html/serialize.js.map +1 -0
  71. package/dist/index.d.ts +13 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +13 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/layout/index.d.ts +6 -0
  76. package/dist/layout/index.d.ts.map +1 -0
  77. package/dist/layout/index.js +6 -0
  78. package/dist/layout/index.js.map +1 -0
  79. package/dist/layout/layout-engine.d.ts +20 -0
  80. package/dist/layout/layout-engine.d.ts.map +1 -0
  81. package/dist/layout/layout-engine.js +198 -0
  82. package/dist/layout/layout-engine.js.map +1 -0
  83. package/dist/layout/measure.d.ts +9 -0
  84. package/dist/layout/measure.d.ts.map +1 -0
  85. package/dist/layout/measure.js +37 -0
  86. package/dist/layout/measure.js.map +1 -0
  87. package/dist/layout/split-paragraph.d.ts +28 -0
  88. package/dist/layout/split-paragraph.d.ts.map +1 -0
  89. package/dist/layout/split-paragraph.js +122 -0
  90. package/dist/layout/split-paragraph.js.map +1 -0
  91. package/dist/layout/split-table.d.ts +46 -0
  92. package/dist/layout/split-table.d.ts.map +1 -0
  93. package/dist/layout/split-table.js +84 -0
  94. package/dist/layout/split-table.js.map +1 -0
  95. package/dist/layout/types.d.ts +73 -0
  96. package/dist/layout/types.d.ts.map +1 -0
  97. package/dist/layout/types.js +36 -0
  98. package/dist/layout/types.js.map +1 -0
  99. package/dist/layout/widow-orphan.d.ts +15 -0
  100. package/dist/layout/widow-orphan.d.ts.map +1 -0
  101. package/dist/layout/widow-orphan.js +14 -0
  102. package/dist/layout/widow-orphan.js.map +1 -0
  103. package/dist/model/content-expr.d.ts +32 -0
  104. package/dist/model/content-expr.d.ts.map +1 -0
  105. package/dist/model/content-expr.js +106 -0
  106. package/dist/model/content-expr.js.map +1 -0
  107. package/dist/model/fragment.d.ts +17 -0
  108. package/dist/model/fragment.d.ts.map +1 -0
  109. package/dist/model/fragment.js +44 -0
  110. package/dist/model/fragment.js.map +1 -0
  111. package/dist/model/index.d.ts +10 -0
  112. package/dist/model/index.d.ts.map +1 -0
  113. package/dist/model/index.js +10 -0
  114. package/dist/model/index.js.map +1 -0
  115. package/dist/model/mark.d.ts +35 -0
  116. package/dist/model/mark.d.ts.map +1 -0
  117. package/dist/model/mark.js +89 -0
  118. package/dist/model/mark.js.map +1 -0
  119. package/dist/model/node-type.d.ts +36 -0
  120. package/dist/model/node-type.d.ts.map +1 -0
  121. package/dist/model/node-type.js +14 -0
  122. package/dist/model/node-type.js.map +1 -0
  123. package/dist/model/node.d.ts +36 -0
  124. package/dist/model/node.d.ts.map +1 -0
  125. package/dist/model/node.js +192 -0
  126. package/dist/model/node.js.map +1 -0
  127. package/dist/model/position.d.ts +66 -0
  128. package/dist/model/position.d.ts.map +1 -0
  129. package/dist/model/position.js +158 -0
  130. package/dist/model/position.js.map +1 -0
  131. package/dist/model/schema.d.ts +28 -0
  132. package/dist/model/schema.d.ts.map +1 -0
  133. package/dist/model/schema.js +195 -0
  134. package/dist/model/schema.js.map +1 -0
  135. package/dist/model/slice.d.ts +26 -0
  136. package/dist/model/slice.d.ts.map +1 -0
  137. package/dist/model/slice.js +56 -0
  138. package/dist/model/slice.js.map +1 -0
  139. package/dist/model/table-grid.d.ts +71 -0
  140. package/dist/model/table-grid.d.ts.map +1 -0
  141. package/dist/model/table-grid.js +130 -0
  142. package/dist/model/table-grid.js.map +1 -0
  143. package/dist/plugin/index.d.ts +3 -0
  144. package/dist/plugin/index.d.ts.map +1 -0
  145. package/dist/plugin/index.js +3 -0
  146. package/dist/plugin/index.js.map +1 -0
  147. package/dist/plugin/plugin-key.d.ts +13 -0
  148. package/dist/plugin/plugin-key.d.ts.map +1 -0
  149. package/dist/plugin/plugin-key.js +13 -0
  150. package/dist/plugin/plugin-key.js.map +1 -0
  151. package/dist/plugin/plugin-state.d.ts +2 -0
  152. package/dist/plugin/plugin-state.d.ts.map +1 -0
  153. package/dist/plugin/plugin-state.js +3 -0
  154. package/dist/plugin/plugin-state.js.map +1 -0
  155. package/dist/plugin/plugin.d.ts +39 -0
  156. package/dist/plugin/plugin.d.ts.map +1 -0
  157. package/dist/plugin/plugin.js +10 -0
  158. package/dist/plugin/plugin.js.map +1 -0
  159. package/dist/schema/default.d.ts +163 -0
  160. package/dist/schema/default.d.ts.map +1 -0
  161. package/dist/schema/default.js +94 -0
  162. package/dist/schema/default.js.map +1 -0
  163. package/dist/schema/index.d.ts +2 -0
  164. package/dist/schema/index.d.ts.map +1 -0
  165. package/dist/schema/index.js +2 -0
  166. package/dist/schema/index.js.map +1 -0
  167. package/dist/serialize/index.d.ts +2 -0
  168. package/dist/serialize/index.d.ts.map +1 -0
  169. package/dist/serialize/index.js +2 -0
  170. package/dist/serialize/index.js.map +1 -0
  171. package/dist/serialize/json.d.ts +15 -0
  172. package/dist/serialize/json.d.ts.map +1 -0
  173. package/dist/serialize/json.js +23 -0
  174. package/dist/serialize/json.js.map +1 -0
  175. package/dist/state/all-selection.d.ts +11 -0
  176. package/dist/state/all-selection.d.ts.map +1 -0
  177. package/dist/state/all-selection.js +17 -0
  178. package/dist/state/all-selection.js.map +1 -0
  179. package/dist/state/cell-selection.d.ts +30 -0
  180. package/dist/state/cell-selection.d.ts.map +1 -0
  181. package/dist/state/cell-selection.js +38 -0
  182. package/dist/state/cell-selection.js.map +1 -0
  183. package/dist/state/editor-state.d.ts +46 -0
  184. package/dist/state/editor-state.d.ts.map +1 -0
  185. package/dist/state/editor-state.js +211 -0
  186. package/dist/state/editor-state.js.map +1 -0
  187. package/dist/state/index.d.ts +7 -0
  188. package/dist/state/index.d.ts.map +1 -0
  189. package/dist/state/index.js +7 -0
  190. package/dist/state/index.js.map +1 -0
  191. package/dist/state/node-selection.d.ts +16 -0
  192. package/dist/state/node-selection.d.ts.map +1 -0
  193. package/dist/state/node-selection.js +51 -0
  194. package/dist/state/node-selection.js.map +1 -0
  195. package/dist/state/selection.d.ts +29 -0
  196. package/dist/state/selection.d.ts.map +1 -0
  197. package/dist/state/selection.js +24 -0
  198. package/dist/state/selection.js.map +1 -0
  199. package/dist/state/text-selection.d.ts +10 -0
  200. package/dist/state/text-selection.d.ts.map +1 -0
  201. package/dist/state/text-selection.js +26 -0
  202. package/dist/state/text-selection.js.map +1 -0
  203. package/dist/transform/attr-step.d.ts +16 -0
  204. package/dist/transform/attr-step.d.ts.map +1 -0
  205. package/dist/transform/attr-step.js +98 -0
  206. package/dist/transform/attr-step.js.map +1 -0
  207. package/dist/transform/index.d.ts +10 -0
  208. package/dist/transform/index.d.ts.map +1 -0
  209. package/dist/transform/index.js +10 -0
  210. package/dist/transform/index.js.map +1 -0
  211. package/dist/transform/mapping.d.ts +44 -0
  212. package/dist/transform/mapping.d.ts.map +1 -0
  213. package/dist/transform/mapping.js +101 -0
  214. package/dist/transform/mapping.js.map +1 -0
  215. package/dist/transform/mark-step.d.ts +27 -0
  216. package/dist/transform/mark-step.d.ts.map +1 -0
  217. package/dist/transform/mark-step.js +146 -0
  218. package/dist/transform/mark-step.js.map +1 -0
  219. package/dist/transform/replace-around-step.d.ts +35 -0
  220. package/dist/transform/replace-around-step.d.ts.map +1 -0
  221. package/dist/transform/replace-around-step.js +144 -0
  222. package/dist/transform/replace-around-step.js.map +1 -0
  223. package/dist/transform/replace-step.d.ts +17 -0
  224. package/dist/transform/replace-step.d.ts.map +1 -0
  225. package/dist/transform/replace-step.js +72 -0
  226. package/dist/transform/replace-step.js.map +1 -0
  227. package/dist/transform/replace.d.ts +18 -0
  228. package/dist/transform/replace.d.ts.map +1 -0
  229. package/dist/transform/replace.js +132 -0
  230. package/dist/transform/replace.js.map +1 -0
  231. package/dist/transform/set-page-meta-step.d.ts +42 -0
  232. package/dist/transform/set-page-meta-step.d.ts.map +1 -0
  233. package/dist/transform/set-page-meta-step.js +75 -0
  234. package/dist/transform/set-page-meta-step.js.map +1 -0
  235. package/dist/transform/step.d.ts +34 -0
  236. package/dist/transform/step.d.ts.map +1 -0
  237. package/dist/transform/step.js +23 -0
  238. package/dist/transform/step.js.map +1 -0
  239. package/dist/transform/transaction.d.ts +20 -0
  240. package/dist/transform/transaction.d.ts.map +1 -0
  241. package/dist/transform/transaction.js +38 -0
  242. package/dist/transform/transaction.js.map +1 -0
  243. package/dist/version.d.ts +2 -0
  244. package/dist/version.d.ts.map +1 -0
  245. package/dist/version.js +5 -0
  246. package/dist/version.js.map +1 -0
  247. package/dist/view/cell-drag.d.ts +33 -0
  248. package/dist/view/cell-drag.d.ts.map +1 -0
  249. package/dist/view/cell-drag.js +177 -0
  250. package/dist/view/cell-drag.js.map +1 -0
  251. package/dist/view/clipboard.d.ts +5 -0
  252. package/dist/view/clipboard.d.ts.map +1 -0
  253. package/dist/view/clipboard.js +97 -0
  254. package/dist/view/clipboard.js.map +1 -0
  255. package/dist/view/default-renderer.d.ts +3 -0
  256. package/dist/view/default-renderer.d.ts.map +1 -0
  257. package/dist/view/default-renderer.js +142 -0
  258. package/dist/view/default-renderer.js.map +1 -0
  259. package/dist/view/dom-spec.d.ts +11 -0
  260. package/dist/view/dom-spec.d.ts.map +1 -0
  261. package/dist/view/dom-spec.js +32 -0
  262. package/dist/view/dom-spec.js.map +1 -0
  263. package/dist/view/editor-view.d.ts +55 -0
  264. package/dist/view/editor-view.d.ts.map +1 -0
  265. package/dist/view/editor-view.js +143 -0
  266. package/dist/view/editor-view.js.map +1 -0
  267. package/dist/view/image-resize.d.ts +37 -0
  268. package/dist/view/image-resize.d.ts.map +1 -0
  269. package/dist/view/image-resize.js +191 -0
  270. package/dist/view/image-resize.js.map +1 -0
  271. package/dist/view/index.d.ts +15 -0
  272. package/dist/view/index.d.ts.map +1 -0
  273. package/dist/view/index.js +15 -0
  274. package/dist/view/index.js.map +1 -0
  275. package/dist/view/input-pipeline.d.ts +24 -0
  276. package/dist/view/input-pipeline.d.ts.map +1 -0
  277. package/dist/view/input-pipeline.js +226 -0
  278. package/dist/view/input-pipeline.js.map +1 -0
  279. package/dist/view/mutation-observer.d.ts +17 -0
  280. package/dist/view/mutation-observer.d.ts.map +1 -0
  281. package/dist/view/mutation-observer.js +62 -0
  282. package/dist/view/mutation-observer.js.map +1 -0
  283. package/dist/view/page-slots.d.ts +56 -0
  284. package/dist/view/page-slots.d.ts.map +1 -0
  285. package/dist/view/page-slots.js +230 -0
  286. package/dist/view/page-slots.js.map +1 -0
  287. package/dist/view/paginator.d.ts +17 -0
  288. package/dist/view/paginator.d.ts.map +1 -0
  289. package/dist/view/paginator.js +93 -0
  290. package/dist/view/paginator.js.map +1 -0
  291. package/dist/view/print.d.ts +42 -0
  292. package/dist/view/print.d.ts.map +1 -0
  293. package/dist/view/print.js +70 -0
  294. package/dist/view/print.js.map +1 -0
  295. package/dist/view/reconcile.d.ts +16 -0
  296. package/dist/view/reconcile.d.ts.map +1 -0
  297. package/dist/view/reconcile.js +158 -0
  298. package/dist/view/reconcile.js.map +1 -0
  299. package/dist/view/renderer.d.ts +31 -0
  300. package/dist/view/renderer.d.ts.map +1 -0
  301. package/dist/view/renderer.js +89 -0
  302. package/dist/view/renderer.js.map +1 -0
  303. package/dist/view/selection-sync.d.ts +35 -0
  304. package/dist/view/selection-sync.d.ts.map +1 -0
  305. package/dist/view/selection-sync.js +324 -0
  306. package/dist/view/selection-sync.js.map +1 -0
  307. package/dist/view/table-resize.d.ts +41 -0
  308. package/dist/view/table-resize.d.ts.map +1 -0
  309. package/dist/view/table-resize.js +216 -0
  310. package/dist/view/table-resize.js.map +1 -0
  311. package/package.json +93 -0
  312. package/styles/base.css +269 -0
  313. package/styles/dark.css +36 -0
  314. package/styles/light.css +13 -0
  315. package/styles/page.css +93 -0
  316. package/styles/print-a4.css +87 -0
  317. package/styles/print.css +88 -0
@@ -0,0 +1,146 @@
1
+ import { Fragment } from '../model/fragment.js';
2
+ import { addToSet, removeFromSet } from '../model/mark.js';
3
+ import { DxNode } from '../model/node.js';
4
+ import { Step, registerStep } from './step.js';
5
+ class MarkStep extends Step {
6
+ from;
7
+ to;
8
+ mark;
9
+ constructor(from, to, mark) {
10
+ super();
11
+ this.from = from;
12
+ this.to = to;
13
+ this.mark = mark;
14
+ if (from > to)
15
+ throw new RangeError(`${this.constructor.name}: from > to`);
16
+ }
17
+ apply(doc) {
18
+ try {
19
+ const newDoc = transformMarks(doc, this.from, this.to, this.mark, this.kind === 'addMark' ? 'add' : 'remove');
20
+ return {
21
+ ok: true,
22
+ doc: newDoc,
23
+ mapRange: { start: this.from, oldLen: this.to - this.from, newLen: this.to - this.from },
24
+ };
25
+ }
26
+ catch (err) {
27
+ return { ok: false, failed: err.message };
28
+ }
29
+ }
30
+ map(mapping) {
31
+ const newFrom = mapping.map(this.from, 1);
32
+ const newTo = mapping.map(this.to, -1);
33
+ if (newFrom >= newTo)
34
+ return null;
35
+ return this.kind === 'addMark'
36
+ ? new AddMarkStep(newFrom, newTo, this.mark)
37
+ : new RemoveMarkStep(newFrom, newTo, this.mark);
38
+ }
39
+ toJSON() {
40
+ return {
41
+ kind: this.kind,
42
+ data: { from: this.from, to: this.to, mark: this.mark.toJSON() },
43
+ };
44
+ }
45
+ }
46
+ export class AddMarkStep extends MarkStep {
47
+ get kind() { return 'addMark'; }
48
+ invert(_doc) { return new RemoveMarkStep(this.from, this.to, this.mark); }
49
+ static fromJSON(schema, data) {
50
+ return new AddMarkStep(data.from, data.to, markFromJSON(schema, data.mark));
51
+ }
52
+ }
53
+ export class RemoveMarkStep extends MarkStep {
54
+ get kind() { return 'removeMark'; }
55
+ invert(_doc) { return new AddMarkStep(this.from, this.to, this.mark); }
56
+ static fromJSON(schema, data) {
57
+ return new RemoveMarkStep(data.from, data.to, markFromJSON(schema, data.mark));
58
+ }
59
+ }
60
+ registerStep('addMark', AddMarkStep);
61
+ registerStep('removeMark', RemoveMarkStep);
62
+ function markFromJSON(schema, json) {
63
+ const type = schema.marks[json.type];
64
+ if (!type)
65
+ throw new Error(`mark-step: unknown mark type '${json.type}'`);
66
+ return type.create(json.attrs);
67
+ }
68
+ /**
69
+ * Walk the doc's content, splitting text leaves that cross the [from, to) boundary,
70
+ * applying or removing the mark to the affected portion, then merging adjacent leaves
71
+ * with the same mark set.
72
+ */
73
+ function transformMarks(doc, from, to, mark, action) {
74
+ return transformNode(doc, 0, from, to, mark, action);
75
+ }
76
+ /**
77
+ * absStart: the document-content position at which `node.content` begins.
78
+ * For the root doc this is 0. For a nested non-leaf child whose open token
79
+ * sits at parent-content-pos X, its own content begins at X + 1.
80
+ */
81
+ function transformNode(node, absStart, from, to, mark, action) {
82
+ if (node.isText || node.isAtom)
83
+ return node;
84
+ const newChildren = [];
85
+ let offset = 0;
86
+ for (let i = 0; i < node.content.childCount; i++) {
87
+ const child = node.content.child(i);
88
+ const childStart = absStart + offset;
89
+ const childEnd = childStart + child.nodeSize;
90
+ if (childEnd <= from || childStart >= to) {
91
+ newChildren.push(child);
92
+ }
93
+ else if (child.isText) {
94
+ newChildren.push(...splitText(child, childStart, from, to, mark, action));
95
+ }
96
+ else {
97
+ // Non-leaf child: its content begins 1 position after its own open token.
98
+ newChildren.push(transformNode(child, childStart + 1, from, to, mark, action));
99
+ }
100
+ offset += child.nodeSize;
101
+ }
102
+ return node.copy(Fragment.from(mergeAdjacentText(newChildren)));
103
+ }
104
+ function splitText(text, start, from, to, mark, action) {
105
+ const t = text.text;
106
+ const len = t.length;
107
+ const localFrom = Math.max(0, from - start);
108
+ const localTo = Math.min(len, to - start);
109
+ const head = t.slice(0, localFrom);
110
+ const middle = t.slice(localFrom, localTo);
111
+ const tail = t.slice(localTo);
112
+ const out = [];
113
+ if (head)
114
+ out.push(DxNode.text(text.type, head, text.marks));
115
+ if (middle) {
116
+ const marks = action === 'add' ? addToSet(text.marks, mark) : removeFromSet(text.marks, mark);
117
+ out.push(DxNode.text(text.type, middle, marks));
118
+ }
119
+ if (tail)
120
+ out.push(DxNode.text(text.type, tail, text.marks));
121
+ return out;
122
+ }
123
+ function mergeAdjacentText(children) {
124
+ if (children.length < 2)
125
+ return children;
126
+ const out = [];
127
+ for (const c of children) {
128
+ const prev = out[out.length - 1];
129
+ if (prev && prev.isText && c.isText && prev.type === c.type && marksEqArr(prev.marks, c.marks)) {
130
+ out[out.length - 1] = DxNode.text(prev.type, prev.text + c.text, prev.marks);
131
+ }
132
+ else {
133
+ out.push(c);
134
+ }
135
+ }
136
+ return out;
137
+ }
138
+ function marksEqArr(a, b) {
139
+ if (a.length !== b.length)
140
+ return false;
141
+ for (let i = 0; i < a.length; i++)
142
+ if (!a[i].eq(b[i]))
143
+ return false;
144
+ return true;
145
+ }
146
+ //# sourceMappingURL=mark-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mark-step.js","sourceRoot":"","sources":["../../src/transform/mark-step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { DxNode } from '../model/node.js';
2
+ import type { Schema } from '../model/schema.js';
3
+ import { Slice } from '../model/slice.js';
4
+ import type { Mapping } from './mapping.js';
5
+ import { Step, type StepJSON, type StepResult } from './step.js';
6
+ /**
7
+ * ReplaceAroundStep — wrap/unwrap operation.
8
+ *
9
+ * from..to absolute doc range to replace
10
+ * gapFrom..gapTo absolute doc range whose content is preserved
11
+ * (must lie within from..to)
12
+ * slice new content to insert around the preserved gap
13
+ * insert offset inside the slice's content where the
14
+ * preserved gap content lands
15
+ *
16
+ * Constraints (v0.1):
17
+ * - from <= gapFrom <= gapTo <= to
18
+ * - gapFrom and gapTo share a common parent inside [from..to)
19
+ * - the slice has openStart === openEnd === 0 (whole-block slice)
20
+ */
21
+ export declare class ReplaceAroundStep extends Step {
22
+ readonly from: number;
23
+ readonly to: number;
24
+ readonly gapFrom: number;
25
+ readonly gapTo: number;
26
+ readonly slice: Slice;
27
+ readonly insert: number;
28
+ constructor(from: number, to: number, gapFrom: number, gapTo: number, slice: Slice, insert: number);
29
+ apply(doc: DxNode): StepResult;
30
+ invert(doc: DxNode): Step;
31
+ map(mapping: Mapping): Step | null;
32
+ toJSON(): StepJSON;
33
+ static fromJSON(schema: Schema, data: Readonly<Record<string, unknown>>): ReplaceAroundStep;
34
+ }
35
+ //# sourceMappingURL=replace-around-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-around-step.d.ts","sourceRoot":"","sources":["../../src/transform/replace-around-step.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAgB,MAAM,mBAAmB,CAAA;AAEvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAgB,MAAM,WAAW,CAAA;AAE9E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,SAAQ,IAAI;IAEvC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBALd,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM;IAQzB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAe9B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAUzB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAUlC,MAAM,IAAI,QAAQ;IAclB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,iBAAiB;CAU5F"}
@@ -0,0 +1,144 @@
1
+ import { Fragment } from '../model/fragment.js';
2
+ import { Slice, sliceBetween } from '../model/slice.js';
3
+ import { resolve } from '../model/position.js';
4
+ import { ReplaceStep } from './replace-step.js';
5
+ import { Step, registerStep } from './step.js';
6
+ /**
7
+ * ReplaceAroundStep — wrap/unwrap operation.
8
+ *
9
+ * from..to absolute doc range to replace
10
+ * gapFrom..gapTo absolute doc range whose content is preserved
11
+ * (must lie within from..to)
12
+ * slice new content to insert around the preserved gap
13
+ * insert offset inside the slice's content where the
14
+ * preserved gap content lands
15
+ *
16
+ * Constraints (v0.1):
17
+ * - from <= gapFrom <= gapTo <= to
18
+ * - gapFrom and gapTo share a common parent inside [from..to)
19
+ * - the slice has openStart === openEnd === 0 (whole-block slice)
20
+ */
21
+ export class ReplaceAroundStep extends Step {
22
+ from;
23
+ to;
24
+ gapFrom;
25
+ gapTo;
26
+ slice;
27
+ insert;
28
+ constructor(from, to, gapFrom, gapTo, slice, insert) {
29
+ super();
30
+ this.from = from;
31
+ this.to = to;
32
+ this.gapFrom = gapFrom;
33
+ this.gapTo = gapTo;
34
+ this.slice = slice;
35
+ this.insert = insert;
36
+ if (from > gapFrom || gapTo > to) {
37
+ throw new RangeError('ReplaceAroundStep: gap must lie within [from, to)');
38
+ }
39
+ }
40
+ apply(doc) {
41
+ try {
42
+ const newDoc = applyAround(doc, this.from, this.to, this.gapFrom, this.gapTo, this.slice, this.insert);
43
+ const oldLen = this.to - this.from;
44
+ const newLen = newDoc.content.size - (doc.content.size - oldLen);
45
+ return {
46
+ ok: true,
47
+ doc: newDoc,
48
+ mapRange: { start: this.from, oldLen, newLen },
49
+ };
50
+ }
51
+ catch (err) {
52
+ return { ok: false, failed: err.message };
53
+ }
54
+ }
55
+ invert(doc) {
56
+ // The forward step transformed [from..to) into a region of total length
57
+ // `slice.content.size + (gapTo - gapFrom)`. The clean inverse is a plain
58
+ // ReplaceStep that replaces that new region with the original [from..to)
59
+ // slice — matching ProseMirror's precedent.
60
+ const originalSlice = sliceBetween(doc, this.from, this.to);
61
+ const insertedLen = this.slice.content.size + (this.gapTo - this.gapFrom);
62
+ return new ReplaceStep(this.from, this.from + insertedLen, originalSlice);
63
+ }
64
+ map(mapping) {
65
+ const newFrom = mapping.map(this.from, 1);
66
+ const newTo = mapping.map(this.to, -1);
67
+ const newGapFrom = mapping.map(this.gapFrom, 1);
68
+ const newGapTo = mapping.map(this.gapTo, -1);
69
+ if (newFrom > newTo || newGapFrom > newGapTo)
70
+ return null;
71
+ if (newFrom > newGapFrom || newGapTo > newTo)
72
+ return null;
73
+ return new ReplaceAroundStep(newFrom, newTo, newGapFrom, newGapTo, this.slice, this.insert);
74
+ }
75
+ toJSON() {
76
+ return {
77
+ kind: 'replaceAround',
78
+ data: {
79
+ from: this.from,
80
+ to: this.to,
81
+ gapFrom: this.gapFrom,
82
+ gapTo: this.gapTo,
83
+ slice: this.slice.toJSON(),
84
+ insert: this.insert,
85
+ },
86
+ };
87
+ }
88
+ static fromJSON(schema, data) {
89
+ return new ReplaceAroundStep(data.from, data.to, data.gapFrom, data.gapTo, Slice.fromJSON(schema, data.slice), data.insert);
90
+ }
91
+ }
92
+ registerStep('replaceAround', ReplaceAroundStep);
93
+ function applyAround(doc, from, to, gapFrom, gapTo, slice, insert) {
94
+ if (slice.openStart !== 0 || slice.openEnd !== 0) {
95
+ throw new Error('ReplaceAroundStep: v0.1 supports openStart=openEnd=0 slices only');
96
+ }
97
+ if (from < 0 || to > doc.content.size) {
98
+ throw new RangeError(`ReplaceAroundStep: range [${from}, ${to}) outside doc`);
99
+ }
100
+ // Extract the gap content as a slice of the original doc.
101
+ const gapSlice = sliceBetween(doc, gapFrom, gapTo);
102
+ // Build the new fragment inside the slice's first child: insert the gap content at offset `insert`.
103
+ // For v0.1 we require slice.content to be exactly one node (the wrapper).
104
+ if (slice.content.childCount !== 1) {
105
+ throw new Error('ReplaceAroundStep: v0.1 requires exactly one wrapper node in the slice');
106
+ }
107
+ const wrapper = slice.content.child(0);
108
+ // The wrapper's content currently exists; we replace its content with: before(insert) + gap + after(insert).
109
+ const before = wrapper.cut(0, insert).content;
110
+ const after = wrapper.cut(insert, wrapper.content.size).content;
111
+ const newWrapperContent = before.append(gapSlice.content).append(after);
112
+ const newWrapper = wrapper.copy(newWrapperContent);
113
+ // Now splice the new wrapper into the doc, replacing [from, to).
114
+ return spliceDocBlocks(doc, from, to, newWrapper);
115
+ }
116
+ function spliceDocBlocks(doc, from, to, replacement) {
117
+ // For v0.1 we only support the doc-level whole-block case (from/to are between blocks).
118
+ const rFrom = resolve(doc, from);
119
+ const rTo = resolve(doc, to);
120
+ if (rFrom.depth !== 0 || rTo.depth !== 0) {
121
+ throw new Error('ReplaceAroundStep: v0.1 requires from/to on doc-level boundaries');
122
+ }
123
+ let offset = 0;
124
+ let fromIndex = -1;
125
+ let toIndex = -1;
126
+ for (let i = 0; i < doc.content.childCount; i++) {
127
+ if (offset === from)
128
+ fromIndex = i;
129
+ if (offset === to)
130
+ toIndex = i;
131
+ offset += doc.content.child(i).nodeSize;
132
+ }
133
+ if (offset === from)
134
+ fromIndex = doc.content.childCount;
135
+ if (offset === to)
136
+ toIndex = doc.content.childCount;
137
+ if (fromIndex < 0 || toIndex < 0) {
138
+ throw new Error(`ReplaceAroundStep: positions ${from}/${to} are not on block boundaries`);
139
+ }
140
+ const before = doc.content.children.slice(0, fromIndex);
141
+ const after = doc.content.children.slice(toIndex);
142
+ return doc.copy(Fragment.from([...before, replacement, ...after]));
143
+ }
144
+ //# sourceMappingURL=replace-around-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-around-step.js","sourceRoot":"","sources":["../../src/transform/replace-around-step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DxNode } from '../model/node.js';
2
+ import type { Schema } from '../model/schema.js';
3
+ import { Slice } from '../model/slice.js';
4
+ import type { Mapping } from './mapping.js';
5
+ import { Step, type StepJSON, type StepResult } from './step.js';
6
+ export declare class ReplaceStep extends Step {
7
+ readonly from: number;
8
+ readonly to: number;
9
+ readonly slice: Slice;
10
+ constructor(from: number, to: number, slice: Slice);
11
+ apply(doc: DxNode): StepResult;
12
+ invert(doc: DxNode): Step;
13
+ map(mapping: Mapping): Step | null;
14
+ toJSON(): StepJSON;
15
+ static fromJSON(schema: Schema, data: Readonly<Record<string, unknown>>): ReplaceStep;
16
+ }
17
+ //# sourceMappingURL=replace-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-step.d.ts","sourceRoot":"","sources":["../../src/transform/replace-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAgB,MAAM,WAAW,CAAA;AAE9E,qBAAa,WAAY,SAAQ,IAAI;IAEjC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,KAAK,EAAE,KAAK;gBAFZ,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK;IAMvB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAkB9B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAazB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAUlC,MAAM,IAAI,QAAQ;IAOlB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,WAAW;CAMtF"}
@@ -0,0 +1,72 @@
1
+ import { Slice } from '../model/slice.js';
2
+ import { sliceBetween } from '../model/slice.js';
3
+ import { replace } from './replace.js';
4
+ import { Step, registerStep } from './step.js';
5
+ export class ReplaceStep extends Step {
6
+ from;
7
+ to;
8
+ slice;
9
+ constructor(from, to, slice) {
10
+ super();
11
+ this.from = from;
12
+ this.to = to;
13
+ this.slice = slice;
14
+ if (from > to)
15
+ throw new RangeError('ReplaceStep: from > to');
16
+ }
17
+ apply(doc) {
18
+ try {
19
+ const newDoc = replace(doc, this.from, this.to, this.slice);
20
+ // newLen = how many new positions the step introduces in [from, ...).
21
+ // Derived from the doc size delta: (newDoc.size - doc.size) is the net change,
22
+ // and the deleted span contributed (this.to - this.from) old positions.
23
+ const oldLen = this.to - this.from;
24
+ const newLen = newDoc.content.size - doc.content.size + oldLen;
25
+ return {
26
+ ok: true,
27
+ doc: newDoc,
28
+ mapRange: { start: this.from, oldLen, newLen },
29
+ };
30
+ }
31
+ catch (err) {
32
+ return { ok: false, failed: err.message };
33
+ }
34
+ }
35
+ invert(doc) {
36
+ // The inverse step replaces what `apply` produced (range [from, from + insertedLen))
37
+ // with the slice of the ORIGINAL doc between [from, to). insertedLen is computed
38
+ // by re-applying to know the new doc size; cheaper: derive from a probe apply.
39
+ const probe = this.apply(doc);
40
+ if (!probe.ok) {
41
+ throw new Error(`ReplaceStep.invert: cannot apply forward step: ${probe.failed}`);
42
+ }
43
+ const insertedLen = probe.mapRange.newLen;
44
+ const originalSlice = sliceBetween(doc, this.from, this.to);
45
+ return new ReplaceStep(this.from, this.from + insertedLen, originalSlice);
46
+ }
47
+ map(mapping) {
48
+ const newFrom = mapping.map(this.from, 1);
49
+ const newTo = mapping.map(this.to, -1);
50
+ // If the original step targeted a non-empty range that has now fully collapsed,
51
+ // its anchor has been deleted and the step is meaningless. Drop it.
52
+ if (newFrom > newTo)
53
+ return null;
54
+ if (this.from < this.to && newFrom === newTo)
55
+ return null;
56
+ return new ReplaceStep(newFrom, newTo, this.slice);
57
+ }
58
+ toJSON() {
59
+ return {
60
+ kind: 'replace',
61
+ data: { from: this.from, to: this.to, slice: this.slice.toJSON() },
62
+ };
63
+ }
64
+ static fromJSON(schema, data) {
65
+ const from = data.from;
66
+ const to = data.to;
67
+ const slice = Slice.fromJSON(schema, data.slice);
68
+ return new ReplaceStep(from, to, slice);
69
+ }
70
+ }
71
+ registerStep('replace', ReplaceStep);
72
+ //# sourceMappingURL=replace-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace-step.js","sourceRoot":"","sources":["../../src/transform/replace-step.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { DxNode } from '../model/node.js';
2
+ import type { Slice } from '../model/slice.js';
3
+ /**
4
+ * Replace doc-content range [from, to) with `slice`.
5
+ *
6
+ * Strategy:
7
+ * 1. Resolve from/to.
8
+ * 2. If both endpoints share the same parent and the slice is purely-inline
9
+ * (openStart === openEnd === slice.content.depth() or 0/1), splice
10
+ * children at parentOffset.
11
+ * 3. Else if the endpoints are at depth 0 (between blocks) and the slice
12
+ * has openStart === openEnd === 0, splice whole blocks at the doc level.
13
+ * 4. Else if from and to straddle a block boundary inside the same depth-0
14
+ * parent (typical "delete across paragraphs"), join the two ancestor blocks.
15
+ * 5. Else throw — multi-depth structural transformations are unsupported in v0.1.
16
+ */
17
+ export declare function replace(doc: DxNode, from: number, to: number, slice: Slice): DxNode;
18
+ //# sourceMappingURL=replace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.d.ts","sourceRoot":"","sources":["../../src/transform/replace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAIzC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CA8BnF"}
@@ -0,0 +1,132 @@
1
+ import { Fragment } from '../model/fragment.js';
2
+ import { DxNode } from '../model/node.js';
3
+ import { sameSet } from '../model/mark.js';
4
+ import { resolve, ResolvedPos } from '../model/position.js';
5
+ /**
6
+ * Replace doc-content range [from, to) with `slice`.
7
+ *
8
+ * Strategy:
9
+ * 1. Resolve from/to.
10
+ * 2. If both endpoints share the same parent and the slice is purely-inline
11
+ * (openStart === openEnd === slice.content.depth() or 0/1), splice
12
+ * children at parentOffset.
13
+ * 3. Else if the endpoints are at depth 0 (between blocks) and the slice
14
+ * has openStart === openEnd === 0, splice whole blocks at the doc level.
15
+ * 4. Else if from and to straddle a block boundary inside the same depth-0
16
+ * parent (typical "delete across paragraphs"), join the two ancestor blocks.
17
+ * 5. Else throw — multi-depth structural transformations are unsupported in v0.1.
18
+ */
19
+ export function replace(doc, from, to, slice) {
20
+ if (from < 0 || to > doc.content.size || from > to) {
21
+ throw new RangeError(`replace: invalid range [${from}, ${to}) for doc size ${doc.content.size}`);
22
+ }
23
+ const rFrom = resolve(doc, from);
24
+ const rTo = resolve(doc, to);
25
+ // --- Case 1: both endpoints in same parent (most common: typing, intra-block edits) ---
26
+ if (rFrom.depth === rTo.depth && rFrom.depth > 0 && rFrom.node(rFrom.depth - 1) === rTo.node(rTo.depth - 1) && rFrom.parent === rTo.parent) {
27
+ // The slice must be inline-compatible with the parent: either empty,
28
+ // or openStart === openEnd <= 1 (a flat inline slice or a same-level cut).
29
+ if (slice.content.size === 0 || (slice.openStart <= 1 && slice.openEnd <= 1)) {
30
+ return spliceInline(doc, rFrom, rTo, slice);
31
+ }
32
+ }
33
+ // --- Case 2: doc-level whole-block splice ---
34
+ if (rFrom.depth === 0 && rTo.depth === 0 && slice.openStart === 0 && slice.openEnd === 0) {
35
+ return spliceBlocks(doc, from, to, slice);
36
+ }
37
+ // --- Case 3: cross-block deletion at depth 0..1 (join paragraphs) ---
38
+ if (rFrom.depth === 1 && rTo.depth === 1 && rFrom.node(0) === rTo.node(0) && rFrom.parent !== rTo.parent && slice.content.size === 0) {
39
+ return joinBlocks(doc, rFrom, rTo);
40
+ }
41
+ // --- Case 4: same-parent at depth 0 between blocks, slice with open boundaries on inline level ---
42
+ // Not yet needed for v0.1's typing path; explicitly unsupported.
43
+ throw new Error(`replace: unsupported slice/range combination (depths ${rFrom.depth}/${rTo.depth}, openStart=${slice.openStart}, openEnd=${slice.openEnd})`);
44
+ }
45
+ function spliceInline(doc, rFrom, rTo, slice) {
46
+ const parent = rFrom.parent;
47
+ const before = parent.cut(0, rFrom.parentOffset).content;
48
+ const after = parent.cut(rTo.parentOffset, parent.content.size).content;
49
+ const inserted = slice.content;
50
+ const newParentContent = mergeAdjacentText(before.append(inserted).append(after));
51
+ const newParent = parent.copy(newParentContent);
52
+ return replaceNodeAtDepth(doc, rFrom, newParent);
53
+ }
54
+ function mergeAdjacentText(frag) {
55
+ if (frag.childCount < 2)
56
+ return frag;
57
+ const out = [];
58
+ for (let i = 0; i < frag.childCount; i++) {
59
+ const c = frag.child(i);
60
+ const prev = out[out.length - 1];
61
+ if (prev && prev.isText && c.isText && prev.type === c.type && marksEq(prev.marks, c.marks)) {
62
+ out[out.length - 1] = DxNode.text(prev.type, prev.text + c.text, prev.marks);
63
+ }
64
+ else {
65
+ out.push(c);
66
+ }
67
+ }
68
+ return Fragment.from(out);
69
+ }
70
+ function marksEq(a, b) {
71
+ return sameSet(a, b);
72
+ }
73
+ function spliceBlocks(doc, from, to, slice) {
74
+ // At doc-level boundaries, from and to land between block children.
75
+ // Compute child indices: walk doc.content, accumulate nodeSize, find boundaries.
76
+ const indices = boundaryIndices(doc, from, to);
77
+ const before = doc.content.children.slice(0, indices.fromIndex);
78
+ const after = doc.content.children.slice(indices.toIndex);
79
+ const inserted = slice.content.children;
80
+ return doc.copy(Fragment.from([...before, ...inserted, ...after]));
81
+ }
82
+ function joinBlocks(doc, rFrom, rTo) {
83
+ // Trim head of rFrom.parent, trim tail of rTo.parent, concatenate inline content into a single block.
84
+ const headBlock = rFrom.parent;
85
+ const tailBlock = rTo.parent;
86
+ const headContent = headBlock.cut(0, rFrom.parentOffset).content;
87
+ const tailContent = tailBlock.cut(rTo.parentOffset, tailBlock.content.size).content;
88
+ const merged = headBlock.copy(mergeAdjacentText(headContent.append(tailContent)));
89
+ // Replace the head block in the doc and drop everything from head+1 .. tail inclusive.
90
+ const docContent = doc.content;
91
+ const headIndex = rFrom.index(1);
92
+ const tailIndex = rTo.index(1);
93
+ const newChildren = [
94
+ ...docContent.children.slice(0, headIndex),
95
+ merged,
96
+ ...docContent.children.slice(tailIndex + 1),
97
+ ];
98
+ return doc.copy(Fragment.from(newChildren));
99
+ }
100
+ function replaceNodeAtDepth(_doc, r, replacement) {
101
+ // Bubble the replacement up the ancestor chain, rebuilding parents as we go.
102
+ let current = replacement;
103
+ for (let d = r.depth - 1; d >= 0; d--) {
104
+ const parentAtD = r.node(d);
105
+ const childIndex = r.index(d + 1);
106
+ const children = [...parentAtD.content.children];
107
+ children[childIndex] = current;
108
+ current = parentAtD.copy(Fragment.from(children));
109
+ }
110
+ return current;
111
+ }
112
+ function boundaryIndices(doc, from, to) {
113
+ let offset = 0;
114
+ let fromIndex = -1;
115
+ let toIndex = -1;
116
+ for (let i = 0; i < doc.content.childCount; i++) {
117
+ if (offset === from)
118
+ fromIndex = i;
119
+ if (offset === to)
120
+ toIndex = i;
121
+ offset += doc.content.child(i).nodeSize;
122
+ }
123
+ if (offset === from)
124
+ fromIndex = doc.content.childCount;
125
+ if (offset === to)
126
+ toIndex = doc.content.childCount;
127
+ if (fromIndex < 0 || toIndex < 0) {
128
+ throw new Error(`replace: positions ${from}/${to} are not on block boundaries`);
129
+ }
130
+ return { fromIndex, toIndex };
131
+ }
132
+ //# sourceMappingURL=replace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.js","sourceRoot":"","sources":["../../src/transform/replace.ts"],"names":[],"mappings":"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"}