@kerebron/extension-tables 0.4.27 → 0.4.29
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/esm/ExtensionTables.d.ts +10 -0
- package/esm/ExtensionTables.d.ts.map +1 -0
- package/esm/ExtensionTables.js +15 -0
- package/esm/ExtensionTables.js.map +1 -0
- package/esm/NodeTable.d.ts +19 -0
- package/esm/NodeTable.d.ts.map +1 -0
- package/esm/NodeTable.js +84 -0
- package/esm/NodeTable.js.map +1 -0
- package/esm/NodeTableCell.d.ts +11 -0
- package/esm/NodeTableCell.d.ts.map +1 -0
- package/esm/NodeTableCell.js +54 -0
- package/esm/NodeTableCell.js.map +1 -0
- package/esm/NodeTableHeader.d.ts +8 -0
- package/esm/NodeTableHeader.d.ts.map +1 -0
- package/esm/NodeTableHeader.js +44 -0
- package/esm/NodeTableHeader.js.map +1 -0
- package/esm/NodeTableRow.d.ts +11 -0
- package/esm/NodeTableRow.d.ts.map +1 -0
- package/esm/NodeTableRow.js +24 -0
- package/esm/NodeTableRow.js.map +1 -0
- package/esm/_dnt.shims.d.ts +2 -0
- package/esm/_dnt.shims.d.ts.map +1 -0
- package/esm/_dnt.shims.js +58 -0
- package/esm/_dnt.shims.js.map +1 -0
- package/esm/package.json +3 -0
- package/esm/utilities/CellSelection.d.ts +53 -0
- package/esm/utilities/CellSelection.d.ts.map +1 -0
- package/esm/utilities/CellSelection.js +365 -0
- package/esm/utilities/CellSelection.js.map +1 -0
- package/esm/utilities/TableMap.d.ts +92 -0
- package/esm/utilities/TableMap.d.ts.map +1 -0
- package/esm/utilities/TableMap.js +320 -0
- package/esm/utilities/TableMap.js.map +1 -0
- package/esm/utilities/TableView.d.ts +21 -0
- package/esm/utilities/TableView.d.ts.map +1 -0
- package/esm/utilities/TableView.js +81 -0
- package/esm/utilities/TableView.js.map +1 -0
- package/esm/utilities/columnResizing.d.ts +50 -0
- package/esm/utilities/columnResizing.d.ts.map +1 -0
- package/esm/utilities/columnResizing.js +300 -0
- package/esm/utilities/columnResizing.js.map +1 -0
- package/esm/utilities/commands.d.ts +164 -0
- package/esm/utilities/commands.d.ts.map +1 -0
- package/esm/utilities/commands.js +703 -0
- package/esm/utilities/commands.js.map +1 -0
- package/esm/utilities/copypaste.d.ts +35 -0
- package/esm/utilities/copypaste.d.ts.map +1 -0
- package/esm/utilities/copypaste.js +284 -0
- package/esm/utilities/copypaste.js.map +1 -0
- package/esm/utilities/createCell.d.ts +3 -0
- package/esm/utilities/createCell.d.ts.map +1 -0
- package/esm/utilities/createCell.js +7 -0
- package/esm/utilities/createCell.js.map +1 -0
- package/esm/utilities/createTable.d.ts +3 -0
- package/esm/utilities/createTable.d.ts.map +1 -0
- package/esm/utilities/createTable.js +32 -0
- package/esm/utilities/createTable.js.map +1 -0
- package/esm/utilities/fixTables.d.ts +20 -0
- package/esm/utilities/fixTables.d.ts.map +1 -0
- package/esm/utilities/fixTables.js +147 -0
- package/esm/utilities/fixTables.js.map +1 -0
- package/esm/utilities/getTableNodeTypes.d.ts +5 -0
- package/esm/utilities/getTableNodeTypes.d.ts.map +1 -0
- package/esm/utilities/getTableNodeTypes.js +15 -0
- package/esm/utilities/getTableNodeTypes.js.map +1 -0
- package/esm/utilities/input.d.ts +21 -0
- package/esm/utilities/input.d.ts.map +1 -0
- package/esm/utilities/input.js +242 -0
- package/esm/utilities/input.js.map +1 -0
- package/esm/utilities/tableEditing.d.ts +23 -0
- package/esm/utilities/tableEditing.d.ts.map +1 -0
- package/esm/utilities/tableEditing.js +64 -0
- package/esm/utilities/tableEditing.js.map +1 -0
- package/esm/utilities/tableNodeTypes.d.ts +14 -0
- package/esm/utilities/tableNodeTypes.d.ts.map +1 -0
- package/esm/utilities/tableNodeTypes.js +17 -0
- package/esm/utilities/tableNodeTypes.js.map +1 -0
- package/esm/utilities/util.d.ts +73 -0
- package/esm/utilities/util.d.ts.map +1 -0
- package/esm/utilities/util.js +156 -0
- package/esm/utilities/util.js.map +1 -0
- package/package.json +6 -3
- package/src/ExtensionTables.ts +16 -0
- package/src/NodeTable.ts +139 -0
- package/src/NodeTableCell.ts +70 -0
- package/src/NodeTableHeader.ts +49 -0
- package/src/NodeTableRow.ts +41 -0
- package/src/_dnt.shims.ts +60 -0
- package/src/utilities/CellSelection.ts +477 -0
- package/src/utilities/TableMap.ts +392 -0
- package/src/utilities/TableView.ts +102 -0
- package/src/utilities/columnResizing.ts +437 -0
- package/src/utilities/commands.ts +896 -0
- package/src/utilities/copypaste.ts +394 -0
- package/src/utilities/createCell.ts +12 -0
- package/src/utilities/createTable.ts +53 -0
- package/src/utilities/fixTables.ts +156 -0
- package/src/utilities/getTableNodeTypes.ts +21 -0
- package/src/utilities/input.ts +299 -0
- package/src/utilities/tableEditing.ts +90 -0
- package/src/utilities/tableNodeTypes.ts +32 -0
- package/src/utilities/util.ts +204 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// Various helper function for working with tables
|
|
2
|
+
import { PluginKey } from 'prosemirror-state';
|
|
3
|
+
import { tableNodeTypes } from './tableNodeTypes.js';
|
|
4
|
+
import { TableMap } from './TableMap.js';
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export const tableEditingKey = new PluginKey('selectingCells');
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export function cellAround($pos) {
|
|
13
|
+
for (let d = $pos.depth - 1; d > 0; d--) {
|
|
14
|
+
if ($pos.node(d).type.spec.tableRole == 'row') {
|
|
15
|
+
return $pos.node(0).resolve($pos.before(d + 1));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function cellWrapping($pos) {
|
|
21
|
+
for (let d = $pos.depth; d > 0; d--) {
|
|
22
|
+
// Sometimes the cell can be in the same depth.
|
|
23
|
+
const role = $pos.node(d).type.spec.tableRole;
|
|
24
|
+
if (role === 'cell' || role === 'header_cell')
|
|
25
|
+
return $pos.node(d);
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @public
|
|
31
|
+
*/
|
|
32
|
+
export function isInTable(state) {
|
|
33
|
+
const $head = state.selection.$head;
|
|
34
|
+
for (let d = $head.depth; d > 0; d--) {
|
|
35
|
+
if ($head.node(d).type.spec.tableRole == 'row')
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
export function selectionCell(state) {
|
|
44
|
+
const sel = state.selection;
|
|
45
|
+
if ('$anchorCell' in sel && sel.$anchorCell) {
|
|
46
|
+
return sel.$anchorCell.pos > sel.$headCell.pos
|
|
47
|
+
? sel.$anchorCell
|
|
48
|
+
: sel.$headCell;
|
|
49
|
+
}
|
|
50
|
+
else if ('node' in sel &&
|
|
51
|
+
sel.node &&
|
|
52
|
+
sel.node.type.spec.tableRole == 'cell') {
|
|
53
|
+
return sel.$anchor;
|
|
54
|
+
}
|
|
55
|
+
const $cell = cellAround(sel.$head) || cellNear(sel.$head);
|
|
56
|
+
if ($cell) {
|
|
57
|
+
return $cell;
|
|
58
|
+
}
|
|
59
|
+
throw new RangeError(`No cell found around position ${sel.head}`);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
export function cellNear($pos) {
|
|
65
|
+
for (let after = $pos.nodeAfter, pos = $pos.pos; after; after = after.firstChild, pos++) {
|
|
66
|
+
const role = after.type.spec.tableRole;
|
|
67
|
+
if (role == 'cell' || role == 'header_cell')
|
|
68
|
+
return $pos.doc.resolve(pos);
|
|
69
|
+
}
|
|
70
|
+
for (let before = $pos.nodeBefore, pos = $pos.pos; before; before = before.lastChild, pos--) {
|
|
71
|
+
const role = before.type.spec.tableRole;
|
|
72
|
+
if (role == 'cell' || role == 'header_cell') {
|
|
73
|
+
return $pos.doc.resolve(pos - before.nodeSize);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* @public
|
|
79
|
+
*/
|
|
80
|
+
export function pointsAtCell($pos) {
|
|
81
|
+
return $pos.parent.type.spec.tableRole == 'row' && !!$pos.nodeAfter;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* @public
|
|
85
|
+
*/
|
|
86
|
+
export function moveCellForward($pos) {
|
|
87
|
+
return $pos.node(0).resolve($pos.pos + $pos.nodeAfter.nodeSize);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @internal
|
|
91
|
+
*/
|
|
92
|
+
export function inSameTable($cellA, $cellB) {
|
|
93
|
+
return ($cellA.depth == $cellB.depth &&
|
|
94
|
+
$cellA.pos >= $cellB.start(-1) &&
|
|
95
|
+
$cellA.pos <= $cellB.end(-1));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @public
|
|
99
|
+
*/
|
|
100
|
+
export function findCell($pos) {
|
|
101
|
+
return TableMap.get($pos.node(-1)).findCell($pos.pos - $pos.start(-1));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* @public
|
|
105
|
+
*/
|
|
106
|
+
export function colCount($pos) {
|
|
107
|
+
return TableMap.get($pos.node(-1)).colCount($pos.pos - $pos.start(-1));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @public
|
|
111
|
+
*/
|
|
112
|
+
export function nextCell($pos, axis, dir) {
|
|
113
|
+
const table = $pos.node(-1);
|
|
114
|
+
const map = TableMap.get(table);
|
|
115
|
+
const tableStart = $pos.start(-1);
|
|
116
|
+
const moved = map.nextCell($pos.pos - tableStart, axis, dir);
|
|
117
|
+
return moved == null ? null : $pos.node(0).resolve(tableStart + moved);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* @public
|
|
121
|
+
*/
|
|
122
|
+
export function removeColSpan(attrs, pos, n = 1) {
|
|
123
|
+
const result = { ...attrs, colspan: attrs.colspan - n };
|
|
124
|
+
if (result.colwidth) {
|
|
125
|
+
result.colwidth = result.colwidth.slice();
|
|
126
|
+
result.colwidth.splice(pos, n);
|
|
127
|
+
if (!result.colwidth.some((w) => w > 0))
|
|
128
|
+
result.colwidth = null;
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @public
|
|
134
|
+
*/
|
|
135
|
+
export function addColSpan(attrs, pos, n = 1) {
|
|
136
|
+
const result = { ...attrs, colspan: attrs.colspan + n };
|
|
137
|
+
if (result.colwidth) {
|
|
138
|
+
result.colwidth = result.colwidth.slice();
|
|
139
|
+
for (let i = 0; i < n; i++)
|
|
140
|
+
result.colwidth.splice(pos, 0, 0);
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* @public
|
|
146
|
+
*/
|
|
147
|
+
export function columnIsHeader(map, table, col) {
|
|
148
|
+
const headerCell = tableNodeTypes(table.type.schema).header_cell;
|
|
149
|
+
for (let row = 0; row < map.height; row++) {
|
|
150
|
+
if (table.nodeAt(map.map[col + row * map.width]).type != headerCell) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/utilities/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kerebron/extension-tables",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.29",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"module": "./esm/ExtensionTables.js",
|
|
6
6
|
"exports": {
|
|
@@ -24,9 +24,12 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"scripts": {},
|
|
27
|
-
"files": [
|
|
27
|
+
"files": [
|
|
28
|
+
"esm",
|
|
29
|
+
"src"
|
|
30
|
+
],
|
|
28
31
|
"dependencies": {
|
|
29
|
-
"@kerebron/editor": "0.4.
|
|
32
|
+
"@kerebron/editor": "0.4.29",
|
|
30
33
|
"prosemirror-model": "1.25.3",
|
|
31
34
|
"prosemirror-state": "1.4.3",
|
|
32
35
|
"prosemirror-transform": "1.10.4",
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Extension } from '@kerebron/editor';
|
|
2
|
+
|
|
3
|
+
import { NodeTable } from './NodeTable.js';
|
|
4
|
+
import { NodeTableRow } from './NodeTableRow.js';
|
|
5
|
+
import { NodeTableHeader } from './NodeTableHeader.js';
|
|
6
|
+
import { NodeTableCell } from './NodeTableCell.js';
|
|
7
|
+
|
|
8
|
+
export class ExtensionTables extends Extension {
|
|
9
|
+
name = 'extension-tables';
|
|
10
|
+
requires = [
|
|
11
|
+
new NodeTable(),
|
|
12
|
+
new NodeTableHeader(),
|
|
13
|
+
new NodeTableRow(),
|
|
14
|
+
new NodeTableCell(),
|
|
15
|
+
];
|
|
16
|
+
}
|
package/src/NodeTable.ts
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { TextSelection } from 'prosemirror-state';
|
|
2
|
+
import { NodeSpec, NodeType } from 'prosemirror-model';
|
|
3
|
+
import { Node as ProseMirrorNode } from 'prosemirror-model';
|
|
4
|
+
|
|
5
|
+
import { type CoreEditor, Node } from '@kerebron/editor';
|
|
6
|
+
import {
|
|
7
|
+
type CommandFactories,
|
|
8
|
+
type CommandShortcuts,
|
|
9
|
+
} from '@kerebron/editor/commands';
|
|
10
|
+
import { type InputRule } from '@kerebron/editor/plugins/input-rules';
|
|
11
|
+
import {
|
|
12
|
+
getHtmlAttributes,
|
|
13
|
+
setHtmlAttributes,
|
|
14
|
+
} from '@kerebron/editor/utilities';
|
|
15
|
+
|
|
16
|
+
import { createTable } from './utilities/createTable.js';
|
|
17
|
+
import { CellSelection } from './utilities/CellSelection.js';
|
|
18
|
+
import { columnResizing } from './utilities/columnResizing.js';
|
|
19
|
+
import { tableEditing } from './utilities/tableEditing.js';
|
|
20
|
+
import {
|
|
21
|
+
addColumnAfter,
|
|
22
|
+
addColumnBefore,
|
|
23
|
+
addRowAfter,
|
|
24
|
+
addRowBefore,
|
|
25
|
+
deleteColumn,
|
|
26
|
+
deleteRow,
|
|
27
|
+
deleteTable,
|
|
28
|
+
goToNextCell,
|
|
29
|
+
mergeCells,
|
|
30
|
+
setCellAttr,
|
|
31
|
+
splitCell,
|
|
32
|
+
toggleHeader,
|
|
33
|
+
toggleHeaderCell,
|
|
34
|
+
toggleHeaderColumn,
|
|
35
|
+
toggleHeaderRow,
|
|
36
|
+
} from './utilities/commands.js';
|
|
37
|
+
import { Plugin } from 'prosemirror-state';
|
|
38
|
+
import { Direction } from './utilities/input.js';
|
|
39
|
+
|
|
40
|
+
export class NodeTable extends Node {
|
|
41
|
+
override name = 'table';
|
|
42
|
+
requires = ['doc'];
|
|
43
|
+
|
|
44
|
+
override attributes = {
|
|
45
|
+
class: {
|
|
46
|
+
default: 'table',
|
|
47
|
+
fromDom(element: HTMLElement) {
|
|
48
|
+
return element.hasAttribute('class')
|
|
49
|
+
? element.getAttribute('class')!
|
|
50
|
+
: undefined;
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
override getNodeSpec(): NodeSpec {
|
|
56
|
+
return {
|
|
57
|
+
content: 'table_row+',
|
|
58
|
+
tableRole: 'table',
|
|
59
|
+
isolating: true,
|
|
60
|
+
group: 'block',
|
|
61
|
+
parseDOM: [{
|
|
62
|
+
tag: 'table',
|
|
63
|
+
getAttrs: (element) => setHtmlAttributes(this, element),
|
|
64
|
+
}],
|
|
65
|
+
toDOM: (
|
|
66
|
+
node: ProseMirrorNode,
|
|
67
|
+
) => ['table', getHtmlAttributes(this, node), ['tbody', 0]],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
override getCommandFactories(
|
|
72
|
+
editor: CoreEditor,
|
|
73
|
+
type: NodeType,
|
|
74
|
+
): Partial<CommandFactories> {
|
|
75
|
+
const commands: Partial<CommandFactories> = {
|
|
76
|
+
addColumnAfter: () => (state, dispatch) =>
|
|
77
|
+
addColumnAfter(state, dispatch),
|
|
78
|
+
addColumnBefore: () => (state, dispatch) =>
|
|
79
|
+
addColumnBefore(state, dispatch),
|
|
80
|
+
addRowAfter: () => (state, dispatch) => addRowAfter(state, dispatch),
|
|
81
|
+
addRowBefore: () => (state, dispatch) => addRowBefore(state, dispatch),
|
|
82
|
+
deleteColumn: () => (state, dispatch) => deleteColumn(state, dispatch),
|
|
83
|
+
deleteRow: () => (state, dispatch) => deleteRow(state, dispatch),
|
|
84
|
+
deleteTable: () => (state, dispatch) => deleteTable(state, dispatch),
|
|
85
|
+
goToNextCell: (direction: Direction) => goToNextCell(direction),
|
|
86
|
+
mergeCells: () => (state, dispatch) => mergeCells(state, dispatch),
|
|
87
|
+
setCellAttr: (...args) => setCellAttr(...args),
|
|
88
|
+
splitCell: () => (state, dispatch) => splitCell(state, dispatch),
|
|
89
|
+
toggleHeader: (...args) => toggleHeader(...args),
|
|
90
|
+
toggleHeaderCell: () => (state, dispatch) =>
|
|
91
|
+
toggleHeaderCell(state, dispatch),
|
|
92
|
+
toggleHeaderRow: () => (state, dispatch) =>
|
|
93
|
+
toggleHeaderRow(state, dispatch),
|
|
94
|
+
toggleHeaderColumn: () => (state, dispatch) =>
|
|
95
|
+
toggleHeaderColumn(state, dispatch),
|
|
96
|
+
insertTable:
|
|
97
|
+
({ rows = 3, cols = 3, withHeaderRow = true } = {}) =>
|
|
98
|
+
(state, dispatch) => {
|
|
99
|
+
const tr = state.tr;
|
|
100
|
+
const node = createTable(editor.schema, rows, cols, withHeaderRow);
|
|
101
|
+
|
|
102
|
+
if (dispatch) {
|
|
103
|
+
const offset = tr.selection.from + 1;
|
|
104
|
+
|
|
105
|
+
tr.replaceSelectionWith(node)
|
|
106
|
+
.scrollIntoView()
|
|
107
|
+
.setSelection(TextSelection.near(tr.doc.resolve(offset)));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return true;
|
|
111
|
+
},
|
|
112
|
+
setCellSelection: (position) => (state, dispatch) => {
|
|
113
|
+
if (dispatch) {
|
|
114
|
+
const selection = CellSelection.create(
|
|
115
|
+
state.doc,
|
|
116
|
+
position.anchorCell,
|
|
117
|
+
position.headCell,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
state.tr.setSelection(selection);
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
return commands;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
override getKeyboardShortcuts(): Partial<CommandShortcuts> {
|
|
129
|
+
const keys = {};
|
|
130
|
+
return keys;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
override getProseMirrorPlugins(): Plugin[] {
|
|
134
|
+
return [
|
|
135
|
+
columnResizing(),
|
|
136
|
+
tableEditing(),
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Attrs, Node as PmNode, NodeSpec, NodeType } from 'prosemirror-model';
|
|
2
|
+
|
|
3
|
+
import { type CoreEditor, Node } from '@kerebron/editor';
|
|
4
|
+
import {
|
|
5
|
+
type CommandFactories,
|
|
6
|
+
type CommandShortcuts,
|
|
7
|
+
} from '@kerebron/editor/commands';
|
|
8
|
+
import { type InputRule } from '@kerebron/editor/plugins/input-rules';
|
|
9
|
+
|
|
10
|
+
function getCellAttrs(dom: HTMLElement | string): Attrs {
|
|
11
|
+
if (typeof dom === 'string') {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const widthAttr = dom.getAttribute('data-colwidth');
|
|
16
|
+
const widths = widthAttr && /^\d+(,\d+)*$/.test(widthAttr)
|
|
17
|
+
? widthAttr.split(',').map((s) => Number(s))
|
|
18
|
+
: null;
|
|
19
|
+
const colspan = Number(dom.getAttribute('colspan') || 1);
|
|
20
|
+
return {
|
|
21
|
+
colspan,
|
|
22
|
+
rowspan: Number(dom.getAttribute('rowspan') || 1),
|
|
23
|
+
colwidth: widths && widths.length == colspan ? widths : null,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function setCellAttrs(node: PmNode): Attrs {
|
|
28
|
+
return {
|
|
29
|
+
colspan: (node.attrs.colspan != 1) ? node.attrs.colspan : undefined,
|
|
30
|
+
rowspan: (node.attrs.rowspan != 1) ? node.attrs.rowspan : undefined,
|
|
31
|
+
'data-colwidth': node.attrs.colwidth?.join(','),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class NodeTableCell extends Node {
|
|
36
|
+
override name = 'table_cell';
|
|
37
|
+
requires = ['table_row'];
|
|
38
|
+
|
|
39
|
+
override getNodeSpec(): NodeSpec {
|
|
40
|
+
return {
|
|
41
|
+
content: 'block+',
|
|
42
|
+
attrs: {
|
|
43
|
+
colspan: { default: 1 },
|
|
44
|
+
rowspan: { default: 1 },
|
|
45
|
+
colwidth: { default: null },
|
|
46
|
+
},
|
|
47
|
+
tableRole: 'cell',
|
|
48
|
+
isolating: true,
|
|
49
|
+
parseDOM: [
|
|
50
|
+
{ tag: 'td', getAttrs: (dom) => getCellAttrs(dom) },
|
|
51
|
+
],
|
|
52
|
+
toDOM(node) {
|
|
53
|
+
return ['td', setCellAttrs(node), 0];
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
override getCommandFactories(
|
|
59
|
+
editor: CoreEditor,
|
|
60
|
+
type: NodeType,
|
|
61
|
+
): Partial<CommandFactories> {
|
|
62
|
+
const commands = {};
|
|
63
|
+
return commands;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override getKeyboardShortcuts(): Partial<CommandShortcuts> {
|
|
67
|
+
const keys = {};
|
|
68
|
+
return keys;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Attrs, Node as PmNode, NodeSpec } from 'prosemirror-model';
|
|
2
|
+
import { Node } from '@kerebron/editor';
|
|
3
|
+
|
|
4
|
+
function getCellAttrs(dom: HTMLElement | string): Attrs {
|
|
5
|
+
if (typeof dom === 'string') {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const widthAttr = dom.getAttribute('data-colwidth');
|
|
10
|
+
const widths = widthAttr && /^\d+(,\d+)*$/.test(widthAttr)
|
|
11
|
+
? widthAttr.split(',').map((s) => Number(s))
|
|
12
|
+
: null;
|
|
13
|
+
const colspan = Number(dom.getAttribute('colspan') || 1);
|
|
14
|
+
return {
|
|
15
|
+
colspan,
|
|
16
|
+
rowspan: Number(dom.getAttribute('rowspan') || 1),
|
|
17
|
+
colwidth: widths && widths.length == colspan ? widths : null,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function setCellAttrs(node: PmNode): Attrs {
|
|
22
|
+
return {
|
|
23
|
+
colspan: (node.attrs.colspan != 1) ? node.attrs.colspan : undefined,
|
|
24
|
+
rowspan: (node.attrs.rowspan != 1) ? node.attrs.rowspan : undefined,
|
|
25
|
+
'data-colwidth': node.attrs.colwidth?.join(','),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class NodeTableHeader extends Node {
|
|
30
|
+
override name = 'table_header';
|
|
31
|
+
requires = ['table'];
|
|
32
|
+
|
|
33
|
+
override getNodeSpec(): NodeSpec {
|
|
34
|
+
return {
|
|
35
|
+
content: 'block+',
|
|
36
|
+
attrs: {
|
|
37
|
+
colspan: { default: 1 },
|
|
38
|
+
rowspan: { default: 1 },
|
|
39
|
+
colwidth: { default: null },
|
|
40
|
+
},
|
|
41
|
+
tableRole: 'header_cell',
|
|
42
|
+
isolating: true,
|
|
43
|
+
parseDOM: [
|
|
44
|
+
{ tag: 'th', getAttrs: (dom) => getCellAttrs(dom) },
|
|
45
|
+
],
|
|
46
|
+
toDOM: (node) => ['th', setCellAttrs(node), 0],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { NodeSpec, NodeType } from 'prosemirror-model';
|
|
2
|
+
|
|
3
|
+
import { type CoreEditor, Node } from '@kerebron/editor';
|
|
4
|
+
import {
|
|
5
|
+
type CommandFactories,
|
|
6
|
+
type CommandShortcuts,
|
|
7
|
+
} from '@kerebron/editor/commands';
|
|
8
|
+
import {
|
|
9
|
+
type InputRule,
|
|
10
|
+
textblockTypeInputRule,
|
|
11
|
+
} from '@kerebron/editor/plugins/input-rules';
|
|
12
|
+
|
|
13
|
+
export class NodeTableRow extends Node {
|
|
14
|
+
override name = 'table_row';
|
|
15
|
+
requires = ['table'];
|
|
16
|
+
|
|
17
|
+
override getNodeSpec(): NodeSpec {
|
|
18
|
+
return {
|
|
19
|
+
content: '(table_cell | table_header)*',
|
|
20
|
+
tableRole: 'row',
|
|
21
|
+
parseDOM: [{ tag: 'tr' }],
|
|
22
|
+
toDOM() {
|
|
23
|
+
return ['tr', 0];
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
override getCommandFactories(
|
|
29
|
+
editor: CoreEditor,
|
|
30
|
+
type: NodeType,
|
|
31
|
+
): Partial<CommandFactories> {
|
|
32
|
+
const commands = {};
|
|
33
|
+
|
|
34
|
+
return commands;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override getKeyboardShortcuts(): Partial<CommandShortcuts> {
|
|
38
|
+
const keys = {};
|
|
39
|
+
return keys;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const dntGlobals = {
|
|
2
|
+
};
|
|
3
|
+
export const dntGlobalThis = createMergeProxy(globalThis, dntGlobals);
|
|
4
|
+
|
|
5
|
+
function createMergeProxy<T extends object, U extends object>(
|
|
6
|
+
baseObj: T,
|
|
7
|
+
extObj: U,
|
|
8
|
+
): Omit<T, keyof U> & U {
|
|
9
|
+
return new Proxy(baseObj, {
|
|
10
|
+
get(_target, prop, _receiver) {
|
|
11
|
+
if (prop in extObj) {
|
|
12
|
+
return (extObj as any)[prop];
|
|
13
|
+
} else {
|
|
14
|
+
return (baseObj as any)[prop];
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
set(_target, prop, value) {
|
|
18
|
+
if (prop in extObj) {
|
|
19
|
+
delete (extObj as any)[prop];
|
|
20
|
+
}
|
|
21
|
+
(baseObj as any)[prop] = value;
|
|
22
|
+
return true;
|
|
23
|
+
},
|
|
24
|
+
deleteProperty(_target, prop) {
|
|
25
|
+
let success = false;
|
|
26
|
+
if (prop in extObj) {
|
|
27
|
+
delete (extObj as any)[prop];
|
|
28
|
+
success = true;
|
|
29
|
+
}
|
|
30
|
+
if (prop in baseObj) {
|
|
31
|
+
delete (baseObj as any)[prop];
|
|
32
|
+
success = true;
|
|
33
|
+
}
|
|
34
|
+
return success;
|
|
35
|
+
},
|
|
36
|
+
ownKeys(_target) {
|
|
37
|
+
const baseKeys = Reflect.ownKeys(baseObj);
|
|
38
|
+
const extKeys = Reflect.ownKeys(extObj);
|
|
39
|
+
const extKeysSet = new Set(extKeys);
|
|
40
|
+
return [...baseKeys.filter((k) => !extKeysSet.has(k)), ...extKeys];
|
|
41
|
+
},
|
|
42
|
+
defineProperty(_target, prop, desc) {
|
|
43
|
+
if (prop in extObj) {
|
|
44
|
+
delete (extObj as any)[prop];
|
|
45
|
+
}
|
|
46
|
+
Reflect.defineProperty(baseObj, prop, desc);
|
|
47
|
+
return true;
|
|
48
|
+
},
|
|
49
|
+
getOwnPropertyDescriptor(_target, prop) {
|
|
50
|
+
if (prop in extObj) {
|
|
51
|
+
return Reflect.getOwnPropertyDescriptor(extObj, prop);
|
|
52
|
+
} else {
|
|
53
|
+
return Reflect.getOwnPropertyDescriptor(baseObj, prop);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
has(_target, prop) {
|
|
57
|
+
return prop in extObj || prop in baseObj;
|
|
58
|
+
},
|
|
59
|
+
}) as any;
|
|
60
|
+
}
|