@react-x11/components 0.7.1 → 0.9.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/README.md +295 -51
- package/dist/charts/node.d.ts +1 -1
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +6 -2
- package/dist/charts/node.js.map +1 -1
- package/dist/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/color-picker/ColorPicker.js +43 -33
- package/dist/color-picker/ColorPicker.js.map +1 -1
- package/dist/embed/client.d.ts +48 -3
- package/dist/embed/client.d.ts.map +1 -1
- package/dist/embed/client.js +79 -5
- package/dist/embed/client.js.map +1 -1
- package/dist/embed/index.d.ts +1 -1
- package/dist/embed/index.d.ts.map +1 -1
- package/dist/embed/index.js +1 -1
- package/dist/embed/index.js.map +1 -1
- package/dist/html/node.d.ts +3 -1
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +7 -5
- package/dist/html/node.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{markdown → internal/markdown}/ast.d.ts +12 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -0
- package/dist/internal/markdown/ast.js +22 -0
- package/dist/internal/markdown/ast.js.map +1 -0
- package/dist/internal/markdown/parse.d.ts.map +1 -0
- package/dist/{markdown → internal/markdown}/parse.js +112 -22
- package/dist/internal/markdown/parse.js.map +1 -0
- package/dist/internal/markdown/stringify.d.ts +4 -0
- package/dist/internal/markdown/stringify.d.ts.map +1 -0
- package/dist/internal/markdown/stringify.js +684 -0
- package/dist/internal/markdown/stringify.js.map +1 -0
- package/dist/internal/markdown/tags.d.ts.map +1 -0
- package/dist/internal/markdown/tags.js.map +1 -0
- package/dist/internal/scroll.d.ts +3 -2
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +33 -15
- package/dist/internal/scroll.js.map +1 -1
- package/dist/internal/units.d.ts +2 -0
- package/dist/internal/units.d.ts.map +1 -0
- package/dist/internal/units.js +35 -0
- package/dist/internal/units.js.map +1 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +4 -2
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +98 -0
- package/dist/maps/anchors.d.ts.map +1 -0
- package/dist/maps/anchors.js +531 -0
- package/dist/maps/anchors.js.map +1 -0
- package/dist/maps/controller.d.ts +283 -0
- package/dist/maps/controller.d.ts.map +1 -0
- package/dist/maps/controller.js +743 -0
- package/dist/maps/controller.js.map +1 -0
- package/dist/maps/gl/buckets.d.ts +95 -0
- package/dist/maps/gl/buckets.d.ts.map +1 -0
- package/dist/maps/gl/buckets.js +362 -0
- package/dist/maps/gl/buckets.js.map +1 -0
- package/dist/maps/gl/build-worker.d.ts +13 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -0
- package/dist/maps/gl/build-worker.js +44 -0
- package/dist/maps/gl/build-worker.js.map +1 -0
- package/dist/maps/gl/color.d.ts +8 -0
- package/dist/maps/gl/color.d.ts.map +1 -0
- package/dist/maps/gl/color.js +57 -0
- package/dist/maps/gl/color.js.map +1 -0
- package/dist/maps/gl/cover.d.ts +51 -0
- package/dist/maps/gl/cover.d.ts.map +1 -0
- package/dist/maps/gl/cover.js +124 -0
- package/dist/maps/gl/cover.js.map +1 -0
- package/dist/maps/gl/index.d.ts +3 -0
- package/dist/maps/gl/index.d.ts.map +1 -0
- package/dist/maps/gl/index.js +20 -0
- package/dist/maps/gl/index.js.map +1 -0
- package/dist/maps/gl/markers.d.ts +28 -0
- package/dist/maps/gl/markers.d.ts.map +1 -0
- package/dist/maps/gl/markers.js +60 -0
- package/dist/maps/gl/markers.js.map +1 -0
- package/dist/maps/gl/overlays.d.ts +68 -0
- package/dist/maps/gl/overlays.d.ts.map +1 -0
- package/dist/maps/gl/overlays.js +300 -0
- package/dist/maps/gl/overlays.js.map +1 -0
- package/dist/maps/gl/pane.d.ts +12 -0
- package/dist/maps/gl/pane.d.ts.map +1 -0
- package/dist/maps/gl/pane.js +37 -0
- package/dist/maps/gl/pane.js.map +1 -0
- package/dist/maps/gl/placement.d.ts +111 -0
- package/dist/maps/gl/placement.d.ts.map +1 -0
- package/dist/maps/gl/placement.js +567 -0
- package/dist/maps/gl/placement.js.map +1 -0
- package/dist/maps/gl/renderer.d.ts +352 -0
- package/dist/maps/gl/renderer.d.ts.map +1 -0
- package/dist/maps/gl/renderer.js +1127 -0
- package/dist/maps/gl/renderer.js.map +1 -0
- package/dist/maps/gl/shaders.d.ts +120 -0
- package/dist/maps/gl/shaders.d.ts.map +1 -0
- package/dist/maps/gl/shaders.js +451 -0
- package/dist/maps/gl/shaders.js.map +1 -0
- package/dist/maps/gl/store.d.ts +115 -0
- package/dist/maps/gl/store.d.ts.map +1 -0
- package/dist/maps/gl/store.js +469 -0
- package/dist/maps/gl/store.js.map +1 -0
- package/dist/maps/gl/text.d.ts +154 -0
- package/dist/maps/gl/text.d.ts.map +1 -0
- package/dist/maps/gl/text.js +382 -0
- package/dist/maps/gl/text.js.map +1 -0
- package/dist/maps/gl/view.d.ts +54 -0
- package/dist/maps/gl/view.d.ts.map +1 -0
- package/dist/maps/gl/view.js +974 -0
- package/dist/maps/gl/view.js.map +1 -0
- package/dist/maps/index.d.ts +1 -1
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +216 -52
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +37 -16
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +188 -119
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +162 -56
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +607 -515
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/overlay.d.ts +72 -9
- package/dist/maps/overlay.d.ts.map +1 -1
- package/dist/maps/overlay.js +108 -28
- package/dist/maps/overlay.js.map +1 -1
- package/dist/maps/paint.d.ts +3 -0
- package/dist/maps/paint.d.ts.map +1 -1
- package/dist/maps/paint.js.map +1 -1
- package/dist/maps/proj.d.ts +14 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +28 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/renderer.d.ts +69 -0
- package/dist/maps/renderer.d.ts.map +1 -0
- package/dist/maps/renderer.js +66 -0
- package/dist/maps/renderer.js.map +1 -0
- package/dist/maps/sources.d.ts +25 -3
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +17 -0
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/theme.d.ts +19 -0
- package/dist/maps/theme.d.ts.map +1 -0
- package/dist/maps/theme.js +44 -0
- package/dist/maps/theme.js.map +1 -0
- package/dist/maps/tiles.d.ts +117 -17
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +163 -30
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +188 -20
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/expressions.d.ts +1 -1
- package/dist/markdown/expressions.d.ts.map +1 -1
- package/dist/markdown/expressions.js.map +1 -1
- package/dist/markdown/index.d.ts +7 -6
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +9 -7
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/media-player/index.d.ts +11 -3
- package/dist/media-player/index.d.ts.map +1 -1
- package/dist/media-player/index.js +13 -2
- package/dist/media-player/index.js.map +1 -1
- package/dist/rich-text-editor/clipboard.d.ts +23 -0
- package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
- package/dist/rich-text-editor/clipboard.js +307 -0
- package/dist/rich-text-editor/clipboard.js.map +1 -0
- package/dist/rich-text-editor/collab.d.ts +32 -0
- package/dist/rich-text-editor/collab.d.ts.map +1 -0
- package/dist/rich-text-editor/collab.js +55 -0
- package/dist/rich-text-editor/collab.js.map +1 -0
- package/dist/rich-text-editor/commands.d.ts +50 -0
- package/dist/rich-text-editor/commands.d.ts.map +1 -0
- package/dist/rich-text-editor/commands.js +376 -0
- package/dist/rich-text-editor/commands.js.map +1 -0
- package/dist/rich-text-editor/drag.d.ts +68 -0
- package/dist/rich-text-editor/drag.d.ts.map +1 -0
- package/dist/rich-text-editor/drag.js +148 -0
- package/dist/rich-text-editor/drag.js.map +1 -0
- package/dist/rich-text-editor/html.d.ts +145 -0
- package/dist/rich-text-editor/html.d.ts.map +1 -0
- package/dist/rich-text-editor/html.js +516 -0
- package/dist/rich-text-editor/html.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +263 -0
- package/dist/rich-text-editor/index.d.ts.map +1 -0
- package/dist/rich-text-editor/index.js +822 -0
- package/dist/rich-text-editor/index.js.map +1 -0
- package/dist/rich-text-editor/inline.d.ts +94 -0
- package/dist/rich-text-editor/inline.d.ts.map +1 -0
- package/dist/rich-text-editor/inline.js +252 -0
- package/dist/rich-text-editor/inline.js.map +1 -0
- package/dist/rich-text-editor/keymap.d.ts +71 -0
- package/dist/rich-text-editor/keymap.d.ts.map +1 -0
- package/dist/rich-text-editor/keymap.js +393 -0
- package/dist/rich-text-editor/keymap.js.map +1 -0
- package/dist/rich-text-editor/keys.d.ts +29 -0
- package/dist/rich-text-editor/keys.d.ts.map +1 -0
- package/dist/rich-text-editor/keys.js +93 -0
- package/dist/rich-text-editor/keys.js.map +1 -0
- package/dist/rich-text-editor/look.d.ts +71 -0
- package/dist/rich-text-editor/look.d.ts.map +1 -0
- package/dist/rich-text-editor/look.js +342 -0
- package/dist/rich-text-editor/look.js.map +1 -0
- package/dist/rich-text-editor/markdown.d.ts +18 -0
- package/dist/rich-text-editor/markdown.d.ts.map +1 -0
- package/dist/rich-text-editor/markdown.js +496 -0
- package/dist/rich-text-editor/markdown.js.map +1 -0
- package/dist/rich-text-editor/nodes.d.ts +135 -0
- package/dist/rich-text-editor/nodes.d.ts.map +1 -0
- package/dist/rich-text-editor/nodes.js +397 -0
- package/dist/rich-text-editor/nodes.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts +68 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -0
- package/dist/rich-text-editor/render.js +500 -0
- package/dist/rich-text-editor/render.js.map +1 -0
- package/dist/rich-text-editor/schema.d.ts +16 -0
- package/dist/rich-text-editor/schema.d.ts.map +1 -0
- package/dist/rich-text-editor/schema.js +386 -0
- package/dist/rich-text-editor/schema.js.map +1 -0
- package/dist/rich-text-editor/store.d.ts +11 -0
- package/dist/rich-text-editor/store.d.ts.map +1 -0
- package/dist/rich-text-editor/store.js +43 -0
- package/dist/rich-text-editor/store.js.map +1 -0
- package/dist/rich-text-editor/suggest.d.ts +127 -0
- package/dist/rich-text-editor/suggest.d.ts.map +1 -0
- package/dist/rich-text-editor/suggest.js +0 -0
- package/dist/rich-text-editor/suggest.js.map +1 -0
- package/dist/rich-text-editor/tables.d.ts +41 -0
- package/dist/rich-text-editor/tables.d.ts.map +1 -0
- package/dist/rich-text-editor/tables.js +204 -0
- package/dist/rich-text-editor/tables.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts +58 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
- package/dist/rich-text-editor/toolbar.js +548 -0
- package/dist/rich-text-editor/toolbar.js.map +1 -0
- package/dist/rich-text-editor/view.d.ts +368 -0
- package/dist/rich-text-editor/view.d.ts.map +1 -0
- package/dist/rich-text-editor/view.js +1968 -0
- package/dist/rich-text-editor/view.js.map +1 -0
- package/dist/rich-text-editor/virtual.d.ts +54 -0
- package/dist/rich-text-editor/virtual.d.ts.map +1 -0
- package/dist/rich-text-editor/virtual.js +262 -0
- package/dist/rich-text-editor/virtual.js.map +1 -0
- package/dist/richtext/node.d.ts +25 -2
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +46 -24
- package/dist/richtext/node.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +14 -5
- package/dist/table/index.js.map +1 -1
- package/dist/terminal/backends.d.ts +4 -1
- package/dist/terminal/backends.d.ts.map +1 -1
- package/dist/terminal/backends.js.map +1 -1
- package/dist/terminal/index.d.ts +18 -7
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +28 -11
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/node.d.ts +56 -3
- package/dist/terminal/vt/node.d.ts.map +1 -1
- package/dist/terminal/vt/node.js +106 -26
- package/dist/terminal/vt/node.js.map +1 -1
- package/dist/terminal/vt/renderer.d.ts +4 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -1
- package/dist/terminal/vt/renderer.js +14 -5
- package/dist/terminal/vt/renderer.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +6 -4
- package/dist/tree/index.js.map +1 -1
- package/package.json +23 -4
- package/src/charts/node.ts +6 -2
- package/src/color-picker/ColorPicker.ts +107 -81
- package/src/embed/client.ts +102 -8
- package/src/embed/index.ts +2 -0
- package/src/html/node.ts +7 -5
- package/src/index.ts +2 -0
- package/src/{markdown → internal/markdown}/ast.ts +24 -7
- package/src/{markdown → internal/markdown}/parse.ts +134 -24
- package/src/internal/markdown/stringify.ts +772 -0
- package/src/internal/scroll.ts +39 -18
- package/src/internal/units.ts +34 -0
- package/src/internal/window.ts +4 -2
- package/src/maps/anchors.ts +607 -0
- package/src/maps/controller.ts +999 -0
- package/src/maps/gl/buckets.ts +457 -0
- package/src/maps/gl/build-worker.ts +55 -0
- package/src/maps/gl/color.ts +62 -0
- package/src/maps/gl/cover.ts +170 -0
- package/src/maps/gl/index.ts +23 -0
- package/src/maps/gl/markers.ts +83 -0
- package/src/maps/gl/overlays.ts +379 -0
- package/src/maps/gl/pane.ts +42 -0
- package/src/maps/gl/placement.ts +816 -0
- package/src/maps/gl/renderer.ts +1576 -0
- package/src/maps/gl/shaders.ts +486 -0
- package/src/maps/gl/store.ts +566 -0
- package/src/maps/gl/text.ts +495 -0
- package/src/maps/gl/view.ts +1224 -0
- package/src/maps/index.ts +270 -81
- package/src/maps/labels.ts +214 -121
- package/src/maps/node.ts +763 -629
- package/src/maps/overlay.ts +148 -43
- package/src/maps/paint.ts +3 -0
- package/src/maps/proj.ts +31 -0
- package/src/maps/renderer.ts +155 -0
- package/src/maps/sources.ts +38 -3
- package/src/maps/theme.ts +51 -0
- package/src/maps/tiles.ts +191 -33
- package/src/maps/types.ts +188 -20
- package/src/markdown/expressions.ts +5 -1
- package/src/markdown/index.ts +14 -11
- package/src/markdown/spans.ts +1 -1
- package/src/media-player/index.ts +18 -4
- package/src/rich-text-editor/clipboard.ts +439 -0
- package/src/rich-text-editor/collab.ts +91 -0
- package/src/rich-text-editor/commands.ts +448 -0
- package/src/rich-text-editor/dom-globals.d.ts +23 -0
- package/src/rich-text-editor/drag.ts +211 -0
- package/src/rich-text-editor/html.ts +619 -0
- package/src/rich-text-editor/index.ts +1331 -0
- package/src/rich-text-editor/inline.ts +345 -0
- package/src/rich-text-editor/keymap.ts +510 -0
- package/src/rich-text-editor/keys.ts +119 -0
- package/src/rich-text-editor/look.ts +427 -0
- package/src/rich-text-editor/markdown.ts +653 -0
- package/src/rich-text-editor/nodes.ts +497 -0
- package/src/rich-text-editor/render.ts +800 -0
- package/src/rich-text-editor/schema.ts +431 -0
- package/src/rich-text-editor/store.ts +39 -0
- package/src/rich-text-editor/suggest.ts +597 -0
- package/src/rich-text-editor/tables.ts +272 -0
- package/src/rich-text-editor/toolbar.ts +724 -0
- package/src/rich-text-editor/view.ts +2287 -0
- package/src/rich-text-editor/virtual.ts +347 -0
- package/src/richtext/node.ts +59 -30
- package/src/table/index.ts +14 -5
- package/src/terminal/backends.ts +4 -1
- package/src/terminal/index.ts +43 -15
- package/src/terminal/vt/node.ts +128 -29
- package/src/terminal/vt/renderer.ts +27 -5
- package/src/tree/index.ts +6 -4
- package/dist/markdown/ast.d.ts.map +0 -1
- package/dist/markdown/ast.js +0 -17
- package/dist/markdown/ast.js.map +0 -1
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/tags.d.ts.map +0 -1
- package/dist/markdown/tags.js.map +0 -1
- /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.js +0 -0
- /package/src/{markdown → internal/markdown}/tags.ts +0 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// Table editing: rows and columns in and out, a table where the caret is,
|
|
2
|
+
// and a column's alignment — prosemirror-tables' commands, kept to the shape
|
|
3
|
+
// a table in markdown has.
|
|
4
|
+
//
|
|
5
|
+
// prosemirror-tables is the ecosystem's table model. Its `TableMap` answers
|
|
6
|
+
// "which cell is at row r, column c" through spans, and its commands are the
|
|
7
|
+
// argued-over answers for adding and removing rows and columns; the default
|
|
8
|
+
// schema's table nodes carry its `tableRole`s and cell attributes so they
|
|
9
|
+
// can be pointed at it (./schema.ts). What it does not know is the rule of
|
|
10
|
+
// the editor's value: **a markdown table has one header row, it is the first
|
|
11
|
+
// row, and alignment belongs to a column.** prosemirror-tables inserts a row
|
|
12
|
+
// above the header as plain cells, leaves a first row that is not a header
|
|
13
|
+
// when the header is deleted, and gives a new cell no alignment — each of
|
|
14
|
+
// which markdown would read back as something other than what the editor
|
|
15
|
+
// showed. So a command here that starts in a table shaped like markdown's
|
|
16
|
+
// finishes by putting that shape back (`keepMarkdownShape`); a table shaped
|
|
17
|
+
// otherwise — a header column, an HTML table with no header — is left as
|
|
18
|
+
// prosemirror-tables leaves it.
|
|
19
|
+
//
|
|
20
|
+
// Its `tableEditing()` plugin is not used: the cell selection it adds runs
|
|
21
|
+
// on DOM mouse events this view does not have. `fixTables` is, through
|
|
22
|
+
// `tableRepair` — the repair a pasted ragged table needs before `TableMap`
|
|
23
|
+
// can reason about it.
|
|
24
|
+
import type { Node as PMNode, NodeType, Schema } from 'prosemirror-model';
|
|
25
|
+
import { Plugin, TextSelection } from 'prosemirror-state';
|
|
26
|
+
import type { Command, EditorState, Transaction } from 'prosemirror-state';
|
|
27
|
+
import {
|
|
28
|
+
addColumnAfter as addColumnAfterPM,
|
|
29
|
+
addColumnBefore as addColumnBeforePM,
|
|
30
|
+
addRowAfter as addRowAfterPM,
|
|
31
|
+
addRowBefore as addRowBeforePM,
|
|
32
|
+
deleteColumn as deleteColumnPM,
|
|
33
|
+
deleteRow as deleteRowPM,
|
|
34
|
+
deleteTable as deleteTablePM,
|
|
35
|
+
findTable,
|
|
36
|
+
fixTables,
|
|
37
|
+
isInTable,
|
|
38
|
+
selectedRect,
|
|
39
|
+
tableNodeTypes,
|
|
40
|
+
} from 'prosemirror-tables';
|
|
41
|
+
|
|
42
|
+
/** A column's alignment, as GFM writes it — `:--`, `:-:`, `--:` — or none. */
|
|
43
|
+
export type ColumnAlign = 'left' | 'center' | 'right' | null;
|
|
44
|
+
|
|
45
|
+
interface TableTypes {
|
|
46
|
+
table: NodeType;
|
|
47
|
+
row: NodeType;
|
|
48
|
+
cell: NodeType;
|
|
49
|
+
/** Null when the schema has no header cell of its own. */
|
|
50
|
+
header: NodeType | null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The schema's table node types by prosemirror-tables' roles, or null for
|
|
54
|
+
* a schema without tables. */
|
|
55
|
+
function tableTypes(schema: Schema): TableTypes | null {
|
|
56
|
+
const roles = tableNodeTypes(schema) as Partial<Record<string, NodeType>>;
|
|
57
|
+
const { table, row, cell } = roles;
|
|
58
|
+
if (!table || !row || !cell) return null;
|
|
59
|
+
const header = roles.header_cell;
|
|
60
|
+
return {
|
|
61
|
+
table,
|
|
62
|
+
row,
|
|
63
|
+
cell,
|
|
64
|
+
header: header && header !== cell ? header : null,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function alignOf(cell: PMNode): ColumnAlign {
|
|
69
|
+
const a = cell.attrs.align;
|
|
70
|
+
return a === 'left' || a === 'center' || a === 'right' ? a : null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Header cells in the first row and nowhere else, and no spans: the only
|
|
74
|
+
* table markdown can write. */
|
|
75
|
+
function markdownShaped(table: PMNode, types: TableTypes): boolean {
|
|
76
|
+
if (!types.header || table.childCount === 0) return false;
|
|
77
|
+
let shaped = true;
|
|
78
|
+
table.forEach((row, _offset, index) => {
|
|
79
|
+
row.forEach((cell) => {
|
|
80
|
+
if ((cell.type === types.header) !== (index === 0)) shaped = false;
|
|
81
|
+
if ((cell.attrs.colspan ?? 1) !== 1 || (cell.attrs.rowspan ?? 1) !== 1)
|
|
82
|
+
shaped = false;
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
return shaped;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Put markdown's shape back on the table at `tablePos`: header cells in the
|
|
90
|
+
* first row and plain ones below, and each column aligned the way the first
|
|
91
|
+
* of its cells that says so is. Cells change type and attributes in place,
|
|
92
|
+
* so no position moves.
|
|
93
|
+
*/
|
|
94
|
+
function keepMarkdownShape(
|
|
95
|
+
tr: Transaction,
|
|
96
|
+
tablePos: number,
|
|
97
|
+
types: TableTypes,
|
|
98
|
+
): void {
|
|
99
|
+
const table = tr.doc.nodeAt(tablePos);
|
|
100
|
+
if (!table || table.type !== types.table || !types.header) return;
|
|
101
|
+
const header = types.header;
|
|
102
|
+
// `??=` fills a column still at null too, so the first cell that says
|
|
103
|
+
// how its column is aligned wins
|
|
104
|
+
const aligns: ColumnAlign[] = [];
|
|
105
|
+
table.forEach((row) => {
|
|
106
|
+
row.forEach((cell, _offset, col) => {
|
|
107
|
+
aligns[col] ??= alignOf(cell);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
table.forEach((row, rowOffset, index) => {
|
|
111
|
+
row.forEach((cell, cellOffset, col) => {
|
|
112
|
+
const type = index === 0 ? header : types.cell;
|
|
113
|
+
const align = aligns[col] ?? null;
|
|
114
|
+
const alignable = 'align' in cell.attrs;
|
|
115
|
+
if (cell.type === type && (!alignable || alignOf(cell) === align)) return;
|
|
116
|
+
tr.setNodeMarkup(
|
|
117
|
+
tablePos + 1 + rowOffset + 1 + cellOffset,
|
|
118
|
+
type,
|
|
119
|
+
alignable ? { ...cell.attrs, align } : cell.attrs,
|
|
120
|
+
cell.marks,
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
type TablesCommand = (
|
|
127
|
+
state: EditorState,
|
|
128
|
+
dispatch?: (tr: Transaction) => void,
|
|
129
|
+
) => boolean;
|
|
130
|
+
|
|
131
|
+
/** A prosemirror-tables command that leaves a markdown-shaped table
|
|
132
|
+
* markdown-shaped. */
|
|
133
|
+
function keepingShape(command: TablesCommand): Command {
|
|
134
|
+
return (state, dispatch) => {
|
|
135
|
+
const types = tableTypes(state.schema);
|
|
136
|
+
const found = isInTable(state) ? findTable(state.selection.$from) : null;
|
|
137
|
+
if (!dispatch || !types || !found || !markdownShaped(found.node, types))
|
|
138
|
+
return command(state, dispatch);
|
|
139
|
+
return command(state, (tr) => {
|
|
140
|
+
keepMarkdownShape(tr, tr.mapping.map(found.pos), types);
|
|
141
|
+
dispatch(tr.scrollIntoView());
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** A row above the one the selection is in. Above a markdown table's
|
|
147
|
+
* header, the new row becomes the header. */
|
|
148
|
+
export const addRowBefore: Command = keepingShape(addRowBeforePM);
|
|
149
|
+
/** A row below the one the selection is in. */
|
|
150
|
+
export const addRowAfter: Command = keepingShape(addRowAfterPM);
|
|
151
|
+
/** The selected rows out. The last row cannot go — delete the table. When a
|
|
152
|
+
* markdown table loses its header, the row below becomes it. */
|
|
153
|
+
export const deleteRow: Command = keepingShape(deleteRowPM);
|
|
154
|
+
/** A column before the one the selection is in. */
|
|
155
|
+
export const addColumnBefore: Command = keepingShape(addColumnBeforePM);
|
|
156
|
+
/** A column after the one the selection is in. */
|
|
157
|
+
export const addColumnAfter: Command = keepingShape(addColumnAfterPM);
|
|
158
|
+
/** The selected columns out. The last column cannot go. */
|
|
159
|
+
export const deleteColumn: Command = keepingShape(deleteColumnPM);
|
|
160
|
+
/** The table the selection is in, whole. */
|
|
161
|
+
export const deleteTable: Command = deleteTablePM;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* A table where the selection is: `rows` rows of `cols` columns, the first
|
|
165
|
+
* row a header, and the caret in its first cell — with a paragraph after it
|
|
166
|
+
* when nothing that takes a caret would follow. Not inside another table.
|
|
167
|
+
*/
|
|
168
|
+
export function insertTable(rows = 3, cols = 3): Command {
|
|
169
|
+
return (state, dispatch) => {
|
|
170
|
+
const types = tableTypes(state.schema);
|
|
171
|
+
if (!types || isInTable(state) || rows < 1 || cols < 1) return false;
|
|
172
|
+
const make = (type: NodeType): PMNode =>
|
|
173
|
+
types.row.create(
|
|
174
|
+
null,
|
|
175
|
+
Array.from({ length: cols }, () => type.createAndFill()!),
|
|
176
|
+
);
|
|
177
|
+
const table = types.table.create(null, [
|
|
178
|
+
make(types.header ?? types.cell),
|
|
179
|
+
...Array.from({ length: rows - 1 }, () => make(types.cell)),
|
|
180
|
+
]);
|
|
181
|
+
if (!dispatch) return true;
|
|
182
|
+
const from = state.selection.from;
|
|
183
|
+
const tr = state.tr.replaceSelectionWith(table);
|
|
184
|
+
// the node itself, where the replace put it — or, had fitting copied it,
|
|
185
|
+
// the first table from where the selection was
|
|
186
|
+
let at = -1;
|
|
187
|
+
tr.doc.descendants((node, pos) => {
|
|
188
|
+
if (at >= 0) return false;
|
|
189
|
+
if (node === table) at = pos;
|
|
190
|
+
return true;
|
|
191
|
+
});
|
|
192
|
+
if (at < 0) {
|
|
193
|
+
tr.doc.nodesBetween(
|
|
194
|
+
tr.mapping.map(from, -1),
|
|
195
|
+
tr.doc.content.size,
|
|
196
|
+
(n, pos) => {
|
|
197
|
+
if (at < 0 && n.type === types.table) at = pos;
|
|
198
|
+
return at < 0;
|
|
199
|
+
},
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
if (at < 0) return false;
|
|
203
|
+
const end = at + tr.doc.nodeAt(at)!.nodeSize;
|
|
204
|
+
const $end = tr.doc.resolve(end);
|
|
205
|
+
const para = state.schema.nodes.paragraph;
|
|
206
|
+
if (
|
|
207
|
+
para &&
|
|
208
|
+
!$end.nodeAfter &&
|
|
209
|
+
$end.parent.canReplaceWith($end.index(), $end.index(), para)
|
|
210
|
+
) {
|
|
211
|
+
tr.insert(end, para.create());
|
|
212
|
+
}
|
|
213
|
+
// table, row, cell: three steps in to the first cell's text
|
|
214
|
+
tr.setSelection(TextSelection.create(tr.doc, at + 3));
|
|
215
|
+
dispatch(tr.scrollIntoView());
|
|
216
|
+
return true;
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Every cell of the selected columns aligned: GFM's alignment is a
|
|
221
|
+
* column's, not a cell's. `null` takes it off. */
|
|
222
|
+
export function setColumnAlign(align: ColumnAlign): Command {
|
|
223
|
+
return (state, dispatch) => {
|
|
224
|
+
if (!isInTable(state)) return false;
|
|
225
|
+
const rect = selectedRect(state);
|
|
226
|
+
const { map, table, tableStart } = rect;
|
|
227
|
+
const first = table.firstChild?.firstChild;
|
|
228
|
+
if (!first || !('align' in first.attrs)) return false;
|
|
229
|
+
if (!dispatch) return true;
|
|
230
|
+
const tr = state.tr;
|
|
231
|
+
const done = new Set<number>();
|
|
232
|
+
for (let row = 0; row < map.height; row++) {
|
|
233
|
+
for (let col = rect.left; col < rect.right; col++) {
|
|
234
|
+
const at = map.map[row * map.width + col];
|
|
235
|
+
if (done.has(at)) continue;
|
|
236
|
+
done.add(at);
|
|
237
|
+
const cell = table.nodeAt(at);
|
|
238
|
+
if (cell && alignOf(cell) !== align)
|
|
239
|
+
tr.setNodeMarkup(tableStart + at, undefined, {
|
|
240
|
+
...cell.attrs,
|
|
241
|
+
align,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
dispatch(tr);
|
|
246
|
+
return true;
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** The alignment of the column the selection is in, or undefined outside a
|
|
251
|
+
* table — what lights an alignment button. */
|
|
252
|
+
export function columnAlign(state: EditorState): ColumnAlign | undefined {
|
|
253
|
+
if (!isInTable(state)) return undefined;
|
|
254
|
+
const rect = selectedRect(state);
|
|
255
|
+
const cell = rect.table.nodeAt(rect.map.map[rect.left]);
|
|
256
|
+
return cell ? alignOf(cell) : null;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export { isInTable };
|
|
260
|
+
|
|
261
|
+
/** Every table kept rectangular: prosemirror-tables' `fixTables` after each
|
|
262
|
+
* change, for a table that a paste or an HTML document left ragged. */
|
|
263
|
+
export function tableRepair(): Plugin {
|
|
264
|
+
return new Plugin({
|
|
265
|
+
appendTransaction: (_trs, oldState, state) => fixTables(state, oldState),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** Whether the schema has tables prosemirror-tables can edit. */
|
|
270
|
+
export function hasTables(schema: Schema): boolean {
|
|
271
|
+
return tableTypes(schema) !== null;
|
|
272
|
+
}
|