@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.
- package/LICENSE +21 -0
- package/README.md +81 -0
- package/dist/collab/port.d.ts +46 -0
- package/dist/collab/port.d.ts.map +1 -0
- package/dist/collab/port.js +11 -0
- package/dist/collab/port.js.map +1 -0
- package/dist/commands/block-commands.d.ts +62 -0
- package/dist/commands/block-commands.d.ts.map +1 -0
- package/dist/commands/block-commands.js +208 -0
- package/dist/commands/block-commands.js.map +1 -0
- package/dist/commands/command.d.ts +13 -0
- package/dist/commands/command.d.ts.map +1 -0
- package/dist/commands/command.js +13 -0
- package/dist/commands/command.js.map +1 -0
- package/dist/commands/edit-commands.d.ts +5 -0
- package/dist/commands/edit-commands.d.ts.map +1 -0
- package/dist/commands/edit-commands.js +147 -0
- package/dist/commands/edit-commands.js.map +1 -0
- package/dist/commands/image-commands.d.ts +31 -0
- package/dist/commands/image-commands.d.ts.map +1 -0
- package/dist/commands/image-commands.js +130 -0
- package/dist/commands/image-commands.js.map +1 -0
- package/dist/commands/index.d.ts +11 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/keymap.d.ts +34 -0
- package/dist/commands/keymap.d.ts.map +1 -0
- package/dist/commands/keymap.js +84 -0
- package/dist/commands/keymap.js.map +1 -0
- package/dist/commands/link-commands.d.ts +54 -0
- package/dist/commands/link-commands.d.ts.map +1 -0
- package/dist/commands/link-commands.js +151 -0
- package/dist/commands/link-commands.js.map +1 -0
- package/dist/commands/list-commands.d.ts +42 -0
- package/dist/commands/list-commands.d.ts.map +1 -0
- package/dist/commands/list-commands.js +316 -0
- package/dist/commands/list-commands.js.map +1 -0
- package/dist/commands/mark-commands.d.ts +53 -0
- package/dist/commands/mark-commands.d.ts.map +1 -0
- package/dist/commands/mark-commands.js +181 -0
- package/dist/commands/mark-commands.js.map +1 -0
- package/dist/commands/selection-commands.d.ts +3 -0
- package/dist/commands/selection-commands.d.ts.map +1 -0
- package/dist/commands/selection-commands.js +11 -0
- package/dist/commands/selection-commands.js.map +1 -0
- package/dist/commands/table-commands.d.ts +109 -0
- package/dist/commands/table-commands.d.ts.map +1 -0
- package/dist/commands/table-commands.js +884 -0
- package/dist/commands/table-commands.js.map +1 -0
- package/dist/history/history.d.ts +40 -0
- package/dist/history/history.d.ts.map +1 -0
- package/dist/history/history.js +139 -0
- package/dist/history/history.js.map +1 -0
- package/dist/history/index.d.ts +2 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +2 -0
- package/dist/history/index.js.map +1 -0
- package/dist/html/index.d.ts +3 -0
- package/dist/html/index.d.ts.map +1 -0
- package/dist/html/index.js +3 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/parse.d.ts +4 -0
- package/dist/html/parse.d.ts.map +1 -0
- package/dist/html/parse.js +0 -0
- package/dist/html/parse.js.map +1 -0
- package/dist/html/serialize.d.ts +4 -0
- package/dist/html/serialize.d.ts.map +1 -0
- package/dist/html/serialize.js +75 -0
- package/dist/html/serialize.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/index.d.ts +6 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +6 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/layout-engine.d.ts +20 -0
- package/dist/layout/layout-engine.d.ts.map +1 -0
- package/dist/layout/layout-engine.js +198 -0
- package/dist/layout/layout-engine.js.map +1 -0
- package/dist/layout/measure.d.ts +9 -0
- package/dist/layout/measure.d.ts.map +1 -0
- package/dist/layout/measure.js +37 -0
- package/dist/layout/measure.js.map +1 -0
- package/dist/layout/split-paragraph.d.ts +28 -0
- package/dist/layout/split-paragraph.d.ts.map +1 -0
- package/dist/layout/split-paragraph.js +122 -0
- package/dist/layout/split-paragraph.js.map +1 -0
- package/dist/layout/split-table.d.ts +46 -0
- package/dist/layout/split-table.d.ts.map +1 -0
- package/dist/layout/split-table.js +84 -0
- package/dist/layout/split-table.js.map +1 -0
- package/dist/layout/types.d.ts +73 -0
- package/dist/layout/types.d.ts.map +1 -0
- package/dist/layout/types.js +36 -0
- package/dist/layout/types.js.map +1 -0
- package/dist/layout/widow-orphan.d.ts +15 -0
- package/dist/layout/widow-orphan.d.ts.map +1 -0
- package/dist/layout/widow-orphan.js +14 -0
- package/dist/layout/widow-orphan.js.map +1 -0
- package/dist/model/content-expr.d.ts +32 -0
- package/dist/model/content-expr.d.ts.map +1 -0
- package/dist/model/content-expr.js +106 -0
- package/dist/model/content-expr.js.map +1 -0
- package/dist/model/fragment.d.ts +17 -0
- package/dist/model/fragment.d.ts.map +1 -0
- package/dist/model/fragment.js +44 -0
- package/dist/model/fragment.js.map +1 -0
- package/dist/model/index.d.ts +10 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +10 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/mark.d.ts +35 -0
- package/dist/model/mark.d.ts.map +1 -0
- package/dist/model/mark.js +89 -0
- package/dist/model/mark.js.map +1 -0
- package/dist/model/node-type.d.ts +36 -0
- package/dist/model/node-type.d.ts.map +1 -0
- package/dist/model/node-type.js +14 -0
- package/dist/model/node-type.js.map +1 -0
- package/dist/model/node.d.ts +36 -0
- package/dist/model/node.d.ts.map +1 -0
- package/dist/model/node.js +192 -0
- package/dist/model/node.js.map +1 -0
- package/dist/model/position.d.ts +66 -0
- package/dist/model/position.d.ts.map +1 -0
- package/dist/model/position.js +158 -0
- package/dist/model/position.js.map +1 -0
- package/dist/model/schema.d.ts +28 -0
- package/dist/model/schema.d.ts.map +1 -0
- package/dist/model/schema.js +195 -0
- package/dist/model/schema.js.map +1 -0
- package/dist/model/slice.d.ts +26 -0
- package/dist/model/slice.d.ts.map +1 -0
- package/dist/model/slice.js +56 -0
- package/dist/model/slice.js.map +1 -0
- package/dist/model/table-grid.d.ts +71 -0
- package/dist/model/table-grid.d.ts.map +1 -0
- package/dist/model/table-grid.js +130 -0
- package/dist/model/table-grid.js.map +1 -0
- package/dist/plugin/index.d.ts +3 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +3 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/plugin-key.d.ts +13 -0
- package/dist/plugin/plugin-key.d.ts.map +1 -0
- package/dist/plugin/plugin-key.js +13 -0
- package/dist/plugin/plugin-key.js.map +1 -0
- package/dist/plugin/plugin-state.d.ts +2 -0
- package/dist/plugin/plugin-state.d.ts.map +1 -0
- package/dist/plugin/plugin-state.js +3 -0
- package/dist/plugin/plugin-state.js.map +1 -0
- package/dist/plugin/plugin.d.ts +39 -0
- package/dist/plugin/plugin.d.ts.map +1 -0
- package/dist/plugin/plugin.js +10 -0
- package/dist/plugin/plugin.js.map +1 -0
- package/dist/schema/default.d.ts +163 -0
- package/dist/schema/default.d.ts.map +1 -0
- package/dist/schema/default.js +94 -0
- package/dist/schema/default.js.map +1 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/serialize/index.d.ts +2 -0
- package/dist/serialize/index.d.ts.map +1 -0
- package/dist/serialize/index.js +2 -0
- package/dist/serialize/index.js.map +1 -0
- package/dist/serialize/json.d.ts +15 -0
- package/dist/serialize/json.d.ts.map +1 -0
- package/dist/serialize/json.js +23 -0
- package/dist/serialize/json.js.map +1 -0
- package/dist/state/all-selection.d.ts +11 -0
- package/dist/state/all-selection.d.ts.map +1 -0
- package/dist/state/all-selection.js +17 -0
- package/dist/state/all-selection.js.map +1 -0
- package/dist/state/cell-selection.d.ts +30 -0
- package/dist/state/cell-selection.d.ts.map +1 -0
- package/dist/state/cell-selection.js +38 -0
- package/dist/state/cell-selection.js.map +1 -0
- package/dist/state/editor-state.d.ts +46 -0
- package/dist/state/editor-state.d.ts.map +1 -0
- package/dist/state/editor-state.js +211 -0
- package/dist/state/editor-state.js.map +1 -0
- package/dist/state/index.d.ts +7 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/node-selection.d.ts +16 -0
- package/dist/state/node-selection.d.ts.map +1 -0
- package/dist/state/node-selection.js +51 -0
- package/dist/state/node-selection.js.map +1 -0
- package/dist/state/selection.d.ts +29 -0
- package/dist/state/selection.d.ts.map +1 -0
- package/dist/state/selection.js +24 -0
- package/dist/state/selection.js.map +1 -0
- package/dist/state/text-selection.d.ts +10 -0
- package/dist/state/text-selection.d.ts.map +1 -0
- package/dist/state/text-selection.js +26 -0
- package/dist/state/text-selection.js.map +1 -0
- package/dist/transform/attr-step.d.ts +16 -0
- package/dist/transform/attr-step.d.ts.map +1 -0
- package/dist/transform/attr-step.js +98 -0
- package/dist/transform/attr-step.js.map +1 -0
- package/dist/transform/index.d.ts +10 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +10 -0
- package/dist/transform/index.js.map +1 -0
- package/dist/transform/mapping.d.ts +44 -0
- package/dist/transform/mapping.d.ts.map +1 -0
- package/dist/transform/mapping.js +101 -0
- package/dist/transform/mapping.js.map +1 -0
- package/dist/transform/mark-step.d.ts +27 -0
- package/dist/transform/mark-step.d.ts.map +1 -0
- package/dist/transform/mark-step.js +146 -0
- package/dist/transform/mark-step.js.map +1 -0
- package/dist/transform/replace-around-step.d.ts +35 -0
- package/dist/transform/replace-around-step.d.ts.map +1 -0
- package/dist/transform/replace-around-step.js +144 -0
- package/dist/transform/replace-around-step.js.map +1 -0
- package/dist/transform/replace-step.d.ts +17 -0
- package/dist/transform/replace-step.d.ts.map +1 -0
- package/dist/transform/replace-step.js +72 -0
- package/dist/transform/replace-step.js.map +1 -0
- package/dist/transform/replace.d.ts +18 -0
- package/dist/transform/replace.d.ts.map +1 -0
- package/dist/transform/replace.js +132 -0
- package/dist/transform/replace.js.map +1 -0
- package/dist/transform/set-page-meta-step.d.ts +42 -0
- package/dist/transform/set-page-meta-step.d.ts.map +1 -0
- package/dist/transform/set-page-meta-step.js +75 -0
- package/dist/transform/set-page-meta-step.js.map +1 -0
- package/dist/transform/step.d.ts +34 -0
- package/dist/transform/step.d.ts.map +1 -0
- package/dist/transform/step.js +23 -0
- package/dist/transform/step.js.map +1 -0
- package/dist/transform/transaction.d.ts +20 -0
- package/dist/transform/transaction.d.ts.map +1 -0
- package/dist/transform/transaction.js +38 -0
- package/dist/transform/transaction.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/view/cell-drag.d.ts +33 -0
- package/dist/view/cell-drag.d.ts.map +1 -0
- package/dist/view/cell-drag.js +177 -0
- package/dist/view/cell-drag.js.map +1 -0
- package/dist/view/clipboard.d.ts +5 -0
- package/dist/view/clipboard.d.ts.map +1 -0
- package/dist/view/clipboard.js +97 -0
- package/dist/view/clipboard.js.map +1 -0
- package/dist/view/default-renderer.d.ts +3 -0
- package/dist/view/default-renderer.d.ts.map +1 -0
- package/dist/view/default-renderer.js +142 -0
- package/dist/view/default-renderer.js.map +1 -0
- package/dist/view/dom-spec.d.ts +11 -0
- package/dist/view/dom-spec.d.ts.map +1 -0
- package/dist/view/dom-spec.js +32 -0
- package/dist/view/dom-spec.js.map +1 -0
- package/dist/view/editor-view.d.ts +55 -0
- package/dist/view/editor-view.d.ts.map +1 -0
- package/dist/view/editor-view.js +143 -0
- package/dist/view/editor-view.js.map +1 -0
- package/dist/view/image-resize.d.ts +37 -0
- package/dist/view/image-resize.d.ts.map +1 -0
- package/dist/view/image-resize.js +191 -0
- package/dist/view/image-resize.js.map +1 -0
- package/dist/view/index.d.ts +15 -0
- package/dist/view/index.d.ts.map +1 -0
- package/dist/view/index.js +15 -0
- package/dist/view/index.js.map +1 -0
- package/dist/view/input-pipeline.d.ts +24 -0
- package/dist/view/input-pipeline.d.ts.map +1 -0
- package/dist/view/input-pipeline.js +226 -0
- package/dist/view/input-pipeline.js.map +1 -0
- package/dist/view/mutation-observer.d.ts +17 -0
- package/dist/view/mutation-observer.d.ts.map +1 -0
- package/dist/view/mutation-observer.js +62 -0
- package/dist/view/mutation-observer.js.map +1 -0
- package/dist/view/page-slots.d.ts +56 -0
- package/dist/view/page-slots.d.ts.map +1 -0
- package/dist/view/page-slots.js +230 -0
- package/dist/view/page-slots.js.map +1 -0
- package/dist/view/paginator.d.ts +17 -0
- package/dist/view/paginator.d.ts.map +1 -0
- package/dist/view/paginator.js +93 -0
- package/dist/view/paginator.js.map +1 -0
- package/dist/view/print.d.ts +42 -0
- package/dist/view/print.d.ts.map +1 -0
- package/dist/view/print.js +70 -0
- package/dist/view/print.js.map +1 -0
- package/dist/view/reconcile.d.ts +16 -0
- package/dist/view/reconcile.d.ts.map +1 -0
- package/dist/view/reconcile.js +158 -0
- package/dist/view/reconcile.js.map +1 -0
- package/dist/view/renderer.d.ts +31 -0
- package/dist/view/renderer.d.ts.map +1 -0
- package/dist/view/renderer.js +89 -0
- package/dist/view/renderer.js.map +1 -0
- package/dist/view/selection-sync.d.ts +35 -0
- package/dist/view/selection-sync.d.ts.map +1 -0
- package/dist/view/selection-sync.js +324 -0
- package/dist/view/selection-sync.js.map +1 -0
- package/dist/view/table-resize.d.ts +41 -0
- package/dist/view/table-resize.d.ts.map +1 -0
- package/dist/view/table-resize.js +216 -0
- package/dist/view/table-resize.js.map +1 -0
- package/package.json +93 -0
- package/styles/base.css +269 -0
- package/styles/dark.css +36 -0
- package/styles/light.css +13 -0
- package/styles/page.css +93 -0
- package/styles/print-a4.css +87 -0
- package/styles/print.css +88 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { Fragment } from '../model/fragment.js';
|
|
2
|
+
import { DxNode } from '../model/node.js';
|
|
3
|
+
import { findTopBlockDepth, resolve } from '../model/position.js';
|
|
4
|
+
import { Slice } from '../model/slice.js';
|
|
5
|
+
import { TextSelection } from '../state/text-selection.js';
|
|
6
|
+
import { AttrStep } from '../transform/attr-step.js';
|
|
7
|
+
import { ReplaceStep } from '../transform/replace-step.js';
|
|
8
|
+
/**
|
|
9
|
+
* List commands.
|
|
10
|
+
*
|
|
11
|
+
* The default schema declares:
|
|
12
|
+
* list: { content: 'list_item+', attrs: { ordered: { default: false } } }
|
|
13
|
+
* list_item: { content: 'paragraph block*' }
|
|
14
|
+
*
|
|
15
|
+
* All commands manipulate the doc-level structure with whole-block ReplaceStep
|
|
16
|
+
* splices (openStart=0, openEnd=0) and use selectionOverride to keep the cursor
|
|
17
|
+
* on an editable inline position after the structural reshuffle.
|
|
18
|
+
*/
|
|
19
|
+
function setOverride(tr, pos) {
|
|
20
|
+
;
|
|
21
|
+
tr.selectionOverride =
|
|
22
|
+
new TextSelection(pos, pos);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Wrap the depth-1 block containing the cursor (or contiguous run covered by
|
|
26
|
+
* the selection) into a `listType` of the given ordered-ness. Each wrapped
|
|
27
|
+
* block becomes the body of a new `list_item`.
|
|
28
|
+
*
|
|
29
|
+
* - If cursor is already inside a list of the same ordered-ness — no-op.
|
|
30
|
+
* - If cursor is inside a list of opposite ordered-ness — switch the list's
|
|
31
|
+
* `ordered` attr via AttrStep (cheap, preserves DOM in incremental mode).
|
|
32
|
+
* - Otherwise — splice the depth-1 run with a single new list.
|
|
33
|
+
*/
|
|
34
|
+
export function wrapInList(listType, attrs) {
|
|
35
|
+
return (state, dispatch) => {
|
|
36
|
+
const { from, to } = state.selection;
|
|
37
|
+
const rpFrom = resolve(state.doc, from);
|
|
38
|
+
const d = findTopBlockDepth(rpFrom);
|
|
39
|
+
if (d < 1)
|
|
40
|
+
return false;
|
|
41
|
+
const listItemType = state.schema.nodes.list_item;
|
|
42
|
+
if (!listItemType)
|
|
43
|
+
return false;
|
|
44
|
+
// Case A — cursor is inside a list already (inside the current block
|
|
45
|
+
// container; an outer list above the cell boundary doesn't count).
|
|
46
|
+
for (let i = rpFrom.depth; i >= d; i--) {
|
|
47
|
+
const n = rpFrom.node(i);
|
|
48
|
+
if (n.type === listType) {
|
|
49
|
+
if (Object.is(n.attrs.ordered, attrs.ordered))
|
|
50
|
+
return false;
|
|
51
|
+
if (!dispatch)
|
|
52
|
+
return true;
|
|
53
|
+
const tr = state.tr.step(new AttrStep(rpFrom.before(i), 'ordered', attrs.ordered));
|
|
54
|
+
dispatch(tr);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Case B — block run wrap inside the current block container (doc OR
|
|
59
|
+
// a cell). Sibling blocks live in rpFrom.node(d - 1).content.
|
|
60
|
+
const container = rpFrom.node(d - 1);
|
|
61
|
+
const containerStart = d - 1 === 0 ? 0 : rpFrom.start(d - 1);
|
|
62
|
+
const startIdx = rpFrom.index(d);
|
|
63
|
+
const rpTo = resolve(state.doc, to);
|
|
64
|
+
const endIdx = rpTo.depth >= d && rpTo.node(d - 1) === container ? rpTo.index(d) : startIdx;
|
|
65
|
+
// Collect the run and wrap each block in a list_item. The list_item
|
|
66
|
+
// content expression is `paragraph block*` — the first child must be a
|
|
67
|
+
// paragraph. If we encounter a non-paragraph leading block (heading,
|
|
68
|
+
// hr, etc.) bail out: list semantics don't make sense there.
|
|
69
|
+
const items = [];
|
|
70
|
+
for (let i = startIdx; i <= endIdx; i++) {
|
|
71
|
+
const block = container.content.child(i);
|
|
72
|
+
if (block.type.name !== 'paragraph')
|
|
73
|
+
return false;
|
|
74
|
+
items.push(state.schema.node('list_item', null, [block]));
|
|
75
|
+
}
|
|
76
|
+
if (items.length === 0)
|
|
77
|
+
return false;
|
|
78
|
+
if (!dispatch)
|
|
79
|
+
return true;
|
|
80
|
+
const list = state.schema.node(listType.name, attrs, items);
|
|
81
|
+
// Compute block-coordinate range covering [startIdx, endIdx] inside the
|
|
82
|
+
// container's content.
|
|
83
|
+
let blockStart = containerStart;
|
|
84
|
+
for (let i = 0; i < startIdx; i++)
|
|
85
|
+
blockStart += container.content.child(i).nodeSize;
|
|
86
|
+
let blockEnd = blockStart;
|
|
87
|
+
for (let i = startIdx; i <= endIdx; i++)
|
|
88
|
+
blockEnd += container.content.child(i).nodeSize;
|
|
89
|
+
const slice = new Slice(Fragment.from([list]), 0, 0);
|
|
90
|
+
const tr = state.tr.step(new ReplaceStep(blockStart, blockEnd, slice));
|
|
91
|
+
// Preserve cursor. The cursor was at `from`; relative to the run start
|
|
92
|
+
// (blockStart) its offset is `from - blockStart`. After wrap, the same
|
|
93
|
+
// inline position lives two opens deeper (list[open] + list_item[open]).
|
|
94
|
+
const parentOffset = from - blockStart;
|
|
95
|
+
setOverride(tr, blockStart + parentOffset + 2);
|
|
96
|
+
dispatch(tr);
|
|
97
|
+
return true;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Unwrap the list_item containing the cursor. Items before the lifted one
|
|
102
|
+
* stay in the original list; items after split into a new list of the same
|
|
103
|
+
* ordered-ness; the lifted item's children become siblings of the (former)
|
|
104
|
+
* list slot. If the list ends up empty (single item lifted), the whole list
|
|
105
|
+
* is replaced by the lifted children.
|
|
106
|
+
*
|
|
107
|
+
* Returns false when the cursor is not inside a list_item.
|
|
108
|
+
*/
|
|
109
|
+
export function liftListItem() {
|
|
110
|
+
return (state, dispatch) => {
|
|
111
|
+
const { from } = state.selection;
|
|
112
|
+
const rp = resolve(state.doc, from);
|
|
113
|
+
const topD = findTopBlockDepth(rp);
|
|
114
|
+
if (topD < 1)
|
|
115
|
+
return false;
|
|
116
|
+
// Find list_item ancestor and its parent list.
|
|
117
|
+
let liDepth = -1;
|
|
118
|
+
for (let d = rp.depth; d >= 1; d--) {
|
|
119
|
+
if (rp.node(d).type.name === 'list_item') {
|
|
120
|
+
liDepth = d;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (liDepth < 2)
|
|
125
|
+
return false;
|
|
126
|
+
const list = rp.node(liDepth - 1);
|
|
127
|
+
if (list.type.name !== 'list')
|
|
128
|
+
return false;
|
|
129
|
+
// The outer list must be the top-level block in its container (doc or
|
|
130
|
+
// table_cell). Nested lift (sub-list inside a list_item) is not yet
|
|
131
|
+
// supported — the outer list_item content expression accepts the nested
|
|
132
|
+
// list, but emitting the lifted item as siblings would require splitting
|
|
133
|
+
// the outer list_item. Deferred to a later iteration.
|
|
134
|
+
if (liDepth - 1 !== topD) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
if (!dispatch)
|
|
138
|
+
return true;
|
|
139
|
+
const itemIdx = rp.index(liDepth);
|
|
140
|
+
const item = rp.node(liDepth);
|
|
141
|
+
const beforeItems = [];
|
|
142
|
+
const afterItems = [];
|
|
143
|
+
for (let i = 0; i < list.content.childCount; i++) {
|
|
144
|
+
const child = list.content.child(i);
|
|
145
|
+
if (i < itemIdx)
|
|
146
|
+
beforeItems.push(child);
|
|
147
|
+
else if (i > itemIdx)
|
|
148
|
+
afterItems.push(child);
|
|
149
|
+
}
|
|
150
|
+
const liftedChildren = [];
|
|
151
|
+
for (let i = 0; i < item.content.childCount; i++) {
|
|
152
|
+
liftedChildren.push(item.content.child(i));
|
|
153
|
+
}
|
|
154
|
+
const replacement = [];
|
|
155
|
+
if (beforeItems.length > 0) {
|
|
156
|
+
replacement.push(state.schema.node('list', list.attrs, beforeItems));
|
|
157
|
+
}
|
|
158
|
+
for (const c of liftedChildren)
|
|
159
|
+
replacement.push(c);
|
|
160
|
+
if (afterItems.length > 0) {
|
|
161
|
+
replacement.push(state.schema.node('list', list.attrs, afterItems));
|
|
162
|
+
}
|
|
163
|
+
const listStart = rp.before(liDepth - 1);
|
|
164
|
+
const listEnd = rp.after(liDepth - 1);
|
|
165
|
+
const slice = new Slice(Fragment.from(replacement), 0, 0);
|
|
166
|
+
const tr = state.tr.step(new ReplaceStep(listStart, listEnd, slice));
|
|
167
|
+
// Preserve cursor. The cursor was inside the item's first child
|
|
168
|
+
// (typically a paragraph) at `from`. The relative offset within that
|
|
169
|
+
// paragraph is preserved. After lift:
|
|
170
|
+
// absolute pos of paragraph[open] in the new doc =
|
|
171
|
+
// listStart + (beforeItems contribute sum of nodeSizes) [+ no list opens, list_item open]
|
|
172
|
+
// Item was at rp.before(liDepth) before; cursor offset inside the item's
|
|
173
|
+
// first child = from - rp.before(liDepth) - 1 (subtract item [open]).
|
|
174
|
+
const itemOpen = rp.before(liDepth);
|
|
175
|
+
const innerOffset = from - itemOpen - 1; // offset inside item content
|
|
176
|
+
let newListStart = listStart;
|
|
177
|
+
if (beforeItems.length > 0) {
|
|
178
|
+
let beforeSize = 0;
|
|
179
|
+
for (const b of beforeItems)
|
|
180
|
+
beforeSize += b.nodeSize;
|
|
181
|
+
newListStart = listStart + beforeSize;
|
|
182
|
+
}
|
|
183
|
+
// newListStart now points to where lifted children begin.
|
|
184
|
+
setOverride(tr, newListStart + innerOffset);
|
|
185
|
+
dispatch(tr);
|
|
186
|
+
return true;
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Nest the list_item containing the cursor under its previous sibling
|
|
191
|
+
* list_item. If the previous sibling already ends with a nested list of the
|
|
192
|
+
* same ordered-ness, append to it; otherwise create a new nested list.
|
|
193
|
+
*
|
|
194
|
+
* Returns false when there is no previous sibling list_item or when the
|
|
195
|
+
* cursor is not in a list_item.
|
|
196
|
+
*/
|
|
197
|
+
export function sinkListItem() {
|
|
198
|
+
return (state, dispatch) => {
|
|
199
|
+
const { from } = state.selection;
|
|
200
|
+
const rp = resolve(state.doc, from);
|
|
201
|
+
const topD = findTopBlockDepth(rp);
|
|
202
|
+
if (topD < 1)
|
|
203
|
+
return false;
|
|
204
|
+
let liDepth = -1;
|
|
205
|
+
for (let d = rp.depth; d >= 1; d--) {
|
|
206
|
+
if (rp.node(d).type.name === 'list_item') {
|
|
207
|
+
liDepth = d;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (liDepth < 2)
|
|
212
|
+
return false;
|
|
213
|
+
const list = rp.node(liDepth - 1);
|
|
214
|
+
if (list.type.name !== 'list')
|
|
215
|
+
return false;
|
|
216
|
+
const itemIdx = rp.index(liDepth);
|
|
217
|
+
if (itemIdx === 0)
|
|
218
|
+
return false;
|
|
219
|
+
// Outer list must be the top-level block in its container (doc or cell);
|
|
220
|
+
// nested sink (item already deeper than the topmost list) needs a
|
|
221
|
+
// multi-level rebuild and is still deferred.
|
|
222
|
+
if (liDepth - 1 !== topD) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
if (!dispatch)
|
|
226
|
+
return true;
|
|
227
|
+
const item = rp.node(liDepth);
|
|
228
|
+
const prevItem = list.content.child(itemIdx - 1);
|
|
229
|
+
// Decide whether prevItem already ends with a nested list of matching
|
|
230
|
+
// ordered-ness — if so, append; otherwise create a fresh nested list.
|
|
231
|
+
const lastOfPrev = prevItem.content.childCount > 0
|
|
232
|
+
? prevItem.content.child(prevItem.content.childCount - 1)
|
|
233
|
+
: null;
|
|
234
|
+
const ordered = list.attrs.ordered;
|
|
235
|
+
let newPrevChildren;
|
|
236
|
+
if (lastOfPrev &&
|
|
237
|
+
lastOfPrev.type.name === 'list' &&
|
|
238
|
+
Object.is(lastOfPrev.attrs.ordered, ordered)) {
|
|
239
|
+
const newNested = state.schema.node('list', lastOfPrev.attrs, [...lastOfPrev.content.children, item]);
|
|
240
|
+
newPrevChildren = [];
|
|
241
|
+
for (let i = 0; i < prevItem.content.childCount - 1; i++) {
|
|
242
|
+
newPrevChildren.push(prevItem.content.child(i));
|
|
243
|
+
}
|
|
244
|
+
newPrevChildren.push(newNested);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
const newNested = state.schema.node('list', { ordered }, [item]);
|
|
248
|
+
newPrevChildren = [];
|
|
249
|
+
for (let i = 0; i < prevItem.content.childCount; i++) {
|
|
250
|
+
newPrevChildren.push(prevItem.content.child(i));
|
|
251
|
+
}
|
|
252
|
+
newPrevChildren.push(newNested);
|
|
253
|
+
}
|
|
254
|
+
const newPrevItem = state.schema.node('list_item', null, newPrevChildren);
|
|
255
|
+
// Build the new list: items before prev, then newPrevItem, then items after the sunk one.
|
|
256
|
+
const newItems = [];
|
|
257
|
+
for (let i = 0; i < itemIdx - 1; i++)
|
|
258
|
+
newItems.push(list.content.child(i));
|
|
259
|
+
newItems.push(newPrevItem);
|
|
260
|
+
for (let i = itemIdx + 1; i < list.content.childCount; i++)
|
|
261
|
+
newItems.push(list.content.child(i));
|
|
262
|
+
const newList = state.schema.node('list', list.attrs, newItems);
|
|
263
|
+
const listStart = rp.before(liDepth - 1);
|
|
264
|
+
const listEnd = rp.after(liDepth - 1);
|
|
265
|
+
const slice = new Slice(Fragment.from([newList]), 0, 0);
|
|
266
|
+
const tr = state.tr.step(new ReplaceStep(listStart, listEnd, slice));
|
|
267
|
+
// Preserve cursor. The cursor's inner offset within the sunk item's
|
|
268
|
+
// content is preserved; we just need to compute the new absolute pos.
|
|
269
|
+
const itemOpen = rp.before(liDepth);
|
|
270
|
+
const innerOffset = from - itemOpen - 1;
|
|
271
|
+
// Compute size of new previous item: that's where the sunk item now lives.
|
|
272
|
+
// Walk newList children up to (itemIdx - 1) — but the index of the sunk
|
|
273
|
+
// item inside newPrevItem's nested list matters for the cursor.
|
|
274
|
+
let cursor = listStart + 1; // inside the new list
|
|
275
|
+
for (let i = 0; i < itemIdx - 1; i++) {
|
|
276
|
+
cursor += newList.content.child(i).nodeSize;
|
|
277
|
+
}
|
|
278
|
+
// cursor now sits at the [open] of newPrevItem. Step inside it.
|
|
279
|
+
cursor += 1;
|
|
280
|
+
// Walk newPrevItem's children up to the nested list (it's the last one).
|
|
281
|
+
for (let i = 0; i < newPrevChildren.length - 1; i++) {
|
|
282
|
+
cursor += newPrevChildren[i].nodeSize;
|
|
283
|
+
}
|
|
284
|
+
// cursor now sits at the [open] of the nested list. Step inside.
|
|
285
|
+
cursor += 1;
|
|
286
|
+
// The sunk item is the last child of the nested list. Skip preceding items.
|
|
287
|
+
const nestedList = newPrevChildren[newPrevChildren.length - 1];
|
|
288
|
+
for (let i = 0; i < nestedList.content.childCount - 1; i++) {
|
|
289
|
+
cursor += nestedList.content.child(i).nodeSize;
|
|
290
|
+
}
|
|
291
|
+
// cursor now sits at the [open] of the sunk item. Step inside to offset.
|
|
292
|
+
cursor += 1 + innerOffset;
|
|
293
|
+
setOverride(tr, cursor);
|
|
294
|
+
dispatch(tr);
|
|
295
|
+
return true;
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Toggle: if cursor is already inside a list of `attrs.ordered` parity, lift
|
|
300
|
+
* the current list_item; otherwise wrap.
|
|
301
|
+
*/
|
|
302
|
+
export function toggleList(listType, attrs) {
|
|
303
|
+
return (state, dispatch) => {
|
|
304
|
+
const rp = resolve(state.doc, state.selection.from);
|
|
305
|
+
const topD = findTopBlockDepth(rp);
|
|
306
|
+
// Only consider lists inside the current block container.
|
|
307
|
+
for (let d = rp.depth; d >= topD; d--) {
|
|
308
|
+
const n = rp.node(d);
|
|
309
|
+
if (n.type === listType && Object.is(n.attrs.ordered, attrs.ordered)) {
|
|
310
|
+
return liftListItem()(state, dispatch);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return wrapInList(listType, attrs)(state, dispatch);
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=list-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-commands.js","sourceRoot":"","sources":["../../src/commands/list-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { MarkType } from '../model/mark.js';
|
|
2
|
+
import type { EditorState } from '../state/editor-state.js';
|
|
3
|
+
import type { Command } from './command.js';
|
|
4
|
+
export declare function markActive(state: EditorState, markType: MarkType): boolean;
|
|
5
|
+
export declare function toggleMark(markType: MarkType): Command;
|
|
6
|
+
/**
|
|
7
|
+
* Replace any existing mark of `markType` in the selection range with a
|
|
8
|
+
* fresh instance carrying `attrs`. Different from {@link toggleMark}: this
|
|
9
|
+
* always ends with the mark applied, regardless of prior state, and replaces
|
|
10
|
+
* conflicting attrs (e.g. switching font-size from 14px to 18px).
|
|
11
|
+
*
|
|
12
|
+
* No-op if the selection is collapsed.
|
|
13
|
+
*/
|
|
14
|
+
export declare function setMark(markType: MarkType, attrs?: Record<string, unknown>): Command;
|
|
15
|
+
/**
|
|
16
|
+
* Remove every mark of `markType` (any attrs) from the selection range.
|
|
17
|
+
* Returns false when nothing changes (collapsed selection or no such marks).
|
|
18
|
+
*/
|
|
19
|
+
export declare function clearMark(markType: MarkType): Command;
|
|
20
|
+
/**
|
|
21
|
+
* Read the active value of `attrName` for the `markType` mark on the current
|
|
22
|
+
* selection. Returns the common value when every text node in the range
|
|
23
|
+
* carries the same attribute value, otherwise null (mixed or unset).
|
|
24
|
+
*
|
|
25
|
+
* Use {@link probeMarkAttr} when you need to distinguish unset vs. mixed.
|
|
26
|
+
*/
|
|
27
|
+
export declare function activeMarkAttr(state: EditorState, markType: MarkType, attrName: string): unknown;
|
|
28
|
+
export type MarkAttrProbe = {
|
|
29
|
+
readonly state: 'collapsed';
|
|
30
|
+
} | {
|
|
31
|
+
readonly state: 'unset';
|
|
32
|
+
} | {
|
|
33
|
+
readonly state: 'uniform';
|
|
34
|
+
readonly value: unknown;
|
|
35
|
+
} | {
|
|
36
|
+
readonly state: 'mixed';
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Probe `attrName` of `markType` across the selection range.
|
|
40
|
+
*
|
|
41
|
+
* - `collapsed` — selection is empty (no range to inspect).
|
|
42
|
+
* - `unset` — no text in the range carries the mark.
|
|
43
|
+
* - `uniform` — every text in the range shares the same attribute value
|
|
44
|
+
* (the value may itself be `null` if the mark is present
|
|
45
|
+
* with that attr literally unset, but in practice this
|
|
46
|
+
* means "explicit mark with this value").
|
|
47
|
+
* - `mixed` — values differ across the range.
|
|
48
|
+
*
|
|
49
|
+
* Used by toolbar controls that need to render uniform values, "mixed" as
|
|
50
|
+
* blank, and unset as a default option.
|
|
51
|
+
*/
|
|
52
|
+
export declare function probeMarkAttr(state: EditorState, markType: MarkType, attrName: string): MarkAttrProbe;
|
|
53
|
+
//# sourceMappingURL=mark-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mark-commands.d.ts","sourceRoot":"","sources":["../../src/commands/mark-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAI1E;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CActD;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAcxF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAcrD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAGT;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAA;AAE/B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,aAAa,CA+Bf"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { AddMarkStep, RemoveMarkStep } from '../transform/mark-step.js';
|
|
2
|
+
export function markActive(state, markType) {
|
|
3
|
+
const { from, to } = state.selection;
|
|
4
|
+
if (from === to)
|
|
5
|
+
return false;
|
|
6
|
+
return rangeHasMarkOnAllText(state.doc, from, to, markType);
|
|
7
|
+
}
|
|
8
|
+
export function toggleMark(markType) {
|
|
9
|
+
return (state, dispatch) => {
|
|
10
|
+
const { from, to } = state.selection;
|
|
11
|
+
if (from === to)
|
|
12
|
+
return false;
|
|
13
|
+
const isActive = rangeHasMarkOnAllText(state.doc, from, to, markType);
|
|
14
|
+
if (!dispatch)
|
|
15
|
+
return true;
|
|
16
|
+
const tr = state.tr;
|
|
17
|
+
const mark = markType.create();
|
|
18
|
+
const stepped = isActive
|
|
19
|
+
? tr.step(new RemoveMarkStep(from, to, mark))
|
|
20
|
+
: tr.step(new AddMarkStep(from, to, mark));
|
|
21
|
+
dispatch(stepped);
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Replace any existing mark of `markType` in the selection range with a
|
|
27
|
+
* fresh instance carrying `attrs`. Different from {@link toggleMark}: this
|
|
28
|
+
* always ends with the mark applied, regardless of prior state, and replaces
|
|
29
|
+
* conflicting attrs (e.g. switching font-size from 14px to 18px).
|
|
30
|
+
*
|
|
31
|
+
* No-op if the selection is collapsed.
|
|
32
|
+
*/
|
|
33
|
+
export function setMark(markType, attrs = {}) {
|
|
34
|
+
return (state, dispatch) => {
|
|
35
|
+
const { from, to } = state.selection;
|
|
36
|
+
if (from === to)
|
|
37
|
+
return false;
|
|
38
|
+
if (!dispatch)
|
|
39
|
+
return true;
|
|
40
|
+
const existing = uniqueMarksOfType(state.doc, from, to, markType);
|
|
41
|
+
let tr = state.tr;
|
|
42
|
+
for (const m of existing) {
|
|
43
|
+
tr = tr.step(new RemoveMarkStep(from, to, m));
|
|
44
|
+
}
|
|
45
|
+
tr = tr.step(new AddMarkStep(from, to, markType.create(attrs)));
|
|
46
|
+
dispatch(tr);
|
|
47
|
+
return true;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Remove every mark of `markType` (any attrs) from the selection range.
|
|
52
|
+
* Returns false when nothing changes (collapsed selection or no such marks).
|
|
53
|
+
*/
|
|
54
|
+
export function clearMark(markType) {
|
|
55
|
+
return (state, dispatch) => {
|
|
56
|
+
const { from, to } = state.selection;
|
|
57
|
+
if (from === to)
|
|
58
|
+
return false;
|
|
59
|
+
const existing = uniqueMarksOfType(state.doc, from, to, markType);
|
|
60
|
+
if (existing.length === 0)
|
|
61
|
+
return false;
|
|
62
|
+
if (!dispatch)
|
|
63
|
+
return true;
|
|
64
|
+
let tr = state.tr;
|
|
65
|
+
for (const m of existing) {
|
|
66
|
+
tr = tr.step(new RemoveMarkStep(from, to, m));
|
|
67
|
+
}
|
|
68
|
+
dispatch(tr);
|
|
69
|
+
return true;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Read the active value of `attrName` for the `markType` mark on the current
|
|
74
|
+
* selection. Returns the common value when every text node in the range
|
|
75
|
+
* carries the same attribute value, otherwise null (mixed or unset).
|
|
76
|
+
*
|
|
77
|
+
* Use {@link probeMarkAttr} when you need to distinguish unset vs. mixed.
|
|
78
|
+
*/
|
|
79
|
+
export function activeMarkAttr(state, markType, attrName) {
|
|
80
|
+
const r = probeMarkAttr(state, markType, attrName);
|
|
81
|
+
return r.state === 'uniform' ? r.value : null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Probe `attrName` of `markType` across the selection range.
|
|
85
|
+
*
|
|
86
|
+
* - `collapsed` — selection is empty (no range to inspect).
|
|
87
|
+
* - `unset` — no text in the range carries the mark.
|
|
88
|
+
* - `uniform` — every text in the range shares the same attribute value
|
|
89
|
+
* (the value may itself be `null` if the mark is present
|
|
90
|
+
* with that attr literally unset, but in practice this
|
|
91
|
+
* means "explicit mark with this value").
|
|
92
|
+
* - `mixed` — values differ across the range.
|
|
93
|
+
*
|
|
94
|
+
* Used by toolbar controls that need to render uniform values, "mixed" as
|
|
95
|
+
* blank, and unset as a default option.
|
|
96
|
+
*/
|
|
97
|
+
export function probeMarkAttr(state, markType, attrName) {
|
|
98
|
+
const { from, to } = state.selection;
|
|
99
|
+
if (from === to)
|
|
100
|
+
return { state: 'collapsed' };
|
|
101
|
+
let first = null;
|
|
102
|
+
let seenAnyText = false;
|
|
103
|
+
let mixed = false;
|
|
104
|
+
walkRange(state.doc, 0, from, to, (n) => {
|
|
105
|
+
if (!n.isText || mixed)
|
|
106
|
+
return;
|
|
107
|
+
seenAnyText = true;
|
|
108
|
+
const m = n.marks.find((mk) => mk.type === markType);
|
|
109
|
+
const cur = m
|
|
110
|
+
? { kind: 'value', value: m.attrs[attrName] }
|
|
111
|
+
: { kind: 'unset' };
|
|
112
|
+
if (!first) {
|
|
113
|
+
first = cur;
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (first.kind !== cur.kind) {
|
|
117
|
+
mixed = true;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (first.kind === 'value' && cur.kind === 'value' && !Object.is(first.value, cur.value)) {
|
|
121
|
+
mixed = true;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
if (!seenAnyText || first === null)
|
|
125
|
+
return { state: 'unset' };
|
|
126
|
+
if (mixed)
|
|
127
|
+
return { state: 'mixed' };
|
|
128
|
+
const snap = first;
|
|
129
|
+
if (snap.kind === 'unset')
|
|
130
|
+
return { state: 'unset' };
|
|
131
|
+
return { state: 'uniform', value: snap.value };
|
|
132
|
+
}
|
|
133
|
+
function uniqueMarksOfType(doc, from, to, markType) {
|
|
134
|
+
const out = [];
|
|
135
|
+
walkRange(doc, 0, from, to, (n) => {
|
|
136
|
+
if (!n.isText)
|
|
137
|
+
return;
|
|
138
|
+
for (const m of n.marks) {
|
|
139
|
+
if (m.type === markType && !out.some((e) => e.eq(m)))
|
|
140
|
+
out.push(m);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function rangeHasMarkOnAllText(doc, from, to, markType) {
|
|
146
|
+
let allHave = true;
|
|
147
|
+
let sawText = false;
|
|
148
|
+
walkRange(doc, 0, from, to, (node) => {
|
|
149
|
+
if (!node.isText)
|
|
150
|
+
return;
|
|
151
|
+
sawText = true;
|
|
152
|
+
if (!node.marks.some((m) => m.type === markType)) {
|
|
153
|
+
allHave = false;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return sawText && allHave;
|
|
157
|
+
}
|
|
158
|
+
function walkRange(node, absStart, from, to, visit) {
|
|
159
|
+
if (node.isText) {
|
|
160
|
+
const end = absStart + node.nodeSize;
|
|
161
|
+
if (end <= from || absStart >= to)
|
|
162
|
+
return;
|
|
163
|
+
visit(node);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (node.isAtom)
|
|
167
|
+
return;
|
|
168
|
+
let offset = 0;
|
|
169
|
+
for (let i = 0; i < node.content.childCount; i++) {
|
|
170
|
+
const child = node.content.child(i);
|
|
171
|
+
const childStart = absStart + offset;
|
|
172
|
+
if (child.isText) {
|
|
173
|
+
walkRange(child, childStart, from, to, visit);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
walkRange(child, childStart + 1, from, to, visit);
|
|
177
|
+
}
|
|
178
|
+
offset += child.nodeSize;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=mark-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mark-commands.js","sourceRoot":"","sources":["../../src/commands/mark-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-commands.d.ts","sourceRoot":"","sources":["../../src/commands/selection-commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,eAAO,MAAM,SAAS,EAAE,OAiBvB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AllSelection } from '../state/all-selection.js';
|
|
2
|
+
export const selectAll = (state, dispatch) => {
|
|
3
|
+
if (!dispatch)
|
|
4
|
+
return true;
|
|
5
|
+
const tr = state.tr;
|
|
6
|
+
tr
|
|
7
|
+
.selectionOverride = new AllSelection(state.doc);
|
|
8
|
+
dispatch(tr);
|
|
9
|
+
return true;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=selection-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-commands.js","sourceRoot":"","sources":["../../src/commands/selection-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAKxD,MAAM,CAAC,MAAM,SAAS,GAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAWlB;IAAC,EAAsD;SACrD,iBAAiB,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClD,QAAQ,CAAC,EAAE,CAAC,CAAA;IACZ,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|