punctilio 5.1.2 → 5.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/prose-view.d.ts.map +1 -1
- package/dist/prose-view.js +24 -8
- package/dist/prose-view.js.map +1 -1
- package/package.json +1 -1
- package/src/prose-view.ts +323 -223
package/README.md
CHANGED
|
@@ -231,7 +231,7 @@ A `.pre-commit-hooks.yaml` ships in the package, so [pre-commit](https://pre-com
|
|
|
231
231
|
# .pre-commit-config.yaml
|
|
232
232
|
repos:
|
|
233
233
|
- repo: https://github.com/alexander-turner/punctilio
|
|
234
|
-
rev: v5.1.
|
|
234
|
+
rev: v5.1.2
|
|
235
235
|
hooks:
|
|
236
236
|
- id: punctilio # rewrites *.md / *.html in place
|
|
237
237
|
- id: punctilio-check # or: fail without writing (CI-friendly)
|
package/dist/prose-view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prose-view.d.ts","sourceRoot":"","sources":["../src/prose-view.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"prose-view.d.ts","sourceRoot":"","sources":["../src/prose-view.ts"],"names":[],"mappings":"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"}
|
package/dist/prose-view.js
CHANGED
|
@@ -62,8 +62,12 @@ class ProseViewImpl {
|
|
|
62
62
|
* tie-breaking shorter spans first so a zero-length edit sorts before a
|
|
63
63
|
* spanning edit at the same start. A pure insertion may therefore coexist
|
|
64
64
|
* with a replacement starting at the same offset: the insertion's text lands
|
|
65
|
-
* before the replaced span's text. Overlapping spans
|
|
66
|
-
* insertions at the same offset
|
|
65
|
+
* before the replaced span's text. Overlapping spans are rejected, as are two
|
|
66
|
+
* pure insertions at the same offset that share a `bind` — those would land in
|
|
67
|
+
* the same node with no defined order. Two same-offset insertions with
|
|
68
|
+
* opposite `bind` are unambiguous: `bind: "left"` routes to the node ending at
|
|
69
|
+
* the offset and `bind: "right"` to the node starting there, so they occupy
|
|
70
|
+
* different nodes (left-bound sorted first).
|
|
67
71
|
*
|
|
68
72
|
* All edits are distributed in a single left-to-right pass that rebuilds
|
|
69
73
|
* each node's value once — per-edit string surgery would be quadratic on
|
|
@@ -73,15 +77,22 @@ class ProseViewImpl {
|
|
|
73
77
|
if (this.edits.length === 0) {
|
|
74
78
|
return;
|
|
75
79
|
}
|
|
76
|
-
const
|
|
80
|
+
const bindRank = (edit) => edit.bind === "left" ? 0 : 1;
|
|
81
|
+
const sorted = [...this.edits].sort((a, b) => a.start - b.start ||
|
|
82
|
+
a.end - a.start - (b.end - b.start) ||
|
|
83
|
+
bindRank(a) - bindRank(b));
|
|
77
84
|
for (let i = 1; i < sorted.length; i++) {
|
|
78
85
|
const prev = sorted[i - 1];
|
|
79
86
|
const curr = sorted[i];
|
|
80
87
|
if (prev.end > curr.start) {
|
|
81
88
|
throw new Error(`Overlapping edits: [${prev.start}, ${prev.end}) and [${curr.start}, ${curr.end}).`);
|
|
82
89
|
}
|
|
83
|
-
if (prev.end === curr.start &&
|
|
84
|
-
|
|
90
|
+
if (prev.end === curr.start &&
|
|
91
|
+
prev.start === prev.end &&
|
|
92
|
+
curr.start === curr.end &&
|
|
93
|
+
prev.bind === curr.bind) {
|
|
94
|
+
throw new Error(`Two pure insertions at the same offset ${curr.start} with bind "${curr.bind}" are ` +
|
|
95
|
+
`ambiguous; combine them.`);
|
|
85
96
|
}
|
|
86
97
|
}
|
|
87
98
|
// Node spans in `text` via cumulative lengths.
|
|
@@ -201,13 +212,15 @@ function lowerBound(values, target) {
|
|
|
201
212
|
}
|
|
202
213
|
/** True iff some interior boundary falls strictly inside the match span. */
|
|
203
214
|
function matchContainsBoundary(match, view) {
|
|
204
|
-
return firstInteriorBoundary(view, match.index, match.index + match[0].length) >= 0;
|
|
215
|
+
return (firstInteriorBoundary(view, match.index, match.index + match[0].length) >= 0);
|
|
205
216
|
}
|
|
206
217
|
/** Smallest node boundary strictly inside (start, end), or -1 when none. */
|
|
207
218
|
export function firstInteriorBoundary(view, start, end) {
|
|
208
219
|
const boundaries = view.boundaries;
|
|
209
220
|
const first = lowerBound(boundaries, start + 1);
|
|
210
|
-
return first < boundaries.length && boundaries[first] < end
|
|
221
|
+
return first < boundaries.length && boundaries[first] < end
|
|
222
|
+
? boundaries[first]
|
|
223
|
+
: -1;
|
|
211
224
|
}
|
|
212
225
|
/** Largest node boundary strictly less than `offset`, or -1 when none. O(log n). */
|
|
213
226
|
export function lastBoundaryBefore(view, offset) {
|
|
@@ -311,7 +324,10 @@ function parseDollarToken(template, dollarIndex) {
|
|
|
311
324
|
throw new Error(`Unsupported group reference $${digits} in replacement template ` +
|
|
312
325
|
`${JSON.stringify(template)}; numbered groups start at $1.`);
|
|
313
326
|
}
|
|
314
|
-
return {
|
|
327
|
+
return {
|
|
328
|
+
part: { kind: "indexed", index, fallback },
|
|
329
|
+
next: dollarIndex + 1 + digits.length,
|
|
330
|
+
};
|
|
315
331
|
}
|
|
316
332
|
if (next === "<") {
|
|
317
333
|
const close = template.indexOf(">", dollarIndex + 2);
|
package/dist/prose-view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prose-view.js","sourceRoot":"","sources":["../src/prose-view.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prose-view.js","sourceRoot":"","sources":["../src/prose-view.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/prose-view.ts
CHANGED
|
@@ -1,93 +1,107 @@
|
|
|
1
1
|
export interface ProseNode {
|
|
2
|
-
value: string
|
|
2
|
+
value: string;
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
export interface ProseView {
|
|
6
6
|
/** Concatenation of the nodes' values. No markers, ever. */
|
|
7
|
-
readonly text: string
|
|
7
|
+
readonly text: string;
|
|
8
8
|
/** Offsets in `text` where one source node ends and the next begins (interior boundaries only; length = nodes.length - 1; may contain duplicates when nodes are empty). */
|
|
9
|
-
readonly boundaries: readonly number[]
|
|
9
|
+
readonly boundaries: readonly number[];
|
|
10
10
|
/** True iff a node edge falls at exactly this offset. O(log n) binary search. */
|
|
11
|
-
hasBoundary(offset: number): boolean
|
|
11
|
+
hasBoundary(offset: number): boolean;
|
|
12
12
|
/** Queue an edit replacing [start, end) with `text`. Edits must not overlap; enforced at commit. */
|
|
13
|
-
replace(
|
|
13
|
+
replace(
|
|
14
|
+
start: number,
|
|
15
|
+
end: number,
|
|
16
|
+
text: string,
|
|
17
|
+
opts?: { bind?: "left" | "right" },
|
|
18
|
+
): void;
|
|
14
19
|
/** Apply queued edits back onto the source nodes (mutating their `value`s), then recompute `text`/`boundaries`. The view supports arbitrarily many queue/commit cycles. */
|
|
15
|
-
commit(): void
|
|
20
|
+
commit(): void;
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
interface QueuedEdit {
|
|
19
|
-
start: number
|
|
20
|
-
end: number
|
|
21
|
-
text: string
|
|
22
|
-
bind: "left" | "right"
|
|
24
|
+
start: number;
|
|
25
|
+
end: number;
|
|
26
|
+
text: string;
|
|
27
|
+
bind: "left" | "right";
|
|
23
28
|
}
|
|
24
29
|
|
|
25
30
|
/** True iff the offset falls between a high surrogate and its low surrogate. */
|
|
26
31
|
function splitsSurrogatePair(text: string, offset: number): boolean {
|
|
27
|
-
if (offset <= 0 || offset >= text.length) return false
|
|
28
|
-
const high = text.charCodeAt(offset - 1)
|
|
29
|
-
const low = text.charCodeAt(offset)
|
|
30
|
-
return high >= 0xd800 && high <= 0xdbff && low >= 0xdc00 && low <= 0xdfff
|
|
32
|
+
if (offset <= 0 || offset >= text.length) return false;
|
|
33
|
+
const high = text.charCodeAt(offset - 1);
|
|
34
|
+
const low = text.charCodeAt(offset);
|
|
35
|
+
return high >= 0xd800 && high <= 0xdbff && low >= 0xdc00 && low <= 0xdfff;
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
class ProseViewImpl implements ProseView {
|
|
34
|
-
private readonly nodes: ProseNode[]
|
|
35
|
-
private cachedText: string
|
|
36
|
-
private cachedBoundaries: number[]
|
|
37
|
-
private edits: QueuedEdit[] = []
|
|
39
|
+
private readonly nodes: ProseNode[];
|
|
40
|
+
private cachedText: string;
|
|
41
|
+
private cachedBoundaries: number[];
|
|
42
|
+
private edits: QueuedEdit[] = [];
|
|
38
43
|
|
|
39
44
|
constructor(nodes: ProseNode[]) {
|
|
40
|
-
this.nodes = nodes
|
|
41
|
-
this.cachedText = ""
|
|
42
|
-
this.cachedBoundaries = []
|
|
43
|
-
this.refresh()
|
|
45
|
+
this.nodes = nodes;
|
|
46
|
+
this.cachedText = "";
|
|
47
|
+
this.cachedBoundaries = [];
|
|
48
|
+
this.refresh();
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
get text(): string {
|
|
47
|
-
return this.cachedText
|
|
52
|
+
return this.cachedText;
|
|
48
53
|
}
|
|
49
54
|
|
|
50
55
|
get boundaries(): readonly number[] {
|
|
51
|
-
return this.cachedBoundaries
|
|
56
|
+
return this.cachedBoundaries;
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
/** Recompute `text` and `boundaries` from the current node values. */
|
|
55
60
|
private refresh(): void {
|
|
56
|
-
let text = ""
|
|
57
|
-
const boundaries: number[] = []
|
|
61
|
+
let text = "";
|
|
62
|
+
const boundaries: number[] = [];
|
|
58
63
|
this.nodes.forEach((node, index) => {
|
|
59
|
-
text += node.value
|
|
64
|
+
text += node.value;
|
|
60
65
|
if (index < this.nodes.length - 1) {
|
|
61
|
-
boundaries.push(text.length)
|
|
66
|
+
boundaries.push(text.length);
|
|
62
67
|
}
|
|
63
|
-
})
|
|
64
|
-
this.cachedText = text
|
|
65
|
-
this.cachedBoundaries = boundaries
|
|
68
|
+
});
|
|
69
|
+
this.cachedText = text;
|
|
70
|
+
this.cachedBoundaries = boundaries;
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
hasBoundary(offset: number): boolean {
|
|
69
|
-
const boundaries = this.cachedBoundaries
|
|
70
|
-
const first = lowerBound(boundaries, offset)
|
|
71
|
-
return first < boundaries.length && boundaries[first] === offset
|
|
74
|
+
const boundaries = this.cachedBoundaries;
|
|
75
|
+
const first = lowerBound(boundaries, offset);
|
|
76
|
+
return first < boundaries.length && boundaries[first] === offset;
|
|
72
77
|
}
|
|
73
78
|
|
|
74
|
-
replace(
|
|
79
|
+
replace(
|
|
80
|
+
start: number,
|
|
81
|
+
end: number,
|
|
82
|
+
text: string,
|
|
83
|
+
opts?: { bind?: "left" | "right" },
|
|
84
|
+
): void {
|
|
75
85
|
if (!Number.isInteger(start) || !Number.isInteger(end)) {
|
|
76
|
-
throw new Error(
|
|
86
|
+
throw new Error(
|
|
87
|
+
`replace() offsets must be integers, got start=${start}, end=${end}.`,
|
|
88
|
+
);
|
|
77
89
|
}
|
|
78
90
|
if (start < 0 || start > end || end > this.cachedText.length) {
|
|
79
91
|
throw new Error(
|
|
80
92
|
`replace() requires 0 <= start <= end <= text.length (${this.cachedText.length}), ` +
|
|
81
|
-
|
|
82
|
-
)
|
|
93
|
+
`got start=${start}, end=${end}.`,
|
|
94
|
+
);
|
|
83
95
|
}
|
|
84
96
|
if (splitsSurrogatePair(this.cachedText, start)) {
|
|
85
|
-
throw new Error(
|
|
97
|
+
throw new Error(
|
|
98
|
+
`replace() start=${start} splits a UTF-16 surrogate pair.`,
|
|
99
|
+
);
|
|
86
100
|
}
|
|
87
101
|
if (splitsSurrogatePair(this.cachedText, end)) {
|
|
88
|
-
throw new Error(`replace() end=${end} splits a UTF-16 surrogate pair.`)
|
|
102
|
+
throw new Error(`replace() end=${end} splits a UTF-16 surrogate pair.`);
|
|
89
103
|
}
|
|
90
|
-
this.edits.push({ start, end, text, bind: opts?.bind ?? "left" })
|
|
104
|
+
this.edits.push({ start, end, text, bind: opts?.bind ?? "left" });
|
|
91
105
|
}
|
|
92
106
|
|
|
93
107
|
/**
|
|
@@ -95,8 +109,12 @@ class ProseViewImpl implements ProseView {
|
|
|
95
109
|
* tie-breaking shorter spans first so a zero-length edit sorts before a
|
|
96
110
|
* spanning edit at the same start. A pure insertion may therefore coexist
|
|
97
111
|
* with a replacement starting at the same offset: the insertion's text lands
|
|
98
|
-
* before the replaced span's text. Overlapping spans
|
|
99
|
-
* insertions at the same offset
|
|
112
|
+
* before the replaced span's text. Overlapping spans are rejected, as are two
|
|
113
|
+
* pure insertions at the same offset that share a `bind` — those would land in
|
|
114
|
+
* the same node with no defined order. Two same-offset insertions with
|
|
115
|
+
* opposite `bind` are unambiguous: `bind: "left"` routes to the node ending at
|
|
116
|
+
* the offset and `bind: "right"` to the node starting there, so they occupy
|
|
117
|
+
* different nodes (left-bound sorted first).
|
|
100
118
|
*
|
|
101
119
|
* All edits are distributed in a single left-to-right pass that rebuilds
|
|
102
120
|
* each node's value once — per-edit string surgery would be quadratic on
|
|
@@ -104,73 +122,86 @@ class ProseViewImpl implements ProseView {
|
|
|
104
122
|
*/
|
|
105
123
|
commit(): void {
|
|
106
124
|
if (this.edits.length === 0) {
|
|
107
|
-
return
|
|
125
|
+
return;
|
|
108
126
|
}
|
|
109
127
|
|
|
128
|
+
const bindRank = (edit: QueuedEdit): number =>
|
|
129
|
+
edit.bind === "left" ? 0 : 1;
|
|
110
130
|
const sorted = [...this.edits].sort(
|
|
111
|
-
(a, b) =>
|
|
112
|
-
|
|
131
|
+
(a, b) =>
|
|
132
|
+
a.start - b.start ||
|
|
133
|
+
a.end - a.start - (b.end - b.start) ||
|
|
134
|
+
bindRank(a) - bindRank(b),
|
|
135
|
+
);
|
|
113
136
|
for (let i = 1; i < sorted.length; i++) {
|
|
114
|
-
const prev = sorted[i - 1]
|
|
115
|
-
const curr = sorted[i]
|
|
137
|
+
const prev = sorted[i - 1];
|
|
138
|
+
const curr = sorted[i];
|
|
116
139
|
if (prev.end > curr.start) {
|
|
117
140
|
throw new Error(
|
|
118
|
-
`Overlapping edits: [${prev.start}, ${prev.end}) and [${curr.start}, ${curr.end})
|
|
119
|
-
)
|
|
141
|
+
`Overlapping edits: [${prev.start}, ${prev.end}) and [${curr.start}, ${curr.end}).`,
|
|
142
|
+
);
|
|
120
143
|
}
|
|
121
|
-
if (
|
|
144
|
+
if (
|
|
145
|
+
prev.end === curr.start &&
|
|
146
|
+
prev.start === prev.end &&
|
|
147
|
+
curr.start === curr.end &&
|
|
148
|
+
prev.bind === curr.bind
|
|
149
|
+
) {
|
|
122
150
|
throw new Error(
|
|
123
|
-
`Two pure insertions at the same offset ${curr.start} are
|
|
124
|
-
|
|
151
|
+
`Two pure insertions at the same offset ${curr.start} with bind "${curr.bind}" are ` +
|
|
152
|
+
`ambiguous; combine them.`,
|
|
153
|
+
);
|
|
125
154
|
}
|
|
126
155
|
}
|
|
127
156
|
|
|
128
157
|
// Node spans in `text` via cumulative lengths.
|
|
129
|
-
const starts: number[] = []
|
|
130
|
-
const ends: number[] = []
|
|
131
|
-
let cursor = 0
|
|
158
|
+
const starts: number[] = [];
|
|
159
|
+
const ends: number[] = [];
|
|
160
|
+
let cursor = 0;
|
|
132
161
|
for (const node of this.nodes) {
|
|
133
|
-
starts.push(cursor)
|
|
134
|
-
cursor += node.value.length
|
|
135
|
-
ends.push(cursor)
|
|
162
|
+
starts.push(cursor);
|
|
163
|
+
cursor += node.value.length;
|
|
164
|
+
ends.push(cursor);
|
|
136
165
|
}
|
|
137
166
|
|
|
138
|
-
const text = this.cachedText
|
|
139
|
-
const parts: string[][] = this.nodes.map(() => [])
|
|
167
|
+
const text = this.cachedText;
|
|
168
|
+
const parts: string[][] = this.nodes.map(() => []);
|
|
140
169
|
|
|
141
170
|
// Rolling copy state: kept text in [0, copiedUpTo) has been distributed.
|
|
142
|
-
let copiedUpTo = 0
|
|
143
|
-
let copyNode = 0
|
|
171
|
+
let copiedUpTo = 0;
|
|
172
|
+
let copyNode = 0;
|
|
144
173
|
const copyUpTo = (target: number): void => {
|
|
145
174
|
while (copiedUpTo < target) {
|
|
146
|
-
while (copyNode < this.nodes.length - 1 && ends[copyNode] <= copiedUpTo)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
copiedUpTo
|
|
175
|
+
while (copyNode < this.nodes.length - 1 && ends[copyNode] <= copiedUpTo)
|
|
176
|
+
copyNode++;
|
|
177
|
+
const sliceEnd = Math.min(target, ends[copyNode]);
|
|
178
|
+
parts[copyNode].push(text.slice(copiedUpTo, sliceEnd));
|
|
179
|
+
copiedUpTo = sliceEnd;
|
|
150
180
|
}
|
|
151
|
-
}
|
|
181
|
+
};
|
|
152
182
|
|
|
153
183
|
for (const edit of sorted) {
|
|
154
|
-
copyUpTo(edit.start)
|
|
184
|
+
copyUpTo(edit.start);
|
|
155
185
|
// Deleted spans are simply never copied; replacement/insertion text
|
|
156
186
|
// lands in the target node, whose parts are filled exactly up to
|
|
157
187
|
// `edit.start` at this point.
|
|
158
188
|
if (edit.text.length > 0) {
|
|
159
|
-
const targetIndex =
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
189
|
+
const targetIndex =
|
|
190
|
+
edit.end > edit.start
|
|
191
|
+
? this.nodeContainingChar(edit.start, ends)
|
|
192
|
+
: this.targetNodeForInsertion(edit, ends);
|
|
193
|
+
parts[targetIndex].push(edit.text);
|
|
163
194
|
}
|
|
164
|
-
if (edit.end > copiedUpTo) copiedUpTo = edit.end
|
|
195
|
+
if (edit.end > copiedUpTo) copiedUpTo = edit.end;
|
|
165
196
|
}
|
|
166
|
-
copyUpTo(text.length)
|
|
197
|
+
copyUpTo(text.length);
|
|
167
198
|
|
|
168
199
|
this.nodes.forEach((node, index) => {
|
|
169
|
-
node.value = parts[index].join("")
|
|
170
|
-
})
|
|
200
|
+
node.value = parts[index].join("");
|
|
201
|
+
});
|
|
171
202
|
|
|
172
|
-
this.edits = []
|
|
173
|
-
this.refresh()
|
|
203
|
+
this.edits = [];
|
|
204
|
+
this.refresh();
|
|
174
205
|
}
|
|
175
206
|
|
|
176
207
|
/**
|
|
@@ -179,31 +210,31 @@ class ProseViewImpl implements ProseView {
|
|
|
179
210
|
* the offset are skipped, matching a first-containing-span linear scan).
|
|
180
211
|
*/
|
|
181
212
|
private nodeContainingChar(offset: number, ends: number[]): number {
|
|
182
|
-
let low = 0
|
|
183
|
-
let high = ends.length - 1
|
|
213
|
+
let low = 0;
|
|
214
|
+
let high = ends.length - 1;
|
|
184
215
|
while (low < high) {
|
|
185
|
-
const mid = (low + high) >>> 1
|
|
216
|
+
const mid = (low + high) >>> 1;
|
|
186
217
|
if (ends[mid] <= offset) {
|
|
187
|
-
low = mid + 1
|
|
218
|
+
low = mid + 1;
|
|
188
219
|
} else {
|
|
189
|
-
high = mid
|
|
220
|
+
high = mid;
|
|
190
221
|
}
|
|
191
222
|
}
|
|
192
|
-
return low
|
|
223
|
+
return low;
|
|
193
224
|
}
|
|
194
225
|
|
|
195
226
|
private targetNodeForInsertion(edit: QueuedEdit, ends: number[]): number {
|
|
196
227
|
if (edit.bind === "left") {
|
|
197
|
-
if (edit.start === 0) return 0
|
|
198
|
-
return this.nodeContainingChar(edit.start - 1, ends)
|
|
228
|
+
if (edit.start === 0) return 0;
|
|
229
|
+
return this.nodeContainingChar(edit.start - 1, ends);
|
|
199
230
|
}
|
|
200
|
-
if (edit.start === this.cachedText.length) return this.nodes.length - 1
|
|
201
|
-
return this.nodeContainingChar(edit.start, ends)
|
|
231
|
+
if (edit.start === this.cachedText.length) return this.nodes.length - 1;
|
|
232
|
+
return this.nodeContainingChar(edit.start, ends);
|
|
202
233
|
}
|
|
203
234
|
}
|
|
204
235
|
|
|
205
236
|
export function buildProseView(nodes: ProseNode[]): ProseView {
|
|
206
|
-
return new ProseViewImpl(nodes)
|
|
237
|
+
return new ProseViewImpl(nodes);
|
|
207
238
|
}
|
|
208
239
|
|
|
209
240
|
/**
|
|
@@ -212,27 +243,30 @@ export function buildProseView(nodes: ProseNode[]): ProseView {
|
|
|
212
243
|
* group; an empty list yields no groups. Used to isolate opaque-delimited
|
|
213
244
|
* segments so a pass never sees text as adjacent across removed content.
|
|
214
245
|
*/
|
|
215
|
-
export function splitAtIndices<T>(
|
|
246
|
+
export function splitAtIndices<T>(
|
|
247
|
+
items: readonly T[],
|
|
248
|
+
breakBefore: ReadonlySet<number>,
|
|
249
|
+
): T[][] {
|
|
216
250
|
if (breakBefore.size === 0) {
|
|
217
|
-
return items.length > 0 ? [items.slice()] : []
|
|
251
|
+
return items.length > 0 ? [items.slice()] : [];
|
|
218
252
|
}
|
|
219
|
-
const groups: T[][] = []
|
|
220
|
-
let start = 0
|
|
253
|
+
const groups: T[][] = [];
|
|
254
|
+
let start = 0;
|
|
221
255
|
for (let i = 1; i < items.length; i++) {
|
|
222
256
|
if (breakBefore.has(i)) {
|
|
223
|
-
groups.push(items.slice(start, i))
|
|
224
|
-
start = i
|
|
257
|
+
groups.push(items.slice(start, i));
|
|
258
|
+
start = i;
|
|
225
259
|
}
|
|
226
260
|
}
|
|
227
|
-
groups.push(items.slice(start))
|
|
228
|
-
return groups
|
|
261
|
+
groups.push(items.slice(start));
|
|
262
|
+
return groups;
|
|
229
263
|
}
|
|
230
264
|
|
|
231
265
|
export interface ReplaceAllOptions {
|
|
232
266
|
/** Opt-in: allow a match that contains an interior node boundary. Default: such matches are skipped. */
|
|
233
|
-
allowBoundaries?: (match: RegExpExecArray, view: ProseView) => boolean
|
|
267
|
+
allowBoundaries?: (match: RegExpExecArray, view: ProseView) => boolean;
|
|
234
268
|
/** For pure-insertion edits produced by the replacer (rare), bind side. */
|
|
235
|
-
bind?: "left" | "right"
|
|
269
|
+
bind?: "left" | "right";
|
|
236
270
|
}
|
|
237
271
|
|
|
238
272
|
/**
|
|
@@ -241,33 +275,44 @@ export interface ReplaceAllOptions {
|
|
|
241
275
|
* linear scan here would make inline-element-heavy views O(text × nodes).
|
|
242
276
|
*/
|
|
243
277
|
function lowerBound(values: readonly number[], target: number): number {
|
|
244
|
-
let low = 0
|
|
245
|
-
let high = values.length
|
|
278
|
+
let low = 0;
|
|
279
|
+
let high = values.length;
|
|
246
280
|
while (low < high) {
|
|
247
|
-
const mid = (low + high) >>> 1
|
|
248
|
-
if (values[mid] < target) low = mid + 1
|
|
249
|
-
else high = mid
|
|
281
|
+
const mid = (low + high) >>> 1;
|
|
282
|
+
if (values[mid] < target) low = mid + 1;
|
|
283
|
+
else high = mid;
|
|
250
284
|
}
|
|
251
|
-
return low
|
|
285
|
+
return low;
|
|
252
286
|
}
|
|
253
287
|
|
|
254
288
|
/** True iff some interior boundary falls strictly inside the match span. */
|
|
255
|
-
function matchContainsBoundary(
|
|
256
|
-
|
|
289
|
+
function matchContainsBoundary(
|
|
290
|
+
match: RegExpExecArray,
|
|
291
|
+
view: ProseView,
|
|
292
|
+
): boolean {
|
|
293
|
+
return (
|
|
294
|
+
firstInteriorBoundary(view, match.index, match.index + match[0].length) >= 0
|
|
295
|
+
);
|
|
257
296
|
}
|
|
258
297
|
|
|
259
298
|
/** Smallest node boundary strictly inside (start, end), or -1 when none. */
|
|
260
|
-
export function firstInteriorBoundary(
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
299
|
+
export function firstInteriorBoundary(
|
|
300
|
+
view: ProseView,
|
|
301
|
+
start: number,
|
|
302
|
+
end: number,
|
|
303
|
+
): number {
|
|
304
|
+
const boundaries = view.boundaries;
|
|
305
|
+
const first = lowerBound(boundaries, start + 1);
|
|
306
|
+
return first < boundaries.length && boundaries[first] < end
|
|
307
|
+
? boundaries[first]
|
|
308
|
+
: -1;
|
|
264
309
|
}
|
|
265
310
|
|
|
266
311
|
/** Largest node boundary strictly less than `offset`, or -1 when none. O(log n). */
|
|
267
312
|
export function lastBoundaryBefore(view: ProseView, offset: number): number {
|
|
268
|
-
const boundaries = view.boundaries
|
|
269
|
-
const first = lowerBound(boundaries, offset)
|
|
270
|
-
return first > 0 ? boundaries[first - 1] : -1
|
|
313
|
+
const boundaries = view.boundaries;
|
|
314
|
+
const first = lowerBound(boundaries, offset);
|
|
315
|
+
return first > 0 ? boundaries[first - 1] : -1;
|
|
271
316
|
}
|
|
272
317
|
|
|
273
318
|
/**
|
|
@@ -282,23 +327,27 @@ export function interiorBoundariesWithin(
|
|
|
282
327
|
end: number,
|
|
283
328
|
allowedSlots: readonly number[],
|
|
284
329
|
): boolean {
|
|
285
|
-
const boundaries = view.boundaries
|
|
286
|
-
for (
|
|
287
|
-
|
|
330
|
+
const boundaries = view.boundaries;
|
|
331
|
+
for (
|
|
332
|
+
let i = lowerBound(boundaries, start + 1);
|
|
333
|
+
i < boundaries.length && boundaries[i] < end;
|
|
334
|
+
i++
|
|
335
|
+
) {
|
|
336
|
+
if (!allowedSlots.includes(boundaries[i])) return false;
|
|
288
337
|
}
|
|
289
|
-
return true
|
|
338
|
+
return true;
|
|
290
339
|
}
|
|
291
340
|
|
|
292
341
|
/** Count of node boundaries that fall at exactly `offset` (empty nodes stack). */
|
|
293
342
|
export function boundaryCountAt(view: ProseView, offset: number): number {
|
|
294
|
-
const boundaries = view.boundaries
|
|
295
|
-
let i = lowerBound(boundaries, offset)
|
|
296
|
-
let count = 0
|
|
343
|
+
const boundaries = view.boundaries;
|
|
344
|
+
let i = lowerBound(boundaries, offset);
|
|
345
|
+
let count = 0;
|
|
297
346
|
while (i < boundaries.length && boundaries[i] === offset) {
|
|
298
|
-
count
|
|
299
|
-
i
|
|
347
|
+
count++;
|
|
348
|
+
i++;
|
|
300
349
|
}
|
|
301
|
-
return count
|
|
350
|
+
return count;
|
|
302
351
|
}
|
|
303
352
|
|
|
304
353
|
/**
|
|
@@ -306,8 +355,11 @@ export function boundaryCountAt(view: ProseView, offset: number): number {
|
|
|
306
355
|
* position exceeds the single-boundary tolerance the passes allow in an
|
|
307
356
|
* editing slot.
|
|
308
357
|
*/
|
|
309
|
-
export function exceedsSingleBoundary(
|
|
310
|
-
|
|
358
|
+
export function exceedsSingleBoundary(
|
|
359
|
+
view: ProseView,
|
|
360
|
+
offset: number,
|
|
361
|
+
): boolean {
|
|
362
|
+
return boundaryCountAt(view, offset) > 1;
|
|
311
363
|
}
|
|
312
364
|
|
|
313
365
|
export function replaceAllInView(
|
|
@@ -317,30 +369,37 @@ export function replaceAllInView(
|
|
|
317
369
|
options?: ReplaceAllOptions,
|
|
318
370
|
): void {
|
|
319
371
|
if (!regex.global) {
|
|
320
|
-
throw new Error(
|
|
372
|
+
throw new Error(
|
|
373
|
+
"replaceAllInView() requires a regex with the global (g) flag.",
|
|
374
|
+
);
|
|
321
375
|
}
|
|
322
376
|
|
|
323
|
-
const allowBoundaries = options?.allowBoundaries
|
|
324
|
-
const bind = options?.bind
|
|
325
|
-
const text = view.text
|
|
326
|
-
regex.lastIndex = 0
|
|
377
|
+
const allowBoundaries = options?.allowBoundaries;
|
|
378
|
+
const bind = options?.bind;
|
|
379
|
+
const text = view.text;
|
|
380
|
+
regex.lastIndex = 0;
|
|
327
381
|
|
|
328
|
-
let match: RegExpExecArray | null
|
|
382
|
+
let match: RegExpExecArray | null;
|
|
329
383
|
while ((match = regex.exec(text)) !== null) {
|
|
330
384
|
if (match[0].length === 0) {
|
|
331
|
-
regex.lastIndex += 1
|
|
385
|
+
regex.lastIndex += 1;
|
|
332
386
|
}
|
|
333
387
|
|
|
334
388
|
if (matchContainsBoundary(match, view) && !allowBoundaries?.(match, view)) {
|
|
335
|
-
continue
|
|
389
|
+
continue;
|
|
336
390
|
}
|
|
337
391
|
|
|
338
|
-
const replacement = replacer(match, view)
|
|
392
|
+
const replacement = replacer(match, view);
|
|
339
393
|
if (replacement === null) {
|
|
340
|
-
continue
|
|
394
|
+
continue;
|
|
341
395
|
}
|
|
342
396
|
|
|
343
|
-
view.replace(
|
|
397
|
+
view.replace(
|
|
398
|
+
match.index,
|
|
399
|
+
match.index + match[0].length,
|
|
400
|
+
replacement,
|
|
401
|
+
bind ? { bind } : undefined,
|
|
402
|
+
);
|
|
344
403
|
}
|
|
345
404
|
}
|
|
346
405
|
|
|
@@ -348,12 +407,15 @@ export function replaceAllInView(
|
|
|
348
407
|
* String↔view bridge: builds a single-node ProseView over `text`, runs `run`
|
|
349
408
|
* against it, commits any queued edits, and returns the resulting text.
|
|
350
409
|
*/
|
|
351
|
-
export function withProseView(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
410
|
+
export function withProseView(
|
|
411
|
+
text: string,
|
|
412
|
+
run: (view: ProseView) => void,
|
|
413
|
+
): string {
|
|
414
|
+
const node: ProseNode = { value: text };
|
|
415
|
+
const view = buildProseView([node]);
|
|
416
|
+
run(view);
|
|
417
|
+
view.commit();
|
|
418
|
+
return node.value;
|
|
357
419
|
}
|
|
358
420
|
|
|
359
421
|
/**
|
|
@@ -362,9 +424,9 @@ export function withProseView(text: string, run: (view: ProseView) => void): str
|
|
|
362
424
|
* edits committed onto it in place.
|
|
363
425
|
*/
|
|
364
426
|
export type ProsePass = {
|
|
365
|
-
(input: string): string
|
|
366
|
-
(input: ProseView): void
|
|
367
|
-
}
|
|
427
|
+
(input: string): string;
|
|
428
|
+
(input: ProseView): void;
|
|
429
|
+
};
|
|
368
430
|
|
|
369
431
|
export interface DefinePassOptions {
|
|
370
432
|
/**
|
|
@@ -377,64 +439,78 @@ export interface DefinePassOptions {
|
|
|
377
439
|
* - predicate: forwarded as `allowBoundaries` to {@link replaceAllInView};
|
|
378
440
|
* return `true` to allow that particular boundary-spanning match.
|
|
379
441
|
*/
|
|
380
|
-
boundaries?:
|
|
442
|
+
boundaries?:
|
|
443
|
+
| "skip"
|
|
444
|
+
| "allow"
|
|
445
|
+
| ((match: RegExpExecArray, view: ProseView) => boolean);
|
|
381
446
|
}
|
|
382
447
|
|
|
383
448
|
type ReplacementPart =
|
|
384
449
|
| { kind: "literal"; text: string }
|
|
385
450
|
| { kind: "whole" }
|
|
386
|
-
| {
|
|
387
|
-
|
|
451
|
+
| {
|
|
452
|
+
kind: "indexed";
|
|
453
|
+
index: number;
|
|
454
|
+
fallback?: { index: number; literal: string };
|
|
455
|
+
}
|
|
456
|
+
| { kind: "named"; name: string };
|
|
388
457
|
|
|
389
458
|
function isAsciiDigit(char: string | undefined): char is string {
|
|
390
|
-
return char !== undefined && char >= "0" && char <= "9"
|
|
459
|
+
return char !== undefined && char >= "0" && char <= "9";
|
|
391
460
|
}
|
|
392
461
|
|
|
393
462
|
/** Parses the `$`-token starting at `dollarIndex`; returns the part and the offset past it. */
|
|
394
|
-
function parseDollarToken(
|
|
463
|
+
function parseDollarToken(
|
|
464
|
+
template: string,
|
|
465
|
+
dollarIndex: number,
|
|
466
|
+
): { part: ReplacementPart; next: number } {
|
|
395
467
|
const unsupported = (): Error =>
|
|
396
468
|
new Error(
|
|
397
469
|
`Unsupported "$" form in replacement template ${JSON.stringify(template)}; ` +
|
|
398
|
-
|
|
399
|
-
)
|
|
470
|
+
`supported forms are $$, $&, $1-$99, and $<name>.`,
|
|
471
|
+
);
|
|
400
472
|
|
|
401
|
-
const next = template[dollarIndex + 1]
|
|
473
|
+
const next = template[dollarIndex + 1];
|
|
402
474
|
if (next === "$") {
|
|
403
|
-
return { part: { kind: "literal", text: "$" }, next: dollarIndex + 2 }
|
|
475
|
+
return { part: { kind: "literal", text: "$" }, next: dollarIndex + 2 };
|
|
404
476
|
}
|
|
405
477
|
if (next === "&") {
|
|
406
|
-
return { part: { kind: "whole" }, next: dollarIndex + 2 }
|
|
478
|
+
return { part: { kind: "whole" }, next: dollarIndex + 2 };
|
|
407
479
|
}
|
|
408
480
|
if (isAsciiDigit(next)) {
|
|
409
481
|
const digits = isAsciiDigit(template[dollarIndex + 2])
|
|
410
482
|
? next + template[dollarIndex + 2]
|
|
411
|
-
: next
|
|
412
|
-
const index = parseInt(digits, 10)
|
|
483
|
+
: next;
|
|
484
|
+
const index = parseInt(digits, 10);
|
|
413
485
|
// `$12` means group 12 when it exists, otherwise group 1 followed by a
|
|
414
486
|
// literal "2" — matching String.replace. `$0`/`$00` reference nothing.
|
|
415
|
-
const fallbackIndex = parseInt(digits[0], 10)
|
|
416
|
-
const fallback =
|
|
417
|
-
|
|
418
|
-
|
|
487
|
+
const fallbackIndex = parseInt(digits[0], 10);
|
|
488
|
+
const fallback =
|
|
489
|
+
digits.length === 2 && fallbackIndex > 0
|
|
490
|
+
? { index: fallbackIndex, literal: digits[1] }
|
|
491
|
+
: undefined;
|
|
419
492
|
if (index === 0 && fallback === undefined) {
|
|
420
493
|
throw new Error(
|
|
421
494
|
`Unsupported group reference $${digits} in replacement template ` +
|
|
422
|
-
|
|
423
|
-
)
|
|
495
|
+
`${JSON.stringify(template)}; numbered groups start at $1.`,
|
|
496
|
+
);
|
|
424
497
|
}
|
|
425
|
-
return {
|
|
498
|
+
return {
|
|
499
|
+
part: { kind: "indexed", index, fallback },
|
|
500
|
+
next: dollarIndex + 1 + digits.length,
|
|
501
|
+
};
|
|
426
502
|
}
|
|
427
503
|
if (next === "<") {
|
|
428
|
-
const close = template.indexOf(">", dollarIndex + 2)
|
|
504
|
+
const close = template.indexOf(">", dollarIndex + 2);
|
|
429
505
|
if (close === -1 || close === dollarIndex + 2) {
|
|
430
|
-
throw unsupported()
|
|
506
|
+
throw unsupported();
|
|
431
507
|
}
|
|
432
508
|
return {
|
|
433
509
|
part: { kind: "named", name: template.slice(dollarIndex + 2, close) },
|
|
434
510
|
next: close + 1,
|
|
435
|
-
}
|
|
511
|
+
};
|
|
436
512
|
}
|
|
437
|
-
throw unsupported()
|
|
513
|
+
throw unsupported();
|
|
438
514
|
}
|
|
439
515
|
|
|
440
516
|
/**
|
|
@@ -444,29 +520,29 @@ function parseDollarToken(template: string, dollarIndex: number): { part: Replac
|
|
|
444
520
|
* `$'`, a bare or malformed `$`) throws rather than silently substituting.
|
|
445
521
|
*/
|
|
446
522
|
function parseReplacementTemplate(template: string): ReplacementPart[] {
|
|
447
|
-
const parts: ReplacementPart[] = []
|
|
448
|
-
let literalStart = 0
|
|
449
|
-
let i = 0
|
|
523
|
+
const parts: ReplacementPart[] = [];
|
|
524
|
+
let literalStart = 0;
|
|
525
|
+
let i = 0;
|
|
450
526
|
|
|
451
527
|
while (i < template.length) {
|
|
452
528
|
if (template[i] !== "$") {
|
|
453
|
-
i
|
|
454
|
-
continue
|
|
529
|
+
i++;
|
|
530
|
+
continue;
|
|
455
531
|
}
|
|
456
532
|
if (i > literalStart) {
|
|
457
|
-
parts.push({ kind: "literal", text: template.slice(literalStart, i) })
|
|
533
|
+
parts.push({ kind: "literal", text: template.slice(literalStart, i) });
|
|
458
534
|
}
|
|
459
|
-
const { part, next } = parseDollarToken(template, i)
|
|
460
|
-
parts.push(part)
|
|
461
|
-
i = next
|
|
462
|
-
literalStart = next
|
|
535
|
+
const { part, next } = parseDollarToken(template, i);
|
|
536
|
+
parts.push(part);
|
|
537
|
+
i = next;
|
|
538
|
+
literalStart = next;
|
|
463
539
|
}
|
|
464
540
|
|
|
465
541
|
if (template.length > literalStart) {
|
|
466
|
-
parts.push({ kind: "literal", text: template.slice(literalStart) })
|
|
542
|
+
parts.push({ kind: "literal", text: template.slice(literalStart) });
|
|
467
543
|
}
|
|
468
544
|
|
|
469
|
-
return parts
|
|
545
|
+
return parts;
|
|
470
546
|
}
|
|
471
547
|
|
|
472
548
|
/** Renders a numbered group reference, applying the `$12` → `$1` + "2" fallback. */
|
|
@@ -475,15 +551,15 @@ function renderIndexedPart(
|
|
|
475
551
|
match: RegExpExecArray,
|
|
476
552
|
): string {
|
|
477
553
|
if (part.index < match.length) {
|
|
478
|
-
return match[part.index] ?? ""
|
|
554
|
+
return match[part.index] ?? "";
|
|
479
555
|
}
|
|
480
556
|
if (part.fallback && part.fallback.index < match.length) {
|
|
481
|
-
return (match[part.fallback.index] ?? "") + part.fallback.literal
|
|
557
|
+
return (match[part.fallback.index] ?? "") + part.fallback.literal;
|
|
482
558
|
}
|
|
483
559
|
throw new Error(
|
|
484
560
|
`Replacement references group $${part.index} but the pattern only has ` +
|
|
485
|
-
|
|
486
|
-
)
|
|
561
|
+
`${match.length - 1} capture group(s).`,
|
|
562
|
+
);
|
|
487
563
|
}
|
|
488
564
|
|
|
489
565
|
/**
|
|
@@ -492,31 +568,33 @@ function renderIndexedPart(
|
|
|
492
568
|
* throws, while a defined group that simply did not participate in the match
|
|
493
569
|
* substitutes the empty string (as with String.replace).
|
|
494
570
|
*/
|
|
495
|
-
function compileReplacementTemplate(
|
|
496
|
-
|
|
571
|
+
function compileReplacementTemplate(
|
|
572
|
+
template: string,
|
|
573
|
+
): (match: RegExpExecArray) => string {
|
|
574
|
+
const parts = parseReplacementTemplate(template);
|
|
497
575
|
return (match) =>
|
|
498
576
|
parts
|
|
499
577
|
.map((part) => {
|
|
500
578
|
switch (part.kind) {
|
|
501
579
|
case "literal":
|
|
502
|
-
return part.text
|
|
580
|
+
return part.text;
|
|
503
581
|
case "whole":
|
|
504
|
-
return match[0]
|
|
582
|
+
return match[0];
|
|
505
583
|
case "indexed":
|
|
506
|
-
return renderIndexedPart(part, match)
|
|
584
|
+
return renderIndexedPart(part, match);
|
|
507
585
|
case "named": {
|
|
508
|
-
const groups = match.groups
|
|
586
|
+
const groups = match.groups;
|
|
509
587
|
if (!groups || !(part.name in groups)) {
|
|
510
588
|
throw new Error(
|
|
511
589
|
`Replacement references group $<${part.name}> but the pattern ` +
|
|
512
|
-
|
|
513
|
-
)
|
|
590
|
+
`has no capture group named "${part.name}".`,
|
|
591
|
+
);
|
|
514
592
|
}
|
|
515
|
-
return groups[part.name] ?? ""
|
|
593
|
+
return groups[part.name] ?? "";
|
|
516
594
|
}
|
|
517
595
|
}
|
|
518
596
|
})
|
|
519
|
-
.join("")
|
|
597
|
+
.join("");
|
|
520
598
|
}
|
|
521
599
|
|
|
522
600
|
/**
|
|
@@ -535,38 +613,48 @@ function compileReplacementTemplate(template: string): (match: RegExpExecArray)
|
|
|
535
613
|
*/
|
|
536
614
|
export function definePass(
|
|
537
615
|
pattern: RegExp,
|
|
538
|
-
replacement:
|
|
616
|
+
replacement:
|
|
617
|
+
| string
|
|
618
|
+
| ((match: RegExpExecArray, view: ProseView) => string | null),
|
|
539
619
|
options: DefinePassOptions = {},
|
|
540
620
|
): ProsePass {
|
|
541
621
|
if (!pattern.global) {
|
|
542
|
-
throw new Error(
|
|
622
|
+
throw new Error(
|
|
623
|
+
"definePass() requires a pattern with the global (g) flag.",
|
|
624
|
+
);
|
|
543
625
|
}
|
|
544
626
|
|
|
545
|
-
const boundaries = options.boundaries ?? "skip"
|
|
546
|
-
let allowBoundaries: ReplaceAllOptions["allowBoundaries"]
|
|
627
|
+
const boundaries = options.boundaries ?? "skip";
|
|
628
|
+
let allowBoundaries: ReplaceAllOptions["allowBoundaries"];
|
|
547
629
|
if (boundaries === "allow") {
|
|
548
|
-
allowBoundaries = () => true
|
|
630
|
+
allowBoundaries = () => true;
|
|
549
631
|
} else if (typeof boundaries === "function") {
|
|
550
|
-
allowBoundaries = boundaries
|
|
632
|
+
allowBoundaries = boundaries;
|
|
551
633
|
} else if (boundaries !== "skip") {
|
|
552
634
|
throw new Error(
|
|
553
635
|
`Invalid boundaries option: ${JSON.stringify(boundaries)}. ` +
|
|
554
|
-
|
|
555
|
-
)
|
|
636
|
+
`Must be "skip", "allow", or a predicate.`,
|
|
637
|
+
);
|
|
556
638
|
}
|
|
557
639
|
|
|
558
|
-
const replacer =
|
|
559
|
-
|
|
560
|
-
|
|
640
|
+
const replacer =
|
|
641
|
+
typeof replacement === "string"
|
|
642
|
+
? compileReplacementTemplate(replacement)
|
|
643
|
+
: replacement;
|
|
561
644
|
|
|
562
|
-
function pass(input: string): string
|
|
563
|
-
function pass(input: ProseView): void
|
|
645
|
+
function pass(input: string): string;
|
|
646
|
+
function pass(input: ProseView): void;
|
|
564
647
|
function pass(input: string | ProseView): string | void {
|
|
565
648
|
return overInput(input, (view) => {
|
|
566
|
-
replaceAllInView(
|
|
567
|
-
|
|
649
|
+
replaceAllInView(
|
|
650
|
+
view,
|
|
651
|
+
pattern,
|
|
652
|
+
replacer,
|
|
653
|
+
allowBoundaries ? { allowBoundaries } : undefined,
|
|
654
|
+
);
|
|
655
|
+
});
|
|
568
656
|
}
|
|
569
|
-
return pass
|
|
657
|
+
return pass;
|
|
570
658
|
}
|
|
571
659
|
|
|
572
660
|
/**
|
|
@@ -574,15 +662,27 @@ export function definePass(
|
|
|
574
662
|
* single-node view and returns the transformed string; a ProseView has the
|
|
575
663
|
* pass's edits queued and committed onto it in place (returns nothing).
|
|
576
664
|
*/
|
|
577
|
-
export function overInput(
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
665
|
+
export function overInput(
|
|
666
|
+
input: string,
|
|
667
|
+
run: (view: ProseView) => void,
|
|
668
|
+
): string;
|
|
669
|
+
export function overInput(
|
|
670
|
+
input: ProseView,
|
|
671
|
+
run: (view: ProseView) => void,
|
|
672
|
+
): void;
|
|
673
|
+
export function overInput(
|
|
674
|
+
input: string | ProseView,
|
|
675
|
+
run: (view: ProseView) => void,
|
|
676
|
+
): string | void;
|
|
677
|
+
export function overInput(
|
|
678
|
+
input: string | ProseView,
|
|
679
|
+
run: (view: ProseView) => void,
|
|
680
|
+
): string | void {
|
|
581
681
|
if (typeof input === "string") {
|
|
582
|
-
return withProseView(input, run)
|
|
682
|
+
return withProseView(input, run);
|
|
583
683
|
}
|
|
584
|
-
run(input)
|
|
585
|
-
input.commit()
|
|
684
|
+
run(input);
|
|
685
|
+
input.commit();
|
|
586
686
|
}
|
|
587
687
|
|
|
588
688
|
/**
|
|
@@ -592,10 +692,10 @@ export function overInput(input: string | ProseView, run: (view: ProseView) => v
|
|
|
592
692
|
* otherwise repeat.
|
|
593
693
|
*/
|
|
594
694
|
export function makeProsePass(run: (view: ProseView) => void): ProsePass {
|
|
595
|
-
function pass(input: string): string
|
|
596
|
-
function pass(input: ProseView): void
|
|
695
|
+
function pass(input: string): string;
|
|
696
|
+
function pass(input: ProseView): void;
|
|
597
697
|
function pass(input: string | ProseView): string | void {
|
|
598
|
-
return overInput(input, run)
|
|
698
|
+
return overInput(input, run);
|
|
599
699
|
}
|
|
600
|
-
return pass
|
|
700
|
+
return pass;
|
|
601
701
|
}
|