@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,42 @@
|
|
|
1
|
+
import { Fragment } from '../model/fragment.js';
|
|
2
|
+
import { DxNode } from '../model/node.js';
|
|
3
|
+
import type { Schema } from '../model/schema.js';
|
|
4
|
+
import type { Mapping } from './mapping.js';
|
|
5
|
+
import { Step, type StepJSON, type StepResult } from './step.js';
|
|
6
|
+
/**
|
|
7
|
+
* Replace the `header` or `footer` Fragment of EditorState.pageMeta.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle / inversion side-channel:
|
|
10
|
+
* - `apply(doc)` is a no-op on the main doc: pageMeta lives outside of
|
|
11
|
+
* `doc`. The value carried by the step is consumed by
|
|
12
|
+
* EditorState.applyOne, which actually swaps the fragment on the new
|
|
13
|
+
* EditorState it constructs.
|
|
14
|
+
* - Before storing the step on the transaction, applyOne calls
|
|
15
|
+
* `recordPrevious(prevFragment)` so that `invert()` can produce the
|
|
16
|
+
* inverse step without needing the previous EditorState in hand. The
|
|
17
|
+
* side-channel is intentionally NOT serialized (`toJSON` only carries
|
|
18
|
+
* `slot` + `newFragment`); inversion is meaningful only on
|
|
19
|
+
* just-applied step instances kept in the history.
|
|
20
|
+
*
|
|
21
|
+
* - `map(mapping)` returns `this` unchanged: header/footer positions live
|
|
22
|
+
* outside the main doc's position space, so the mapping never affects
|
|
23
|
+
* them.
|
|
24
|
+
*/
|
|
25
|
+
export declare class SetPageMetaStep extends Step {
|
|
26
|
+
readonly slot: 'header' | 'footer';
|
|
27
|
+
readonly newFragment: Fragment;
|
|
28
|
+
private _prevFragment?;
|
|
29
|
+
constructor(slot: 'header' | 'footer', newFragment: Fragment);
|
|
30
|
+
/**
|
|
31
|
+
* Record the pre-apply fragment so `invert()` can build the inverse.
|
|
32
|
+
* Called only by EditorState.applyOne. Idempotent — re-recording with
|
|
33
|
+
* the same value is fine; recording with a different value is a bug.
|
|
34
|
+
*/
|
|
35
|
+
recordPrevious(fragment: Fragment): void;
|
|
36
|
+
apply(doc: DxNode): StepResult;
|
|
37
|
+
invert(_doc: DxNode): Step;
|
|
38
|
+
map(_mapping: Mapping): Step | null;
|
|
39
|
+
toJSON(): StepJSON;
|
|
40
|
+
static fromJSON(schema: Schema, data: Readonly<Record<string, unknown>>): SetPageMetaStep;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=set-page-meta-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-page-meta-step.d.ts","sourceRoot":"","sources":["../../src/transform/set-page-meta-step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAiB,MAAM,kBAAkB,CAAA;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAgB,MAAM,WAAW,CAAA;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAgB,SAAQ,IAAI;IAIrC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAClC,QAAQ,CAAC,WAAW,EAAE,QAAQ;IAJhC,OAAO,CAAC,aAAa,CAAC,CAAU;gBAGrB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,WAAW,EAAE,QAAQ;IAKhC;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIxC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAM9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS1B,GAAG,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAInC,MAAM,IAAI,QAAQ;IAUlB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,eAAe;CAU1F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Fragment } from '../model/fragment.js';
|
|
2
|
+
import { DxNode } from '../model/node.js';
|
|
3
|
+
import { Step, registerStep } from './step.js';
|
|
4
|
+
/**
|
|
5
|
+
* Replace the `header` or `footer` Fragment of EditorState.pageMeta.
|
|
6
|
+
*
|
|
7
|
+
* Lifecycle / inversion side-channel:
|
|
8
|
+
* - `apply(doc)` is a no-op on the main doc: pageMeta lives outside of
|
|
9
|
+
* `doc`. The value carried by the step is consumed by
|
|
10
|
+
* EditorState.applyOne, which actually swaps the fragment on the new
|
|
11
|
+
* EditorState it constructs.
|
|
12
|
+
* - Before storing the step on the transaction, applyOne calls
|
|
13
|
+
* `recordPrevious(prevFragment)` so that `invert()` can produce the
|
|
14
|
+
* inverse step without needing the previous EditorState in hand. The
|
|
15
|
+
* side-channel is intentionally NOT serialized (`toJSON` only carries
|
|
16
|
+
* `slot` + `newFragment`); inversion is meaningful only on
|
|
17
|
+
* just-applied step instances kept in the history.
|
|
18
|
+
*
|
|
19
|
+
* - `map(mapping)` returns `this` unchanged: header/footer positions live
|
|
20
|
+
* outside the main doc's position space, so the mapping never affects
|
|
21
|
+
* them.
|
|
22
|
+
*/
|
|
23
|
+
export class SetPageMetaStep extends Step {
|
|
24
|
+
slot;
|
|
25
|
+
newFragment;
|
|
26
|
+
_prevFragment;
|
|
27
|
+
constructor(slot, newFragment) {
|
|
28
|
+
super();
|
|
29
|
+
this.slot = slot;
|
|
30
|
+
this.newFragment = newFragment;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Record the pre-apply fragment so `invert()` can build the inverse.
|
|
34
|
+
* Called only by EditorState.applyOne. Idempotent — re-recording with
|
|
35
|
+
* the same value is fine; recording with a different value is a bug.
|
|
36
|
+
*/
|
|
37
|
+
recordPrevious(fragment) {
|
|
38
|
+
this._prevFragment = fragment;
|
|
39
|
+
}
|
|
40
|
+
apply(doc) {
|
|
41
|
+
// SetPageMetaStep doesn't touch the main doc. The value carried by
|
|
42
|
+
// the step is consumed by EditorState.applyOne.
|
|
43
|
+
return { ok: true, doc, mapRange: { start: 0, oldLen: 0, newLen: 0 } };
|
|
44
|
+
}
|
|
45
|
+
invert(_doc) {
|
|
46
|
+
if (this._prevFragment === undefined) {
|
|
47
|
+
throw new Error('SetPageMetaStep.invert: previous fragment not recorded; applyOne must call recordPrevious() before invert()');
|
|
48
|
+
}
|
|
49
|
+
return new SetPageMetaStep(this.slot, this._prevFragment);
|
|
50
|
+
}
|
|
51
|
+
map(_mapping) {
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
toJSON() {
|
|
55
|
+
return {
|
|
56
|
+
kind: 'setPageMeta',
|
|
57
|
+
data: {
|
|
58
|
+
slot: this.slot,
|
|
59
|
+
fragment: this.newFragment.children.map((c) => c.toJSON()),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
static fromJSON(schema, data) {
|
|
64
|
+
const slot = data.slot;
|
|
65
|
+
const types = {};
|
|
66
|
+
for (const name of Object.keys(schema.nodes)) {
|
|
67
|
+
types[name] = schema.nodes[name];
|
|
68
|
+
}
|
|
69
|
+
const raw = data.fragment ?? [];
|
|
70
|
+
const nodes = raw.map((j) => DxNode.fromJSON(types, j));
|
|
71
|
+
return new SetPageMetaStep(slot, Fragment.from(nodes));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
registerStep('setPageMeta', SetPageMetaStep);
|
|
75
|
+
//# sourceMappingURL=set-page-meta-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-page-meta-step.js","sourceRoot":"","sources":["../../src/transform/set-page-meta-step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAiB,MAAM,kBAAkB,CAAA;AAIxD,OAAO,EAAE,IAAI,EAAkC,YAAY,EAAE,MAAM,WAAW,CAAA;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,eAAgB,SAAQ,IAAI;IAI5B;IACA;IAJH,aAAa,CAAW;IAEhC,YACW,IAAyB,EACzB,WAAqB;QAE9B,KAAK,EAAE,CAAA;QAHE,SAAI,GAAJ,IAAI,CAAqB;QACzB,gBAAW,GAAX,WAAW,CAAU;IAGhC,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,QAAkB;QAC/B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,GAAW;QACf,mEAAmE;QACnE,gDAAgD;QAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAA;IACxE,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAA;QACH,CAAC;QACD,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;IAC3D,CAAC;IAED,GAAG,CAAC,QAAiB;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE;gBACJ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAY,CAAC,MAAM,EAAE,CAAC;aACvE;SACF,CAAA;IACH,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAAc,EAAE,IAAuC;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,IAA2B,CAAA;QAC7C,MAAM,KAAK,GAA6B,EAAE,CAAA;QAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,GAAI,MAAM,CAAC,KAAkC,CAAC,IAAI,CAAE,CAAA;QACjE,CAAC;QACD,MAAM,GAAG,GAAI,IAAI,CAAC,QAAoC,IAAI,EAAE,CAAA;QAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QACvD,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,CAAC;CACF;AAED,YAAY,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DxNode } from '../model/node.js';
|
|
2
|
+
import type { Schema } from '../model/schema.js';
|
|
3
|
+
import type { MapRange, Mapping } from './mapping.js';
|
|
4
|
+
export type StepResult = {
|
|
5
|
+
readonly ok: true;
|
|
6
|
+
readonly doc: DxNode;
|
|
7
|
+
readonly mapRange: MapRange;
|
|
8
|
+
} | {
|
|
9
|
+
readonly ok: false;
|
|
10
|
+
readonly failed: string;
|
|
11
|
+
};
|
|
12
|
+
/** JSON shape every Step round-trips through. */
|
|
13
|
+
export interface StepJSON {
|
|
14
|
+
readonly kind: string;
|
|
15
|
+
readonly data: Readonly<Record<string, unknown>>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Abstract Step. Every concrete step (ReplaceStep, AddMarkStep, ...) implements
|
|
19
|
+
* `apply` (mutate doc, return result + map range), `invert` (build the inverse
|
|
20
|
+
* step against the pre-apply doc), and `map` (rebase this step through a
|
|
21
|
+
* Mapping, returning null if the step's anchor range was deleted).
|
|
22
|
+
*/
|
|
23
|
+
export declare abstract class Step {
|
|
24
|
+
abstract apply(doc: DxNode): StepResult;
|
|
25
|
+
abstract invert(doc: DxNode): Step;
|
|
26
|
+
abstract map(mapping: Mapping): Step | null;
|
|
27
|
+
abstract toJSON(): StepJSON;
|
|
28
|
+
}
|
|
29
|
+
export interface StepConstructor {
|
|
30
|
+
fromJSON(schema: Schema, data: Readonly<Record<string, unknown>>): Step;
|
|
31
|
+
}
|
|
32
|
+
export declare function registerStep(kind: string, ctor: StepConstructor): void;
|
|
33
|
+
export declare function stepFromJSON(schema: Schema, json: StepJSON): Step;
|
|
34
|
+
//# sourceMappingURL=step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/transform/step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACxE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnD,iDAAiD;AACjD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACjD;AAED;;;;;GAKG;AACH,8BAAsB,IAAI;IACxB,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IACvC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAClC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAC3C,QAAQ,CAAC,MAAM,IAAI,QAAQ;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAA;CACxE;AAKD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAKtE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAIjE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract Step. Every concrete step (ReplaceStep, AddMarkStep, ...) implements
|
|
3
|
+
* `apply` (mutate doc, return result + map range), `invert` (build the inverse
|
|
4
|
+
* step against the pre-apply doc), and `map` (rebase this step through a
|
|
5
|
+
* Mapping, returning null if the step's anchor range was deleted).
|
|
6
|
+
*/
|
|
7
|
+
export class Step {
|
|
8
|
+
}
|
|
9
|
+
/** Registry of step constructors keyed by `kind` for deserialization. */
|
|
10
|
+
const REGISTRY = new Map();
|
|
11
|
+
export function registerStep(kind, ctor) {
|
|
12
|
+
if (REGISTRY.has(kind)) {
|
|
13
|
+
throw new Error(`registerStep: duplicate kind '${kind}'`);
|
|
14
|
+
}
|
|
15
|
+
REGISTRY.set(kind, ctor);
|
|
16
|
+
}
|
|
17
|
+
export function stepFromJSON(schema, json) {
|
|
18
|
+
const ctor = REGISTRY.get(json.kind);
|
|
19
|
+
if (!ctor)
|
|
20
|
+
throw new Error(`stepFromJSON: unknown step kind '${json.kind}'`);
|
|
21
|
+
return ctor.fromJSON(schema, json.data);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../src/transform/step.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,MAAM,OAAgB,IAAI;CAKzB;AAMD,yEAAyE;AACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAA;AAEnD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAqB;IAC9D,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,GAAG,CAAC,CAAA;IAC3D,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAc;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;IAC5E,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DxNode } from '../model/node.js';
|
|
2
|
+
import type { Schema } from '../model/schema.js';
|
|
3
|
+
import type { Slice } from '../model/slice.js';
|
|
4
|
+
import { Mapping } from './mapping.js';
|
|
5
|
+
import { Step, type StepJSON } from './step.js';
|
|
6
|
+
export interface TransactionJSON {
|
|
7
|
+
readonly steps: ReadonlyArray<StepJSON>;
|
|
8
|
+
}
|
|
9
|
+
export declare class Transaction {
|
|
10
|
+
readonly doc: DxNode;
|
|
11
|
+
readonly schema: Schema;
|
|
12
|
+
readonly steps: ReadonlyArray<Step>;
|
|
13
|
+
readonly mapping: Mapping;
|
|
14
|
+
constructor(doc: DxNode, schema: Schema, steps?: ReadonlyArray<Step>, mapping?: Mapping);
|
|
15
|
+
step(step: Step): Transaction;
|
|
16
|
+
replaceRange(from: number, to: number, slice: Slice): Transaction;
|
|
17
|
+
toJSON(): TransactionJSON;
|
|
18
|
+
static fromJSON(schema: Schema, baseDoc: DxNode, json: TransactionJSON): Transaction;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/transform/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAiB,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAgB,MAAM,WAAW,CAAA;AAG7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CACxC;AAED,qBAAa,WAAW;IAEpB,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO;gBAHhB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,aAAa,CAAC,IAAI,CAAM,EAC/B,OAAO,GAAE,OAAuB;IAG3C,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW;IAe7B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW;IAIjE,MAAM,IAAI,eAAe;IAIzB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW;CAOrF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Mapping } from './mapping.js';
|
|
2
|
+
import { Step, stepFromJSON } from './step.js';
|
|
3
|
+
import { ReplaceStep } from './replace-step.js';
|
|
4
|
+
export class Transaction {
|
|
5
|
+
doc;
|
|
6
|
+
schema;
|
|
7
|
+
steps;
|
|
8
|
+
mapping;
|
|
9
|
+
constructor(doc, schema, steps = [], mapping = Mapping.empty) {
|
|
10
|
+
this.doc = doc;
|
|
11
|
+
this.schema = schema;
|
|
12
|
+
this.steps = steps;
|
|
13
|
+
this.mapping = mapping;
|
|
14
|
+
}
|
|
15
|
+
step(step) {
|
|
16
|
+
const result = step.apply(this.doc);
|
|
17
|
+
if (!result.ok) {
|
|
18
|
+
throw new Error(`Transaction.step: ${result.failed}`);
|
|
19
|
+
}
|
|
20
|
+
const range = result.mapRange;
|
|
21
|
+
return new Transaction(result.doc, this.schema, [...this.steps, step], this.mapping.append(range));
|
|
22
|
+
}
|
|
23
|
+
// Convenience builders
|
|
24
|
+
replaceRange(from, to, slice) {
|
|
25
|
+
return this.step(new ReplaceStep(from, to, slice));
|
|
26
|
+
}
|
|
27
|
+
toJSON() {
|
|
28
|
+
return { steps: this.steps.map((s) => s.toJSON()) };
|
|
29
|
+
}
|
|
30
|
+
static fromJSON(schema, baseDoc, json) {
|
|
31
|
+
let tr = new Transaction(baseDoc, schema);
|
|
32
|
+
for (const sjson of json.steps) {
|
|
33
|
+
tr = tr.step(stepFromJSON(schema, sjson));
|
|
34
|
+
}
|
|
35
|
+
return tr;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/transform/transaction.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAiB,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,IAAI,EAAiB,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAM/C,MAAM,OAAO,WAAW;IAEX;IACA;IACA;IACA;IAJX,YACW,GAAW,EACX,MAAc,EACd,QAA6B,EAAE,EAC/B,UAAmB,OAAO,CAAC,KAAK;QAHhC,QAAG,GAAH,GAAG,CAAQ;QACX,WAAM,GAAN,MAAM,CAAQ;QACd,UAAK,GAAL,KAAK,CAA0B;QAC/B,YAAO,GAAP,OAAO,CAAyB;IACxC,CAAC;IAEJ,IAAI,CAAC,IAAU;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,MAAM,KAAK,GAAa,MAAM,CAAC,QAAQ,CAAA;QACvC,OAAO,IAAI,WAAW,CACpB,MAAM,CAAC,GAAG,EACV,IAAI,CAAC,MAAM,EACX,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAC3B,CAAA;IACH,CAAC;IAED,uBAAuB;IACvB,YAAY,CAAC,IAAY,EAAE,EAAU,EAAE,KAAY;QACjD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;IACpD,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAA;IACrD,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAAc,EAAE,OAAe,EAAE,IAAqB;QACpE,IAAI,EAAE,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;QAC3C,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,WAAW,CAAA"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,oEAAoE;AACpE,0CAA0C;AAC1C,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { EditorView } from './editor-view.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cross-cell drag-to-select controller.
|
|
4
|
+
*
|
|
5
|
+
* Hot-zone coordination with `installTableResize`:
|
|
6
|
+
* - `installTableResize` owns the 5px-from-right-edge of every
|
|
7
|
+
* `.dx-table-cell` (column resize). On pointerdown, we test the same
|
|
8
|
+
* hot-zone (`cellRect.right - event.clientX <= 5`) and bail if the
|
|
9
|
+
* pointer is inside it — the resize controller will take the gesture.
|
|
10
|
+
* - We attach our listeners AFTER `installTableResize`. Even so, both
|
|
11
|
+
* listeners receive every pointer event; the resize controller only
|
|
12
|
+
* enters its drag state when its own hot-zone check matches, and we
|
|
13
|
+
* only enter ours when the inverse check matches. They cannot both be
|
|
14
|
+
* "active" simultaneously.
|
|
15
|
+
*
|
|
16
|
+
* Behavior:
|
|
17
|
+
* - pointerdown on a `.dx-table-cell` (outside the resize hot-zone)
|
|
18
|
+
* records that cell as the drag anchor. No transaction is dispatched
|
|
19
|
+
* yet — a click without movement leaves existing TextSelection logic
|
|
20
|
+
* untouched.
|
|
21
|
+
* - pointermove while an anchor is recorded:
|
|
22
|
+
* * If the pointer is in a DIFFERENT cell of the SAME table, dispatch
|
|
23
|
+
* a `CellSelection(anchorCellPos, currentCellPos)` (deduped against
|
|
24
|
+
* the previously-dispatched head cell so we don't spam transactions).
|
|
25
|
+
* * If the pointer returns to the anchor cell after a CellSelection
|
|
26
|
+
* was dispatched, collapse back to a TextSelection inside the
|
|
27
|
+
* anchor.
|
|
28
|
+
* - pointerup / pointercancel clears the anchor.
|
|
29
|
+
* - Escape (document keydown) — if `state.selection` is a CellSelection,
|
|
30
|
+
* collapse to TextSelection at the anchor cell's first inline position.
|
|
31
|
+
*/
|
|
32
|
+
export declare function installCellDrag(view: EditorView): () => void;
|
|
33
|
+
//# sourceMappingURL=cell-drag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cell-drag.d.ts","sourceRoot":"","sources":["../../src/view/cell-drag.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,IAAI,CAsJ5D"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { CellSelection } from '../state/cell-selection.js';
|
|
2
|
+
import { TextSelection } from '../state/text-selection.js';
|
|
3
|
+
import { getNodeRef } from './renderer.js';
|
|
4
|
+
/**
|
|
5
|
+
* Cross-cell drag-to-select controller.
|
|
6
|
+
*
|
|
7
|
+
* Hot-zone coordination with `installTableResize`:
|
|
8
|
+
* - `installTableResize` owns the 5px-from-right-edge of every
|
|
9
|
+
* `.dx-table-cell` (column resize). On pointerdown, we test the same
|
|
10
|
+
* hot-zone (`cellRect.right - event.clientX <= 5`) and bail if the
|
|
11
|
+
* pointer is inside it — the resize controller will take the gesture.
|
|
12
|
+
* - We attach our listeners AFTER `installTableResize`. Even so, both
|
|
13
|
+
* listeners receive every pointer event; the resize controller only
|
|
14
|
+
* enters its drag state when its own hot-zone check matches, and we
|
|
15
|
+
* only enter ours when the inverse check matches. They cannot both be
|
|
16
|
+
* "active" simultaneously.
|
|
17
|
+
*
|
|
18
|
+
* Behavior:
|
|
19
|
+
* - pointerdown on a `.dx-table-cell` (outside the resize hot-zone)
|
|
20
|
+
* records that cell as the drag anchor. No transaction is dispatched
|
|
21
|
+
* yet — a click without movement leaves existing TextSelection logic
|
|
22
|
+
* untouched.
|
|
23
|
+
* - pointermove while an anchor is recorded:
|
|
24
|
+
* * If the pointer is in a DIFFERENT cell of the SAME table, dispatch
|
|
25
|
+
* a `CellSelection(anchorCellPos, currentCellPos)` (deduped against
|
|
26
|
+
* the previously-dispatched head cell so we don't spam transactions).
|
|
27
|
+
* * If the pointer returns to the anchor cell after a CellSelection
|
|
28
|
+
* was dispatched, collapse back to a TextSelection inside the
|
|
29
|
+
* anchor.
|
|
30
|
+
* - pointerup / pointercancel clears the anchor.
|
|
31
|
+
* - Escape (document keydown) — if `state.selection` is a CellSelection,
|
|
32
|
+
* collapse to TextSelection at the anchor cell's first inline position.
|
|
33
|
+
*/
|
|
34
|
+
export function installCellDrag(view) {
|
|
35
|
+
const RESIZE_HOT_ZONE_PX = 5;
|
|
36
|
+
let drag = null;
|
|
37
|
+
function findCellAt(target) {
|
|
38
|
+
if (!(target instanceof Element))
|
|
39
|
+
return null;
|
|
40
|
+
const cell = target.closest('.dx-table-cell');
|
|
41
|
+
if (!cell)
|
|
42
|
+
return null;
|
|
43
|
+
if (!view.dom.contains(cell))
|
|
44
|
+
return null;
|
|
45
|
+
return cell;
|
|
46
|
+
}
|
|
47
|
+
function isInResizeHotZone(cell, clientX) {
|
|
48
|
+
const rect = cell.getBoundingClientRect();
|
|
49
|
+
return rect.right - clientX <= RESIZE_HOT_ZONE_PX && clientX <= rect.right;
|
|
50
|
+
}
|
|
51
|
+
function tableOf(cell) {
|
|
52
|
+
return cell.closest('table.dx-table');
|
|
53
|
+
}
|
|
54
|
+
function posOf(cell) {
|
|
55
|
+
const ref = getNodeRef(cell);
|
|
56
|
+
if (!ref || ref.pos < 0)
|
|
57
|
+
return null;
|
|
58
|
+
return ref.pos;
|
|
59
|
+
}
|
|
60
|
+
function dispatchSelection(sel) {
|
|
61
|
+
const tr = view.state.tr;
|
|
62
|
+
tr.selectionOverride = sel;
|
|
63
|
+
view.dispatch(tr);
|
|
64
|
+
}
|
|
65
|
+
function firstInlinePosOf(cellPos) {
|
|
66
|
+
// cell [open] sits at cellPos; cell's first inline position is
|
|
67
|
+
// cellPos + 1 (inside the cell) + 1 (inside the first paragraph).
|
|
68
|
+
// The cell's first child is a paragraph in every well-formed table; the
|
|
69
|
+
// first inline position is therefore cellPos + 2.
|
|
70
|
+
return cellPos + 2;
|
|
71
|
+
}
|
|
72
|
+
function onPointerDown(event) {
|
|
73
|
+
if (event.button !== 0)
|
|
74
|
+
return;
|
|
75
|
+
if (drag)
|
|
76
|
+
return;
|
|
77
|
+
const cell = findCellAt(event.target);
|
|
78
|
+
if (!cell)
|
|
79
|
+
return;
|
|
80
|
+
// Defer to the resize controller when the pointer is in its hot-zone.
|
|
81
|
+
if (isInResizeHotZone(cell, event.clientX))
|
|
82
|
+
return;
|
|
83
|
+
const table = tableOf(cell);
|
|
84
|
+
if (!table)
|
|
85
|
+
return;
|
|
86
|
+
const anchorPos = posOf(cell);
|
|
87
|
+
if (anchorPos === null)
|
|
88
|
+
return;
|
|
89
|
+
const captureTarget = event.target instanceof HTMLElement ? event.target : view.dom;
|
|
90
|
+
try {
|
|
91
|
+
captureTarget.setPointerCapture(event.pointerId);
|
|
92
|
+
}
|
|
93
|
+
catch { /* ignore */ }
|
|
94
|
+
drag = {
|
|
95
|
+
anchorEl: cell,
|
|
96
|
+
anchorPos,
|
|
97
|
+
table,
|
|
98
|
+
pointerId: event.pointerId,
|
|
99
|
+
captureTarget,
|
|
100
|
+
lastDispatchedHead: null,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function onPointerMove(event) {
|
|
104
|
+
if (!drag)
|
|
105
|
+
return;
|
|
106
|
+
// Pointer-capture sends every move here, even outside the editor DOM.
|
|
107
|
+
// Use elementFromPoint to find what's under the pointer right now.
|
|
108
|
+
const doc = view.dom.ownerDocument;
|
|
109
|
+
const elAt = doc.elementFromPoint(event.clientX, event.clientY);
|
|
110
|
+
if (!elAt)
|
|
111
|
+
return;
|
|
112
|
+
const cell = elAt.closest('.dx-table-cell');
|
|
113
|
+
if (!cell || !view.dom.contains(cell))
|
|
114
|
+
return;
|
|
115
|
+
// Different table → ignore (we don't cross tables).
|
|
116
|
+
if (tableOf(cell) !== drag.table)
|
|
117
|
+
return;
|
|
118
|
+
const headPos = posOf(cell);
|
|
119
|
+
if (headPos === null)
|
|
120
|
+
return;
|
|
121
|
+
if (headPos === drag.anchorPos) {
|
|
122
|
+
// Returned to the anchor cell. If we had previously dispatched a
|
|
123
|
+
// CellSelection, collapse back to a TextSelection inside the anchor.
|
|
124
|
+
if (drag.lastDispatchedHead !== null) {
|
|
125
|
+
dispatchSelection(new TextSelection(firstInlinePosOf(drag.anchorPos), firstInlinePosOf(drag.anchorPos)));
|
|
126
|
+
drag.lastDispatchedHead = null;
|
|
127
|
+
}
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Pointer is in a different cell of the same table.
|
|
131
|
+
if (drag.lastDispatchedHead === headPos)
|
|
132
|
+
return; // already dispatched
|
|
133
|
+
dispatchSelection(new CellSelection(drag.anchorPos, headPos));
|
|
134
|
+
drag.lastDispatchedHead = headPos;
|
|
135
|
+
event.preventDefault();
|
|
136
|
+
}
|
|
137
|
+
function endDrag() {
|
|
138
|
+
if (!drag)
|
|
139
|
+
return;
|
|
140
|
+
const finished = drag;
|
|
141
|
+
drag = null;
|
|
142
|
+
try {
|
|
143
|
+
finished.captureTarget.releasePointerCapture(finished.pointerId);
|
|
144
|
+
}
|
|
145
|
+
catch { /* ignore */ }
|
|
146
|
+
}
|
|
147
|
+
function onPointerUp(_event) {
|
|
148
|
+
endDrag();
|
|
149
|
+
}
|
|
150
|
+
function onPointerCancel(_event) {
|
|
151
|
+
endDrag();
|
|
152
|
+
}
|
|
153
|
+
function onKeyDown(event) {
|
|
154
|
+
if (event.key !== 'Escape')
|
|
155
|
+
return;
|
|
156
|
+
const sel = view.state.selection;
|
|
157
|
+
if (!(sel instanceof CellSelection))
|
|
158
|
+
return;
|
|
159
|
+
const collapsed = firstInlinePosOf(sel.anchorCell);
|
|
160
|
+
dispatchSelection(new TextSelection(collapsed, collapsed));
|
|
161
|
+
event.preventDefault();
|
|
162
|
+
}
|
|
163
|
+
view.dom.addEventListener('pointerdown', onPointerDown);
|
|
164
|
+
view.dom.addEventListener('pointermove', onPointerMove);
|
|
165
|
+
view.dom.addEventListener('pointerup', onPointerUp);
|
|
166
|
+
view.dom.addEventListener('pointercancel', onPointerCancel);
|
|
167
|
+
const ownerDoc = view.dom.ownerDocument;
|
|
168
|
+
ownerDoc.addEventListener('keydown', onKeyDown);
|
|
169
|
+
return () => {
|
|
170
|
+
view.dom.removeEventListener('pointerdown', onPointerDown);
|
|
171
|
+
view.dom.removeEventListener('pointermove', onPointerMove);
|
|
172
|
+
view.dom.removeEventListener('pointerup', onPointerUp);
|
|
173
|
+
view.dom.removeEventListener('pointercancel', onPointerCancel);
|
|
174
|
+
ownerDoc.removeEventListener('keydown', onKeyDown);
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=cell-drag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cell-drag.js","sourceRoot":"","sources":["../../src/view/cell-drag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/view/clipboard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,wBAAwB;CAExC;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,GAAE,wBAA6B,GAAG,MAAM,IAAI,CA6E3G"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { parseHTML } from '../html/parse.js';
|
|
2
|
+
import { serializeHTML } from '../html/serialize.js';
|
|
3
|
+
import { Fragment } from '../model/fragment.js';
|
|
4
|
+
import { Slice, sliceBetween } from '../model/slice.js';
|
|
5
|
+
import { ReplaceStep } from '../transform/replace-step.js';
|
|
6
|
+
export function installClipboardHandlers(view, _opts = {}) {
|
|
7
|
+
const handlers = [];
|
|
8
|
+
function on(type, listener) {
|
|
9
|
+
view.dom.addEventListener(type, listener);
|
|
10
|
+
handlers.push([type, listener]);
|
|
11
|
+
}
|
|
12
|
+
on('copy', (event) => {
|
|
13
|
+
const e = event;
|
|
14
|
+
if (!e.clipboardData)
|
|
15
|
+
return;
|
|
16
|
+
const state = view.state;
|
|
17
|
+
const { from, to } = state.selection;
|
|
18
|
+
if (from === to)
|
|
19
|
+
return;
|
|
20
|
+
const sliceContent = sliceBetween(state.doc, from, to).content;
|
|
21
|
+
// Wrap inline content in a paragraph for HTML output.
|
|
22
|
+
const doc = state.schema.node('doc', null, [
|
|
23
|
+
state.schema.node('paragraph', null, sliceContent),
|
|
24
|
+
]);
|
|
25
|
+
const html = serializeHTML(doc, state.schema);
|
|
26
|
+
const text = extractText(sliceContent);
|
|
27
|
+
e.clipboardData.setData('text/html', html);
|
|
28
|
+
e.clipboardData.setData('text/plain', text);
|
|
29
|
+
event.preventDefault();
|
|
30
|
+
});
|
|
31
|
+
on('cut', (event) => {
|
|
32
|
+
const e = event;
|
|
33
|
+
if (!e.clipboardData)
|
|
34
|
+
return;
|
|
35
|
+
const state = view.state;
|
|
36
|
+
const { from, to } = state.selection;
|
|
37
|
+
if (from === to)
|
|
38
|
+
return;
|
|
39
|
+
const sliceContent = sliceBetween(state.doc, from, to).content;
|
|
40
|
+
const docNode = state.schema.node('doc', null, [
|
|
41
|
+
state.schema.node('paragraph', null, sliceContent),
|
|
42
|
+
]);
|
|
43
|
+
const html = serializeHTML(docNode, state.schema);
|
|
44
|
+
const text = extractText(sliceContent);
|
|
45
|
+
e.clipboardData.setData('text/html', html);
|
|
46
|
+
e.clipboardData.setData('text/plain', text);
|
|
47
|
+
event.preventDefault();
|
|
48
|
+
// Now delete the selection.
|
|
49
|
+
const tr = state.tr.step(new ReplaceStep(from, to, Slice.empty));
|
|
50
|
+
view.dispatch(tr);
|
|
51
|
+
});
|
|
52
|
+
on('paste', (event) => {
|
|
53
|
+
const e = event;
|
|
54
|
+
if (!e.clipboardData)
|
|
55
|
+
return;
|
|
56
|
+
const html = e.clipboardData.getData('text/html');
|
|
57
|
+
const text = e.clipboardData.getData('text/plain');
|
|
58
|
+
const state = view.state;
|
|
59
|
+
let slice;
|
|
60
|
+
if (html) {
|
|
61
|
+
const parsed = parseHTML(html, state.schema);
|
|
62
|
+
// Use the parsed doc's first paragraph's inline content (the common case).
|
|
63
|
+
const firstBlock = parsed.content.child(0);
|
|
64
|
+
if (firstBlock && firstBlock.type.name === 'paragraph') {
|
|
65
|
+
slice = new Slice(firstBlock.content, 1, 1);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
slice = new Slice(parsed.content, 0, 0);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (text) {
|
|
72
|
+
slice = new Slice(Fragment.from([state.schema.text(text)]), 1, 1);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const tr = state.tr.step(new ReplaceStep(state.selection.from, state.selection.to, slice));
|
|
78
|
+
event.preventDefault();
|
|
79
|
+
view.dispatch(tr);
|
|
80
|
+
});
|
|
81
|
+
return () => {
|
|
82
|
+
for (const [type, listener] of handlers)
|
|
83
|
+
view.dom.removeEventListener(type, listener);
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function extractText(frag) {
|
|
87
|
+
let out = '';
|
|
88
|
+
for (const c of frag.children) {
|
|
89
|
+
const n = c;
|
|
90
|
+
if (n.isText)
|
|
91
|
+
out += n.text;
|
|
92
|
+
else
|
|
93
|
+
out += extractText(n.content);
|
|
94
|
+
}
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/view/clipboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-renderer.d.ts","sourceRoot":"","sources":["../../src/view/default-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAwC,MAAM,eAAe,CAAA;AA4H9E,eAAO,MAAM,eAAe,UA0B1B,CAAA"}
|