@nerd-bible/wordgard 0.5.3-beta4 → 0.5.3-beta5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/doc.js +49 -42
- package/dist/editor.d.ts +30 -136
- package/dist/editor.js +160 -568
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/schema.js +4 -4
- package/dist/set.d.ts +305 -0
- package/dist/set.js +814 -0
- package/dist/table.js +3 -3
- package/package.json +2 -11
package/dist/doc.js
CHANGED
|
@@ -2158,43 +2158,8 @@ class ChangeSet {
|
|
|
2158
2158
|
return fix ? set.compose(fix) : set;
|
|
2159
2159
|
}
|
|
2160
2160
|
compose(other) {
|
|
2161
|
-
let
|
|
2162
|
-
|
|
2163
|
-
let sections = [], data = [];
|
|
2164
|
-
let a = new SectionIter(sectionsA, dataA), b = new SectionIter(sectionsB, dataB);
|
|
2165
|
-
for (let open = false;;) {
|
|
2166
|
-
if (a.done && b.done) {
|
|
2167
|
-
return new ChangeSet(sections, data);
|
|
2168
|
-
}
|
|
2169
|
-
else if (a.ins == 0) { addSection(sections, data, a.len, 0, a.slice, open);
|
|
2170
|
-
a.next();
|
|
2171
|
-
}
|
|
2172
|
-
else if (b.len == 0 && !b.done) { addSection(sections, data, 0, b.ins, b.slice, open);
|
|
2173
|
-
b.next();
|
|
2174
|
-
}
|
|
2175
|
-
else if (a.done || b.done) {
|
|
2176
|
-
throw new ValidationError("Mismatched change set lengths");
|
|
2177
|
-
}
|
|
2178
|
-
else {
|
|
2179
|
-
let len = Math.min(a.len2, b.len), sectionLen = sections.length;
|
|
2180
|
-
if (a.keep && b.keep) {
|
|
2181
|
-
let mods = combineMods(a.mods, b.mods);
|
|
2182
|
-
addSection(sections, data, len, mods ? -2 : -1, mods, open);
|
|
2183
|
-
}
|
|
2184
|
-
else if (a.keep) {
|
|
2185
|
-
addSection(sections, data, len, b.off ? 0 : b.ins, b.off ? Slice.empty : b.slice, open);
|
|
2186
|
-
}
|
|
2187
|
-
else if (b.keep) {
|
|
2188
|
-
addSection(sections, data, a.off ? 0 : a.len, len, applyModsToSlice(a.slicePart(len), b.mods), open);
|
|
2189
|
-
}
|
|
2190
|
-
else {
|
|
2191
|
-
addSection(sections, data, a.off ? 0 : a.len, b.off ? 0 : b.ins, b.off ? Slice.empty : b.slice, open);
|
|
2192
|
-
}
|
|
2193
|
-
open = (a.ins > len || b.ins >= 0 && b.len > len) && (open || sections.length > sectionLen);
|
|
2194
|
-
a.forward2(len);
|
|
2195
|
-
b.forward(len);
|
|
2196
|
-
}
|
|
2197
|
-
}
|
|
2161
|
+
let { sections, data } = compose(this.sections, other.sections, this.data, other.data);
|
|
2162
|
+
return new ChangeSet(sections, data);
|
|
2198
2163
|
}
|
|
2199
2164
|
invert(doc) {
|
|
2200
2165
|
let sections = [], data = [];
|
|
@@ -2415,6 +2380,9 @@ class ChangeSet {
|
|
|
2415
2380
|
}
|
|
2416
2381
|
return result;
|
|
2417
2382
|
}
|
|
2383
|
+
static composeSections(a, b) {
|
|
2384
|
+
return compose(a, b).sections;
|
|
2385
|
+
}
|
|
2418
2386
|
static transform(doc, a, b) {
|
|
2419
2387
|
let { set: mA, fix } = transform(a, b, doc, true, true);
|
|
2420
2388
|
let mB = transform(b, a, doc, false, false).set;
|
|
@@ -2613,6 +2581,43 @@ function transform(setA, setB, doc, before, fit) {
|
|
|
2613
2581
|
}
|
|
2614
2582
|
}
|
|
2615
2583
|
}
|
|
2584
|
+
function compose(sectionsA, sectionsB, dataA, dataB) {
|
|
2585
|
+
let sections = [], data = dataA ? [] : null;
|
|
2586
|
+
let a = new SectionIter(sectionsA, dataA), b = new SectionIter(sectionsB, dataB);
|
|
2587
|
+
for (let open = false;;) {
|
|
2588
|
+
if (a.done && b.done) {
|
|
2589
|
+
return { sections, data };
|
|
2590
|
+
}
|
|
2591
|
+
else if (a.ins == 0) { addSection(sections, data, a.len, 0, a.slice, open);
|
|
2592
|
+
a.next();
|
|
2593
|
+
}
|
|
2594
|
+
else if (b.len == 0 && !b.done) { addSection(sections, data, 0, b.ins, b.slice, open);
|
|
2595
|
+
b.next();
|
|
2596
|
+
}
|
|
2597
|
+
else if (a.done || b.done) {
|
|
2598
|
+
throw new ValidationError("Mismatched change set lengths");
|
|
2599
|
+
}
|
|
2600
|
+
else {
|
|
2601
|
+
let len = Math.min(a.len2, b.len), sectionLen = sections.length;
|
|
2602
|
+
if (a.keep && b.keep) {
|
|
2603
|
+
let mods = combineMods(a.mods, b.mods);
|
|
2604
|
+
addSection(sections, data, len, (data ? mods : a.ins == -2 || b.ins == -2) ? -2 : -1, mods, open);
|
|
2605
|
+
}
|
|
2606
|
+
else if (a.keep) {
|
|
2607
|
+
addSection(sections, data, len, b.off ? 0 : b.ins, b.off ? Slice.empty : b.slice, open);
|
|
2608
|
+
}
|
|
2609
|
+
else if (b.keep) {
|
|
2610
|
+
addSection(sections, data, a.off ? 0 : a.len, len, data ? applyModsToSlice(a.slicePart(len), b.mods) : null, open);
|
|
2611
|
+
}
|
|
2612
|
+
else {
|
|
2613
|
+
addSection(sections, data, a.off ? 0 : a.len, b.off ? 0 : b.ins, b.off ? Slice.empty : b.slice, open);
|
|
2614
|
+
}
|
|
2615
|
+
open = (a.ins > len || b.ins >= 0 && b.len > len) && (open || sections.length > sectionLen);
|
|
2616
|
+
a.forward2(len);
|
|
2617
|
+
b.forward(len);
|
|
2618
|
+
}
|
|
2619
|
+
}
|
|
2620
|
+
}
|
|
2616
2621
|
function combineMods(a, b) {
|
|
2617
2622
|
return !a ? b : !b ? a : a.concat(b);
|
|
2618
2623
|
}
|
|
@@ -2972,10 +2977,10 @@ class SectionIter {
|
|
|
2972
2977
|
get done() { return this.ins == -3; }
|
|
2973
2978
|
get len2() { return this.ins < 0 ? this.len : this.ins; }
|
|
2974
2979
|
get mods() {
|
|
2975
|
-
return this.data[(this.i - 2) >> 1];
|
|
2980
|
+
return this.data ? this.data[(this.i - 2) >> 1] : null;
|
|
2976
2981
|
}
|
|
2977
2982
|
get slice() {
|
|
2978
|
-
return this.data[(this.i - 2) >> 1];
|
|
2983
|
+
return this.data ? this.data[(this.i - 2) >> 1] : Slice.empty;
|
|
2979
2984
|
}
|
|
2980
2985
|
slicePart(len) {
|
|
2981
2986
|
return this.slice.slice(this.off, len == null ? undefined : this.off + len);
|
|
@@ -3004,7 +3009,7 @@ function addSection(sections, data, len, ins, value, forceJoin = false) {
|
|
|
3004
3009
|
return;
|
|
3005
3010
|
let last = sections.length - 2;
|
|
3006
3011
|
if (last >= 0 && ins <= 0 && ins == sections[last + 1]) {
|
|
3007
|
-
let lastValue = data[data.length - 1];
|
|
3012
|
+
let lastValue = data ? data[data.length - 1] : null;
|
|
3008
3013
|
let match = ins == 0 ? true
|
|
3009
3014
|
: value ? lastValue && compareModifications(lastValue, value)
|
|
3010
3015
|
: !lastValue;
|
|
@@ -3016,11 +3021,13 @@ function addSection(sections, data, len, ins, value, forceJoin = false) {
|
|
|
3016
3021
|
if (forceJoin || last >= 0 && len == 0 && sections[last] == 0) {
|
|
3017
3022
|
sections[last] += len;
|
|
3018
3023
|
sections[last + 1] += ins;
|
|
3019
|
-
|
|
3024
|
+
if (data)
|
|
3025
|
+
data[data.length - 1] = data[data.length - 1].concat(value);
|
|
3020
3026
|
}
|
|
3021
3027
|
else {
|
|
3022
3028
|
sections.push(len, ins);
|
|
3023
|
-
data
|
|
3029
|
+
if (data)
|
|
3030
|
+
data.push(value);
|
|
3024
3031
|
}
|
|
3025
3032
|
}
|
|
3026
3033
|
function finishCx(cx, schema) {
|
package/dist/editor.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { GardState, TextblockMap, Transaction, GardSelection } from 'wordgard/st
|
|
|
4
4
|
import { PhraseSet } from 'wordgard/phrases';
|
|
5
5
|
import { StyleModule, StyleSpec } from 'style-mod';
|
|
6
6
|
import { Command, Menu } from 'wordgard/command';
|
|
7
|
+
import { PointSet, RangeSet } from 'wordgard/set';
|
|
7
8
|
|
|
8
9
|
type MakeSelectionStyle = (wg: Wordgard, event: MouseEvent) => Wordgard.MouseSelectionStyle | null;
|
|
9
10
|
|
|
@@ -250,6 +251,21 @@ declare namespace Decoration {
|
|
|
250
251
|
keep your set in a state field and update it incrementally.
|
|
251
252
|
*/
|
|
252
253
|
static source: GardState.Facet<(state: GardState) => PointSet<Point>, readonly ((state: GardState) => PointSet<Point>)[]>;
|
|
254
|
+
/**
|
|
255
|
+
Create a {@link PointSet} from an array or source function of
|
|
256
|
+
point decorations.
|
|
257
|
+
*/
|
|
258
|
+
static set(source: PointSet.Source<Point>): Point.Set;
|
|
259
|
+
/**
|
|
260
|
+
The empty set of point decorations.
|
|
261
|
+
*/
|
|
262
|
+
static none: Point.Set;
|
|
263
|
+
}
|
|
264
|
+
namespace Point {
|
|
265
|
+
/**
|
|
266
|
+
The type used for sets of point decorations.
|
|
267
|
+
*/
|
|
268
|
+
type Set = PointSet<Point>;
|
|
253
269
|
}
|
|
254
270
|
/**
|
|
255
271
|
Range decorations apply to a document range. They are stored in
|
|
@@ -280,7 +296,16 @@ declare namespace Decoration {
|
|
|
280
296
|
range sets on the fly will not perform well, so you'll often
|
|
281
297
|
want to store these in a state field.
|
|
282
298
|
*/
|
|
283
|
-
static source: GardState.Facet<(state: GardState) =>
|
|
299
|
+
static source: GardState.Facet<(state: GardState) => Range.Set, readonly ((state: GardState) => Range.Set)[]>;
|
|
300
|
+
/**
|
|
301
|
+
Create a {@link RangeSet} from an array or source function of
|
|
302
|
+
range decorations.
|
|
303
|
+
*/
|
|
304
|
+
static set(source: RangeSet.Source<Range>): Range.Set;
|
|
305
|
+
/**
|
|
306
|
+
The empty set of range decorations.
|
|
307
|
+
*/
|
|
308
|
+
static none: Range.Set;
|
|
284
309
|
}
|
|
285
310
|
namespace Range {
|
|
286
311
|
/**
|
|
@@ -324,141 +349,10 @@ declare namespace Decoration {
|
|
|
324
349
|
*/
|
|
325
350
|
spanning?: boolean;
|
|
326
351
|
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
Data structure used to store sets of points and then track them
|
|
331
|
-
across document changes. Mostly used for {@link Decoration.Point
|
|
332
|
-
point decorations}, but can also track your own types, if you make
|
|
333
|
-
sure they implement the {@link PointSet.Value} interface.
|
|
334
|
-
*/
|
|
335
|
-
declare class PointSet<T extends PointSet.Value = PointSet.Value> {
|
|
336
|
-
/**
|
|
337
|
-
The values in this set.
|
|
338
|
-
*/
|
|
339
|
-
readonly values: readonly T[];
|
|
340
|
-
/**
|
|
341
|
-
The positions of the values in this set.
|
|
342
|
-
*/
|
|
343
|
-
readonly positions: readonly number[];
|
|
344
|
-
private constructor();
|
|
345
|
-
/**
|
|
346
|
-
The number of points in this set.
|
|
347
|
-
*/
|
|
348
|
-
get length(): number;
|
|
349
|
-
/**
|
|
350
|
-
Adjust the points for a set of document changes. Returns a new
|
|
351
|
-
set with the adjusted points. May delete points when the content
|
|
352
|
-
around them was deleted.
|
|
353
|
-
*/
|
|
354
|
-
map(changes: ChangeSet, start?: number): PointSet<T>;
|
|
355
|
-
/**
|
|
356
|
-
Returns the union of this set and the given set. If
|
|
357
|
-
`maskFrom`/`maskTo` are given, drop any points from `this`
|
|
358
|
-
between or at those positions.
|
|
359
|
-
*/
|
|
360
|
-
merge(other: PointSet<T>, maskFrom?: number, maskTo?: number | undefined): PointSet<T>;
|
|
361
|
-
/**
|
|
362
|
-
Get the value at the given position, if any. If there's multiple
|
|
363
|
-
values at that position, the one with the lowest side is
|
|
364
|
-
returned.
|
|
365
|
-
*/
|
|
366
|
-
at(pos: number): T | undefined;
|
|
367
|
-
/**
|
|
368
|
-
Create a point set from an iterable of `[position, value]`
|
|
369
|
-
tuples, or a function that calls its argument for every point to
|
|
370
|
-
add.
|
|
371
|
-
*/
|
|
372
|
-
static create<T extends PointSet.Value>(source: Iterable<[number, T]> | ((add: (pos: number, value: T) => void) => void)): PointSet<T>;
|
|
373
|
-
/**
|
|
374
|
-
The empty point set.
|
|
375
|
-
*/
|
|
376
|
-
static empty: PointSet<any>;
|
|
377
|
-
}
|
|
378
|
-
declare namespace PointSet {
|
|
379
|
-
/**
|
|
380
|
-
Objects stored in a point set must conform to this interface.
|
|
381
|
-
*/
|
|
382
|
-
interface Value {
|
|
383
|
-
/**
|
|
384
|
-
The side of the point. Used to provide a sorting of points at
|
|
385
|
-
the same position
|
|
386
|
-
*/
|
|
387
|
-
side: number;
|
|
388
|
-
/**
|
|
389
|
-
Specifies whether the point should be deleted when content
|
|
390
|
-
next to it is deleted. See {@link ChangeSet.mapPos}.
|
|
391
|
-
*/
|
|
392
|
-
trackMode: ChangeSet.TrackMode | undefined;
|
|
393
|
-
/**
|
|
394
|
-
Method to compare this value to another.
|
|
395
|
-
*/
|
|
396
|
-
eq(other: PointSet.Value): boolean;
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
Data structure that stores sets of ranges, for use with {@link
|
|
401
|
-
Decoration.Range range decorations} or other data types
|
|
402
|
-
implementing {@link RangeSet.Value}.
|
|
403
|
-
*/
|
|
404
|
-
declare class RangeSet<T extends RangeSet.Value = RangeSet.Value> {
|
|
405
|
-
/**
|
|
406
|
-
The value associated with the ranges in the set.
|
|
407
|
-
*/
|
|
408
|
-
readonly values: readonly T[];
|
|
409
|
-
/**
|
|
410
|
-
The start positions of the ranges in this set.
|
|
411
|
-
*/
|
|
412
|
-
readonly from: readonly number[];
|
|
413
|
-
/**
|
|
414
|
-
The end positions of the ranges.
|
|
415
|
-
*/
|
|
416
|
-
readonly to: readonly number[];
|
|
417
|
-
private constructor();
|
|
418
|
-
/**
|
|
419
|
-
The number of ranges stored in this set.
|
|
420
|
-
*/
|
|
421
|
-
get length(): number;
|
|
422
|
-
/**
|
|
423
|
-
Adjust the positions of the ranges for the given change set.
|
|
424
|
-
Returns a set with the updated ranges.
|
|
425
|
-
*/
|
|
426
|
-
map(changes: ChangeSet, start?: number): RangeSet<T>;
|
|
427
|
-
/**
|
|
428
|
-
Merge this set with another set. If `maskFrom`/`maskTo` are
|
|
429
|
-
given, any ranges overlapping the masked range in `this` are
|
|
430
|
-
not included in the merged set.
|
|
431
|
-
*/
|
|
432
|
-
merge(other: RangeSet<T>, maskFrom?: number, maskTo?: number | undefined): RangeSet<T>;
|
|
433
|
-
/**
|
|
434
|
-
Create a range set from an iterable of `[from, to, value]`
|
|
435
|
-
tuples, or a function that calls its argument for every range to
|
|
436
|
-
add.
|
|
437
|
-
*/
|
|
438
|
-
static create<T extends RangeSet.Value>(source: Iterable<[number, number, T]> | ((add: (from: number, to: number, value: T) => void) => void)): RangeSet<T>;
|
|
439
|
-
/**
|
|
440
|
-
The empty range set.
|
|
441
|
-
*/
|
|
442
|
-
static empty: RangeSet<any>;
|
|
443
|
-
}
|
|
444
|
-
declare namespace RangeSet {
|
|
445
|
-
/**
|
|
446
|
-
Values stored in a range set must conform to this interface.
|
|
447
|
-
*/
|
|
448
|
-
interface Value {
|
|
449
|
-
/**
|
|
450
|
-
Whether content inserted at the start of this value's range is
|
|
451
|
-
included in the range.
|
|
452
|
-
*/
|
|
453
|
-
inclusiveStart: boolean;
|
|
454
|
-
/**
|
|
455
|
-
Whether content inserted at the end is included.
|
|
456
|
-
*/
|
|
457
|
-
inclusiveEnd: boolean;
|
|
458
352
|
/**
|
|
459
|
-
|
|
353
|
+
The type used for sets of point decorations.
|
|
460
354
|
*/
|
|
461
|
-
|
|
355
|
+
type Set = RangeSet<Range>;
|
|
462
356
|
}
|
|
463
357
|
}
|
|
464
358
|
|
|
@@ -511,7 +405,7 @@ declare abstract class Tile {
|
|
|
511
405
|
get isSpanning(): boolean;
|
|
512
406
|
get isComposition(): boolean;
|
|
513
407
|
get isPoint(): boolean;
|
|
514
|
-
get
|
|
408
|
+
get tag(): Node$1.Tag | null;
|
|
515
409
|
posBeforeChild(child: Tile, ownStart?: number): number;
|
|
516
410
|
get posBefore(): number;
|
|
517
411
|
get posAtStart(): number;
|
|
@@ -1938,4 +1832,4 @@ being dragged over the editor.
|
|
|
1938
1832
|
*/
|
|
1939
1833
|
declare function dropCursor(): GardState.Extension;
|
|
1940
1834
|
|
|
1941
|
-
export { Decoration, Dialog, InputRule, KeyBinding, Panel,
|
|
1835
|
+
export { Decoration, Dialog, InputRule, KeyBinding, Panel, Tooltip, Widget, Wordgard, dropCursor, menuBar, placeholder };
|